tx · 8QM9tca9vsupr8qCpWhjN6t68CQuNDTfTTrJy6maZRww

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.03100000 Waves

2022.09.16 17:54 [2231810] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "8QM9tca9vsupr8qCpWhjN6t68CQuNDTfTTrJy6maZRww", "fee": 3100000, "feeAssetId": null, "timestamp": 1663340158930, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "2oudUqe8tvE4uMrEoVxDQZPSfyXAzzZQTxAgWyYS1zj7Zf7NepAVpReRzb5BaaXU3XxBPgajyjV24BeG4LwJjPQK" ], "script": "base64:BgLEHggCEgMKAQgSAwoBCBIAEgQKAgEEEgcKBQEBAQEEEgQKAgEEEgQKAgEIEgQKAgEIEgMKAQESABIHCgUBAQEIARIECgIIARIECgIIARIECgIIARIECgIBARIDCgEBEgYKBAEBCAESBAoCCAgSBAoCCAgSBAoCCAESABIDCgEIEgUKAwEBARIECgIIARIECgIBARIECgIICBILCgkIAQECAQIIBAQSBgoECAgBCCIGc2NhbGU4IgxzY2FsZThCaWdJbnQiB3NjYWxlMTgiCHRob3VzYW5kIgp6ZXJvQmlnSW50IglvbmVCaWdJbnQiCnNsaXBwYWdlNEQiBUFtdWx0IgVEY29udiIDU0VQIgVFTVBUWSIKUG9vbEFjdGl2ZSIKUG9vbFB1dERpcyIOUG9vbE1hdGNoZXJEaXMiDFBvb2xTaHV0ZG93biIOaWR4UG9vbEFkZHJlc3MiCWlkeFBvb2xTdCIJaWR4TFBBc0lkIglpZHhBbUFzSWQiCWlkeFByQXNJZCILaWR4QW10QXNEY20iDWlkeFByaWNlQXNEY20iC2lkeElBbXRBc0lkIg1pZHhJUHJpY2VBc0lkIg9pZHhGYWN0U3Rha0NudHIiEGlkeEZhY3RTbGlwcENudHIiEWlkeEZhY3RHd3hSZXdDbnRyIhJmZWVQZXJtaWxsZURlZmF1bHQiAnQxIgdvcmlnVmFsIg1vcmlnU2NhbGVNdWx0IgJmMSIDdmFsIg9yZXN1bHRTY2FsZU11bHQiAnRzIgNhbXQiCHJlc1NjYWxlIghjdXJTY2FsZSIDYWJzIgJmYyIDbXBrIgRwbXBrIgJwbCICcGgiAWgiAXQiA3BhdSICdWEiBHR4SWQiA2dhdSICYWEiAnBhIgNhbXAiA2FkYSIOa2V5RmVlUGVybWlsbGUiC2ZlZVBlcm1pbGxlIgRmY2ZnIgRtdHBrIgJwYyIGaUFtdEFzIgVpUHJBcyIDbWJhIgViQVN0ciIDYXBzIhxrZXlBbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoIhZrZXlGZWVDb2xsZWN0b3JBZGRyZXNzIgN0b2UiA29yViIGc2VuZHJWIgZtYXRjaFYiA3N0ciIHJG1hdGNoMCIGdmFsU3RyIgRzdHJmIgRhZGRyIgNrZXkiBGludGYiA2ZjYSIBQSIDaWdzIgJtcCITZmVlQ29sbGVjdG9yQWRkcmVzcyIDZ3BjIgVhbXRBcyIHcHJpY2VBcyIIaVByaWNlQXMiA2dmYyINZmFjdG9yeUNvbmZpZyIPc3Rha2luZ0NvbnRyYWN0Ig9zbGlwYWdlQ29udHJhY3QiC2d3eENvbnRyYWN0IhFkYXRhUHV0QWN0aW9uSW5mbyINaW5BbXRBc3NldEFtdCIPaW5QcmljZUFzc2V0QW10IghvdXRMcEFtdCIFcHJpY2UiCnNsaXBCeVVzZXIiDHNsaXBwYWdlUmVhbCIIdHhIZWlnaHQiC3R4VGltZXN0YW1wIgxzbGlwYWdlQW1BbXQiDHNsaXBhZ2VQckFtdCIRZGF0YUdldEFjdGlvbkluZm8iDm91dEFtdEFzc2V0QW10IhBvdXRQcmljZUFzc2V0QW10IgdpbkxwQW10Ig1nZXRBY2NCYWxhbmNlIgdhc3NldElkIgRjcGJpIghwckFtdFgxOCIIYW1BbXRYMTgiA3ZhZCICQTEiAkEyIghzbGlwcGFnZSIEZGlmZiIEcGFzcyICdmQiAkQxIgJEMCIEc2xwZyIEZmFpbCIDcGNwIgphbUFzc2V0RGNtIgpwckFzc2V0RGNtIgVhbUFtdCIFcHJBbXQiC2FtdEFzQW10WDE4IgpwckFzQW10WDE4IgpjYWxjUHJpY2VzIgVscEFtdCIDY2ZnIghhbXRBc0RjbSIHcHJBc0RjbSIIcHJpY2VYMTgiCGxwQW10WDE4Ig1scFBySW5BbUFzWDE4Ig1scFBySW5QckFzWDE4Ig9jYWxjdWxhdGVQcmljZXMiAXAiB3Rha2VGZWUiBmFtb3VudCIDZmVlIgNlZ28iBnR4SWQ1OCIKcG10QXNzZXRJZCIIcG10THBBbXQiC3VzZXJBZGRyZXNzIgRscElkIgRhbUlkIgRwcklkIgVhbURjbSIFcHJEY20iA3N0cyIHbHBFbWlzcyIJYW1CYWxhbmNlIgxhbUJhbGFuY2VYMTgiCXByQmFsYW5jZSIMcHJCYWxhbmNlWDE4IgtjdXJQcmljZVgxOCIIY3VyUHJpY2UiC3BtdExwQW10WDE4IgpscEVtaXNzWDE4IgtvdXRBbUFtdFgxOCILb3V0UHJBbXRYMTgiCG91dEFtQW10IghvdXRQckFtdCIFc3RhdGUiA2VwbyIHaW5BbUFtdCIGaW5BbUlkIgdpblByQW10IgZpblBySWQiBmlzRXZhbCIGZW1pdExwIgppc09uZUFzc2V0IhB2YWxpZGF0ZVNsaXBwYWdlIgZwbXRBbXQiBXBtdElkIgdhbUlkU3RyIgdwcklkU3RyIglpbkFtSWRTdHIiCWluUHJJZFN0ciIGYW10RGNtIghwcmljZURjbSIEbHBFbSIPaW5BbUFzc2V0QW10WDE4Ig9pblByQXNzZXRBbXRYMTgiDHVzZXJQcmljZVgxOCIBciILc2xpcHBhZ2VYMTgiD3NsaXBwYWdlUmVhbFgxOCINbHBFbWlzc2lvblgxOCIKcHJWaWFBbVgxOCIKYW1WaWFQclgxOCIMZXhwZWN0ZWRBbXRzIhFleHBBbXRBc3NldEFtdFgxOCITZXhwUHJpY2VBc3NldEFtdFgxOCIJY2FsY0xwQW10Ig5jYWxjQW1Bc3NldFBtdCIOY2FsY1ByQXNzZXRQbXQiDHNsaXBwYWdlQ2FsYyIJZW1pdExwQW10IgZhbURpZmYiBnByRGlmZiINJHQwMTYyNzExNjYxNiIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiA21vYSIFb3JkZXIiB2FtdEFzSWQiBnByQXNJZCIPYWNjQW10QXNCYWxhbmNlIg5hY2NQckFzQmFsYW5jZSIKb3JBbXRBc3NldCIKb3JBbXRBc1N0ciIJb3JQckFzc2V0IglvclByQXNTdHIiCm9yZGVyUHJpY2UiDmNhc3RPcmRlclByaWNlIhFpc09yZGVyUHJpY2VWYWxpZCICY2ciAWkiA3BtdCICY3AiBmNhbGxlciIHYW1Bc1BtdCIHcHJBc1BtdCITZXN0aW1hdGVQdXRPbmVUa25WMiIJcG10QW10UmF3Igpwb29sQ29uZmlnIg0kdDAyMDk0MjIwOTg3IglmZWVBbW91bnQiDSR0MDIwOTkxMjE0NTIiDGFtQmFsYW5jZU5vdyIMcHJCYWxhbmNlTm93Ig0kdDAyMTQ1NjIxNTkwIhBhbUJhbGFuY2VGb3JDYWxjIhBwckJhbGFuY2VGb3JDYWxjIgp4UHJlY2lzaW9uIgZyZXN1bHQiAUAiDSR0MDIyMDU5MjIxNTUiC2FtQXNzZXRQYXJ0IgtwckFzc2V0UGFydCIGZXN0UHV0Igdlc3RpbUxQIglscEFzc2V0SWQiAW0iAXMiAnBtIgJwZCICbW0iAnBrIgFjIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSICY20iA2hwbSIDY3BtIgRzbGlwIglhdXRvU3Rha2UiB2ZhY3RDZmciC3N0YWtpbmdDbnRyIghzbGlwQ250ciIBZSICZWwiBmxlZ2FjeSICc2EiAnNwIghscFRybnNmciICc3MiBW91dExwIgdnd3hDbnRyIgdwb29sQ2ZnIgVhZGRvbiIQcGF5bWVudEFtb3VudFJhdyINJHQwMjcxMjUyNzE3NyINJHQwMjczMzcyNzk1MyIMdmlydFN3YXBJbkFtIg12aXJ0U3dhcE91dFByIgx2aXJ0U3dhcEluUHIiDXZpcnRTd2FwT3V0QW0iBkQwdnNEMSIJbHBDYWxjUmVzIhBzZW5kRmVlVG9NYXRjaGVyIgxtaW5PdXRBbW91bnQiCmFtRGVjaW1hbHMiCnByRGVjaW1hbHMiDXBheW1lbnRBbW91bnQiDnBheW1lbnRBc3NldElkIg9scEFzc2V0RW1pc3Npb24iDSR0MDMyNzgwMzMwODkiEHByaWNlQXNzZXRBbW91bnQiEWFtb3VudEFzc2V0QW1vdW50IglscEFtdEJvdGgiD2xwQXNzZXRQcmljZU9uZSIQbHBBc3NldFByaWNlQm90aCIFYm9udXMiB21heFNscGciCW91dEFtdEFtdCIBYiIKZXhjaFJlc3VsdCIHbm90VXNlZCIJb3V0QW1vdW50IgpvdXRBc3NldElkIgplc3RpbUFtQW10Igplc3RpbVByQW10Ig0kdDAzNjM3MDM2ODMwIgt0b3RhbEdldFJhdyIIdG90YWxHZXQiCGZpbmFsUmVzIg0kdDAzNzU3NzM3NjgxIgVvdXRBbSIFb3V0UHIiC3RvdGFsQW1vdW50IhFvdXRBc3NldElkT3JXYXZlcyIIY3VyUHJYMTgiBWN1clByIgRidXJuIgpwb29sU3RhdHVzIg0kdDAzOTc3NTM5ODYyIg1scEFzc2V0QW1vdW50Ig0kdDA0MDk1NjQxMjI3IhRhbW91bnRCYWxhbmNlRm9yU3dhcCITcHJpY2VCYWxhbmNlRm9yU3dhcCIMYW1vdW50VG9Td2FwIgp5UHJlY2lzaW9uIg0kdDA0MTc5OTQxODQ4Ig0kdDA0MjE5MjQyMzA3IhJub0xlc3NUaGVuQW10QXNzZXQiFG5vTGVzc1RoZW5QcmljZUFzc2V0IhRidXJuTFBBc3NldE9uRmFjdG9yeSINY2hlY2tQYXltZW50cyIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiD291dEFtb3VudFJlc3VsdCIIYW10QXNTdHIiB3ByQXNTdHIiAWsiAnByIgxyZXNTY2FsZU11bHQiB3VzckFkZHIiB3BtdEFzSWQiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleSIKbWF0Y2hlclB1YiIKb3JkZXJWYWxpZCILc2VuZGVyVmFsaWQiDG1hdGNoZXJWYWxpZCIHbmV3SGFzaCILYWxsb3dlZEhhc2giC2N1cnJlbnRIYXNoVwABYQCAwtcvAAFiCQC2AgEAgMLXLwABYwkAtgIBAICAkLu61q3wDQABZADoBwABZQkAtgIBAAAAAWYJALYCAQABAAFnCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABaAIDMTAwAAFpAgExAAFqAgJfXwABawIAAAFsAAEAAW0AAgABbgADAAFvAAQAAXAAAQABcQACAAFyAAMAAXMABAABdAAFAAF1AAYAAXYABwABdwAIAAF4AAkAAXkAAQABegAHAAFBAAoAAUIAAAEBQwIBRAFFCQC8AgMJALYCAQUBRAUBYwkAtgIBBQFFAQFGAgFHAUgJAKADAQkAvAIDBQFHCQC2AgEFAUgFAWMBAUkDAUoBSwFMCQBrAwUBSgUBSwUBTAEBTQEBRwMJAL8CAgUBZQUBRwkAvgIBBQFHBQFHAQFOAAITJXNfX2ZhY3RvcnlDb250cmFjdAEBTwACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFQAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQFRAAIRJXMlc19fcHJpY2VfX2xhc3QBAVICAVMBVAkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAVMJAMwIAgkApAMBBQFUBQNuaWwFAWoBAVUCAVYBVwkArAICCQCsAgIJAKwCAgILJXMlcyVzX19QX18FAVYCAl9fBQFXAQFYAgFWAVcJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQFWAgJfXwUBVwEBWQACDyVzX19hbW91bnRBc3NldAEBWgACDiVzX19wcmljZUFzc2V0AQJhYQACByVzX19hbXABAmFiAAINJXNfX2FkZG9uQWRkcgACYWMCDyVzX19mZWVQZXJtaWxsZQACYWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWMFAUIBAmFlAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFmAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhZwICYWgCYWkJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFoAgJfXwUCYWkCCF9fY29uZmlnAQJhagECYWsJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYWsBAmFsAAIMJXNfX3NodXRkb3duAQJhbQACHSVzX19hbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAQJhbgACFyVzX19mZWVDb2xsZWN0b3JBZGRyZXNzAQJhbwMCYXACYXECYXIJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIRRmFpbGVkOiBvcmRWYWxpZD0JAKUDAQUCYXACCyBzbmRyVmFsaWQ9CQClAwEFAmFxAgwgbXRjaHJWYWxpZD0JAKUDAQUCYXIBAmFzAQFHBAJhdAUBRwMJAAECBQJhdAIGU3RyaW5nBAJhdQUCYXQFAmF1CQACAQITZmFpbCBjYXN0IHRvIFN0cmluZwECYXYCAmF3AmF4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYXcFAmF4CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF3CQDMCAICAS4JAMwIAgUCYXgJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYXkCAmF3AmF4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYXcFAmF4CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF3CQDMCAICAS4JAMwIAgUCYXgJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAACYXoJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhdgIFBHRoaXMJAQFOAAACYUEJAQJhdgIFBHRoaXMJAQJhYQABAmFCAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhegkBAmFsAAcBAmFDAAkA2QQBCQECYXYCBQJhegkBAmFmAAACYUQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhdgIFAmF6CQECYW4AAQJhRQAEAmFGCQECYXYCBQR0aGlzCQEBWQAEAmFHCQECYXYCBQR0aGlzCQEBWgAEAmFICQECYXkCBQJhegkBAmFqAQUCYUcEAmFoCQECYXkCBQJhegkBAmFqAQUCYUYJALUJAgkBAmF2AgUCYXoJAQJhZwIJAKQDAQUCYWgJAKQDAQUCYUgFAWoBAmFJAAkAtQkCCQECYXYCBQJhegkBAmFlAAUBagACYUoJAQJhSQAAAmFLCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJhSgUBeQIgSW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MAAmFMCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJhSgUBegIgSW52YWxpZCBzbGlwYWdlIGNvbnRyYWN0IGFkZHJlc3MAAmFNCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJhSgUBQQIcSW52YWxpZCBnd3ggY29udHJhY3QgYWRkcmVzcwECYU4KAmFPAmFQAmFRAmFSAmFTAmFUAmFVAmFWAmFXAmFYCQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJhTwkAzAgCCQCkAwEFAmFQCQDMCAIJAKQDAQUCYVEJAMwIAgkApAMBBQJhUgkAzAgCCQCkAwEFAmFTCQDMCAIJAKQDAQUCYVQJAMwIAgkApAMBBQJhVQkAzAgCCQCkAwEFAmFWCQDMCAIJAKQDAQUCYVcJAMwIAgkApAMBBQJhWAUDbmlsBQFqAQJhWQYCYVoCYmECYmICYVICYVUCYVYJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJhWgkAzAgCCQCkAwEFAmJhCQDMCAIJAKQDAQUCYmIJAMwIAgkApAMBBQJhUgkAzAgCCQCkAwEFAmFVCQDMCAIJAKQDAQUCYVYFA25pbAUBagECYmMBAmJkAwkAAAIFAmJkAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQJiZAECYmUCAmJmAmJnCQC8AgMFAmJmBQFjBQJiZwECYmgDAmJpAmJqAmJrBAJibAkAvAIDCQC4AgIFAmJpBQJiagUBYgUCYmoEAmJtCQC/AgIJALgCAgUCYmsJAQFNAQUCYmwFAWUDCQEBIQEFAmJtCQACAQkArAICAgpCaWcgc2xwZzogCQCmAwEFAmJsCQCUCgIFAmJtCQCZAwEJAMwIAgUCYmkJAMwIAgUCYmoFA25pbAECYm4DAmJvAmJwAmJxBAJibAkAvAIDBQJicAUBYgUCYm8EAmJyCQC/AgIFAmJxBQJibAMDBQJicgYJAL8CAgUCYnAFAmJvCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJicAIBIAkApgMBBQJibwIBIAkApgMBBQJibAIBIAkApgMBBQJicQUCYnIBAmJzBAJidAJidQJidgJidwQCYngJAQFDAgUCYnYFAmJ0BAJieQkBAUMCBQJidwUCYnUJAQJiZQIFAmJ5BQJieAECYnoDAmJ2AmJ3AmJBBAJiQgkBAmFFAAQCYkMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiQgUBdQQCYkQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiQgUBdgQCYkUJAQJicwQFAmJDBQJiRAUCYnYFAmJ3BAJiZwkBAUMCBQJidgUCYkMEAmJmCQEBQwIFAmJ3BQJiRAQCYkYJAQFDAgUCYkEFAWEEAmJHCQECYmUCBQJiZwUCYkYEAmJICQECYmUCBQJiZgUCYkYJAMwIAgUCYkUJAMwIAgUCYkcJAMwIAgUCYkgFA25pbAECYkkDAmJ2AmJ3AmJBBAJiSgkBAmJ6AwUCYnYFAmJ3BQJiQQkAzAgCCQEBRgIJAJEDAgUCYkoAAAUBYQkAzAgCCQEBRgIJAJEDAgUCYkoAAQUBYQkAzAgCCQEBRgIJAJEDAgUCYkoAAgUBYQUDbmlsAQJiSwECYkwEAmJNCQBrAwUCYkwFAmFkBQFkCQCUCgIJAGUCBQJiTAUCYk0FAmJNAQJiTgQCYk8CYlACYlECYlIEAmJCCQECYUUABAJiUwkAkQMCBQJiQgUBcgQCYlQJAJEDAgUCYkIFAXMEAmJVCQCRAwIFAmJCBQF0BAJiVgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJCBQF1BAJiVwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJCBQF2BAJiWAkAkQMCBQJiQgUBcQQCYlkICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJiUwILV3JvbmcgTFAgaWQIcXVhbnRpdHkDCQECIT0CBQJiUwUCYlAJAAIBAg9Xcm9uZyBwbXQgYXNzZXQEAmJaCQECYmMBBQJiVAQCY2EJAQFDAgUCYloFAmJWBAJjYgkBAmJjAQUCYlUEAmNjCQEBQwIFAmNiBQJiVwQCY2QJAQJiZQIFAmNjBQJjYQQCY2UJAQFGAgUCY2QFAWEEAmNmCQEBQwIFAmJRBQFhBAJjZwkBAUMCBQJiWQUBYQQCY2gJALwCAwUCY2EFAmNmBQJjZwQCY2kJALwCAwUCY2MFAmNmBQJjZwQCY2oJAQFGAgUCY2gFAmJWBAJjawkBAUYCBQJjaQUCYlcEAmNsAwkAAAIFAmJPAgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiUgUCY2oDCQAAAgUCYlQCBVdBVkVTBQR1bml0CQDZBAEFAmJUCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJSBQJjawMJAAACBQJiVQIFV0FWRVMFBHVuaXQJANkEAQUCYlUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVgCCQClCAEFAmJSBQJiTwkBAmFZBgUCY2oFAmNrBQJiUQUCY2UFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAAUCY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFSAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY2UFA25pbAkAnAoKBQJjagUCY2sFAmJUBQJiVQUCYloFAmNiBQJiWQUCY2QFAmJYBQJjbAECY20NAmJPAmJrAmNuAmNvAmNwAmNxAmJSAmNyAmNzAmN0AmN1AmN2AmN3BAJiQgkBAmFFAAQCYlMJANkEAQkAkQMCBQJiQgUBcgQCY3gJAJEDAgUCYkIFAXMEAmN5CQCRAwIFAmJCBQF0BAJjegkAkQMCBQJiQgUBdwQCY0EJAJEDAgUCYkIFAXgEAmNCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkIFAXUEAmNDCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkIFAXYEAmJYCQCRAwIFAmJCBQFxBAJjRAgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJiUwIIV3IgbHAgYXMIcXVhbnRpdHkEAmJaAwUCY3IJAQJiYwEFAmN4AwMFAmN0CQAAAgUCY3cFAmN4BwkAZQIJAQJiYwEFAmN4BQJjdgMFAmN0CQECYmMBBQJjeAkAZQIJAQJiYwEFAmN4BQJjbgQCY2IDBQJjcgkBAmJjAQUCY3kDAwUCY3QJAAACBQJjdwUCY3kHCQBlAgkBAmJjAQUCY3kFAmN2AwUCY3QJAQJiYwEFAmN5CQBlAgkBAmJjAQUCY3kFAmNwBAJjRQkBAUMCBQJjbgUCY0IEAmNGCQEBQwIFAmNwBQJjQwQCY0cJAQJiZQIFAmNGBQJjRQQCY2EJAQFDAgUCYloFAmNCBAJjYwkBAUMCBQJjYgUCY0MEAmNIAwkAAAIFAmNEAAAEAmNkBQFlBAJjSQUBZQQCYkYJAHYGCQC5AgIFAmNFBQJjRgAACQC2AgEABQABAAAFBERPV04JAJcKBQkBAUYCBQJiRgUBYQkBAUYCBQJjRQUCY0IJAQFGAgUCY0YFAmNDCQECYmUCCQC3AgIFAmNjBQJjRgkAtwICBQJjYQUCY0UFAmNJBAJjZAkBAmJlAgUCY2MFAmNhBAJjSgkAvAIDCQEBTQEJALgCAgUCY2QFAmNHBQFjBQJjZAQCY0kJAQFDAgUCYmsFAWEDAwMFAmN1CQECIT0CBQJjZAUBZQcJAL8CAgUCY0oFAmNJBwkAAgEJAKwCAgkArAICCQCsAgICD1ByaWNlIHNsaXBwYWdlIAkApgMBBQJjSgIDID4gCQCmAwEFAmNJBAJjSwkBAUMCBQJjRAUBYQQCY0wJALwCAwUCY0UFAmNkBQFjBAJjTQkAvAIDBQJjRgUBYwUCY2QEAmNOAwkAvwICBQJjTAUCY0YJAJQKAgUCY00FAmNGCQCUCgIFAmNFBQJjTAQCY08IBQJjTgJfMQQCY1AIBQJjTgJfMgQCYkYJALwCAwUCY0sFAmNQBQJjYwkAlwoFCQEBRgIFAmJGBQFhCQEBRgIFAmNPBQJjQgkBAUYCBQJjUAUCY0MFAmNkBQJjSQQCY1EIBQJjSAJfMQQCY1IIBQJjSAJfMgQCY1MIBQJjSAJfMwQCY2UJAQFGAggFAmNIAl80BQFhBAJjVAkBAUYCCAUCY0gCXzUFAWEDCQBnAgAABQJjUQkAAgECB0xQIDw9IDAEAmNVAwkBASEBBQJjcwAABQJjUQQCY1YJAGUCBQJjbgUCY1IEAmNXCQBlAgUCY3AFAmNTBAJjWAMDBQJjdAkAAAIFAmN3BQJjeAcJAJQKAgUCY3YAAAMDBQJjdAkAAAIFAmN3BQJjeQcJAJQKAgAABQJjdgkAlAoCBQJjUgUCY1MEAmNZCAUCY1gCXzEEAmNaCAUCY1gCXzIEAmRhCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQAFAmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUCYlIFAmJPCQECYU4KBQJjWQUCY1oFAmNVBQJjZQUCYmsFAmNUBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjVgUCY1cFA25pbAkAnwoNBQJjUQUCY1UFAmNlBQJiWgUCY2IFAmNEBQJiUwUCYlgFAmRhBQJjVgUCY1cFAmNvBQJjcQECZGIBAmRjBAJiQgkBAmFFAAQCZGQJAJEDAgUCYkIFAXMEAmRlCQCRAwIFAmJCBQF0BAJiWAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJCBQFxBAJiQwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJCBQF1BAJiRAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJCBQF2BAJkZgkBAmJjAQUCZGQEAmRnCQECYmMBBQJkZQQCY2QDCQAAAggFAmRjCW9yZGVyVHlwZQUDQnV5CQECYnMEBQJiQwUCYkQJAGQCBQJkZggFAmRjBmFtb3VudAUCZGcJAQJicwQFAmJDBQJiRAkAZQIFAmRmCAUCZGMGYW1vdW50BQJkZwQCY2UJAQFGAgUCY2QFAWEDAwMJAQJhQgAGCQAAAgUCYlgFAW4GCQAAAgUCYlgFAW8JAAIBAg1BZG1pbiBibG9ja2VkBAJkaAgIBQJkYwlhc3NldFBhaXILYW1vdW50QXNzZXQEAmRpAwkAAAIFAmRoBQR1bml0AgVXQVZFUwkA2AQBCQEFdmFsdWUBBQJkaAQCZGoICAUCZGMJYXNzZXRQYWlyCnByaWNlQXNzZXQEAmRrAwkAAAIFAmRqBQR1bml0AgVXQVZFUwkA2AQBCQEFdmFsdWUBBQJkagMDCQECIT0CBQJkaQUCZGQGCQECIT0CBQJkawUCZGUJAAIBAglXciBhc3NldHMEAmRsCAUCZGMFcHJpY2UEAmNDCQBrAwUBYQUCYkQFAmJDBAJkbQkBAUkDBQJkbAUBYQUCY0MEAmRuAwkAAAIIBQJkYwlvcmRlclR5cGUFA0J1eQkAZwIFAmNlBQJkbQkAZwIFAmRtBQJjZQYBAmRvAQJkcAMJAQIhPQIJAJADAQgFAmRwCHBheW1lbnRzAAEJAAIBAgoxIHBtbnQgZXhwBAJkcQkBBXZhbHVlAQkAkQMCCAUCZHAIcGF5bWVudHMAAAQCYlAJAQV2YWx1ZQEIBQJkcQdhc3NldElkBAJjdggFAmRxBmFtb3VudAQCY0gJAQJiTgQJANgEAQgFAmRwDXRyYW5zYWN0aW9uSWQJANgEAQUCYlAFAmN2CAUCZHAGY2FsbGVyBAJjaggFAmNIAl8xBAJjawgFAmNIAl8yBAJiWAkBDXBhcnNlSW50VmFsdWUBCAUCY0gCXzkEAmNsCAUCY0gDXzEwAwMJAQJhQgAGCQAAAgUCYlgFAW8JAAIBCQCsAgICD0FkbWluIGJsb2NrZWQ6IAkApAMBBQJiWAkAlwoFBQJjagUCY2sFAmN2BQJiUAUCY2wBAmRyCgJkcwFXAmR0AmR1AmJrAmNzAmN0AmN1AmN2AmN3BAJjSAkBAmNtDQUBVwUCYmsICQEFdmFsdWUBBQJkdAZhbW91bnQICQEFdmFsdWUBBQJkdAdhc3NldElkCAkBBXZhbHVlAQUCZHUGYW1vdW50CAkBBXZhbHVlAQUCZHUHYXNzZXRJZAUCZHMHBQJjcwUCY3QFAmN1BQJjdgUCY3cEAmJYCQENcGFyc2VJbnRWYWx1ZQEIBQJjSAJfOAMDAwkBAmFCAAYJAAACBQJiWAUBbQYJAAACBQJiWAUBbwkAAgEJAKwCAgIIQmxvY2tlZDoJAKQDAQUCYlgFAmNIAQJkdgQCZHcCYlACYlIBVwQCZHgJAQJhRQAEAmJUCQCRAwIFAmR4BQFzBAJiVQkAkQMCBQJkeAUBdAQCYloJAQJiYwEFAmJUBAJjYgkBAmJjAQUCYlUEAmR5CQECYksBBQJkdwQCY3YIBQJkeQJfMQQCZHoIBQJkeQJfMgQCZEEDCQAAAgUBVwIACQCUCgIFAmJaBQJjYgMJAAACBQJiUAUCYlQDCQBmAgUCZHcFAmJaCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCCQBlAgUCYloFAmR3BQJjYgMJAAACBQJiUAUCYlUDCQBmAgUCZHcFAmNiCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCBQJiWgkAZQIFAmNiBQJkdwkAAgECEHdyb25nIHBtdEFzc2V0SWQEAmRCCAUCZEECXzEEAmRDCAUCZEECXzIEAmREAwkAAAIFAmJQBQJiVAkAlAoCBQJkQgUCZEMJAJQKAgUCZEMFAmRCBAJkRQgFAmREAl8xBAJkRggFAmREAl8yBAJkRwABBAJkSAoAAmRJCQD8BwQFAmFNAgxjYWxjUHV0WE9ubHkJAMwIAgkApAMBBQJjdgkAzAgCCQCkAwEFAmRFCQDMCAIJAKQDAQUCZEYJAMwIAgIACQDMCAIFAmFBCQDMCAIFAWgJAMwIAgkApAMBBQJkRwkAzAgCBQFpBQNuaWwFA25pbAMJAAECBQJkSQIKKEludCwgSW50KQUCZEkJAAIBCQCsAgIJAAMBCQD8BwQFAmFNAgxjYWxjUHV0WE9ubHkJAMwIAgkApAMBBQJjdgkAzAgCCQCkAwEFAmRFCQDMCAIJAKQDAQUCZEYJAMwIAgIACQDMCAIFAmFBCQDMCAIFAWgJAMwIAgkApAMBBQJkRwkAzAgCBQFpBQNuaWwFA25pbAIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQQCZEoDCQAAAgUCYlAFAmJUBQJkSAkAlAoCCAUCZEgCXzIIBQJkSAJfMQQCZEsIBQJkSgJfMQQCZEwIBQJkSgJfMgQCZE0JAQJkcgoFAmJSBQFXCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQJiVAUCZEsJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFAmJVBQJkTAAABgYHBQJjdgUCYlAEAmROCAUCZE0CXzIEAmRPCAUCZE0CXzcEAmNsCAUCZE0CXzkEAmNWCAUCZE0DXzEwBAJjVwgFAmRNA18xMQUCZE0BAmRQAAQCYXQJAKIIAQkBAU8AAwkAAQIFAmF0AgZTdHJpbmcEAmRRBQJhdAkA2QQBBQJkUQMJAAECBQJhdAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJkUgAEAmF0CQCiCAEJAQFQAAMJAAECBQJhdAIGU3RyaW5nBAJkUQUCYXQJANkEAQUCZFEDCQABAgUCYXQCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACZFMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECZFQBAmRwBAJhdAkBAmRQAAMJAAECBQJhdAIKQnl0ZVZlY3RvcgQCZFUFAmF0AwkAAAIIBQJkcA9jYWxsZXJQdWJsaWNLZXkFAmRVBgUCZFMDCQABAgUCYXQCBFVuaXQDCQAAAggFAmRwBmNhbGxlcgUEdGhpcwYFAmRTCQACAQILTWF0Y2ggZXJyb3IcAmRwAQtjb25zdHJ1Y3RvcgEBTgQCZFYJAQJkVAEFAmRwAwkAAAIFAmRWBQJkVgkAzAgCCQELU3RyaW5nRW50cnkCCQEBTgAFAU4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkcAEKc2V0TWFuYWdlcgECZFcEAmRWCQECZFQBBQJkcAMJAAACBQJkVgUCZFYEAmRYCQDZBAEFAmRXAwkAAAIFAmRYBQJkWAkAzAgCCQELU3RyaW5nRW50cnkCCQEBUAAFAmRXBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZHABDmNvbmZpcm1NYW5hZ2VyAAQCYkoJAQJkUgAEAmRZAwkBCWlzRGVmaW5lZAEFAmJKBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJkWQUCZFkEAmRaAwkAAAIIBQJkcA9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmJKBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJkWgUCZFoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU8ACQDYBAEJAQV2YWx1ZQEFAmJKCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFQAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRwAQNwdXQCAmVhAmViBAJlYwkBAmFJAAQCZWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmVjBQF5AgpXciBzdCBhZGRyBAJlZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZWMFAXoCCldyIHNsIGFkZHIDCQBmAgAABQJlYQkAAgECDldyb25nIHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUCZHAIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQCZWYJAQJkcgoJAKUIAQgFAmRwBmNhbGxlcgkA2AQBCAUCZHANdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJkcAhwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJkcAhwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZHAIcGF5bWVudHMAAQUCZWEGBwYAAAIABAJjVQgFAmVmAl8yBAJkTwgFAmVmAl83BAJjbAgFAmVmAl85BAJjVggFAmVmA18xMAQCY1cIBQJlZgNfMTEEAmJUCAUCZWYDXzEyBAJiVQgFAmVmA18xMwQCY0gJAPwHBAUCYXoCBGVtaXQJAMwIAgUCY1UFA25pbAUDbmlsAwkAAAIFAmNIBQJjSAQCZWcEAmF0BQJjSAMJAAECBQJhdAIHQWRkcmVzcwQCZWgFAmF0CQD8BwQFAmVoAgRlbWl0CQDMCAIFAmNVBQNuaWwFA25pbAUEdW5pdAMJAAACBQJlZwUCZWcEAmVpAwkAZgIFAmNWAAAJAPwHBAUCZWUCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiVAUCY1YFA25pbAUDbmlsAwkAAAIFAmVpBQJlaQQCZWoDCQBmAgUCY1cAAAkA/AcEBQJlZQIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJVBQJjVwUDbmlsBQNuaWwDCQAAAgUCZWoFAmVqBAJlawMFAmViBAJlbAkA/AcEBQJlZAIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZE8FAmNVBQNuaWwDCQAAAgUCZWwFAmVsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmRwBmNhbGxlcgUCY1UFAmRPBQNuaWwJAM4IAgUCY2wFAmVrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRwAQlwdXRPbmVUa24FAmRLAmRMAmVtAmJrAmViBAJiQgkBAmFJAAQCZWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJCBQF5AgpXciBzdCBhZGRyBAJlZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYkIFAXoCCldyIHNsIGFkZHIEAmVuCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJiQgUBQQILV3IgZ3d4IGFkZHIEAmVvCQECYUUABAJiVAkAkQMCBQJlbwUBcwQCYlUJAJEDAgUCZW8FAXQEAmJWCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZW8FAXUEAmJXCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZW8FAXYEAmVwCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQJhYgACAAQCYlIDCQAAAgUCZXAJAKUIAQgFAmRwBmNhbGxlcggFAmRwDG9yaWdpbkNhbGxlcggFAmRwBmNhbGxlcgMDAwMJAGcCAAAFAmJrBgkAZwIAAAUCZEsGCQBnAgAABQJkTAYJAGcCAAAFAmVtCQACAQIMV3JvbmcgcGFyYW1zAwkBAiE9AgkAkAMBCAUCZHAIcGF5bWVudHMAAQkAAgECCzEgcG1udCBleHBkBAJkcQkBBXZhbHVlAQkAkQMCCAUCZHAIcGF5bWVudHMAAAQCYlAJANgEAQkBBXZhbHVlAQgFAmRxB2Fzc2V0SWQEAmVxCAUCZHEGYW1vdW50BAJlcgkBAmJLAQUCZXEEAmN2CAUCZXICXzEEAmR6CAUCZXICXzIDCQBmAgCAreIEBQJlcQkAAgECDVdyb25nIHBtdCBhbXQEAmJaCQECYmMBBQJiVAQCY2IJAQJiYwEFAmJVBAJlcwMJAAACBQJiUAUCYlQDAwkAZgIFAmVxBQJiWgYJAGYCBQJkSwUCY3YJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCYCgYJAGUCBQJiWgUCZXEFAmNiCQBlAgUCY3YFAmRLBQJkTAAAAAADCQAAAgUCYlAFAmJVAwMJAGYCBQJlcQUCY2IGCQBmAgUCZEwFAmN2CQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAmAoGBQJiWgkAZQIFAmNiBQJlcQAAAAAJAGUCBQJjdgUCZEwFAmRLCQACAQIQd3JvbmcgcG10QXNzZXRJZAQCZEIIBQJlcwJfMQQCZEMIBQJlcwJfMgQCZXQIBQJlcwJfMwQCZXUIBQJlcwJfNAQCZXYIBQJlcwJfNQQCZXcIBQJlcwJfNgQCYnAJAPwHBAUCZW4CBWNhbGNECQDMCAIJAKQDAQUCZEIJAMwIAgkApAMBBQJkQwkAzAgCBQJhQQkAzAgCBQFoCQDMCAIFAWkFA25pbAUDbmlsBAJibwkA/AcEBQJlbgIFY2FsY0QJAMwIAgkApgMBCQC2AgEJAGUCCQBkAgUCZEIFAmV0BQJldwkAzAgCCQCmAwEJALYCAQkAZQIJAGQCBQJkQwUCZXYFAmV1CQDMCAIFAmFBCQDMCAIFAWgJAMwIAgUBaQUDbmlsBQNuaWwEAmV4CQECYm4DCQCnAwEJAQJhcwEFAmJvCQCnAwEJAQJhcwEFAmJwBQFnAwkAAAIFAmV4BQJleAQCZE0JAQJkcgoJAKUIAQgFAmRwBmNhbGxlcgkA2AQBCAUCZHANdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUCYlQFAmRLCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQJiVQUCZEwFAmJrBgYGBQJjdgUCYlAEAmROCAUCZE0CXzIEAmRPCAUCZE0CXzcEAmNsCAUCZE0CXzkEAmNWCAUCZE0DXzEwBAJjVwgFAmRNA18xMQQCZXkJAQJiaAMJALYCAQUCZE4JALYCAQUCZW0JALYCAQUCYmsEAmNVCQCgAwEIBQJleQJfMgQCZWYJAPwHBAUCYXoCBGVtaXQJAMwIAgUCY1UFA25pbAUDbmlsAwkAAAIFAmVmBQJlZgQCZWcEAmF0BQJlZgMJAAECBQJhdAIHQWRkcmVzcwQCZWgFAmF0CQD8BwQFAmVoAgRlbWl0CQDMCAIFAmNVBQNuaWwFA25pbAUEdW5pdAMJAAACBQJlZwUCZWcEAmVpAwkAZgIFAmNWAAAJAPwHBAUCZWUCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFAmJUBQJjVgUDbmlsBQNuaWwDCQAAAgUCZWkFAmVpBAJlagMJAGYCBQJjVwAACQD8BwQFAmVlAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQJiVQUCY1cFA25pbAUDbmlsAwkAAAIFAmVqBQJlagQCZWsDBQJlYgQCZWwJAPwHBAUCZWQCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmRPBQJjVQUDbmlsAwkAAAIFAmVsBQJlbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJkcAZjYWxsZXIFAmNVBQJkTwUDbmlsBAJlegMJAGYCBQJkegAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFEBQJkegkA2QQBBQJiUAUDbmlsBQNuaWwJAM4IAgkAzggCBQJjbAUCZWsFAmV6CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRwAQtwdXRPbmVUa25WMgICZUECZWIDCQECIT0CCQCQAwEIBQJkcAhwYXltZW50cwABCQACAQILMSBwbW50IGV4cGQEAmR4CQECYUUABAJiVAkAkQMCBQJkeAUBcwQCYlUJAJEDAgUCZHgFAXQEAmVCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZHgFAXUEAmVDCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZHgFAXYEAmJSAwkAAAIIBQJkcAZjYWxsZXIFBHRoaXMIBQJkcAxvcmlnaW5DYWxsZXIIBQJkcAZjYWxsZXIEAmRxCQEFdmFsdWUBCQCRAwIIBQJkcAhwYXltZW50cwAABAJiUAkA2AQBCQEFdmFsdWUBCAUCZHEHYXNzZXRJZAQCY3YIBQJkcQZhbW91bnQDCQBmAgCAreIEBQJjdgkAAgECDVdyb25nIHBtdCBhbXQEAmNICQECZHYEBQJjdgUCYlAJAKUIAQUCYlIJANgEAQgFAmRwDXRyYW5zYWN0aW9uSWQEAmROCAUCY0gCXzIEAmRPCAUCY0gCXzcEAmNsCAUCY0gCXzkEAmNWCAUCY0gDXzEwBAJjVwgFAmNIA18xMQQCY1UDAwkAZgIFAmVBAAAJAGYCBQJlQQUCZE4HCQACAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJlQQUDbmlsAgAFAmROBAJlZgkA/AcEBQJhegIEZW1pdAkAzAgCBQJjVQUDbmlsBQNuaWwDCQAAAgUCZWYFAmVmBAJlZwQCYXQFAmVmAwkAAQIFAmF0AgdBZGRyZXNzBAJlaAUCYXQJAPwHBAUCZWgCBGVtaXQJAMwIAgUCY1UFA25pbAUDbmlsBQR1bml0AwkAAAIFAmVnBQJlZwQCZWkDCQBmAgUCY1YAAAkA/AcEBQJhTAIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUCYlQFAmNWBQNuaWwFA25pbAMJAAACBQJlaQUCZWkEAmVqAwkAZgIFAmNXAAAJAPwHBAUCYUwCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFAmJVBQJjVwUDbmlsBQNuaWwDCQAAAgUCZWoFAmVqBAJlawMFAmViBAJlbAkA/AcEBQJhSwIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZE8FAmNVBQNuaWwDCQAAAgUCZWwFAmVsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmRwBmNhbGxlcgUCY1UFAmRPBQNuaWwJAJQKAgkAzggCBQJjbAUCZWsFAmNVCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRwARNwdXRPbmVUa25WMlJFQURPTkxZAgJlRAJlRQQCY0gJAQJkdgQFAmVEBQJlRQIAAgAEAmROCAUCY0gCXzIEAmRPCAUCY0gCXzcEAmNsCAUCY0gCXzkEAmNWCAUCY0gDXzEwBAJjVwgFAmNIA18xMQkAlAoCBQNuaWwFAmROAmRwARxwdXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJlRAJlRQQCZHgJAQJhRQAEAmJUCQCRAwIFAmR4BQFzBAJiVQkAkQMCBQJkeAUBdAQCYloJAQJiYwEFAmJUBAJjYgkBAmJjAQUCYlUEAmNICQECZHYEBQJlRAUCZUUCAAIABAJkTggFAmNIAl8yBAJjZQgFAmNIAl8zBAJlRggFAmNIAl82BAJkTwgFAmNIAl83BAJlRwMJAAACBQJlRQUCYlQEAmVICQBrAwUCZUQFAmNlBQFhCQCUCgIFAmVEBQJlSAQCZUkJAGsDBQJlRAUBYQUCY2UJAJQKAgUCZUkFAmVEBAJlSQgFAmVHAl8xBAJlSAgFAmVHAl8yBAJlSgkAawMFAmVGBQJlSAUCY2IEAmVLAwkAAAIFAmVFBQJiVAkAawMFAmVJBQFhBQJkTgkAawMFAmVIBQFhBQJkTgQCZUwJAGsDCQBkAgUCZUgFAmVJBQFhBQJlSgQCZU0JAGsDCQBlAgUCZUwFAmVLBQFhBQJlSwQCZHoICQECYksBBQJlRAJfMgkAlAoCBQNuaWwJAJUKAwUCZE4FAmR6BQJlTQJkcAEKcHV0Rm9yRnJlZQECZU4DCQBmAgAABQJlTgkAAgECCldyb25nIHNscGcDCQECIT0CCQCQAwEIBQJkcAhwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAJkTQkBAmRyCgkApQgBCAUCZHAGY2FsbGVyCQDYBAEIBQJkcA10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAmRwCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAmRwCHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQJkcAhwYXltZW50cwABBQJlTgcHBgAAAgAIBQJkTQJfOQJkcAEDZ2V0AAQCY0gJAQJkbwEFAmRwBAJlTwgFAmNIAl8xBAJjawgFAmNIAl8yBAJjdggFAmNIAl8zBAJiUAgFAmNIAl80BAJjbAgFAmNIAl81BAJlUAkA/AcEBQJhegIEYnVybgkAzAgCBQJjdgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiUAUCY3YFA25pbAMJAAACBQJlUAUCZVAFAmNsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRwAQlnZXRPbmVUa24FAmVRAmVSAmVTAmVUAmJrAwkBAiE9AgkAkAMBCAUCZHAIcGF5bWVudHMAAQkAAgECCzEgcG1udCBleHBkBAJiQgkBAmFFAAQCYlMJAJEDAgUCYkIFAXIEAmJUCQCRAwIFAmJCBQFzBAJiVQkAkQMCBQJiQgUBdAQCYlYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiQgUBdQQCYlcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiQgUBdgQCYlgJAJEDAgUCYkIFAXEEAmVjCQECYUkABAJlbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZWMFAUECCldyIHNsIGFkZHIEAmRxCQEFdmFsdWUBCQCRAwIIBQJkcAhwYXltZW50cwAABAJlcAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQECYWIAAgAEAmJSAwkAAAIFAmVwCQClCAEIBQJkcAZjYWxsZXIIBQJkcAxvcmlnaW5DYWxsZXIIBQJkcAZjYWxsZXIEAmJPCQDYBAEIBQJkcA10cmFuc2FjdGlvbklkBAJiUAkBBXZhbHVlAQgFAmRxB2Fzc2V0SWQEAmN2CAUCZHEGYW1vdW50AwkAZgIAgJTr3AMFAmN2CQACAQINTWluIHBtdCAxMCBMUAMDAwkAZgIAAAUCYmsGCQBmAgAABQJlUQYJAGYCAAAFAmVTCQACAQIMV3JvbmcgcGFyYW1zAwkBAiE9AgUCYlMJANgEAQUCYlAJAAIBAghXcm9uZyBMUAQCY0gJAQJiTgQJANgEAQgFAmRwDXRyYW5zYWN0aW9uSWQJANgEAQUCYlAFAmN2CAUCZHAGY2FsbGVyBAJlVQgFAmNIAl8xBAJlVggFAmNIAl8yBAJiWgkBAmJjAQUCYlQEAmNiCQECYmMBBQJiVQQCZVcDCQAAAgUCZVQFAmJUCQCZCgcJAGUCBQJiWgUCZVUJAGUCBQJjYgUCZVYFAmVRBQJlVgAAAAAJAGQCBQJlVQUCZVEDCQAAAgUCZVQFAmJVCQCZCgcJAGUCBQJiWgUCZVUJAGUCBQJjYgUCZVYAAAAABQJlUQUCZVUJAGQCBQJlVgUCZVEJAAIBAhB3cm9uZyBvdXRBc3NldElkBAJkQggFAmVXAl8xBAJkQwgFAmVXAl8yBAJldAgFAmVXAl8zBAJldQgFAmVXAl80BAJldggFAmVXAl81BAJldwgFAmVXAl82BAJlWAgFAmVXAl83AwMJAGYCAAAFAmV0BgkAZgIAAAUCZXYJAAIBAgpXcm9uZyBjYWxjBAJicAkA/AcEBQJlbgIFY2FsY0QJAMwIAgkApAMBBQJkQgkAzAgCCQCkAwEFAmRDCQDMCAIFAmFBCQDMCAIFAWgJAMwIAgUBaQUDbmlsBQNuaWwEAmJvCQD8BwQFAmVuAgVjYWxjRAkAzAgCCQCkAwEJAGQCCQBlAgUCZEIFAmV0BQJldwkAzAgCCQCkAwEJAGUCCQBkAgUCZEMFAmV1BQJldgkAzAgCBQJhQQkAzAgCBQFoCQDMCAIFAWkFA25pbAUDbmlsBAJleAkBAmJuAwkApwMBCQECYXMBBQJibwkApwMBCQECYXMBBQJicAUBZwMJAAACBQJleAUCZXgEAmVZCAkBAmJLAQUCZVgCXzEEAmVaCQECYmgDCQC2AgEFAmVZCQC2AgEFAmVTCQC2AgEFAmJrAwkAAAIFAmVaBQJlWgQCZmEDCQAAAgUCZVQFAmJUCQCUCgIJAKADAQgFAmVaAl8yAAAJAJQKAgAACQCgAwEIBQJlWgJfMgQCZmIIBQJmYQJfMQQCZmMIBQJmYQJfMgQCZmQJAGQCBQJmYgUCZmMEAmR6CQBlAgUCZVgFAmVZBAJmZQMJAAACBQJlVAIFV0FWRVMFBHVuaXQJANkEAQUCZVQEAmV6AwkAZgIFAmR6AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYUQFAmR6BQJmZQUDbmlsBQNuaWwEAmZmCQECYmUCCQEBQwIFAmNiBQJiVwkBAUMCBQJiWgUCYlYEAmZnCQEBRgIFAmZmBQFhBAJjbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiUgUCZmQFAmZlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFYAgkApQgBBQJiUgUCYk8JAQJhWQYFAmZiBQJmYwUCY3YFAmZnBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQAFAmZnCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmZnBQNuaWwDCQAAAgUCY2wFAmNsBAJmaAkA/AcEBQJhegIEYnVybgkAzAgCBQJjdgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiUAUCY3YFA25pbAMJAAACBQJmaAUCZmgJAM4IAgUCY2wFAmV6CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRwAQtnZXRPbmVUa25WMgICZVQCZUEDCQECIT0CCQCQAwEIBQJkcAhwYXltZW50cwABCQACAQILMSBwbW50IGV4cGQEAmR4CQECYUUABAJiUwkAkQMCBQJkeAUBcgQCYlQJAJEDAgUCZHgFAXMEAmJVCQCRAwIFAmR4BQF0BAJlQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmR4BQF1BAJlQwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmR4BQF2BAJmaQkAkQMCBQJkeAUBcQQCYlIDCQAAAggFAmRwBmNhbGxlcgUEdGhpcwgFAmRwDG9yaWdpbkNhbGxlcggFAmRwBmNhbGxlcgQCZHEJAQV2YWx1ZQEJAJEDAggFAmRwCHBheW1lbnRzAAAEAmJQCQEFdmFsdWUBCAUCZHEHYXNzZXRJZAQCY3YIBQJkcQZhbW91bnQDCQBmAgCAlOvcAwUCY3YJAAIBAg1NaW4gcG10IDEwIExQBAJiTwkA2AQBCAUCZHANdHJhbnNhY3Rpb25JZAMJAQIhPQIFAmJTCQDYBAEFAmJQCQACAQIIV3JvbmcgTFAEAmJaCQECYmMBBQJiVAQCY2IJAQJiYwEFAmJVBAJlWQoAAmRJCQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZVQJAMwIAgUCY3YFA25pbAUDbmlsAwkAAQIFAmRJAgNJbnQFAmRJCQACAQkArAICCQADAQkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmVUCQDMCAIFAmN2BQNuaWwFA25pbAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAJmZAMDCQBmAgUCZUEAAAkAZgIFAmVBBQJlWQcJAAIBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmVBBQNuaWwCAAUCZVkEAmZqAwkAAAIFAmVUBQJiVAkAlAoCBQJmZAAACQCUCgIAAAUCZmQEAmZiCAUCZmoCXzEEAmZjCAUCZmoCXzIEAmZmCQECYmUCCQEBQwIFAmNiBQJlQwkBAUMCBQJiWgUCZUIEAmZnCQEBRgIFAmZmBQFhBAJjbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiUgUCZmQDCQAAAgUCZVQCBVdBVkVTBQR1bml0CQDZBAEFAmVUCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFYAgkApQgBBQJiUgUCYk8JAQJhWQYFAmZiBQJmYwUCY3YFAmZnBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQAFAmZnCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmZnBQNuaWwDCQAAAgUCY2wFAmNsBAJmaAkA/AcEBQJhegIEYnVybgkAzAgCBQJjdgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiUAUCY3YFA25pbAMJAAACBQJmaAUCZmgJAJQKAgUCY2wFAmZkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRwARNnZXRPbmVUa25WMlJFQURPTkxZAgJlVAJmawQCZHgJAQJhRQAEAmJTCQCRAwIFAmR4BQFyBAJiVAkAkQMCBQJkeAUBcwQCYlUJAJEDAgUCZHgFAXQEAmNICQECYk4EAgAFAmJTBQJmawUEdGhpcwQCZVUIBQJjSAJfMQQCZVYIBQJjSAJfMgQCYloJAQJiYwEFAmJUBAJjYgkBAmJjAQUCYlUEAmRCCQBlAgUCYloFAmVVBAJkQwkAZQIFAmNiBQJlVgQCZmwDCQAAAgUCZVQFAmJUCQCVCgMFAmRDBQJkQgUCZVYDCQAAAgUCZVQFAmJVCQCVCgMFAmRCBQJkQwUCZVUJAAIBAhB3cm9uZyBvdXRBc3NldElkBAJmbQgFAmZsAl8xBAJmbggFAmZsAl8yBAJmbwgFAmZsAl8zBAJmcAABBAJlUQoAAmRJCQD8BwQFAmFNAgxjYWxjU3dhcFhUb1kJAMwIAgkApAMBBQJmbwkAzAgCCQCkAwEFAmZtCQDMCAIJAKQDAQUCZm4JAMwIAgIACQDMCAIFAmFBCQDMCAIFAWgJAMwIAgkApAMBBQJmcAkAzAgCBQFpBQNuaWwFA25pbAMJAAECBQJkSQIDSW50BQJkSQkAAgEJAKwCAgkAAwEJAPwHBAUCYU0CDGNhbGNTd2FwWFRvWQkAzAgCCQCkAwEFAmZvCQDMCAIJAKQDAQUCZm0JAMwIAgkApAMBBQJmbgkAzAgCAgAJAMwIAgUCYUEJAMwIAgUBaAkAzAgCCQCkAwEFAmZwCQDMCAIFAWkFA25pbAUDbmlsAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEAmVYCQBkAgUCZVEDCQAAAgUCZVQFAmJUBQJlVQUCZVYEAmZxCQECYksBBQJlWAQCZVkIBQJmcQJfMQQCZHoIBQJmcQJfMgkAlAoCBQNuaWwJAJQKAgUCZVkFAmR6AmRwARxnZXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJlVAJmawQCZHgJAQJhRQAEAmJUCQCRAwIFAmR4BQFzBAJiVQkAkQMCBQJkeAUBdAQCYlMJAJEDAgUCZHgFAXIEAmJaCQECYmMBBQJiVAQCY2IJAQJiYwEFAmJVBAJmcgoAAmRJCQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZVQJAMwIAgUCZmsFA25pbAUDbmlsAwkAAQIFAmRJAgooSW50LCBJbnQpBQJkSQkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQJlVAkAzAgCBQJmawUDbmlsBQNuaWwCHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkEAmVZCAUCZnICXzEEAmR6CAUCZnICXzIEAmNICQECYk4EAgAFAmJTBQJmawUEdGhpcwQCY2oIBQJjSAJfMQQCY2sIBQJjSAJfMgQCZUsJAGsDBQJlWQUBYQUCZmsEAmVMCQBrAwkAZAIFAmNqBQJjawUBYQUCZmsEAmVNCQBrAwkAZQIFAmVLBQJlTAUBYQUCZUwJAJQKAgUDbmlsCQCVCgMFAmVZBQJkegUCZU0CZHABCWdldE5vTGVzcwICZnMCZnQEAmNICQECZG8BBQJkcAQCY2oIBQJjSAJfMQQCY2sIBQJjSAJfMgQCY3YIBQJjSAJfMwQCYlAIBQJjSAJfNAQCY2wIBQJjSAJfNQMJAGYCBQJmcwUCY2oJAAIBCQCsAgIJAKwCAgkArAICAglGYWlsZWQ6ICAJAKQDAQUCY2oCAyA8IAkApAMBBQJmcwMJAGYCBQJmdAUCY2sJAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQJjawIDIDwgCQCkAwEFAmZ0BAJmdQkA/AcEBQJhegIEYnVybgkAzAgCBQJjdgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiUAUCY3YFA25pbAMJAAACBQJmdQUCZnUFAmNsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRwAQ11bnN0YWtlQW5kR2V0AQJiTAQCZnYDCQECIT0CCQCQAwEIBQJkcAhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCZnYFAmZ2BAJiQgkBAmFFAAQCZncJAQJhSQAEAmRPCQDZBAEJAJEDAgUCYkIFAXIEAmZ4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJmdwUBeQIKV3Igc3QgYWRkcgQCZnkJAPwHBAUCZngCB3Vuc3Rha2UJAMwIAgkA2AQBBQJkTwkAzAgCBQJiTAUDbmlsBQNuaWwDCQAAAgUCZnkFAmZ5BAJjSAkBAmJOBAkA2AQBCAUCZHANdHJhbnNhY3Rpb25JZAkA2AQBBQJkTwUCYkwIBQJkcAZjYWxsZXIEAmJYCQENcGFyc2VJbnRWYWx1ZQEIBQJjSAJfOQQCY2wIBQJjSANfMTAEAmZ6AwMJAQJhQgAGCQAAAgUCYlgFAW8JAAIBCQCsAgICCUJsb2NrZWQ6IAkApAMBBQJiWAYDCQAAAgUCZnoFAmZ6BAJmQQkA/AcEBQJhegIEYnVybgkAzAgCBQJiTAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkTwUCYkwFA25pbAMJAAACBQJmQQUCZkEFAmNsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRwARN1bnN0YWtlQW5kR2V0T25lVGtuBAJiTAJlUwJlVAJiawQCZnYDCQECIT0CCQCQAwEIBQJkcAhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCZnYFAmZ2BAJiQgkBAmFFAAQCZncJAQJhSQAEAmRPCQDZBAEJAJEDAgUCYkIFAXIEAmZ4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJmdwUBeQIKV3Igc3QgYWRkcgQCZnkJAPwHBAUCZngCB3Vuc3Rha2UJAMwIAgkA2AQBBQJkTwkAzAgCBQJiTAUDbmlsBQNuaWwDCQAAAgUCZnkFAmZ5BAJmQgoAAmRJCQD8BwQFBHRoaXMCC2dldE9uZVRrblYyCQDMCAIFAmVTCQDMCAIFAmVUCQDMCAIFAmJrBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmRPBQJiTAUDbmlsAwkAAQIFAmRJAgNJbnQFAmRJBQR1bml0AwkAAAIFAmZCBQJmQgkAlAoCBQNuaWwFAmZCCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRwAQhhY3RpdmF0ZQICZkMCZkQDCQECIT0CCQClCAEIBQJkcAZjYWxsZXIJAKUIAQUCYXoJAAIBAgZkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWQAFAmZDCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFaAAUCZkQFA25pbAIHc3VjY2VzcwJkcAEEc2V0UwICZkUCZnoDCQECIT0CCQClCAEIBQJkcAZjYWxsZXIJAQJhdgIFBHRoaXMJAQJhYgAFAmRTCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmZFBQJmegUDbmlsAmRwAQRzZXRJAgJmRQJmegMJAQIhPQIJAKUIAQgFAmRwBmNhbGxlcgkBAmF2AgUEdGhpcwkBAmFiAAUCZFMJAMwIAgkBDEludGVnZXJFbnRyeQIFAmZFBQJmegUDbmlsAmRwARxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZAAkAlAoCBQNuaWwJAQJhRQACZHABHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkBAmJkCQCUCgIFA25pbAkBAmJjAQUCYmQCZHABGWNhbGNQcmljZXNXcmFwcGVyUkVBRE9OTFkDAmJ2AmJ3AmJBBAJmRgkBAmJ6AwUCYnYFAmJ3BQJiQQkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFAmZGAAAJAMwIAgkApgMBCQCRAwIFAmZGAAEJAMwIAgkApgMBCQCRAwIFAmZGAAIFA25pbAJkcAEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIBRwJmRwkAlAoCBQNuaWwJAQFGAgkApwMBBQFHBQJmRwJkcAEUdG9YMThXcmFwcGVyUkVBRE9OTFkCAUQBRQkAlAoCBQNuaWwJAKYDAQkBAUMCBQFEBQFFAmRwAR5jYWxjUHJpY2VCaWdJbnRXcmFwcGVyUkVBRE9OTFkCAmJmAmJnCQCUCgIFA25pbAkApgMBCQECYmUCCQCnAwEFAmJmCQCnAwEFAmJnAmRwASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkCYk8CYmsCY24CY28CY3ACY3ECZkgCY3ICY3MJAJQKAgUDbmlsCQECY20NBQJiTwUCYmsFAmNuBQJjbwUCY3AFAmNxBQJmSAUCY3IFAmNzBgcAAAIAAmRwASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQCYk8CZkkCYlECZkgEAmNICQECYk4EBQJiTwUCZkkFAmJRCQERQGV4dHJOYXRpdmUoMTA2MikBBQJmSAkAlAoCBQNuaWwJAJwKCggFAmNIAl8xCAUCY0gCXzIIBQJjSAJfMwgFAmNIAl80CAUCY0gCXzUIBQJjSAJfNggFAmNIAl83CQCmAwEIBQJjSAJfOAgFAmNIAl85CAUCY0gDXzEwAQJmSgECZksABAJmTAQCYXQJAQJkUAADCQABAgUCYXQCCkJ5dGVWZWN0b3IEAmRVBQJhdAUCZFUDCQABAgUCYXQCBFVuaXQIBQJmSg9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgQCYXQFAmZKAwkAAQIFAmF0AgVPcmRlcgQCZGMFAmF0BAJmTQkBAmFDAAQCZk4JAQJkYgEFAmRjBAJmTwkA9AMDCAUCZGMJYm9keUJ5dGVzCQCRAwIIBQJkYwZwcm9vZnMAAAgFAmRjD3NlbmRlclB1YmxpY0tleQQCZlAJAPQDAwgFAmRjCWJvZHlCeXRlcwkAkQMCCAUCZGMGcHJvb2ZzAAEFAmZNAwMDBQJmTgUCZk8HBQJmUAcGCQECYW8DBQJmTgUCZk8FAmZQAwkAAQIFAmF0AhRTZXRTY3JpcHRUcmFuc2FjdGlvbgQCZFEFAmF0BAJmUQkA9gMBCQEFdmFsdWUBCAUCZFEGc2NyaXB0BAJmUgkA2wQBCQEFdmFsdWUBCQCdCAIFAmF6CQECYW0ABAJmUwkA8QcBBQR0aGlzAwMJAAACBQJmUgUCZlEJAQIhPQIFAmZTBQJmUQcGCQD0AwMIBQJmSglib2R5Qnl0ZXMJAJEDAggFAmZKBnByb29mcwAABQJmTAkA9AMDCAUCZkoJYm9keUJ5dGVzCQCRAwIIBQJmSgZwcm9vZnMAAAUCZkznD0D6", "chainId": 84, "height": 2231810, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8gucaChBSFXFe1PoPkeLAq4infA5CfyA6N4P6WD23PQf Next: 6UsuFaZNWUaeRdn9gxRU2Mid97XP6sfp36AXoGZaqY2C Diff:
OldNewDifferences
170170 func gfc () = split(strf(fca, fcfg()), SEP)
171171
172172
173+let factoryConfig = gfc()
174+
175+let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
176+
177+let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
178+
179+let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
180+
173181 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
174182
175183
231239 }
232240
233241
242+func takeFee (amount) = {
243+ let fee = fraction(amount, feePermille, thousand)
244+ $Tuple2((amount - fee), fee)
245+ }
246+
247+
234248 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
235249 let cfg = gpc()
236250 let lpId = cfg[idxLPAsId]
267281 }
268282
269283
270-func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,pmtAmt,pmtId) = {
284+func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
271285 let cfg = gpc()
272286 let lpId = fromBase58String(cfg[idxLPAsId])
273287 let amIdStr = cfg[idxAmAsId]
312326 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
313327 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
314328 let slippageX18 = t1(slippage, scale8)
315- if (if ((curPriceX18 != zeroBigInt))
329+ if (if (if (validateSlippage)
330+ then (curPriceX18 != zeroBigInt)
331+ else false)
316332 then (slippageRealX18 > slippageX18)
317333 else false)
318334 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
342358 else calcLpAmt
343359 let amDiff = (inAmAmt - calcAmAssetPmt)
344360 let prDiff = (inPrAmt - calcPrAssetPmt)
345- let $t01568216027 = if (if (isOneAsset)
361+ let $t01627116616 = if (if (isOneAsset)
346362 then (pmtId == amIdStr)
347363 else false)
348364 then $Tuple2(pmtAmt, 0)
351367 else false)
352368 then $Tuple2(0, pmtAmt)
353369 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
354- let writeAmAmt = $t01568216027._1
355- let writePrAmt = $t01568216027._2
370+ let writeAmAmt = $t01627116616._1
371+ let writePrAmt = $t01627116616._2
356372 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
357373 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
358374 }
423439 }
424440
425441
426-func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,pmtAmt,pmtId) = {
427- let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, pmtAmt, pmtId)
442+func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
443+ let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
428444 let sts = parseIntValue(r._8)
429445 if (if (if (igs())
430446 then true
436452 }
437453
438454
439-func takeFee (amount) = {
440- let fee = fraction(amount, feePermille, thousand)
441- $Tuple2((amount - fee), fee)
455+func estimatePutOneTknV2 (pmtAmtRaw,pmtAssetId,userAddress,txId) = {
456+ let poolConfig = gpc()
457+ let amId = poolConfig[idxAmAsId]
458+ let prId = poolConfig[idxPrAsId]
459+ let amBalance = getAccBalance(amId)
460+ let prBalance = getAccBalance(prId)
461+ let $t02094220987 = takeFee(pmtAmtRaw)
462+ let pmtAmt = $t02094220987._1
463+ let feeAmount = $t02094220987._2
464+ let $t02099121452 = if ((txId == ""))
465+ then $Tuple2(amBalance, prBalance)
466+ else if ((pmtAssetId == amId))
467+ then if ((pmtAmtRaw > amBalance))
468+ then throw("invalid payment amount")
469+ else $Tuple2((amBalance - pmtAmtRaw), prBalance)
470+ else if ((pmtAssetId == prId))
471+ then if ((pmtAmtRaw > prBalance))
472+ then throw("invalid payment amount")
473+ else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
474+ else throw("wrong pmtAssetId")
475+ let amBalanceNow = $t02099121452._1
476+ let prBalanceNow = $t02099121452._2
477+ let $t02145621590 = if ((pmtAssetId == amId))
478+ then $Tuple2(amBalanceNow, prBalanceNow)
479+ else $Tuple2(prBalanceNow, amBalanceNow)
480+ let amBalanceForCalc = $t02145621590._1
481+ let prBalanceForCalc = $t02145621590._2
482+ let xPrecision = 1
483+ let result = {
484+ let @ = invoke(gwxContract, "calcPutXOnly", [toString(pmtAmt), toString(amBalanceForCalc), toString(prBalanceForCalc), "", A, Amult, toString(xPrecision), Dconv], nil)
485+ if ($isInstanceOf(@, "(Int, Int)"))
486+ then @
487+ else throw(($getType(invoke(gwxContract, "calcPutXOnly", [toString(pmtAmt), toString(amBalanceForCalc), toString(prBalanceForCalc), "", A, Amult, toString(xPrecision), Dconv], nil)) + " couldn't be cast to (Int, Int)"))
488+ }
489+ let $t02205922155 = if ((pmtAssetId == amId))
490+ then result
491+ else $Tuple2(result._2, result._1)
492+ let amAssetPart = $t02205922155._1
493+ let prAssetPart = $t02205922155._2
494+ let estPut = cp(userAddress, txId, AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), 0, true, true, false, pmtAmt, pmtAssetId)
495+ let estimLP = estPut._2
496+ let lpAssetId = estPut._7
497+ let state = estPut._9
498+ let amDiff = estPut._10
499+ let prDiff = estPut._11
500+ estPut
442501 }
443502
444503
533592 else if ((size(i.payments) != 2))
534593 then throw("2 pmnts expd")
535594 else {
536- let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, 0, "")
595+ let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, true, 0, "")
537596 let emitLpAmt = e._2
538597 let lpAssetId = e._7
539598 let state = e._9
613672 let pmt = value(i.payments[0])
614673 let pmtAssetId = toBase58String(value(pmt.assetId))
615674 let paymentAmountRaw = pmt.amount
616- let $t02464424696 = takeFee(paymentAmountRaw)
617- let pmtAmt = $t02464424696._1
618- let feeAmount = $t02464424696._2
675+ let $t02712527177 = takeFee(paymentAmountRaw)
676+ let pmtAmt = $t02712527177._1
677+ let feeAmount = $t02712527177._2
619678 if ((10000000 > paymentAmountRaw))
620679 then throw("Wrong pmt amt")
621680 else {
622681 let amBalance = getAccBalance(amId)
623682 let prBalance = getAccBalance(prId)
624- let $t02485625472 = if ((pmtAssetId == amId))
683+ let $t02733727953 = if ((pmtAssetId == amId))
625684 then if (if ((paymentAmountRaw > amBalance))
626685 then true
627686 else (amAssetPart > pmtAmt))
634693 then throw("invalid payment amount")
635694 else $Tuple6(amBalance, (prBalance - paymentAmountRaw), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
636695 else throw("wrong pmtAssetId")
637- let amBalanceNow = $t02485625472._1
638- let prBalanceNow = $t02485625472._2
639- let virtSwapInAm = $t02485625472._3
640- let virtSwapOutPr = $t02485625472._4
641- let virtSwapInPr = $t02485625472._5
642- let virtSwapOutAm = $t02485625472._6
696+ let amBalanceNow = $t02733727953._1
697+ let prBalanceNow = $t02733727953._2
698+ let virtSwapInAm = $t02733727953._3
699+ let virtSwapOutPr = $t02733727953._4
700+ let virtSwapInPr = $t02733727953._5
701+ let virtSwapOutAm = $t02733727953._6
643702 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
644703 let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
645704 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
646705 if ((D0vsD1 == D0vsD1))
647706 then {
648- let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
707+ let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, true, pmtAmt, pmtAssetId)
649708 let estimLP = estPut._2
650709 let lpAssetId = estPut._7
651710 let state = estPut._9
703762
704763
705764 @Callable(i)
765+func putOneTknV2 (minOutAmount,autoStake) = if ((size(i.payments) != 1))
766+ then throw("1 pmnt expd")
767+ else {
768+ let poolConfig = gpc()
769+ let amId = poolConfig[idxAmAsId]
770+ let prId = poolConfig[idxPrAsId]
771+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
772+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
773+ let userAddress = if ((i.caller == this))
774+ then i.originCaller
775+ else i.caller
776+ let pmt = value(i.payments[0])
777+ let pmtAssetId = toBase58String(value(pmt.assetId))
778+ let pmtAmt = pmt.amount
779+ if ((10000000 > pmtAmt))
780+ then throw("Wrong pmt amt")
781+ else {
782+ let r = estimatePutOneTknV2(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
783+ let estimLP = r._2
784+ let lpAssetId = r._7
785+ let state = r._9
786+ let amDiff = r._10
787+ let prDiff = r._11
788+ let emitLpAmt = if (if ((minOutAmount > 0))
789+ then (minOutAmount > estimLP)
790+ else false)
791+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
792+ else estimLP
793+ let e = invoke(fca, "emit", [emitLpAmt], nil)
794+ if ((e == e))
795+ then {
796+ let el = match e {
797+ case legacy: Address =>
798+ invoke(legacy, "emit", [emitLpAmt], nil)
799+ case _ =>
800+ unit
801+ }
802+ if ((el == el))
803+ then {
804+ let sa = if ((amDiff > 0))
805+ then invoke(slipageContract, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
806+ else nil
807+ if ((sa == sa))
808+ then {
809+ let sp = if ((prDiff > 0))
810+ then invoke(slipageContract, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
811+ else nil
812+ if ((sp == sp))
813+ then {
814+ let lpTrnsfr = if (autoStake)
815+ then {
816+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
817+ if ((ss == ss))
818+ then nil
819+ else throw("Strict value is not equal to itself.")
820+ }
821+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
822+ $Tuple2((state ++ lpTrnsfr), emitLpAmt)
823+ }
824+ else throw("Strict value is not equal to itself.")
825+ }
826+ else throw("Strict value is not equal to itself.")
827+ }
828+ else throw("Strict value is not equal to itself.")
829+ }
830+ else throw("Strict value is not equal to itself.")
831+ }
832+ }
833+
834+
835+
836+@Callable(i)
837+func putOneTknV2READONLY (paymentAmount,paymentAssetId) = {
838+ let r = estimatePutOneTknV2(paymentAmount, paymentAssetId, "", "")
839+ let estimLP = r._2
840+ let lpAssetId = r._7
841+ let state = r._9
842+ let amDiff = r._10
843+ let prDiff = r._11
844+ $Tuple2(nil, estimLP)
845+ }
846+
847+
848+
849+@Callable(i)
850+func putOneTknV2WithBonusREADONLY (paymentAmount,paymentAssetId) = {
851+ let poolConfig = gpc()
852+ let amId = poolConfig[idxAmAsId]
853+ let prId = poolConfig[idxPrAsId]
854+ let amBalance = getAccBalance(amId)
855+ let prBalance = getAccBalance(prId)
856+ let r = estimatePutOneTknV2(paymentAmount, paymentAssetId, "", "")
857+ let estimLP = r._2
858+ let curPrice = r._3
859+ let lpAssetEmission = r._6
860+ let lpAssetId = r._7
861+ let $t03278033089 = if ((paymentAssetId == amId))
862+ then {
863+ let priceAssetAmount = fraction(paymentAmount, curPrice, scale8)
864+ $Tuple2(paymentAmount, priceAssetAmount)
865+ }
866+ else {
867+ let amountAssetAmount = fraction(paymentAmount, scale8, curPrice)
868+ $Tuple2(amountAssetAmount, paymentAmount)
869+ }
870+ let amountAssetAmount = $t03278033089._1
871+ let priceAssetAmount = $t03278033089._2
872+ let lpAmtBoth = fraction(lpAssetEmission, priceAssetAmount, prBalance)
873+ let lpAssetPriceOne = if ((paymentAssetId == amId))
874+ then fraction(amountAssetAmount, scale8, estimLP)
875+ else fraction(priceAssetAmount, scale8, estimLP)
876+ let lpAssetPriceBoth = fraction((priceAssetAmount + amountAssetAmount), scale8, lpAmtBoth)
877+ let bonus = fraction((lpAssetPriceBoth - lpAssetPriceOne), scale8, lpAssetPriceOne)
878+ let feeAmount = takeFee(paymentAmount)._2
879+ $Tuple2(nil, $Tuple3(estimLP, feeAmount, bonus))
880+ }
881+
882+
883+
884+@Callable(i)
706885 func putForFree (maxSlpg) = if ((0 > maxSlpg))
707886 then throw("Wrong slpg")
708887 else if ((size(i.payments) != 2))
709888 then throw("2 pmnts expd")
710889 else {
711- let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, 0, "")
890+ let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, true, 0, "")
712891 estPut._9
713892 }
714893
767946 let estimPrAmt = r._2
768947 let amBalance = getAccBalance(amId)
769948 let prBalance = getAccBalance(prId)
770- let $t03041530875 = if ((outAssetId == amId))
949+ let $t03637036830 = if ((outAssetId == amId))
771950 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
772951 else if ((outAssetId == prId))
773952 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
774953 else throw("wrong outAssetId")
775- let amBalanceNow = $t03041530875._1
776- let prBalanceNow = $t03041530875._2
777- let virtSwapInAm = $t03041530875._3
778- let virtSwapOutPr = $t03041530875._4
779- let virtSwapInPr = $t03041530875._5
780- let virtSwapOutAm = $t03041530875._6
781- let totalGetRaw = $t03041530875._7
954+ let amBalanceNow = $t03637036830._1
955+ let prBalanceNow = $t03637036830._2
956+ let virtSwapInAm = $t03637036830._3
957+ let virtSwapOutPr = $t03637036830._4
958+ let virtSwapInPr = $t03637036830._5
959+ let virtSwapOutAm = $t03637036830._6
960+ let totalGetRaw = $t03637036830._7
782961 if (if ((0 > virtSwapInAm))
783962 then true
784963 else (0 > virtSwapInPr))
793972 let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
794973 if ((finalRes == finalRes))
795974 then {
796- let $t03162231726 = if ((outAssetId == amId))
975+ let $t03757737681 = if ((outAssetId == amId))
797976 then $Tuple2(toInt(finalRes._2), 0)
798977 else $Tuple2(0, toInt(finalRes._2))
799- let outAm = $t03162231726._1
800- let outPr = $t03162231726._2
978+ let outAm = $t03757737681._1
979+ let outPr = $t03757737681._2
801980 let totalAmount = (outAm + outPr)
802981 let feeAmount = (totalGetRaw - totalGet)
803982 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
8241003 }
8251004 }
8261005 }
1006+
1007+
1008+
1009+@Callable(i)
1010+func getOneTknV2 (outAssetId,minOutAmount) = if ((size(i.payments) != 1))
1011+ then throw("1 pmnt expd")
1012+ else {
1013+ let poolConfig = gpc()
1014+ let lpId = poolConfig[idxLPAsId]
1015+ let amId = poolConfig[idxAmAsId]
1016+ let prId = poolConfig[idxPrAsId]
1017+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
1018+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
1019+ let poolStatus = poolConfig[idxPoolSt]
1020+ let userAddress = if ((i.caller == this))
1021+ then i.originCaller
1022+ else i.caller
1023+ let pmt = value(i.payments[0])
1024+ let pmtAssetId = value(pmt.assetId)
1025+ let pmtAmt = pmt.amount
1026+ if ((1000000000 > pmtAmt))
1027+ then throw("Min pmt 10 LP")
1028+ else {
1029+ let txId58 = toBase58String(i.transactionId)
1030+ if ((lpId != toBase58String(pmtAssetId)))
1031+ then throw("Wrong LP")
1032+ else {
1033+ let amBalance = getAccBalance(amId)
1034+ let prBalance = getAccBalance(prId)
1035+ let totalGet = {
1036+ let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
1037+ if ($isInstanceOf(@, "Int"))
1038+ then @
1039+ else throw(($getType(invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)) + " couldn't be cast to Int"))
1040+ }
1041+ let totalAmount = if (if ((minOutAmount > 0))
1042+ then (minOutAmount > totalGet)
1043+ else false)
1044+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
1045+ else totalGet
1046+ let $t03977539862 = if ((outAssetId == amId))
1047+ then $Tuple2(totalAmount, 0)
1048+ else $Tuple2(0, totalAmount)
1049+ let outAm = $t03977539862._1
1050+ let outPr = $t03977539862._2
1051+ let curPrX18 = cpbi(t1(prBalance, prDecimals), t1(amBalance, amDecimals))
1052+ let curPr = f1(curPrX18, scale8)
1053+ let state = [ScriptTransfer(userAddress, totalAmount, if ((outAssetId == "WAVES"))
1054+ then unit
1055+ else fromBase58String(outAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
1056+ if ((state == state))
1057+ then {
1058+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
1059+ if ((burn == burn))
1060+ then $Tuple2(state, totalAmount)
1061+ else throw("Strict value is not equal to itself.")
1062+ }
1063+ else throw("Strict value is not equal to itself.")
1064+ }
1065+ }
1066+ }
1067+
1068+
1069+
1070+@Callable(i)
1071+func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
1072+ let poolConfig = gpc()
1073+ let lpId = poolConfig[idxLPAsId]
1074+ let amId = poolConfig[idxAmAsId]
1075+ let prId = poolConfig[idxPrAsId]
1076+ let r = ego("", lpId, lpAssetAmount, this)
1077+ let estimAmAmt = r._1
1078+ let estimPrAmt = r._2
1079+ let amBalance = getAccBalance(amId)
1080+ let prBalance = getAccBalance(prId)
1081+ let amBalanceNow = (amBalance - estimAmAmt)
1082+ let prBalanceNow = (prBalance - estimPrAmt)
1083+ let $t04095641227 = if ((outAssetId == amId))
1084+ then $Tuple3(prBalanceNow, amBalanceNow, estimPrAmt)
1085+ else if ((outAssetId == prId))
1086+ then $Tuple3(amBalanceNow, prBalanceNow, estimAmAmt)
1087+ else throw("wrong outAssetId")
1088+ let amountBalanceForSwap = $t04095641227._1
1089+ let priceBalanceForSwap = $t04095641227._2
1090+ let amountToSwap = $t04095641227._3
1091+ let yPrecision = 1
1092+ let exchResult = {
1093+ let @ = invoke(gwxContract, "calcSwapXToY", [toString(amountToSwap), toString(amountBalanceForSwap), toString(priceBalanceForSwap), "", A, Amult, toString(yPrecision), Dconv], nil)
1094+ if ($isInstanceOf(@, "Int"))
1095+ then @
1096+ else throw(($getType(invoke(gwxContract, "calcSwapXToY", [toString(amountToSwap), toString(amountBalanceForSwap), toString(priceBalanceForSwap), "", A, Amult, toString(yPrecision), Dconv], nil)) + " couldn't be cast to Int"))
1097+ }
1098+ let totalGetRaw = (exchResult + (if ((outAssetId == amId))
1099+ then estimAmAmt
1100+ else estimPrAmt))
1101+ let $t04179941848 = takeFee(totalGetRaw)
1102+ let totalGet = $t04179941848._1
1103+ let feeAmount = $t04179941848._2
1104+ $Tuple2(nil, $Tuple2(totalGet, feeAmount))
1105+ }
1106+
1107+
1108+
1109+@Callable(i)
1110+func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
1111+ let poolConfig = gpc()
1112+ let amId = poolConfig[idxAmAsId]
1113+ let prId = poolConfig[idxPrAsId]
1114+ let lpId = poolConfig[idxLPAsId]
1115+ let amBalance = getAccBalance(amId)
1116+ let prBalance = getAccBalance(prId)
1117+ let $t04219242307 = {
1118+ let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
1119+ if ($isInstanceOf(@, "(Int, Int)"))
1120+ then @
1121+ else throw(($getType(invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)) + " couldn't be cast to (Int, Int)"))
1122+ }
1123+ let totalGet = $t04219242307._1
1124+ let feeAmount = $t04219242307._2
1125+ let r = ego("", lpId, lpAssetAmount, this)
1126+ let outAmAmt = r._1
1127+ let outPrAmt = r._2
1128+ let lpAssetPriceOne = fraction(totalGet, scale8, lpAssetAmount)
1129+ let lpAssetPriceBoth = fraction((outAmAmt + outPrAmt), scale8, lpAssetAmount)
1130+ let bonus = fraction((lpAssetPriceOne - lpAssetPriceBoth), scale8, lpAssetPriceBoth)
1131+ $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
1132+ }
8271133
8281134
8291135
8881194
8891195
8901196 @Callable(i)
1197+func unstakeAndGetOneTkn (amount,outAmount,outAssetId,slippage) = {
1198+ let checkPayments = if ((size(i.payments) != 0))
1199+ then throw("No pmnts expd")
1200+ else true
1201+ if ((checkPayments == checkPayments))
1202+ then {
1203+ let cfg = gpc()
1204+ let factoryCfg = gfc()
1205+ let lpAssetId = fromBase58String(cfg[idxLPAsId])
1206+ let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
1207+ let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
1208+ if ((unstakeInv == unstakeInv))
1209+ then {
1210+ let outAmountResult = {
1211+ let @ = invoke(this, "getOneTknV2", [outAmount, outAssetId, slippage], [AttachedPayment(lpAssetId, amount)])
1212+ if ($isInstanceOf(@, "Int"))
1213+ then @
1214+ else unit
1215+ }
1216+ if ((outAmountResult == outAmountResult))
1217+ then $Tuple2(nil, outAmountResult)
1218+ else throw("Strict value is not equal to itself.")
1219+ }
1220+ else throw("Strict value is not equal to itself.")
1221+ }
1222+ else throw("Strict value is not equal to itself.")
1223+ }
1224+
1225+
1226+
1227+@Callable(i)
8911228 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
8921229 then throw("denied")
8931230 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
9421279
9431280
9441281 @Callable(i)
945-func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, false, 0, ""))
1282+func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, true, false, 0, ""))
9461283
9471284
9481285
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let thousand = 1000
1111
1212 let zeroBigInt = toBigInt(0)
1313
1414 let oneBigInt = toBigInt(1)
1515
1616 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1717
1818 let Amult = "100"
1919
2020 let Dconv = "1"
2121
2222 let SEP = "__"
2323
2424 let EMPTY = ""
2525
2626 let PoolActive = 1
2727
2828 let PoolPutDis = 2
2929
3030 let PoolMatcherDis = 3
3131
3232 let PoolShutdown = 4
3333
3434 let idxPoolAddress = 1
3535
3636 let idxPoolSt = 2
3737
3838 let idxLPAsId = 3
3939
4040 let idxAmAsId = 4
4141
4242 let idxPrAsId = 5
4343
4444 let idxAmtAsDcm = 6
4545
4646 let idxPriceAsDcm = 7
4747
4848 let idxIAmtAsId = 8
4949
5050 let idxIPriceAsId = 9
5151
5252 let idxFactStakCntr = 1
5353
5454 let idxFactSlippCntr = 7
5555
5656 let idxFactGwxRewCntr = 10
5757
5858 let feePermilleDefault = 0
5959
6060 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6161
6262
6363 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6464
6565
6666 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6767
6868
6969 func abs (val) = if ((zeroBigInt > val))
7070 then -(val)
7171 else val
7272
7373
7474 func fc () = "%s__factoryContract"
7575
7676
7777 func mpk () = "%s__managerPublicKey"
7878
7979
8080 func pmpk () = "%s__pendingManagerPublicKey"
8181
8282
8383 func pl () = "%s%s__price__last"
8484
8585
8686 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
8787
8888
8989 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
9090
9191
9292 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
9393
9494
9595 func aa () = "%s__amountAsset"
9696
9797
9898 func pa () = "%s__priceAsset"
9999
100100
101101 func amp () = "%s__amp"
102102
103103
104104 func ada () = "%s__addonAddr"
105105
106106
107107 let keyFeePermille = "%s__feePermille"
108108
109109 let feePermille = valueOrElse(getInteger(this, keyFeePermille), feePermilleDefault)
110110
111111 func fcfg () = "%s__factoryConfig"
112112
113113
114114 func mtpk () = "%s%s__matcher__publicKey"
115115
116116
117117 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
118118
119119
120120 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
121121
122122
123123 func aps () = "%s__shutdown"
124124
125125
126126 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
127127
128128
129129 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
130130
131131
132132 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
133133
134134
135135 func str (val) = match val {
136136 case valStr: String =>
137137 valStr
138138 case _ =>
139139 throw("fail cast to String")
140140 }
141141
142142
143143 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
144144
145145
146146 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
147147
148148
149149 let fca = addressFromStringValue(strf(this, fc()))
150150
151151 let A = strf(this, amp())
152152
153153 func igs () = valueOrElse(getBoolean(fca, aps()), false)
154154
155155
156156 func mp () = fromBase58String(strf(fca, mtpk()))
157157
158158
159159 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
160160
161161 func gpc () = {
162162 let amtAs = strf(this, aa())
163163 let priceAs = strf(this, pa())
164164 let iPriceAs = intf(fca, mba(priceAs))
165165 let iAmtAs = intf(fca, mba(amtAs))
166166 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
167167 }
168168
169169
170170 func gfc () = split(strf(fca, fcfg()), SEP)
171171
172172
173+let factoryConfig = gfc()
174+
175+let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
176+
177+let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
178+
179+let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
180+
173181 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
174182
175183
176184 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
177185
178186
179187 func getAccBalance (assetId) = if ((assetId == "WAVES"))
180188 then wavesBalance(this).available
181189 else assetBalance(this, fromBase58String(assetId))
182190
183191
184192 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
185193
186194
187195 func vad (A1,A2,slippage) = {
188196 let diff = fraction((A1 - A2), scale8BigInt, A2)
189197 let pass = ((slippage - abs(diff)) > zeroBigInt)
190198 if (!(pass))
191199 then throw(("Big slpg: " + toString(diff)))
192200 else $Tuple2(pass, min([A1, A2]))
193201 }
194202
195203
196204 func vd (D1,D0,slpg) = {
197205 let diff = fraction(D0, scale8BigInt, D1)
198206 let fail = (slpg > diff)
199207 if (if (fail)
200208 then true
201209 else (D0 > D1))
202210 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
203211 else fail
204212 }
205213
206214
207215 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
208216 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
209217 let prAsAmtX18 = t1(prAmt, prAssetDcm)
210218 cpbi(prAsAmtX18, amtAsAmtX18)
211219 }
212220
213221
214222 func calcPrices (amAmt,prAmt,lpAmt) = {
215223 let cfg = gpc()
216224 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
217225 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
218226 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
219227 let amAmtX18 = t1(amAmt, amtAsDcm)
220228 let prAmtX18 = t1(prAmt, prAsDcm)
221229 let lpAmtX18 = t1(lpAmt, scale8)
222230 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
223231 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
224232 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
225233 }
226234
227235
228236 func calculatePrices (amAmt,prAmt,lpAmt) = {
229237 let p = calcPrices(amAmt, prAmt, lpAmt)
230238 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
231239 }
232240
233241
242+func takeFee (amount) = {
243+ let fee = fraction(amount, feePermille, thousand)
244+ $Tuple2((amount - fee), fee)
245+ }
246+
247+
234248 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
235249 let cfg = gpc()
236250 let lpId = cfg[idxLPAsId]
237251 let amId = cfg[idxAmAsId]
238252 let prId = cfg[idxPrAsId]
239253 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
240254 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
241255 let sts = cfg[idxPoolSt]
242256 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
243257 if ((lpId != pmtAssetId))
244258 then throw("Wrong pmt asset")
245259 else {
246260 let amBalance = getAccBalance(amId)
247261 let amBalanceX18 = t1(amBalance, amDcm)
248262 let prBalance = getAccBalance(prId)
249263 let prBalanceX18 = t1(prBalance, prDcm)
250264 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
251265 let curPrice = f1(curPriceX18, scale8)
252266 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
253267 let lpEmissX18 = t1(lpEmiss, scale8)
254268 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
255269 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
256270 let outAmAmt = f1(outAmAmtX18, amDcm)
257271 let outPrAmt = f1(outPrAmtX18, prDcm)
258272 let state = if ((txId58 == ""))
259273 then nil
260274 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
261275 then unit
262276 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
263277 then unit
264278 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
265279 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
266280 }
267281 }
268282
269283
270-func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,pmtAmt,pmtId) = {
284+func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
271285 let cfg = gpc()
272286 let lpId = fromBase58String(cfg[idxLPAsId])
273287 let amIdStr = cfg[idxAmAsId]
274288 let prIdStr = cfg[idxPrAsId]
275289 let inAmIdStr = cfg[idxIAmtAsId]
276290 let inPrIdStr = cfg[idxIPriceAsId]
277291 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
278292 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
279293 let sts = cfg[idxPoolSt]
280294 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
281295 let amBalance = if (isEval)
282296 then getAccBalance(amIdStr)
283297 else if (if (isOneAsset)
284298 then (pmtId == amIdStr)
285299 else false)
286300 then (getAccBalance(amIdStr) - pmtAmt)
287301 else if (isOneAsset)
288302 then getAccBalance(amIdStr)
289303 else (getAccBalance(amIdStr) - inAmAmt)
290304 let prBalance = if (isEval)
291305 then getAccBalance(prIdStr)
292306 else if (if (isOneAsset)
293307 then (pmtId == prIdStr)
294308 else false)
295309 then (getAccBalance(prIdStr) - pmtAmt)
296310 else if (isOneAsset)
297311 then getAccBalance(prIdStr)
298312 else (getAccBalance(prIdStr) - inPrAmt)
299313 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
300314 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
301315 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
302316 let amBalanceX18 = t1(amBalance, amtDcm)
303317 let prBalanceX18 = t1(prBalance, priceDcm)
304318 let r = if ((lpEm == 0))
305319 then {
306320 let curPriceX18 = zeroBigInt
307321 let slippageX18 = zeroBigInt
308322 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
309323 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
310324 }
311325 else {
312326 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
313327 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
314328 let slippageX18 = t1(slippage, scale8)
315- if (if ((curPriceX18 != zeroBigInt))
329+ if (if (if (validateSlippage)
330+ then (curPriceX18 != zeroBigInt)
331+ else false)
316332 then (slippageRealX18 > slippageX18)
317333 else false)
318334 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
319335 else {
320336 let lpEmissionX18 = t1(lpEm, scale8)
321337 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
322338 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
323339 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
324340 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
325341 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
326342 let expAmtAssetAmtX18 = expectedAmts._1
327343 let expPriceAssetAmtX18 = expectedAmts._2
328344 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
329345 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
330346 }
331347 }
332348 let calcLpAmt = r._1
333349 let calcAmAssetPmt = r._2
334350 let calcPrAssetPmt = r._3
335351 let curPrice = f1(r._4, scale8)
336352 let slippageCalc = f1(r._5, scale8)
337353 if ((0 >= calcLpAmt))
338354 then throw("LP <= 0")
339355 else {
340356 let emitLpAmt = if (!(emitLp))
341357 then 0
342358 else calcLpAmt
343359 let amDiff = (inAmAmt - calcAmAssetPmt)
344360 let prDiff = (inPrAmt - calcPrAssetPmt)
345- let $t01568216027 = if (if (isOneAsset)
361+ let $t01627116616 = if (if (isOneAsset)
346362 then (pmtId == amIdStr)
347363 else false)
348364 then $Tuple2(pmtAmt, 0)
349365 else if (if (isOneAsset)
350366 then (pmtId == prIdStr)
351367 else false)
352368 then $Tuple2(0, pmtAmt)
353369 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
354- let writeAmAmt = $t01568216027._1
355- let writePrAmt = $t01568216027._2
370+ let writeAmAmt = $t01627116616._1
371+ let writePrAmt = $t01627116616._2
356372 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
357373 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
358374 }
359375 }
360376
361377
362378 func moa (order) = {
363379 let cfg = gpc()
364380 let amtAsId = cfg[idxAmAsId]
365381 let prAsId = cfg[idxPrAsId]
366382 let sts = parseIntValue(cfg[idxPoolSt])
367383 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
368384 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
369385 let accAmtAsBalance = getAccBalance(amtAsId)
370386 let accPrAsBalance = getAccBalance(prAsId)
371387 let curPriceX18 = if ((order.orderType == Buy))
372388 then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
373389 else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
374390 let curPrice = f1(curPriceX18, scale8)
375391 if (if (if (igs())
376392 then true
377393 else (sts == PoolMatcherDis))
378394 then true
379395 else (sts == PoolShutdown))
380396 then throw("Admin blocked")
381397 else {
382398 let orAmtAsset = order.assetPair.amountAsset
383399 let orAmtAsStr = if ((orAmtAsset == unit))
384400 then "WAVES"
385401 else toBase58String(value(orAmtAsset))
386402 let orPrAsset = order.assetPair.priceAsset
387403 let orPrAsStr = if ((orPrAsset == unit))
388404 then "WAVES"
389405 else toBase58String(value(orPrAsset))
390406 if (if ((orAmtAsStr != amtAsId))
391407 then true
392408 else (orPrAsStr != prAsId))
393409 then throw("Wr assets")
394410 else {
395411 let orderPrice = order.price
396412 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
397413 let castOrderPrice = ts(orderPrice, scale8, priceDcm)
398414 let isOrderPriceValid = if ((order.orderType == Buy))
399415 then (curPrice >= castOrderPrice)
400416 else (castOrderPrice >= curPrice)
401417 true
402418 }
403419 }
404420 }
405421
406422
407423 func cg (i) = if ((size(i.payments) != 1))
408424 then throw("1 pmnt exp")
409425 else {
410426 let pmt = value(i.payments[0])
411427 let pmtAssetId = value(pmt.assetId)
412428 let pmtAmt = pmt.amount
413429 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
414430 let outAmAmt = r._1
415431 let outPrAmt = r._2
416432 let sts = parseIntValue(r._9)
417433 let state = r._10
418434 if (if (igs())
419435 then true
420436 else (sts == PoolShutdown))
421437 then throw(("Admin blocked: " + toString(sts)))
422438 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
423439 }
424440
425441
426-func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,pmtAmt,pmtId) = {
427- let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, pmtAmt, pmtId)
442+func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
443+ let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
428444 let sts = parseIntValue(r._8)
429445 if (if (if (igs())
430446 then true
431447 else (sts == PoolPutDis))
432448 then true
433449 else (sts == PoolShutdown))
434450 then throw(("Blocked:" + toString(sts)))
435451 else r
436452 }
437453
438454
439-func takeFee (amount) = {
440- let fee = fraction(amount, feePermille, thousand)
441- $Tuple2((amount - fee), fee)
455+func estimatePutOneTknV2 (pmtAmtRaw,pmtAssetId,userAddress,txId) = {
456+ let poolConfig = gpc()
457+ let amId = poolConfig[idxAmAsId]
458+ let prId = poolConfig[idxPrAsId]
459+ let amBalance = getAccBalance(amId)
460+ let prBalance = getAccBalance(prId)
461+ let $t02094220987 = takeFee(pmtAmtRaw)
462+ let pmtAmt = $t02094220987._1
463+ let feeAmount = $t02094220987._2
464+ let $t02099121452 = if ((txId == ""))
465+ then $Tuple2(amBalance, prBalance)
466+ else if ((pmtAssetId == amId))
467+ then if ((pmtAmtRaw > amBalance))
468+ then throw("invalid payment amount")
469+ else $Tuple2((amBalance - pmtAmtRaw), prBalance)
470+ else if ((pmtAssetId == prId))
471+ then if ((pmtAmtRaw > prBalance))
472+ then throw("invalid payment amount")
473+ else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
474+ else throw("wrong pmtAssetId")
475+ let amBalanceNow = $t02099121452._1
476+ let prBalanceNow = $t02099121452._2
477+ let $t02145621590 = if ((pmtAssetId == amId))
478+ then $Tuple2(amBalanceNow, prBalanceNow)
479+ else $Tuple2(prBalanceNow, amBalanceNow)
480+ let amBalanceForCalc = $t02145621590._1
481+ let prBalanceForCalc = $t02145621590._2
482+ let xPrecision = 1
483+ let result = {
484+ let @ = invoke(gwxContract, "calcPutXOnly", [toString(pmtAmt), toString(amBalanceForCalc), toString(prBalanceForCalc), "", A, Amult, toString(xPrecision), Dconv], nil)
485+ if ($isInstanceOf(@, "(Int, Int)"))
486+ then @
487+ else throw(($getType(invoke(gwxContract, "calcPutXOnly", [toString(pmtAmt), toString(amBalanceForCalc), toString(prBalanceForCalc), "", A, Amult, toString(xPrecision), Dconv], nil)) + " couldn't be cast to (Int, Int)"))
488+ }
489+ let $t02205922155 = if ((pmtAssetId == amId))
490+ then result
491+ else $Tuple2(result._2, result._1)
492+ let amAssetPart = $t02205922155._1
493+ let prAssetPart = $t02205922155._2
494+ let estPut = cp(userAddress, txId, AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), 0, true, true, false, pmtAmt, pmtAssetId)
495+ let estimLP = estPut._2
496+ let lpAssetId = estPut._7
497+ let state = estPut._9
498+ let amDiff = estPut._10
499+ let prDiff = estPut._11
500+ estPut
442501 }
443502
444503
445504 func m () = match getString(mpk()) {
446505 case s: String =>
447506 fromBase58String(s)
448507 case _: Unit =>
449508 unit
450509 case _ =>
451510 throw("Match error")
452511 }
453512
454513
455514 func pm () = match getString(pmpk()) {
456515 case s: String =>
457516 fromBase58String(s)
458517 case _: Unit =>
459518 unit
460519 case _ =>
461520 throw("Match error")
462521 }
463522
464523
465524 let pd = throw("Permission denied")
466525
467526 func mm (i) = match m() {
468527 case pk: ByteVector =>
469528 if ((i.callerPublicKey == pk))
470529 then true
471530 else pd
472531 case _: Unit =>
473532 if ((i.caller == this))
474533 then true
475534 else pd
476535 case _ =>
477536 throw("Match error")
478537 }
479538
480539
481540 @Callable(i)
482541 func constructor (fc) = {
483542 let c = mm(i)
484543 if ((c == c))
485544 then [StringEntry(fc(), fc)]
486545 else throw("Strict value is not equal to itself.")
487546 }
488547
489548
490549
491550 @Callable(i)
492551 func setManager (pendingManagerPublicKey) = {
493552 let c = mm(i)
494553 if ((c == c))
495554 then {
496555 let cm = fromBase58String(pendingManagerPublicKey)
497556 if ((cm == cm))
498557 then [StringEntry(pmpk(), pendingManagerPublicKey)]
499558 else throw("Strict value is not equal to itself.")
500559 }
501560 else throw("Strict value is not equal to itself.")
502561 }
503562
504563
505564
506565 @Callable(i)
507566 func confirmManager () = {
508567 let p = pm()
509568 let hpm = if (isDefined(p))
510569 then true
511570 else throw("No pending manager")
512571 if ((hpm == hpm))
513572 then {
514573 let cpm = if ((i.callerPublicKey == value(p)))
515574 then true
516575 else throw("You are not pending manager")
517576 if ((cpm == cpm))
518577 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
519578 else throw("Strict value is not equal to itself.")
520579 }
521580 else throw("Strict value is not equal to itself.")
522581 }
523582
524583
525584
526585 @Callable(i)
527586 func put (slip,autoStake) = {
528587 let factCfg = gfc()
529588 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
530589 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
531590 if ((0 > slip))
532591 then throw("Wrong slippage")
533592 else if ((size(i.payments) != 2))
534593 then throw("2 pmnts expd")
535594 else {
536- let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, 0, "")
595+ let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, true, 0, "")
537596 let emitLpAmt = e._2
538597 let lpAssetId = e._7
539598 let state = e._9
540599 let amDiff = e._10
541600 let prDiff = e._11
542601 let amId = e._12
543602 let prId = e._13
544603 let r = invoke(fca, "emit", [emitLpAmt], nil)
545604 if ((r == r))
546605 then {
547606 let el = match r {
548607 case legacy: Address =>
549608 invoke(legacy, "emit", [emitLpAmt], nil)
550609 case _ =>
551610 unit
552611 }
553612 if ((el == el))
554613 then {
555614 let sa = if ((amDiff > 0))
556615 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
557616 else nil
558617 if ((sa == sa))
559618 then {
560619 let sp = if ((prDiff > 0))
561620 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
562621 else nil
563622 if ((sp == sp))
564623 then {
565624 let lpTrnsfr = if (autoStake)
566625 then {
567626 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
568627 if ((ss == ss))
569628 then nil
570629 else throw("Strict value is not equal to itself.")
571630 }
572631 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
573632 (state ++ lpTrnsfr)
574633 }
575634 else throw("Strict value is not equal to itself.")
576635 }
577636 else throw("Strict value is not equal to itself.")
578637 }
579638 else throw("Strict value is not equal to itself.")
580639 }
581640 else throw("Strict value is not equal to itself.")
582641 }
583642 }
584643
585644
586645
587646 @Callable(i)
588647 func putOneTkn (amAssetPart,prAssetPart,outLp,slippage,autoStake) = {
589648 let cfg = gfc()
590649 let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wr st addr")
591650 let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wr sl addr")
592651 let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wr gwx addr")
593652 let poolCfg = gpc()
594653 let amId = poolCfg[idxAmAsId]
595654 let prId = poolCfg[idxPrAsId]
596655 let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
597656 let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
598657 let addon = valueOrElse(getString(this, ada()), "")
599658 let userAddress = if ((addon == toString(i.caller)))
600659 then i.originCaller
601660 else i.caller
602661 if (if (if (if ((0 >= slippage))
603662 then true
604663 else (0 >= amAssetPart))
605664 then true
606665 else (0 >= prAssetPart))
607666 then true
608667 else (0 >= outLp))
609668 then throw("Wrong params")
610669 else if ((size(i.payments) != 1))
611670 then throw("1 pmnt expd")
612671 else {
613672 let pmt = value(i.payments[0])
614673 let pmtAssetId = toBase58String(value(pmt.assetId))
615674 let paymentAmountRaw = pmt.amount
616- let $t02464424696 = takeFee(paymentAmountRaw)
617- let pmtAmt = $t02464424696._1
618- let feeAmount = $t02464424696._2
675+ let $t02712527177 = takeFee(paymentAmountRaw)
676+ let pmtAmt = $t02712527177._1
677+ let feeAmount = $t02712527177._2
619678 if ((10000000 > paymentAmountRaw))
620679 then throw("Wrong pmt amt")
621680 else {
622681 let amBalance = getAccBalance(amId)
623682 let prBalance = getAccBalance(prId)
624- let $t02485625472 = if ((pmtAssetId == amId))
683+ let $t02733727953 = if ((pmtAssetId == amId))
625684 then if (if ((paymentAmountRaw > amBalance))
626685 then true
627686 else (amAssetPart > pmtAmt))
628687 then throw("invalid payment amount")
629688 else $Tuple6((amBalance - paymentAmountRaw), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
630689 else if ((pmtAssetId == prId))
631690 then if (if ((paymentAmountRaw > prBalance))
632691 then true
633692 else (prAssetPart > pmtAmt))
634693 then throw("invalid payment amount")
635694 else $Tuple6(amBalance, (prBalance - paymentAmountRaw), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
636695 else throw("wrong pmtAssetId")
637- let amBalanceNow = $t02485625472._1
638- let prBalanceNow = $t02485625472._2
639- let virtSwapInAm = $t02485625472._3
640- let virtSwapOutPr = $t02485625472._4
641- let virtSwapInPr = $t02485625472._5
642- let virtSwapOutAm = $t02485625472._6
696+ let amBalanceNow = $t02733727953._1
697+ let prBalanceNow = $t02733727953._2
698+ let virtSwapInAm = $t02733727953._3
699+ let virtSwapOutPr = $t02733727953._4
700+ let virtSwapInPr = $t02733727953._5
701+ let virtSwapOutAm = $t02733727953._6
643702 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
644703 let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
645704 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
646705 if ((D0vsD1 == D0vsD1))
647706 then {
648- let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
707+ let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, true, pmtAmt, pmtAssetId)
649708 let estimLP = estPut._2
650709 let lpAssetId = estPut._7
651710 let state = estPut._9
652711 let amDiff = estPut._10
653712 let prDiff = estPut._11
654713 let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
655714 let emitLpAmt = toInt(lpCalcRes._2)
656715 let e = invoke(fca, "emit", [emitLpAmt], nil)
657716 if ((e == e))
658717 then {
659718 let el = match e {
660719 case legacy: Address =>
661720 invoke(legacy, "emit", [emitLpAmt], nil)
662721 case _ =>
663722 unit
664723 }
665724 if ((el == el))
666725 then {
667726 let sa = if ((amDiff > 0))
668727 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
669728 else nil
670729 if ((sa == sa))
671730 then {
672731 let sp = if ((prDiff > 0))
673732 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
674733 else nil
675734 if ((sp == sp))
676735 then {
677736 let lpTrnsfr = if (autoStake)
678737 then {
679738 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
680739 if ((ss == ss))
681740 then nil
682741 else throw("Strict value is not equal to itself.")
683742 }
684743 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
685744 let sendFeeToMatcher = if ((feeAmount > 0))
686745 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
687746 else nil
688747 ((state ++ lpTrnsfr) ++ sendFeeToMatcher)
689748 }
690749 else throw("Strict value is not equal to itself.")
691750 }
692751 else throw("Strict value is not equal to itself.")
693752 }
694753 else throw("Strict value is not equal to itself.")
695754 }
696755 else throw("Strict value is not equal to itself.")
697756 }
698757 else throw("Strict value is not equal to itself.")
699758 }
700759 }
701760 }
702761
703762
704763
705764 @Callable(i)
765+func putOneTknV2 (minOutAmount,autoStake) = if ((size(i.payments) != 1))
766+ then throw("1 pmnt expd")
767+ else {
768+ let poolConfig = gpc()
769+ let amId = poolConfig[idxAmAsId]
770+ let prId = poolConfig[idxPrAsId]
771+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
772+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
773+ let userAddress = if ((i.caller == this))
774+ then i.originCaller
775+ else i.caller
776+ let pmt = value(i.payments[0])
777+ let pmtAssetId = toBase58String(value(pmt.assetId))
778+ let pmtAmt = pmt.amount
779+ if ((10000000 > pmtAmt))
780+ then throw("Wrong pmt amt")
781+ else {
782+ let r = estimatePutOneTknV2(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
783+ let estimLP = r._2
784+ let lpAssetId = r._7
785+ let state = r._9
786+ let amDiff = r._10
787+ let prDiff = r._11
788+ let emitLpAmt = if (if ((minOutAmount > 0))
789+ then (minOutAmount > estimLP)
790+ else false)
791+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
792+ else estimLP
793+ let e = invoke(fca, "emit", [emitLpAmt], nil)
794+ if ((e == e))
795+ then {
796+ let el = match e {
797+ case legacy: Address =>
798+ invoke(legacy, "emit", [emitLpAmt], nil)
799+ case _ =>
800+ unit
801+ }
802+ if ((el == el))
803+ then {
804+ let sa = if ((amDiff > 0))
805+ then invoke(slipageContract, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
806+ else nil
807+ if ((sa == sa))
808+ then {
809+ let sp = if ((prDiff > 0))
810+ then invoke(slipageContract, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
811+ else nil
812+ if ((sp == sp))
813+ then {
814+ let lpTrnsfr = if (autoStake)
815+ then {
816+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
817+ if ((ss == ss))
818+ then nil
819+ else throw("Strict value is not equal to itself.")
820+ }
821+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
822+ $Tuple2((state ++ lpTrnsfr), emitLpAmt)
823+ }
824+ else throw("Strict value is not equal to itself.")
825+ }
826+ else throw("Strict value is not equal to itself.")
827+ }
828+ else throw("Strict value is not equal to itself.")
829+ }
830+ else throw("Strict value is not equal to itself.")
831+ }
832+ }
833+
834+
835+
836+@Callable(i)
837+func putOneTknV2READONLY (paymentAmount,paymentAssetId) = {
838+ let r = estimatePutOneTknV2(paymentAmount, paymentAssetId, "", "")
839+ let estimLP = r._2
840+ let lpAssetId = r._7
841+ let state = r._9
842+ let amDiff = r._10
843+ let prDiff = r._11
844+ $Tuple2(nil, estimLP)
845+ }
846+
847+
848+
849+@Callable(i)
850+func putOneTknV2WithBonusREADONLY (paymentAmount,paymentAssetId) = {
851+ let poolConfig = gpc()
852+ let amId = poolConfig[idxAmAsId]
853+ let prId = poolConfig[idxPrAsId]
854+ let amBalance = getAccBalance(amId)
855+ let prBalance = getAccBalance(prId)
856+ let r = estimatePutOneTknV2(paymentAmount, paymentAssetId, "", "")
857+ let estimLP = r._2
858+ let curPrice = r._3
859+ let lpAssetEmission = r._6
860+ let lpAssetId = r._7
861+ let $t03278033089 = if ((paymentAssetId == amId))
862+ then {
863+ let priceAssetAmount = fraction(paymentAmount, curPrice, scale8)
864+ $Tuple2(paymentAmount, priceAssetAmount)
865+ }
866+ else {
867+ let amountAssetAmount = fraction(paymentAmount, scale8, curPrice)
868+ $Tuple2(amountAssetAmount, paymentAmount)
869+ }
870+ let amountAssetAmount = $t03278033089._1
871+ let priceAssetAmount = $t03278033089._2
872+ let lpAmtBoth = fraction(lpAssetEmission, priceAssetAmount, prBalance)
873+ let lpAssetPriceOne = if ((paymentAssetId == amId))
874+ then fraction(amountAssetAmount, scale8, estimLP)
875+ else fraction(priceAssetAmount, scale8, estimLP)
876+ let lpAssetPriceBoth = fraction((priceAssetAmount + amountAssetAmount), scale8, lpAmtBoth)
877+ let bonus = fraction((lpAssetPriceBoth - lpAssetPriceOne), scale8, lpAssetPriceOne)
878+ let feeAmount = takeFee(paymentAmount)._2
879+ $Tuple2(nil, $Tuple3(estimLP, feeAmount, bonus))
880+ }
881+
882+
883+
884+@Callable(i)
706885 func putForFree (maxSlpg) = if ((0 > maxSlpg))
707886 then throw("Wrong slpg")
708887 else if ((size(i.payments) != 2))
709888 then throw("2 pmnts expd")
710889 else {
711- let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, 0, "")
890+ let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, true, 0, "")
712891 estPut._9
713892 }
714893
715894
716895
717896 @Callable(i)
718897 func get () = {
719898 let r = cg(i)
720899 let outAmtAmt = r._1
721900 let outPrAmt = r._2
722901 let pmtAmt = r._3
723902 let pmtAssetId = r._4
724903 let state = r._5
725904 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
726905 if ((b == b))
727906 then state
728907 else throw("Strict value is not equal to itself.")
729908 }
730909
731910
732911
733912 @Callable(i)
734913 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
735914 then throw("1 pmnt expd")
736915 else {
737916 let cfg = gpc()
738917 let lpId = cfg[idxLPAsId]
739918 let amId = cfg[idxAmAsId]
740919 let prId = cfg[idxPrAsId]
741920 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
742921 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
743922 let sts = cfg[idxPoolSt]
744923 let factCfg = gfc()
745924 let gwxCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wr sl addr")
746925 let pmt = value(i.payments[0])
747926 let addon = valueOrElse(getString(this, ada()), "")
748927 let userAddress = if ((addon == toString(i.caller)))
749928 then i.originCaller
750929 else i.caller
751930 let txId58 = toBase58String(i.transactionId)
752931 let pmtAssetId = value(pmt.assetId)
753932 let pmtAmt = pmt.amount
754933 if ((1000000000 > pmtAmt))
755934 then throw("Min pmt 10 LP")
756935 else if (if (if ((0 > slippage))
757936 then true
758937 else (0 > exchResult))
759938 then true
760939 else (0 > outAmount))
761940 then throw("Wrong params")
762941 else if ((lpId != toBase58String(pmtAssetId)))
763942 then throw("Wrong LP")
764943 else {
765944 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
766945 let estimAmAmt = r._1
767946 let estimPrAmt = r._2
768947 let amBalance = getAccBalance(amId)
769948 let prBalance = getAccBalance(prId)
770- let $t03041530875 = if ((outAssetId == amId))
949+ let $t03637036830 = if ((outAssetId == amId))
771950 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
772951 else if ((outAssetId == prId))
773952 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
774953 else throw("wrong outAssetId")
775- let amBalanceNow = $t03041530875._1
776- let prBalanceNow = $t03041530875._2
777- let virtSwapInAm = $t03041530875._3
778- let virtSwapOutPr = $t03041530875._4
779- let virtSwapInPr = $t03041530875._5
780- let virtSwapOutAm = $t03041530875._6
781- let totalGetRaw = $t03041530875._7
954+ let amBalanceNow = $t03637036830._1
955+ let prBalanceNow = $t03637036830._2
956+ let virtSwapInAm = $t03637036830._3
957+ let virtSwapOutPr = $t03637036830._4
958+ let virtSwapInPr = $t03637036830._5
959+ let virtSwapOutAm = $t03637036830._6
960+ let totalGetRaw = $t03637036830._7
782961 if (if ((0 > virtSwapInAm))
783962 then true
784963 else (0 > virtSwapInPr))
785964 then throw("Wrong calc")
786965 else {
787966 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
788967 let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
789968 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
790969 if ((D0vsD1 == D0vsD1))
791970 then {
792971 let totalGet = takeFee(totalGetRaw)._1
793972 let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
794973 if ((finalRes == finalRes))
795974 then {
796- let $t03162231726 = if ((outAssetId == amId))
975+ let $t03757737681 = if ((outAssetId == amId))
797976 then $Tuple2(toInt(finalRes._2), 0)
798977 else $Tuple2(0, toInt(finalRes._2))
799- let outAm = $t03162231726._1
800- let outPr = $t03162231726._2
978+ let outAm = $t03757737681._1
979+ let outPr = $t03757737681._2
801980 let totalAmount = (outAm + outPr)
802981 let feeAmount = (totalGetRaw - totalGet)
803982 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
804983 then unit
805984 else fromBase58String(outAssetId)
806985 let sendFeeToMatcher = if ((feeAmount > 0))
807986 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
808987 else nil
809988 let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
810989 let curPr = f1(curPrX18, scale8)
811990 let state = [ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
812991 if ((state == state))
813992 then {
814993 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
815994 if ((burn == burn))
816995 then (state ++ sendFeeToMatcher)
817996 else throw("Strict value is not equal to itself.")
818997 }
819998 else throw("Strict value is not equal to itself.")
820999 }
8211000 else throw("Strict value is not equal to itself.")
8221001 }
8231002 else throw("Strict value is not equal to itself.")
8241003 }
8251004 }
8261005 }
1006+
1007+
1008+
1009+@Callable(i)
1010+func getOneTknV2 (outAssetId,minOutAmount) = if ((size(i.payments) != 1))
1011+ then throw("1 pmnt expd")
1012+ else {
1013+ let poolConfig = gpc()
1014+ let lpId = poolConfig[idxLPAsId]
1015+ let amId = poolConfig[idxAmAsId]
1016+ let prId = poolConfig[idxPrAsId]
1017+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
1018+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
1019+ let poolStatus = poolConfig[idxPoolSt]
1020+ let userAddress = if ((i.caller == this))
1021+ then i.originCaller
1022+ else i.caller
1023+ let pmt = value(i.payments[0])
1024+ let pmtAssetId = value(pmt.assetId)
1025+ let pmtAmt = pmt.amount
1026+ if ((1000000000 > pmtAmt))
1027+ then throw("Min pmt 10 LP")
1028+ else {
1029+ let txId58 = toBase58String(i.transactionId)
1030+ if ((lpId != toBase58String(pmtAssetId)))
1031+ then throw("Wrong LP")
1032+ else {
1033+ let amBalance = getAccBalance(amId)
1034+ let prBalance = getAccBalance(prId)
1035+ let totalGet = {
1036+ let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
1037+ if ($isInstanceOf(@, "Int"))
1038+ then @
1039+ else throw(($getType(invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)) + " couldn't be cast to Int"))
1040+ }
1041+ let totalAmount = if (if ((minOutAmount > 0))
1042+ then (minOutAmount > totalGet)
1043+ else false)
1044+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
1045+ else totalGet
1046+ let $t03977539862 = if ((outAssetId == amId))
1047+ then $Tuple2(totalAmount, 0)
1048+ else $Tuple2(0, totalAmount)
1049+ let outAm = $t03977539862._1
1050+ let outPr = $t03977539862._2
1051+ let curPrX18 = cpbi(t1(prBalance, prDecimals), t1(amBalance, amDecimals))
1052+ let curPr = f1(curPrX18, scale8)
1053+ let state = [ScriptTransfer(userAddress, totalAmount, if ((outAssetId == "WAVES"))
1054+ then unit
1055+ else fromBase58String(outAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
1056+ if ((state == state))
1057+ then {
1058+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
1059+ if ((burn == burn))
1060+ then $Tuple2(state, totalAmount)
1061+ else throw("Strict value is not equal to itself.")
1062+ }
1063+ else throw("Strict value is not equal to itself.")
1064+ }
1065+ }
1066+ }
1067+
1068+
1069+
1070+@Callable(i)
1071+func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
1072+ let poolConfig = gpc()
1073+ let lpId = poolConfig[idxLPAsId]
1074+ let amId = poolConfig[idxAmAsId]
1075+ let prId = poolConfig[idxPrAsId]
1076+ let r = ego("", lpId, lpAssetAmount, this)
1077+ let estimAmAmt = r._1
1078+ let estimPrAmt = r._2
1079+ let amBalance = getAccBalance(amId)
1080+ let prBalance = getAccBalance(prId)
1081+ let amBalanceNow = (amBalance - estimAmAmt)
1082+ let prBalanceNow = (prBalance - estimPrAmt)
1083+ let $t04095641227 = if ((outAssetId == amId))
1084+ then $Tuple3(prBalanceNow, amBalanceNow, estimPrAmt)
1085+ else if ((outAssetId == prId))
1086+ then $Tuple3(amBalanceNow, prBalanceNow, estimAmAmt)
1087+ else throw("wrong outAssetId")
1088+ let amountBalanceForSwap = $t04095641227._1
1089+ let priceBalanceForSwap = $t04095641227._2
1090+ let amountToSwap = $t04095641227._3
1091+ let yPrecision = 1
1092+ let exchResult = {
1093+ let @ = invoke(gwxContract, "calcSwapXToY", [toString(amountToSwap), toString(amountBalanceForSwap), toString(priceBalanceForSwap), "", A, Amult, toString(yPrecision), Dconv], nil)
1094+ if ($isInstanceOf(@, "Int"))
1095+ then @
1096+ else throw(($getType(invoke(gwxContract, "calcSwapXToY", [toString(amountToSwap), toString(amountBalanceForSwap), toString(priceBalanceForSwap), "", A, Amult, toString(yPrecision), Dconv], nil)) + " couldn't be cast to Int"))
1097+ }
1098+ let totalGetRaw = (exchResult + (if ((outAssetId == amId))
1099+ then estimAmAmt
1100+ else estimPrAmt))
1101+ let $t04179941848 = takeFee(totalGetRaw)
1102+ let totalGet = $t04179941848._1
1103+ let feeAmount = $t04179941848._2
1104+ $Tuple2(nil, $Tuple2(totalGet, feeAmount))
1105+ }
1106+
1107+
1108+
1109+@Callable(i)
1110+func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
1111+ let poolConfig = gpc()
1112+ let amId = poolConfig[idxAmAsId]
1113+ let prId = poolConfig[idxPrAsId]
1114+ let lpId = poolConfig[idxLPAsId]
1115+ let amBalance = getAccBalance(amId)
1116+ let prBalance = getAccBalance(prId)
1117+ let $t04219242307 = {
1118+ let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
1119+ if ($isInstanceOf(@, "(Int, Int)"))
1120+ then @
1121+ else throw(($getType(invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)) + " couldn't be cast to (Int, Int)"))
1122+ }
1123+ let totalGet = $t04219242307._1
1124+ let feeAmount = $t04219242307._2
1125+ let r = ego("", lpId, lpAssetAmount, this)
1126+ let outAmAmt = r._1
1127+ let outPrAmt = r._2
1128+ let lpAssetPriceOne = fraction(totalGet, scale8, lpAssetAmount)
1129+ let lpAssetPriceBoth = fraction((outAmAmt + outPrAmt), scale8, lpAssetAmount)
1130+ let bonus = fraction((lpAssetPriceOne - lpAssetPriceBoth), scale8, lpAssetPriceBoth)
1131+ $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
1132+ }
8271133
8281134
8291135
8301136 @Callable(i)
8311137 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
8321138 let r = cg(i)
8331139 let outAmAmt = r._1
8341140 let outPrAmt = r._2
8351141 let pmtAmt = r._3
8361142 let pmtAssetId = r._4
8371143 let state = r._5
8381144 if ((noLessThenAmtAsset > outAmAmt))
8391145 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
8401146 else if ((noLessThenPriceAsset > outPrAmt))
8411147 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
8421148 else {
8431149 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
8441150 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
8451151 then state
8461152 else throw("Strict value is not equal to itself.")
8471153 }
8481154 }
8491155
8501156
8511157
8521158 @Callable(i)
8531159 func unstakeAndGet (amount) = {
8541160 let checkPayments = if ((size(i.payments) != 0))
8551161 then throw("No pmnts expd")
8561162 else true
8571163 if ((checkPayments == checkPayments))
8581164 then {
8591165 let cfg = gpc()
8601166 let factoryCfg = gfc()
8611167 let lpAssetId = fromBase58String(cfg[idxLPAsId])
8621168 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
8631169 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
8641170 if ((unstakeInv == unstakeInv))
8651171 then {
8661172 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
8671173 let sts = parseIntValue(r._9)
8681174 let state = r._10
8691175 let v = if (if (igs())
8701176 then true
8711177 else (sts == PoolShutdown))
8721178 then throw(("Blocked: " + toString(sts)))
8731179 else true
8741180 if ((v == v))
8751181 then {
8761182 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
8771183 if ((burnA == burnA))
8781184 then state
8791185 else throw("Strict value is not equal to itself.")
8801186 }
8811187 else throw("Strict value is not equal to itself.")
8821188 }
8831189 else throw("Strict value is not equal to itself.")
8841190 }
8851191 else throw("Strict value is not equal to itself.")
8861192 }
8871193
8881194
8891195
8901196 @Callable(i)
1197+func unstakeAndGetOneTkn (amount,outAmount,outAssetId,slippage) = {
1198+ let checkPayments = if ((size(i.payments) != 0))
1199+ then throw("No pmnts expd")
1200+ else true
1201+ if ((checkPayments == checkPayments))
1202+ then {
1203+ let cfg = gpc()
1204+ let factoryCfg = gfc()
1205+ let lpAssetId = fromBase58String(cfg[idxLPAsId])
1206+ let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
1207+ let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
1208+ if ((unstakeInv == unstakeInv))
1209+ then {
1210+ let outAmountResult = {
1211+ let @ = invoke(this, "getOneTknV2", [outAmount, outAssetId, slippage], [AttachedPayment(lpAssetId, amount)])
1212+ if ($isInstanceOf(@, "Int"))
1213+ then @
1214+ else unit
1215+ }
1216+ if ((outAmountResult == outAmountResult))
1217+ then $Tuple2(nil, outAmountResult)
1218+ else throw("Strict value is not equal to itself.")
1219+ }
1220+ else throw("Strict value is not equal to itself.")
1221+ }
1222+ else throw("Strict value is not equal to itself.")
1223+ }
1224+
1225+
1226+
1227+@Callable(i)
8911228 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
8921229 then throw("denied")
8931230 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
8941231
8951232
8961233
8971234 @Callable(i)
8981235 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
8991236 then pd
9001237 else [StringEntry(k, v)]
9011238
9021239
9031240
9041241 @Callable(i)
9051242 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
9061243 then pd
9071244 else [IntegerEntry(k, v)]
9081245
9091246
9101247
9111248 @Callable(i)
9121249 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
9131250
9141251
9151252
9161253 @Callable(i)
9171254 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
9181255
9191256
9201257
9211258 @Callable(i)
9221259 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
9231260 let pr = calcPrices(amAmt, prAmt, lpAmt)
9241261 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
9251262 }
9261263
9271264
9281265
9291266 @Callable(i)
9301267 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
9311268
9321269
9331270
9341271 @Callable(i)
9351272 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
9361273
9371274
9381275
9391276 @Callable(i)
9401277 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
9411278
9421279
9431280
9441281 @Callable(i)
945-func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, false, 0, ""))
1282+func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, true, false, 0, ""))
9461283
9471284
9481285
9491286 @Callable(i)
9501287 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
9511288 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
9521289 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
9531290 }
9541291
9551292
9561293 @Verifier(tx)
9571294 func verify () = {
9581295 let targetPublicKey = match m() {
9591296 case pk: ByteVector =>
9601297 pk
9611298 case _: Unit =>
9621299 tx.senderPublicKey
9631300 case _ =>
9641301 throw("Match error")
9651302 }
9661303 match tx {
9671304 case order: Order =>
9681305 let matcherPub = mp()
9691306 let orderValid = moa(order)
9701307 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
9711308 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
9721309 if (if (if (orderValid)
9731310 then senderValid
9741311 else false)
9751312 then matcherValid
9761313 else false)
9771314 then true
9781315 else toe(orderValid, senderValid, matcherValid)
9791316 case s: SetScriptTransaction =>
9801317 let newHash = blake2b256(value(s.script))
9811318 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
9821319 let currentHash = scriptHash(this)
9831320 if (if ((allowedHash == newHash))
9841321 then (currentHash != newHash)
9851322 else false)
9861323 then true
9871324 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
9881325 case _ =>
9891326 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
9901327 }
9911328 }
9921329

github/deemru/w8io/873ac7e 
159.70 ms