tx · Dt67xcVQmHVBzrQfFT3HYWXztACJt2jFpUAednBeP99a

3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai:  -0.02400000 Waves

2023.03.22 14:27 [2501162] smart account 3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai > SELF 0.00000000 Waves

{ "type": 13, "id": "Dt67xcVQmHVBzrQfFT3HYWXztACJt2jFpUAednBeP99a", "fee": 2400000, "feeAssetId": null, "timestamp": 1679484487779, "version": 2, "chainId": 84, "sender": "3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai", "senderPublicKey": "2JEaBjtjvMoNGKZmL9QxYefa1VkMJM3vMW8rNvTs9R2H", "proofs": [ "4c11XJi6dfWLdW5GnPHEh4dSPQ5i55xEd4xkSknBTf7gQ17SGSG8GBenKyW5vFsmv9wgNtcvNtHnNBfhXdpUWvEE" ], "script": "base64:BgLhKAgCEgASBAoCCAgSAwoBCBIKCggICAgICAgIARIDCgEIEgYKBAgICAgSBAoCCBgSAwoBCBIECgIIGBIDCgEIEgASAwoBGBIKCggICAgICAEICBIECgIIARIDCgEBEgMKAQESBAoCCAESBgoECAgICBIECgIICBIECgIICBIECgIICBIDCgEIEgMKAQgSAwoBCBIDCgEIEgQKAggIEgMKAQgSAwoBCBIDCgEIEgQKAggIEgMKAQgSAwoBCCIGU0NBTEU4IgVNVUxUOCIHU0NBTEUxOCIGTVVMVDE4Ig5QT09MV0VJR0hUTVVMVCIOR1dYdmlydHVhbFBPT0wiDGxhYmVsUG9vbHNMcCINZGVmYXVsdFNwcmVhZCILd2F2ZXNTdHJpbmciEWRlY2ltYWxzTXVsdFByaWNlIgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIg9Qb29sUHV0RGlzYWJsZWQiE1Bvb2xNYXRjaGVyRGlzYWJsZWQiDFBvb2xTaHV0ZG93biISaWR4SW50ZXJuYWxBc3NldElkIg9pZHhSZXN1dEFjdGlvbnMiIGlkeElmQXNzZXRJZENhbGN1bGF0aW9uUGVyZm9ybWVkIg5pZHhQb29sQWRkcmVzcyINaWR4UG9vbFN0YXR1cyIQaWR4UG9vbExQQXNzZXRJZCINaWR4QW10QXNzZXRJZCIPaWR4UHJpY2VBc3NldElkIg5pZHhBbXRBc3NldERjbSIQaWR4UHJpY2VBc3NldERjbSIOaWR4SUFtdEFzc2V0SWQiEGlkeElQcmljZUFzc2V0SWQiDWlkeExQQXNzZXREY20iC2lkeFBvb2xUeXBlIhNwb29sTGFiZWxXeEVtaXNzaW9uIg92YWxpZFBvb2xMYWJlbHMiFmtleUFsbG93ZWRMcFNjcmlwdEhhc2giHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giIWtleUFsbG93ZWRMcFN0YWJsZUFkZG9uU2NyaXB0SGFzaCIMc3dhcENvbnRyYWN0IhBrZXlGYWN0b3J5Q29uZmlnIg9rZXlMcFRva2Vuc0xpc3QiEWtleVBvb2xTY3JpcHRIYXNoIg1rZXlNYXRjaGVyUHViIhhrZXlMZWdhY3lGYWN0b3J5Q29udHJhY3QiDmtleUxlZ2FjeVBvb2xzIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIPa2V5QWRtaW5QdWJLZXlzIhZrZXlBc3NldHNTdG9yZUNvbnRyYWN0IhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0Ig5rZXlQcmljZUFzc2V0cyIQa2V5UHJpY2VEZWNpbWFscyITa2V5QWxsUG9vbHNTaHV0ZG93biIWa2V5TmV4dEludGVybmFsQXNzZXRJZCIPa2V5UG9vbFRvV2VpZ2h0Igtwb29sQWRkcmVzcyIWa2V5UG9vbFRvV2VpZ2h0SGlzdG9yeSIDbnVtIh9rZXlNYXBwaW5nc0ludGVybmFsMmJhc2VBc3NldElkIhFpbnRlcm5hbEJhc2VBc3NldCIfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZCIMYmFzZUFzc2V0U3RyIg1rZXlQb29sQ29uZmlnIhNhbW91bnRBc3NldEludGVybmFsIhJwcmljZUFzc2V0SW50ZXJuYWwiIWtleVBvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZCIOYXNzZXRzSW50ZXJuYWwiCyR0MDM3MjYzNzg4IiVrZXlBbGxQb29sc09uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIh1rZXlNYXBwaW5nTHBBc3NldFRvUG9vbEFzc2V0cyIKbHBBc3NldFN0ciIda2V5TWFwcGluZ1Bvb2xBc3NldHNUb0xwYXNzZXQiGGludGVybmFsQW1vdW50QXNzZXRJZFN0ciIXaW50ZXJuYWxQcmljZUFzc2V0SWRTdHIiDWtleVBvb2xTcHJlYWQiKWtleU1hcHBpbmdQb29sQ29udHJhY3RBZGRyZXNzVG9Qb29sQXNzZXRzIhNwb29sQ29udHJhY3RBZGRyZXNzIilrZXlNYXBwaW5nUG9vbEFzc2V0c1RvUG9vbENvbnRyYWN0QWRkcmVzcyIfa2V5TWFwcGluZ1Bvb2xDb250cmFjdFRvTFBBc3NldCIqa2V5TWFwcGluZ1Bvb2xMUEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzIg1rZXlXeEVtaXNzaW9uIg1hbW91bnRBc3NldElkIgxwcmljZUFzc2V0SWQiCGtleUluRmVlIg9rZXlJbkZlZURlZmF1bHQiCWtleU91dEZlZSIQa2V5T3V0RmVlRGVmYXVsdCIWa2V5U2tpcE9yZGVyVmFsaWRhdGlvbiIRa2V5Q2hhbmdlQW1wRGVsYXkiEWtleUNoYW5nZUFtcERlbHRhIhJrZXlDaGFuZ2VBbXBUYXJnZXQiD2dldFN0cmluZ09yRmFpbCIDa2V5IhBnZXRCb29sZWFuT3JGYWlsIgxnZXRJbnRPckZhaWwiDHBhcnNlQXNzZXRJZCIFaW5wdXQiGElkeEZhY3RvcnlDZmdTdGFraW5nRGFwcCIZSWR4RmFjdG9yeUNmZ0Jvb3N0aW5nRGFwcCIUSWR4RmFjdG9yeUNmZ0lkb0RhcHAiFUlkeEZhY3RvcnlDZmdUZWFtRGFwcCIZSWR4RmFjdG9yeUNmZ0VtaXNzaW9uRGFwcCIVSWR4RmFjdG9yeUNmZ1Jlc3REYXBwIhlJZHhGYWN0b3J5Q2ZnU2xpcHBhZ2VEYXBwIhRJZHhGYWN0b3J5Q2ZnRGFvRGFwcCIaSWR4RmFjdG9yeUNmZ01hcmtldGluZ0RhcHAiGklkeEZhY3RvcnlDZmdHd3hSZXdhcmREYXBwIhZJZHhGYWN0b3J5Q2ZnQmlyZHNEYXBwIhhnZXRCb29zdGluZ0FkZHJlc3NPckZhaWwiCmZhY3RvcnlDZmciGGdldEVtaXNzaW9uQWRkcmVzc09yRmFpbCIXZ2V0U3Rha2luZ0FkZHJlc3NPckZhaWwiGWdldEd3eFJld2FyZEFkZHJlc3NPckZhaWwiDmdldFByaWNlQXNzZXRzIgckbWF0Y2gwIgFzIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0Ih1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdCIVcGVybWlzc2lvbkRlbmllZEVycm9yIgl0ZXN0RXJyb3IiCG11c3RUaGlzIgFpIgttdXN0TWFuYWdlciICcGsiEGRhdGFGYWN0b3J5Q2ZnVjMiDnN0YWtpbmdBZGRyZXNzIg9ib29zdGluZ0FkZHJlc3MiC2lkb0NvbnRyYWN0Igx0ZWFtQ29udHJhY3QiEGVtaXNzaW9uQ29udHJhY3QiDHJlc3RDb250cmFjdCIQc2xpcHBhZ2VDb250cmFjdCILZGFvQ29udHJhY3QiEW1hcmtldGluZ0NvbnRyYWN0IhJnd3hSZXdhcmRzQ29udHJhY3QiDWJpcmRzQ29udHJhY3QiDmRhdGFGYWN0b3J5Q2ZnIgtkYXRhUG9vbENmZyIKcG9vbFN0YXR1cyIJbHBBc3NldElkIg5hbW91bnRBc3NldFN0ciINcHJpY2VBc3NldFN0ciITYW1vdW50QXNzZXREZWNpbWFscyIScHJpY2VBc3NldERlY2ltYWxzIhVhbW91bnRBc3NldEludGVybmFsSWQiFHByaWNlQXNzZXRJbnRlcm5hbElkIg9scEFzc2V0RGVjaW1hbHMiCHBvb2xUeXBlIhVkYXRhTWFwcGluZ1Bvb2xBc3NldHMiFmludGVybmFsQW1vdW50QXNzZXRTdHIiFWludGVybmFsUHJpY2VBc3NldFN0ciINZ2V0UG9vbENvbmZpZyIKcG9vbEFzc2V0cyIaZ2V0SW50ZXJuYWxBc3NldElkT3JDcmVhdGUiCmFzc2V0SWRTdHIiC2luY3JlbWVudG9yIg9pbnRlcm5hbEFzc2V0SWQiGGN1cnJlbnRJbmRleE9mSW50ZXJuYWxJZCIGcmVzdWx0IhJuZXdJbnRlcm5hbEFzc2V0SWQiCW11c3RBZG1pbiIIYWRtaW5QS3MiCWlzTWFuYWdlciIWaW50T3JEZWZhdWx0T3JGYWxsYmFjayIKa2V5RGVmYXVsdCINdmFsdWVGYWxsYmFjayIScG9vbEV4aXN0c0ludGVybmFsIgRhbUFzIgRwckFzIgNjZmciCmNmZ1JldmVyc2UiBmV4aXN0cyIGYXNzZXQxIgZhc3NldDIiCWFzc2V0TnVtMSIJYXNzZXROdW0yIgJlZSIDcmVzIgJscCIPc3Rha2luZ0NvbnRyYWN0IhBib29zdGluZ0NvbnRyYWN0IhBzbHBpcGFnZUNvbnRyYWN0Ig1wcmljZURlY2ltYWxzIgtjaGVja0NhbGxlciIQbWF0aGNoZXJQdWI1OFN0ciIKbWF0aGNlclB1YiIVbGVnYWN5RmFjdG9yeUNvbnRyYWN0IgtsZWdhY3lQb29scyITYXNzZXRzU3RvcmVDb250cmFjdCIWdm90aW5nRW1pc3Npb25Db250cmFjdCILcHJpY2VBc3NldHMiBWNoZWtzIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSIVY2hlY2tNYW5hZ2VyUHVibGljS2V5IgJwbSIFaGFzUE0iB2NoZWNrUE0iDGFkbWluUHViS2V5cyILbHBBc3NldE5hbWUiDGxwQXNzZXREZXNjciIKcG9vbFdlaWdodCIEbG9nbyIXaW50ZXJuYWxBbW91bnRBc3NldERhdGEiFWludGVybmFsQW1vdW50QXNzZXRJZCIWaW50ZXJuYWxQcmljZUFzc2V0RGF0YSIUaW50ZXJuYWxQcmljZUFzc2V0SWQiFXBvb2xBY2NvdW50U2NyaXB0SGFzaCIcZXRoYWxvblBvb2xBY2NvdW50U2NyaXB0SGFzaCIKcG9vbEV4aXN0cyIPcG9vbENvbmZpZ1ZhbHVlIhRhbW91bnRBc3NldHNEZWNpbWFscyITcHJpY2VBc3NldHNEZWNpbWFscyISbHBBc3NldElzc3VlQWN0aW9uIgxscEFzc2V0SWRTdHIiGHBvb2xBY3RpdmF0ZUludm9rZVJlc3VsdCIYY3JlYXRlT3JVcGRhdGVMcEFzc2V0SW52IhJhZGRQb29sc0xwTGFiZWxJbnYiCnNldExvZ29JbnYiEGFkZEFzc2V0c0xpbmtJbnYiG2luY3JlYXNlQXNzZXRQb29sc051bWJlckludiIJbmV3U3RhdHVzIgpwb29sQ29uZmlnIgpscEFzc2V0RGNtIgxhbW91bnRUb0VtaXQiBmNhbGxlciIMb3JpZ2luQ2FsbGVyIhBscEFzc2V0UmVxdWVzdGVkIgdscEFzc2V0IgxhbW91bnRUb0J1cm4iB3BheW1lbnQiDXBheW1lbnRBbW91bnQiD2luQW1vdW50QXNzZXRJZCIabHBBc3NldFJlcXVlc3RlZEZvckJ1cm5pbmciBXNoYXJlIg1wb29sV2VpZ2h0S2V5Igxnd3hXZWlnaHRLZXkiCWd3eFdlaWdodCINcG9vbFdlaWdodE5ldyIRb25Nb2RpZnlXZWlnaHRJbnYiFWd3eFZpcnR1YWxQb29sQWN0aW9ucyIUcG9vbFdlaWdodEhpc3RvcnlLZXkiF3Bvb2xXZWlnaHRIaXN0b3J5T3JVbml0Ihhwb29sV2VpZ2h0SGlzdG9yeUFjdGlvbnMiDmJ0Y1Bvb2xBZGRyZXNzIg5ldGhQb29sQWRkcmVzcyIRZXRoQnRjUG9vbEFkZHJlc3MiE3VzZGNVc2R0UG9vbEFkZHJlc3MiD2V0aEJ0Y1dlaWdodE5ldyIRdXNkY1VzZHRXZWlnaHROZXciD3dlaWdodERlY3JlbWVudCILc3Rha2luZ0RhcHAiDWd3eFJld2FyZERhcHAiDGJ0Y1dlaWdodEtFWSIMZXRoV2VpZ2h0S0VZIg9ldGhCdGNXZWlnaHRLRVkiEXVzZGNVc2R0V2VpZ2h0S0VZIglidGNXZWlnaHQiCWV0aFdlaWdodCIMYnRjV2VpZ2h0TmV3IgxldGhXZWlnaHROZXciD2J0Y0xwQXNzZXRJZFN0ciIPZXRoTHBBc3NldElkU3RyIhJldGhCdGNMcEFzc2V0SWRTdHIiFHVzZGNVc2R0THBBc3NldElkU3RyIhFvbk1vZGlmeVdlaWdodEJ0YyIRb25Nb2RpZnlXZWlnaHRFdGgiFG9uTW9kaWZ5V2VpZ2h0RXRoQnRjIhZvbk1vZGlmeVdlaWdodFVzZGNVc2R0IgloYXZlTGFiZWwiAWIiB2Fzc2V0SWQiFGNoZWNrUHJpY2VBc3NldHNTaXplIgJjYiIDYWNjIgpwcmljZUFzc2V0IgFyIgdhY3Rpb25zIgIkbCICJHMiBSRhY2MwIgUkZjBfMSICJGEiAiRpIgUkZjBfMiIecG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIiJhbGxQb29sc09uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIgNmZWUiEGFtb3VudEFzc2V0SWRTdHIiD3ByaWNlQXNzZXRJZFN0ciIbYW1vdW50QXNzZXRJbnRlcm5hbElkT3B0aW9uIhpwcmljZUFzc2V0SW50ZXJuYWxJZE9wdGlvbiIZcG9vbENvbnRyYWN0QWRkcmVzc09wdGlvbiIPbHBBc3NldElkT3B0aW9uIghwb29sSW5mbyIFZGVsYXkiBWRlbHRhIgZ0YXJnZXQiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleW0AAWEACAABYgCAwtcvAAFjABIAAWQJALYCAQCAgJC7utat8A0AAWUFAWIAAWYCDkdXWHZpcnR1YWxQT09MAAFnAghQT09MU19MUAABaACAiXoAAWkCBVdBVkVTAAFqCQBoAgkAaAIAZADoBwDoBwABawICX18AAWwCAAABbQABAAFuAAIAAW8AAwABcAAEAAFxAAEAAXIAAgABcwADAAF0AAEAAXUAAgABdgADAAF3AAQAAXgABQABeQAGAAF6AAcAAUEACAABQgAJAAFDAAoAAUQACwABRQILV1hfRU1JU1NJT04AAUYJAMwIAgUBRQUDbmlsAQFHAAIXJXNfX2FsbG93ZWRMcFNjcmlwdEhhc2gBAUgAAh0lc19fYWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaAEBSQACIiVzX19hbGxvd2VkTHBTdGFibGVBZGRvblNjcmlwdEhhc2gBAUoAAhAlc19fc3dhcENvbnRyYWN0AQFLAAIRJXNfX2ZhY3RvcnlDb25maWcBAUwAAhAlc19fbHBUb2tlbnNMaXN0AQFNAAIWJXMlc19fcG9vbF9fc2NyaXB0SGFzaAEBTgACGCVzJXNfX21hdGNoZXJfX3B1YmxpY0tleQEBTwACGSVzX19sZWdhY3lGYWN0b3J5Q29udHJhY3QBAVAAAg8lc19fbGVnYWN5UG9vbHMBAVEAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBUgACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBUwACECVzX19hZG1pblB1YktleXMBAVQAAhclc19fYXNzZXRzU3RvcmVDb250cmFjdAEBVQACGiVzX192b3RpbmdFbWlzc2lvbkNvbnRyYWN0AQFWAAkAuQkCCQDMCAICAiVzCQDMCAICC3ByaWNlQXNzZXRzBQNuaWwFAWsBAVcAAhElc19fcHJpY2VEZWNpbWFscwEBWAACDCVzX19zaHV0ZG93bgEBWQACFyVzX19uZXh0SW50ZXJuYWxBc3NldElkAQFaAQJhYQkArAICAhIlcyVzX19wb29sV2VpZ2h0X18FAmFhAQJhYgICYWECYWMJAKwCAgkArAICCQCsAgICEiVzJXNfX3Bvb2xXZWlnaHRfXwUCYWECAl9fCQCkAwEFAmFjAQJhZAECYWUJAKwCAgIoJXMlcyVkX19tYXBwaW5nc19faW50ZXJuYWwyYmFzZUFzc2V0SWRfXwkApAMBBQJhZQECYWYBAmFnCQCsAgICKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAmFnAQJhaAICYWkCYWoJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFpAgJfXwUCYWoCCF9fY29uZmlnAQJhawECYWwEAmFtBQJhbAQCYWkIBQJhbQJfMQQCYWoIBQJhbQJfMgkAuQkCCQDMCAICBiVkJWQlcwkAzAgCCQCkAwEFAmFpCQDMCAIJAKQDAQUCYWoJAMwIAgIab25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQFA25pbAUBawECYW4ACQC5CQIJAMwIAgICJXMJAMwIAgIab25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQFA25pbAUBawECYW8BAmFwCQCsAgIJAKwCAgIIJXMlcyVzX18FAmFwAhhfX21hcHBpbmdzX19scEFzc2V0MlBvb2wBAmFxAgJhcgJhcwkArAICCQCsAgIJAKwCAgkArAICAgolZCVkJXMlc19fBQJhcgICX18FAmFzAh5fX21hcHBpbmdzX19Qb29sQXNzZXRzMkxwQXNzZXQBAmF0AQJhYQkArAICAg4lcyVzX19zcHJlYWRfXwUCYWEBAmF1AQJhdgkArAICCQCsAgICCCVzJXMlc19fBQJhdgIjX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MlBvb2xBc3NldHMBAmF3AgJhcgJhcwkArAICCQCsAgIJAKwCAgkArAICAgolZCVkJXMlc19fCQCkAwEFAmFyAgJfXwkApAMBBQJhcwIjX19tYXBwaW5nc19fcG9vbEFzc2V0czJQb29sQ29udHJhY3QBAmF4AQJhdgkArAICCQCsAgICCCVzJXMlc19fBQJhdgIgX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MkxwQXNzZXQBAmF5AQJhcAkArAICCQCsAgICCCVzJXMlc19fBQJhcAIgX19tYXBwaW5nc19fbHBBc3NldDJQb29sQ29udHJhY3QBAmF6AgJhQQJhQgkArAICCQCsAgIJAKwCAgIUJXMlcyVzX193eEVtaXNzaW9uX18FAmFBAgJfXwUCYUIBAmFDAQJhYQkArAICAg0lcyVzX19pbkZlZV9fBQJhYQECYUQAAhAlc19faW5GZWVEZWZhdWx0AQJhRQECYWEJAKwCAgIOJXMlc19fb3V0RmVlX18FAmFhAQJhRgACESVzX19vdXRGZWVEZWZhdWx0AQJhRwECYWEJAKwCAgIbJXMlc19fc2tpcE9yZGVyVmFsaWRhdGlvbl9fBQJhYQECYUgBAmFhCQCsAgICFiVzJXNfX2NoYW5nZUFtcERlbGF5X18FAmFhAQJhSQECYWEJAKwCAgIWJXMlc19fY2hhbmdlQW1wRGVsdGFfXwUCYWEBAmFKAQJhYQkArAICAhclcyVzX19jaGFuZ2VBbXBUYXJnZXRfXwUCYWEBAmFLAQJhTAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFAmFMCQCsAgICFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUCYUwBAmFNAQJhTAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCbCAIFBHRoaXMFAmFMCQCsAgICFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUCYUwBAmFOAQJhTAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAmFMCQCsAgICFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUCYUwBAmFPAQJhUAMJAAACBQJhUAUBaQUEdW5pdAkA2QQBBQJhUAACYVEAAQACYVIAAgACYVMAAwACYVQABAACYVUABQACYVYABgACYVcABwACYVgACAACYVkACQACYVoACgACYmEACwECYmIBAmJjCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmJjBQJhUgECYmQBAmJjCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmJjBQJhVQECYmUBAmJjCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmJjBQJhUQECYmYBAmJjCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmJjBQJhWgECYmcABAJiaAkAoggBCQEBVgADCQABAgUCYmgCBlN0cmluZwQCYmkFAmJoAwkAAAIJALECAQUCYmkAAAUDbmlsCQC1CQIFAmJpBQFrBQNuaWwBAmJqAAQCYmgJAKIIAQkBAVEAAwkAAQIFAmJoAgZTdHJpbmcEAmJpBQJiaAkA2QQBBQJiaQMJAAECBQJiaAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJiawAEAmJoCQCiCAEJAQFSAAMJAAECBQJiaAIGU3RyaW5nBAJiaQUCYmgJANkEAQUCYmkDCQABAgUCYmgCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACYmwJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAACYm0JAAIBAg9UZXN0IGVycm9yIGhlcmUBAmJuAQJibwMJAAACCAUCYm8GY2FsbGVyBQR0aGlzBgUCYmwBAmJwAQJibwQCYmgJAQJiagADCQABAgUCYmgCCkJ5dGVWZWN0b3IEAmJxBQJiaAMJAAACCAUCYm8PY2FsbGVyUHVibGljS2V5BQJicQYFAmJsAwkAAQIFAmJoAgRVbml0CQECYm4BBQJibwkAAgECC01hdGNoIGVycm9yAQJicgsCYnMCYnQCYnUCYnYCYncCYngCYnkCYnoCYkECYkICYkMJALkJAgkAzAgCAhYlcyVzJXMlcyVzJXMlcyVzJXMlcyVzCQDMCAIFAmJzCQDMCAIFAmJ0CQDMCAIFAmJ1CQDMCAIFAmJ2CQDMCAIFAmJ3CQDMCAIFAmJ4CQDMCAIFAmJ5CQDMCAIFAmJ6CQDMCAIFAmJBCQDMCAIFAmJCCQDMCAIFAmJDBQNuaWwFAWsBAmJEBwJicwJidAJidQJidgJidwJieAJieQkAuQkCCQDMCAICDCVzJXMlcyVzJXMlcwkAzAgCBQJicwkAzAgCBQJidAkAzAgCBQJidQkAzAgCBQJidgkAzAgCBQJidwkAzAgCBQJieAkAzAgCBQJieQUDbmlsBQFrAQJiRQsCYWECYkYCYkcCYkgCYkkCYkoCYksCYkwCYk0CYk4CYk8JALkJAgkAzAgCAhYlcyVkJXMlcyVzJWQlZCVkJWQlZCVzCQDMCAIFAmFhCQDMCAIFAmJGCQDMCAIFAmJHCQDMCAIFAmJICQDMCAIFAmJJCQDMCAIJAKQDAQUCYkoJAMwIAgkApAMBBQJiSwkAzAgCCQCkAwEFAmJMCQDMCAIJAKQDAQUCYk0JAMwIAgkApAMBBQJiTgkAzAgCBQJiTwUDbmlsBQFrAQJiUAICYlECYlIJALkJAgkAzAgCAgQlZCVkCQDMCAIJAKQDAQUCYlEJAMwIAgkApAMBBQJiUgUDbmlsBQFrAQJiUwECYWEEAmJUCQC1CQIJAQJhSwEJAQJhdQEFAmFhBQFrBAJhaQkAkQMCBQJiVAABBAJhagkAkQMCBQJiVAACCQC1CQIJAQJhSwEJAQJhaAIFAmFpBQJhagUBawECYlUCAmJWAmJXBAJiWAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYWYBBQJiVgAABAJiWQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBWQAAAAQCYloDCQAAAgUCYlgAAAQCY2EJAGQCBQJiWQUCYlcJAJUKAwUCY2EJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFZAAUCY2EJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhZgEFAmJWBQJjYQkAzAgCCQELU3RyaW5nRW50cnkCCQECYWQBBQJjYQUCYlYFA25pbAYJAJUKAwUCYlgFA25pbAcFAmJaAQJjYgECYm8EAmNjCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBAVMABQFsBQFrAwkBD2NvbnRhaW5zRWxlbWVudAIFAmNjCQDYBAEIBQJibw9jYWxsZXJQdWJsaWNLZXkGBAJjZAkBAmJwAQUCYm8DCQAAAgUCY2QFAmNkBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECY2UDAmFMAmNmAmNnCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFMCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmNmBQJjZwECY2gCAmFBAmFCBAJhaQkAnwgBCQECYWYBBQJhQQQCYWoJAJ8IAQkBAmFmAQUCYUIDAwkAAAIFAmFpBQR1bml0BgkAAAIFAmFqBQR1bml0BwQCY2kJAKQDAQkBBXZhbHVlAQUCYWkEAmNqCQCkAwEJAQV2YWx1ZQEFAmFqBAJjawkAoggBCQECYWgCBQJjaQUCY2oEAmNsCQCiCAEJAQJhaAIFAmNqBQJjaQQCY20DCQECIT0CBQJjawUEdW5pdAYJAQIhPQIFAmNsBQR1bml0BQJjbSACYm8BF2dldFN3YXBDb250cmFjdFJFQURPTkxZAAkAlAoCBQNuaWwJAQJhSwEJAQFKAAJibwEgZ2V0THBBc3NldEZyb21Qb29sQXNzZXRzUkVBRE9OTFkCAmNuAmNvAwMJAAACBQJjbgIsOExRVzhmN1A1ZDVQWk03R3RaRUJnYXFSUEdTelMzRGZQdWlYclVSSjRBSlMJAAACBQJjbwIFV0FWRVMHCQCUCgIFA25pbAUEdW5pdAQCY3AJAQV2YWx1ZQEJAJoIAgUEdGhpcwkBAmFmAQUCY24EAmNxCQEFdmFsdWUBCQCaCAIFBHRoaXMJAQJhZgEFAmNvBAJjcgkAnQgCBQR0aGlzCQECYXECCQCkAwEFAmNwCQCkAwEFAmNxBAJjcwMJAAACBQJjcgUEdW5pdAUEdW5pdAkAsAICCQEFdmFsdWUBBQJjcgAECQCUCgIFA25pbAUCY3MCYm8BIWdldFBvb2xBZGRyZXNzRnJvbUxwQXNzZXRSRUFET05MWQECY3QJAJQKAgUDbmlsCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQJheQEFAmN0AgACYm8BC2NvbnN0cnVjdG9yCAJjdQJjdgJidQJidgJidwJieAJjdwJjeAQCY3kJAQJicAEFAmJvAwkAAAIFAmN5BQJjeQkAzAgCCQELU3RyaW5nRW50cnkCCQEBSwAJAQJiRAcFAmN1BQJjdgUCYnUFAmJ2BQJidwUCYngFAmN3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVwAFAmN4BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYm8BDWNvbnN0cnVjdG9yVjIBAmN6BAJjeQkBAmJwAQUCYm8DCQAAAgUCY3kFAmN5BAJjQQkApwgBCQDZBAEFAmN6AwkAAAIFAmNBBQJjQQkAzAgCCQELU3RyaW5nRW50cnkCCQEBTgAFAmN6BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYm8BDWNvbnN0cnVjdG9yVjMEAmJ6AmJBAmJCAmJDBAJjeQkBAmJwAQUCYm8DCQAAAgUCY3kFAmN5BAJiYwkAtQkCCQECYUsBCQEBSwAFAWsJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUsACQECYnILCQCRAwIFAmJjAAEJAJEDAgUCYmMAAgkAkQMCBQJiYwADCQCRAwIFAmJjAAQJAJEDAgUCYmMABQkAkQMCBQJiYwAGCQCRAwIFAmJjAAcFAmJ6BQJiQQUCYkIFAmJDBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYm8BDWNvbnN0cnVjdG9yVjQCAmNCAmNDBAJjeQkBAmJwAQUCYm8DCQAAAgUCY3kFAmN5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFPAAUCY0IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVAACQC5CQIFAmNDBQFrBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYm8BDWNvbnN0cnVjdG9yVjUBAmNEBAJjeQkBAmJwAQUCYm8DCQAAAgUCY3kFAmN5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAAUCY0QFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJibwENY29uc3RydWN0b3JWNgICY0UCY0YEAmNHCQDMCAIJAQJicAEFAmJvCQDMCAIDCQECIT0CCQCmCAEFAmNFBQR1bml0BgIoaW52YWxpZCB2b3RpbmcgZW1pc3Npb24gY29udHJhY3QgYWRkcmVzcwUDbmlsAwkAAAIFAmNHBQJjRwkAzAgCCQELU3RyaW5nRW50cnkCCQEBVQAFAmNFCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFWAAkAuQkCBQJjRgUBawUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJvAQpzZXRNYW5hZ2VyAQJjSAQCY3kJAQJicAEFAmJvAwkAAAIFAmN5BQJjeQQCY0kJANkEAQUCY0gDCQAAAgUCY0kFAmNJCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFSAAUCY0gFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJibwEOY29uZmlybU1hbmFnZXIABAJjSgkBAmJrAAQCY0sDCQEJaXNEZWZpbmVkAQUCY0oGCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmNLBQJjSwQCY0wDCQAAAggFAmJvD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCY0oGCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmNMBQJjTAkAzAgCCQELU3RyaW5nRW50cnkCCQEBUQAJANgEAQkBBXZhbHVlAQUCY0oJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVIABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYm8BCXNldEFkbWlucwECY00EAmN5CQECYnABBQJibwMJAAACBQJjeQUCY3kJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMACQC5CQIFAmNNBQFrBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYm8BD2FjdGl2YXRlTmV3UG9vbAgCYWECYkgCYkkCY04CY08CY1ACYk8CY1EEAmN5CQECY2IBBQJibwMJAAACBQJjeQUCY3kDCQEJaXNEZWZpbmVkAQkAoggBCQECYXUBBQJhYQkAAgEJAKwCAgkArAICAg1Qb29sIGFkZHJlc3MgBQJhYQIUIGFscmVhZHkgcmVnaXN0ZXJlZC4EAmNSCQECYlUCBQJiSAABBAJjUwgFAmNSAl8xBAJjVAkBAmJVAgUCYkkDCAUCY1ICXzMAAgABBAJjVQgFAmNUAl8xBAJjVgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDxBwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmFhCQCsAgICKU5vIHNjcmlwdCBoYXMgYmVlbiBmb3VuZCBvbiBwb29sIGFjY291bnQgBQJhYQQCY1cJARFAZXh0ck5hdGl2ZSgxMDU3KQEJAQFNAAQCY1gJAQJjaAIFAmJIBQJiSQMFAmNYCQACAQkArAICCQCsAgIJAKwCAgkArAICAgVQb29sIAUCYkgCAS8FAmJJAhwgaGFzIGFscmVhZHkgYmVlbiBhY3RpdmF0ZWQuBAJjWQkBBXZhbHVlAQkAnQgCBQR0aGlzCQECYWgCCQCkAwEFAmNTCQCkAwEFAmNVBAJjWgMJAAACBQJiSAIFV0FWRVMFAWoJAGwGAAoAAAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQJiSAhkZWNpbWFscwAAAAAFBERPV04EAmRhAwkAAAIFAmJJAgVXQVZFUwUBagkAbAYACgAACAkBBXZhbHVlAQkA7AcBCQDZBAEFAmJJCGRlY2ltYWxzAAAAAAUERE9XTgQCZGIJAMIIBQUCY04FAmNPAAEACAYEAmJHCQC4CAEFAmRiBAJkYwkA2AQBBQJiRwQCZGQJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYWECCGFjdGl2YXRlCQDMCAIFAmJICQDMCAIFAmJJBQNuaWwFA25pbAMJAAACBQJkZAUCZGQDCQECIT0CBQJkZAIHc3VjY2VzcwkAAgECI1Bvb2wgaW5pdGlhbGlzYXRpb24gZXJyb3IgaGFwcGVuZWQuBAJjRAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFLAQkBAVQABAJkZQkA/AcEBQJjRAIOY3JlYXRlT3JVcGRhdGUJAMwIAgUCZGMJAMwIAgUCY04JAMwIAgcFA25pbAUDbmlsAwkAAAIFAmRlBQJkZQQCZGYJAPwHBAUCY0QCCGFkZExhYmVsCQDMCAIFAmRjCQDMCAIFAWcFA25pbAUDbmlsAwkAAAIFAmRmBQJkZgQCZGcJAPwHBAUCY0QCB3NldExvZ28JAMwIAgUCZGMJAMwIAgUCY1EFA25pbAUDbmlsAwkAAAIFAmRnBQJkZwQCZGgJAPwHBAUCY0QCDWFkZEFzc2V0c0xpbmsJAMwIAgUCYkgJAMwIAgUCYkkJAMwIAgUCZGMFA25pbAUDbmlsAwkAAAIFAmRoBQJkaAQCZGkJAPwHBAUCY0QCGGluY3JlYXNlQXNzZXRQb29sc051bWJlcgkAzAgCBQJiSAUDbmlsBQNuaWwDCQAAAgUCZGkFAmRpCQCUCgIJAM4IAgkAzggCCAUCY1ICXzIIBQJjVAJfMgkAzAgCBQJkYgkAzAgCCQEEQnVybgIFAmJHAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFoAgkApAMBBQJjUwkApAMBBQJjVQkBAmJFCwUCYWEJAKQDAQUBbQUCZGMFAmJIBQJiSQUCY1oFAmRhBQJjUwUCY1UFAWoFAmJPCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhbwEFAmRjCQECYlACBQJjUwUCY1UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFxAgkApAMBBQJjUwkApAMBBQJjVQkArAICAgQlc19fBQJkYwkAzAgCCQELU3RyaW5nRW50cnkCCQECYXUBBQJhYQkBAmJQAgUCY1MFAmNVCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhdwIFAmNTBQJjVQUCYWEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF5AQUCZGMFAmFhCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJheAEFAmFhBQJkYwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVoBBQJhYQUCY1AJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdAEFAmFhBQFoBQNuaWwFAmRjCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJvAQptYW5hZ2VQb29sAgJhYQJkagQCY3kJAQJicAEFAmJvAwkAAAIFAmN5BQJjeQQCZGsJAQJiUwEFAmFhBAJiRgkAkQMCBQJkawUBdQQCZGMJAJEDAgUCZGsFAXYEAmJICQCRAwIFAmRrBQF3BAJiSQkAkQMCBQJkawUBeAQCY1oJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkawUBeQQCZGEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkawUBegQCY1MJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkawUBQQQCY1UJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkawUBQgQCZGwJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkawUBQwQCYk8JAJEDAgUCZGsFAUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFoAgkApAMBBQJjUwkApAMBBQJjVQkBAmJFCwUCYWEJAKQDAQUCZGoFAmRjBQJiSAUCYkkFAmNaBQJkYQUCY1MFAmNVBQJkbAUCYk8FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJibwEEZW1pdAECZG0EAmRuCAUCYm8GY2FsbGVyBAJkbwgFAmJvDG9yaWdpbkNhbGxlcgQCZHAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQECYXgBCQClCAEFAmRuAh1JbnZhbGlkIExQIGFkZHJlc3MgY2FsbGVkIG1lLgQCZHEJANkEAQUCZHAEAmNDCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBAVAABQFsBQFrBAJjQgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAQFPAAIoTGVnYWN5IGZhY3RvcnkgY29udHJhY3QgZG9lcyBub3QgZXhpc3RzLgMJAGcCAAAFAmRtBQNuaWwDCQEPY29udGFpbnNFbGVtZW50AgUCY0MJAKUIAQUCZG4JAJQKAgUDbmlsBQJjQgkAlAoCCQDMCAIJAQdSZWlzc3VlAwUCZHEFAmRtBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCYm8GY2FsbGVyBQJkbQUCZHEFA25pbAIHc3VjY2VzcwJibwEEYnVybgECZHIEAmRuCAUCYm8GY2FsbGVyBAJkbwgFAmJvDG9yaWdpbkNhbGxlcgQCZHMJAQV2YWx1ZQEJAJEDAggFAmJvCHBheW1lbnRzAAAEAmR0CQEFdmFsdWUBCAUCZHMGYW1vdW50BAJkdQkA2AQBCQEFdmFsdWUBCAUCZHMHYXNzZXRJZAQCZHYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQECYXgBCQClCAEFAmRuAh1JbnZhbGlkIExQIGFkZHJlc3MgY2FsbGVkIG1lLgMJAQIhPQIFAmR1BQJkdgkAAgECFUludmFsaWQgYXNzZXQgcGFzc2VkLgMJAQIhPQIFAmRyBQJkdAkAAgECFkludmFsaWQgYW1vdW50IHBhc3NlZC4EAmRxCQDZBAEFAmR2CQCUCgIJAMwIAgkBBEJ1cm4CBQJkcQUCZHIFA25pbAIHc3VjY2VzcwJibwEMbW9kaWZ5V2VpZ2h0AgJiRwJkdwQCY3kDCQAAAgkA2AQBCAgFAmJvBmNhbGxlcgVieXRlcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEBVQACAAYJAQJicAEFAmJvAwkAAAIFAmN5BQJjeQQCYXYJAQJhSwEJAQJheQEFAmJHBAJkeAkBAVoBBQJhdgQCZHkJAQFaAQUBZgQCZHoJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUCZHkAAAQCY1AJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUCZHgAAAQCZEEFAmR3BAJiYwkAtQkCCQECYUsBCQEBSwAFAWsEAmN1CQECYmUBBQJiYwQCZEIJAPwHBAUCY3UCDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmJHCQDMCAIFAmF2BQNuaWwFA25pbAMJAAACBQJkQgUCZEIEAmRDAwkAAAIFAmR6AAAFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZHkAAAUDbmlsBAJkRAkBAmFiAgUCYXYAAAQCZEUJAJ8IAQUCZEQEAmRGAwkAAAIFAmRFBQR1bml0BQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQUCZEQFA25pbAkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmR4BQJkQQUDbmlsBQJkQwUCZEYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYm8BDW1vZGlmeVdlaWdodHMEAmRHAmRIAmRJAmRKBAJjeQkBAmJwAQUCYm8DCQAAAgUCY3kFAmN5BAJkSwkAaQIJAGgCAAUFAWUAZAQCZEwJAGkCCQBoAgAFBQFlAGQEAmRNCQBpAgkAaAIABQUBZQBkBAJiYwkAtQkCCQECYUsBCQEBSwAFAWsEAmROCQECYmUBBQJiYwQCZE8JAQJiZgEFAmJjBAJkUAkBAVoBBQJkRwQCZFEJAQFaAQUCZEgEAmRSCQEBWgEFAmRJBAJkUwkBAVoBBQJkSgQCZFQJAQJhTgEFAmRQBAJkVQkBAmFOAQUCZFEEAmRWCQBlAgUCZFQFAmRNBAJkVwkAZQIFAmRVBQJkTQMJAGcCAAAFAmRWCQACAQkArAICAhZpbnZhbGlkIGJ0Y1dlaWdodE5ldzogCQCkAwEFAmRWAwkAZwIAAAUCZFcJAAIBCQCsAgICFmludmFsaWQgZXRoV2VpZ2h0TmV3OiAJAKQDAQUCZFcEAmRYCQECYUsBCQECYXgBBQJkRwQCZFkJAQJhSwEJAQJheAEFAmRIBAJkWgkBAmFLAQkBAmF4AQUCZEkEAmVhCQECYUsBCQECYXgBBQJkSgQCZWIJAPwHBAUCZE4CDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmRYCQDMCAIFAmRHBQNuaWwFA25pbAMJAAACBQJlYgUCZWIEAmVjCQD8BwQFAmROAg5vbk1vZGlmeVdlaWdodAkAzAgCBQJkWQkAzAgCBQJkSAUDbmlsBQNuaWwDCQAAAgUCZWMFAmVjBAJlZAkA/AcEBQJkTgIOb25Nb2RpZnlXZWlnaHQJAMwIAgUCZFoJAMwIAgUCZEkFA25pbAUDbmlsAwkAAAIFAmVkBQJlZAQCZWUJAPwHBAUCZE4CDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmVhCQDMCAIFAmRKBQNuaWwFA25pbAMJAAACBQJlZQUCZWUJAMwIAgkBDEludGVnZXJFbnRyeQIFAmRQBQJkVgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZFEFAmRXCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkUgUCZEsJAMwIAgkBDEludGVnZXJFbnRyeQIFAmRTBQJkTAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFiAgUCZEcAAAUCZFQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYgIFAmRIAAAFAmRVCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWICBQJkSQAABQJkSwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFiAgUCZEoAAAUCZEwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJibwEYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsAgJhQQJhQgQCZWYEAmJoCQCgCAEJAQJhegIFAmFBBQJhQgMJAAECBQJiaAIHQm9vbGVhbgQCZWcFAmJoBQJlZwcJAJQKAgUDbmlsBQJlZgJibwEWc2V0V3hFbWlzc2lvblBvb2xMYWJlbAICYUECYUIEAmN5CQECY2IBBQJibwMJAAACBQJjeQUCY3kJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAmF6AgUCYUEFAmFCBgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJvARlkZWxldGVXeEVtaXNzaW9uUG9vbExhYmVsAgJhQQJhQgQCY3kDCQECYm4BBQJibwYJAQJjYgEFAmJvAwkAAAIFAmN5BQJjeQkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhegIFAmFBBQJhQgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJvARJvblZlcmlmaWNhdGlvbkxvc3MBAmVoBAJjeQMJAAACCQDYBAEICAUCYm8GY2FsbGVyBWJ5dGVzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQFUAAIABgkBAmJwAQUCYm8DCQAAAgUCY3kFAmN5BAJjRgkBAmJnAAQCZWkDCQBmAgkAkAMBBQJjRgAABgkAAgECFGludmFsaWQgcHJpY2UgYXNzZXRzAwkAAAIFAmVpBQJlaQoBAmVqAgJlawJlbAQCZW0JAPwHBAUEdGhpcwIZZGVsZXRlV3hFbWlzc2lvblBvb2xMYWJlbAkAzAgCBQJlaAkAzAgCBQJlbAUDbmlsBQNuaWwDCQAAAgUCZW0FAmVtBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJlbgoAAmVvBQJjRgoAAmVwCQCQAwEFAmVvCgACZXEFBHVuaXQKAQJlcgICZXMCZXQDCQBnAgUCZXQFAmVwBQJlcwkBAmVqAgUCZXMJAJEDAgUCZW8FAmV0CgECZXUCAmVzAmV0AwkAZwIFAmV0BQJlcAUCZXMJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAyCQECZXUCCQECZXICCQECZXICBQJlcQAAAAEAAgMJAAACBQJlbgUCZW4JAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJvAShpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZAQJhYQQCZGsJAQJiUwEFAmFhBAJhbAkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGsFAUEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkawUBQgQCZXYJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBAmFrAQUCYWwHBAJldwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQECYW4ABwkAlAoCBQNuaWwDBQJldwYFAmV2AmJvARBnZXRJbkZlZVJFQURPTkxZAQJhYQQCZXgJAQJjZQMJAQJhQwEFAmFhCQECYUQAAAAJAJQKAgUDbmlsBQJleAJibwERZ2V0T3V0RmVlUkVBRE9OTFkBAmFhBAJleAkBAmNlAwkBAmFFAQUCYWEJAQJhRgAJAGsDAAoFAWIAkE4JAJQKAgUDbmlsBQJleAJibwEQcG9vbEluZm9SRUFET05MWQICZXkCZXoEAmVBCQCaCAIFBHRoaXMJAQJhZgEFAmV5BAJlQgkAmggCBQR0aGlzCQECYWYBBQJlegQCZUMJAJ0IAgUEdGhpcwkBAmF3AgkBBXZhbHVlAQUCZUEJAQV2YWx1ZQEFAmVCBAJlRAkAnQgCBQR0aGlzCQECYXgBCQEFdmFsdWUBBQJlQwQCY1gDAwkBCWlzRGVmaW5lZAEFAmVBCQEJaXNEZWZpbmVkAQUCZUIHCQEJaXNEZWZpbmVkAQUCZUMHBAJlRQMFAmNYCQCUCgIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFAmVDCQECYU8BCQEFdmFsdWUBBQJlRAUEdW5pdAkAlAoCBQNuaWwFAmVFAmJvARVnZXRQb29sU3RhdHVzUkVBRE9OTFkBAmFhBAJiVAkAtQkCCQECYUsBCQECYXUBBQJhYQUBawQCYWkJAJEDAgUCYlQAAQQCYWoJAJEDAgUCYlQAAgQCY2sJALUJAgkBAmFLAQkBAmFoAgUCYWkFAmFqBQFrCQCUCgIFA25pbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNrBQF1AmJvARVnZXRQb29sQ29uZmlnUkVBRE9OTFkBAmFhBAJiVAkAtQkCCQECYUsBCQECYXUBBQJhYQUBawQCYWkJAJEDAgUCYlQAAQQCYWoJAJEDAgUCYlQAAgQCY2sJALUJAgkBAmFLAQkBAmFoAgUCYWkFAmFqBQFrCQCUCgIFA25pbAUCY2sCYm8BGGdldFBvb2xDb25maWdCeUxwQXNzZXRJZAECZGMEAmJUCQC1CQIJAQJhSwEJAQJhbwEFAmRjBQFrBAJhaQkAkQMCBQJiVAABBAJhagkAkQMCBQJiVAACBAJjawkAtQkCCQECYUsBCQECYWgCBQJhaQUCYWoFAWsJAJQKAgUDbmlsBQJjawJibwEScG9vbEV4aXN0c1JFQURPTkxZAgJhQQJhQgkAlAoCBQNuaWwJAQJjaAIFAmFBBQJhQgJibwEbc2tpcE9yZGVyVmFsaWRhdGlvblJFQURPTkxZAQJhYQkAlAoCBQNuaWwJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBAmFHAQUCYWEHAmJvARpnZXRDaGFuZ2VBbXBDb25maWdSRUFET05MWQECYWEEAmVGCQERQGV4dHJOYXRpdmUoMTA1NSkBCQECYUgBBQJhYQQCZUcJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQJhSQEFAmFhBAJlSAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBAmFKAQUCYWEJAJQKAgUDbmlsCQDMCAIFAmVGCQDMCAIFAmVHCQDMCAIFAmVIBQNuaWwBAmVJAQJlSgAEAmVLBAJiaAkBAmJqAAMJAAECBQJiaAIKQnl0ZVZlY3RvcgQCYnEFAmJoBQJicQMJAAECBQJiaAIEVW5pdAgFAmVJD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJlSQlib2R5Qnl0ZXMJAJEDAggFAmVJBnByb29mcwAABQJlSzKKrNc=", "height": 2501162, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 688tfSDQMrf7MWxvrsT6N8k4PUVPsV1TtyBW6L7ediJa Next: 8BXfsqshR8cnAwrvyPVbE163XTg9DjYf41KXRwyYYQyb Diff:
OldNewDifferences
182182
183183
184184 func keyOutFeeDefault () = "%s__outFeeDefault"
185+
186+
187+func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
188+
189+
190+func keyChangeAmpDelay (poolAddress) = ("%s%s__changeAmpDelay__" + poolAddress)
191+
192+
193+func keyChangeAmpDelta (poolAddress) = ("%s%s__changeAmpDelta__" + poolAddress)
194+
195+
196+func keyChangeAmpTarget (poolAddress) = ("%s%s__changeAmpTarget__" + poolAddress)
185197
186198
187199 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
862874
863875
864876 @Callable(i)
865-func getPoolConfigByLpAssetIdREADONLY (lpAssetIdStr) = {
877+func getPoolConfigByLpAssetId (lpAssetIdStr) = {
866878 let poolAssets = split(getStringOrFail(keyMappingLpAssetToPoolAssets(lpAssetIdStr)), SEP)
867879 let amountAssetInternal = poolAssets[1]
868880 let priceAssetInternal = poolAssets[2]
874886
875887 @Callable(i)
876888 func poolExistsREADONLY (amountAssetId,priceAssetId) = $Tuple2(nil, poolExistsInternal(amountAssetId, priceAssetId))
889+
890+
891+
892+@Callable(i)
893+func skipOrderValidationREADONLY (poolAddress) = $Tuple2(nil, valueOrElse(getBoolean(keySkipOrderValidation(poolAddress)), false))
894+
895+
896+
897+@Callable(i)
898+func getChangeAmpConfigREADONLY (poolAddress) = {
899+ let delay = getIntegerValue(keyChangeAmpDelay(poolAddress))
900+ let delta = getIntegerValue(keyChangeAmpDelta(poolAddress))
901+ let target = getIntegerValue(keyChangeAmpTarget(poolAddress))
902+ $Tuple2(nil, [delay, delta, target])
903+ }
877904
878905
879906 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 8
55
66 let MULT8 = 100000000
77
88 let SCALE18 = 18
99
1010 let MULT18 = toBigInt(1000000000000000000)
1111
1212 let POOLWEIGHTMULT = MULT8
1313
1414 let GWXvirtualPOOL = "GWXvirtualPOOL"
1515
1616 let labelPoolsLp = "POOLS_LP"
1717
1818 let defaultSpread = 2000000
1919
2020 let wavesString = "WAVES"
2121
2222 let decimalsMultPrice = ((100 * 1000) * 1000)
2323
2424 let SEP = "__"
2525
2626 let EMPTY = ""
2727
2828 let PoolActive = 1
2929
3030 let PoolPutDisabled = 2
3131
3232 let PoolMatcherDisabled = 3
3333
3434 let PoolShutdown = 4
3535
3636 let idxInternalAssetId = 1
3737
3838 let idxResutActions = 2
3939
4040 let idxIfAssetIdCalculationPerformed = 3
4141
4242 let idxPoolAddress = 1
4343
4444 let idxPoolStatus = 2
4545
4646 let idxPoolLPAssetId = 3
4747
4848 let idxAmtAssetId = 4
4949
5050 let idxPriceAssetId = 5
5151
5252 let idxAmtAssetDcm = 6
5353
5454 let idxPriceAssetDcm = 7
5555
5656 let idxIAmtAssetId = 8
5757
5858 let idxIPriceAssetId = 9
5959
6060 let idxLPAssetDcm = 10
6161
6262 let idxPoolType = 11
6363
6464 let poolLabelWxEmission = "WX_EMISSION"
6565
6666 let validPoolLabels = [poolLabelWxEmission]
6767
6868 func keyAllowedLpScriptHash () = "%s__allowedLpScriptHash"
6969
7070
7171 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
7272
7373
7474 func keyAllowedLpStableAddonScriptHash () = "%s__allowedLpStableAddonScriptHash"
7575
7676
7777 func swapContract () = "%s__swapContract"
7878
7979
8080 func keyFactoryConfig () = "%s__factoryConfig"
8181
8282
8383 func keyLpTokensList () = "%s__lpTokensList"
8484
8585
8686 func keyPoolScriptHash () = "%s%s__pool__scriptHash"
8787
8888
8989 func keyMatcherPub () = "%s%s__matcher__publicKey"
9090
9191
9292 func keyLegacyFactoryContract () = "%s__legacyFactoryContract"
9393
9494
9595 func keyLegacyPools () = "%s__legacyPools"
9696
9797
9898 func keyManagerPublicKey () = "%s__managerPublicKey"
9999
100100
101101 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
102102
103103
104104 func keyAdminPubKeys () = "%s__adminPubKeys"
105105
106106
107107 func keyAssetsStoreContract () = "%s__assetsStoreContract"
108108
109109
110110 func keyVotingEmissionContract () = "%s__votingEmissionContract"
111111
112112
113113 func keyPriceAssets () = makeString(["%s", "priceAssets"], SEP)
114114
115115
116116 func keyPriceDecimals () = "%s__priceDecimals"
117117
118118
119119 func keyAllPoolsShutdown () = "%s__shutdown"
120120
121121
122122 func keyNextInternalAssetId () = "%s__nextInternalAssetId"
123123
124124
125125 func keyPoolToWeight (poolAddress) = ("%s%s__poolWeight__" + poolAddress)
126126
127127
128128 func keyPoolToWeightHistory (poolAddress,num) = ((("%s%s__poolWeight__" + poolAddress) + "__") + toString(num))
129129
130130
131131 func keyMappingsInternal2baseAssetId (internalBaseAsset) = ("%s%s%d__mappings__internal2baseAssetId__" + toString(internalBaseAsset))
132132
133133
134134 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
135135
136136
137137 func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config")
138138
139139
140140 func keyPoolOneTokenOperationsDisabled (assetsInternal) = {
141141 let $t037263788 = assetsInternal
142142 let amountAssetInternal = $t037263788._1
143143 let priceAssetInternal = $t037263788._2
144144 makeString(["%d%d%s", toString(amountAssetInternal), toString(priceAssetInternal), "oneTokenOperationsDisabled"], SEP)
145145 }
146146
147147
148148 func keyAllPoolsOneTokenOperationsDisabled () = makeString(["%s", "oneTokenOperationsDisabled"], SEP)
149149
150150
151151 func keyMappingLpAssetToPoolAssets (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2Pool")
152152
153153
154154 func keyMappingPoolAssetsToLpasset (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + internalAmountAssetIdStr) + "__") + internalPriceAssetIdStr) + "__mappings__PoolAssets2LpAsset")
155155
156156
157157 func keyPoolSpread (poolAddress) = ("%s%s__spread__" + poolAddress)
158158
159159
160160 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2PoolAssets")
161161
162162
163163 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
164164
165165
166166 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
167167
168168
169169 func keyMappingPoolLPAssetToPoolContractAddress (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2PoolContract")
170170
171171
172172 func keyWxEmission (amountAssetId,priceAssetId) = ((("%s%s%s__wxEmission__" + amountAssetId) + "__") + priceAssetId)
173173
174174
175175 func keyInFee (poolAddress) = ("%s%s__inFee__" + poolAddress)
176176
177177
178178 func keyInFeeDefault () = "%s__inFeeDefault"
179179
180180
181181 func keyOutFee (poolAddress) = ("%s%s__outFee__" + poolAddress)
182182
183183
184184 func keyOutFeeDefault () = "%s__outFeeDefault"
185+
186+
187+func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
188+
189+
190+func keyChangeAmpDelay (poolAddress) = ("%s%s__changeAmpDelay__" + poolAddress)
191+
192+
193+func keyChangeAmpDelta (poolAddress) = ("%s%s__changeAmpDelta__" + poolAddress)
194+
195+
196+func keyChangeAmpTarget (poolAddress) = ("%s%s__changeAmpTarget__" + poolAddress)
185197
186198
187199 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
188200
189201
190202 func getBooleanOrFail (key) = valueOrErrorMessage(getBoolean(this, key), ("No data for this.key=" + key))
191203
192204
193205 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), ("No data for this.key=" + key))
194206
195207
196208 func parseAssetId (input) = if ((input == wavesString))
197209 then unit
198210 else fromBase58String(input)
199211
200212
201213 let IdxFactoryCfgStakingDapp = 1
202214
203215 let IdxFactoryCfgBoostingDapp = 2
204216
205217 let IdxFactoryCfgIdoDapp = 3
206218
207219 let IdxFactoryCfgTeamDapp = 4
208220
209221 let IdxFactoryCfgEmissionDapp = 5
210222
211223 let IdxFactoryCfgRestDapp = 6
212224
213225 let IdxFactoryCfgSlippageDapp = 7
214226
215227 let IdxFactoryCfgDaoDapp = 8
216228
217229 let IdxFactoryCfgMarketingDapp = 9
218230
219231 let IdxFactoryCfgGwxRewardDapp = 10
220232
221233 let IdxFactoryCfgBirdsDapp = 11
222234
223235 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
224236
225237
226238 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
227239
228240
229241 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
230242
231243
232244 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
233245
234246
235247 func getPriceAssets () = match getString(keyPriceAssets()) {
236248 case s: String =>
237249 if ((size(s) == 0))
238250 then nil
239251 else split(s, SEP)
240252 case _ =>
241253 nil
242254 }
243255
244256
245257 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
246258 case s: String =>
247259 fromBase58String(s)
248260 case _: Unit =>
249261 unit
250262 case _ =>
251263 throw("Match error")
252264 }
253265
254266
255267 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
256268 case s: String =>
257269 fromBase58String(s)
258270 case _: Unit =>
259271 unit
260272 case _ =>
261273 throw("Match error")
262274 }
263275
264276
265277 let permissionDeniedError = throw("Permission denied")
266278
267279 let testError = throw("Test error here")
268280
269281 func mustThis (i) = if ((i.caller == this))
270282 then true
271283 else permissionDeniedError
272284
273285
274286 func mustManager (i) = match managerPublicKeyOrUnit() {
275287 case pk: ByteVector =>
276288 if ((i.callerPublicKey == pk))
277289 then true
278290 else permissionDeniedError
279291 case _: Unit =>
280292 mustThis(i)
281293 case _ =>
282294 throw("Match error")
283295 }
284296
285297
286298 func dataFactoryCfgV3 (stakingAddress,boostingAddress,idoContract,teamContract,emissionContract,restContract,slippageContract,daoContract,marketingContract,gwxRewardsContract,birdsContract) = makeString(["%s%s%s%s%s%s%s%s%s%s%s", stakingAddress, boostingAddress, idoContract, teamContract, emissionContract, restContract, slippageContract, daoContract, marketingContract, gwxRewardsContract, birdsContract], SEP)
287299
288300
289301 func dataFactoryCfg (stakingAddress,boostingAddress,idoContract,teamContract,emissionContract,restContract,slippageContract) = makeString(["%s%s%s%s%s%s", stakingAddress, boostingAddress, idoContract, teamContract, emissionContract, restContract, slippageContract], SEP)
290302
291303
292304 func dataPoolCfg (poolAddress,poolStatus,lpAssetId,amountAssetStr,priceAssetStr,amountAssetDecimals,priceAssetDecimals,amountAssetInternalId,priceAssetInternalId,lpAssetDecimals,poolType) = makeString(["%s%d%s%s%s%d%d%d%d%d%s", poolAddress, poolStatus, lpAssetId, amountAssetStr, priceAssetStr, toString(amountAssetDecimals), toString(priceAssetDecimals), toString(amountAssetInternalId), toString(priceAssetInternalId), toString(lpAssetDecimals), poolType], SEP)
293305
294306
295307 func dataMappingPoolAssets (internalAmountAssetStr,internalPriceAssetStr) = makeString(["%d%d", toString(internalAmountAssetStr), toString(internalPriceAssetStr)], SEP)
296308
297309
298310 func getPoolConfig (poolAddress) = {
299311 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
300312 let amountAssetInternal = poolAssets[1]
301313 let priceAssetInternal = poolAssets[2]
302314 split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
303315 }
304316
305317
306318 func getInternalAssetIdOrCreate (assetIdStr,incrementor) = {
307319 let internalAssetId = valueOrElse(getInteger(this, keyMappingsBaseAsset2internalId(assetIdStr)), 0)
308320 let currentIndexOfInternalId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0)
309321 let result = if ((internalAssetId == 0))
310322 then {
311323 let newInternalAssetId = (currentIndexOfInternalId + incrementor)
312324 $Tuple3(newInternalAssetId, [IntegerEntry(keyNextInternalAssetId(), newInternalAssetId), IntegerEntry(keyMappingsBaseAsset2internalId(assetIdStr), newInternalAssetId), StringEntry(keyMappingsInternal2baseAssetId(newInternalAssetId), assetIdStr)], true)
313325 }
314326 else $Tuple3(internalAssetId, nil, false)
315327 result
316328 }
317329
318330
319331 func mustAdmin (i) = {
320332 let adminPKs = split(valueOrElse(getString(keyAdminPubKeys()), EMPTY), SEP)
321333 if (containsElement(adminPKs, toBase58String(i.callerPublicKey)))
322334 then true
323335 else {
324336 let isManager = mustManager(i)
325337 if ((isManager == isManager))
326338 then true
327339 else throw("Strict value is not equal to itself.")
328340 }
329341 }
330342
331343
332344 func intOrDefaultOrFallback (key,keyDefault,valueFallback) = valueOrElse(getInteger(this, key), valueOrElse(getInteger(this, keyDefault), valueFallback))
333345
334346
335347 func poolExistsInternal (amountAssetId,priceAssetId) = {
336348 let amountAssetInternal = getInteger(keyMappingsBaseAsset2internalId(amountAssetId))
337349 let priceAssetInternal = getInteger(keyMappingsBaseAsset2internalId(priceAssetId))
338350 if (if ((amountAssetInternal == unit))
339351 then true
340352 else (priceAssetInternal == unit))
341353 then false
342354 else {
343355 let amAs = toString(value(amountAssetInternal))
344356 let prAs = toString(value(priceAssetInternal))
345357 let cfg = getString(keyPoolConfig(amAs, prAs))
346358 let cfgReverse = getString(keyPoolConfig(prAs, amAs))
347359 let exists = if ((cfg != unit))
348360 then true
349361 else (cfgReverse != unit)
350362 exists
351363 }
352364 }
353365
354366
355367 @Callable(i)
356368 func getSwapContractREADONLY () = $Tuple2(nil, getStringOrFail(swapContract()))
357369
358370
359371
360372 @Callable(i)
361373 func getLpAssetFromPoolAssetsREADONLY (asset1,asset2) = if (if ((asset1 == "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS"))
362374 then (asset2 == "WAVES")
363375 else false)
364376 then $Tuple2(nil, unit)
365377 else {
366378 let assetNum1 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset1)))
367379 let assetNum2 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset2)))
368380 let ee = getString(this, keyMappingPoolAssetsToLpasset(toString(assetNum1), toString(assetNum2)))
369381 let res = if ((ee == unit))
370382 then unit
371383 else drop(value(ee), 4)
372384 $Tuple2(nil, res)
373385 }
374386
375387
376388
377389 @Callable(i)
378390 func getPoolAddressFromLpAssetREADONLY (lp) = $Tuple2(nil, valueOrElse(getString(this, keyMappingPoolLPAssetToPoolContractAddress(lp)), ""))
379391
380392
381393
382394 @Callable(i)
383395 func constructor (stakingContract,boostingContract,idoContract,teamContract,emissionContract,restContract,slpipageContract,priceDecimals) = {
384396 let checkCaller = mustManager(i)
385397 if ((checkCaller == checkCaller))
386398 then [StringEntry(keyFactoryConfig(), dataFactoryCfg(stakingContract, boostingContract, idoContract, teamContract, emissionContract, restContract, slpipageContract)), IntegerEntry(keyPriceDecimals(), priceDecimals)]
387399 else throw("Strict value is not equal to itself.")
388400 }
389401
390402
391403
392404 @Callable(i)
393405 func constructorV2 (mathcherPub58Str) = {
394406 let checkCaller = mustManager(i)
395407 if ((checkCaller == checkCaller))
396408 then {
397409 let mathcerPub = addressFromPublicKey(fromBase58String(mathcherPub58Str))
398410 if ((mathcerPub == mathcerPub))
399411 then [StringEntry(keyMatcherPub(), mathcherPub58Str)]
400412 else throw("Strict value is not equal to itself.")
401413 }
402414 else throw("Strict value is not equal to itself.")
403415 }
404416
405417
406418
407419 @Callable(i)
408420 func constructorV3 (daoContract,marketingContract,gwxRewardsContract,birdsContract) = {
409421 let checkCaller = mustManager(i)
410422 if ((checkCaller == checkCaller))
411423 then {
412424 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
413425 [StringEntry(keyFactoryConfig(), dataFactoryCfgV3(factoryCfg[1], factoryCfg[2], factoryCfg[3], factoryCfg[4], factoryCfg[5], factoryCfg[6], factoryCfg[7], daoContract, marketingContract, gwxRewardsContract, birdsContract))]
414426 }
415427 else throw("Strict value is not equal to itself.")
416428 }
417429
418430
419431
420432 @Callable(i)
421433 func constructorV4 (legacyFactoryContract,legacyPools) = {
422434 let checkCaller = mustManager(i)
423435 if ((checkCaller == checkCaller))
424436 then [StringEntry(keyLegacyFactoryContract(), legacyFactoryContract), StringEntry(keyLegacyPools(), makeString(legacyPools, SEP))]
425437 else throw("Strict value is not equal to itself.")
426438 }
427439
428440
429441
430442 @Callable(i)
431443 func constructorV5 (assetsStoreContract) = {
432444 let checkCaller = mustManager(i)
433445 if ((checkCaller == checkCaller))
434446 then [StringEntry(keyAssetsStoreContract(), assetsStoreContract)]
435447 else throw("Strict value is not equal to itself.")
436448 }
437449
438450
439451
440452 @Callable(i)
441453 func constructorV6 (votingEmissionContract,priceAssets) = {
442454 let cheks = [mustManager(i), if ((addressFromString(votingEmissionContract) != unit))
443455 then true
444456 else "invalid voting emission contract address"]
445457 if ((cheks == cheks))
446458 then [StringEntry(keyVotingEmissionContract(), votingEmissionContract), StringEntry(keyPriceAssets(), makeString(priceAssets, SEP))]
447459 else throw("Strict value is not equal to itself.")
448460 }
449461
450462
451463
452464 @Callable(i)
453465 func setManager (pendingManagerPublicKey) = {
454466 let checkCaller = mustManager(i)
455467 if ((checkCaller == checkCaller))
456468 then {
457469 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
458470 if ((checkManagerPublicKey == checkManagerPublicKey))
459471 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
460472 else throw("Strict value is not equal to itself.")
461473 }
462474 else throw("Strict value is not equal to itself.")
463475 }
464476
465477
466478
467479 @Callable(i)
468480 func confirmManager () = {
469481 let pm = pendingManagerPublicKeyOrUnit()
470482 let hasPM = if (isDefined(pm))
471483 then true
472484 else throw("No pending manager")
473485 if ((hasPM == hasPM))
474486 then {
475487 let checkPM = if ((i.callerPublicKey == value(pm)))
476488 then true
477489 else throw("You are not pending manager")
478490 if ((checkPM == checkPM))
479491 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
480492 else throw("Strict value is not equal to itself.")
481493 }
482494 else throw("Strict value is not equal to itself.")
483495 }
484496
485497
486498
487499 @Callable(i)
488500 func setAdmins (adminPubKeys) = {
489501 let checkCaller = mustManager(i)
490502 if ((checkCaller == checkCaller))
491503 then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
492504 else throw("Strict value is not equal to itself.")
493505 }
494506
495507
496508
497509 @Callable(i)
498510 func activateNewPool (poolAddress,amountAssetStr,priceAssetStr,lpAssetName,lpAssetDescr,poolWeight,poolType,logo) = {
499511 let checkCaller = mustAdmin(i)
500512 if ((checkCaller == checkCaller))
501513 then if (isDefined(getString(keyMappingPoolContractAddressToPoolAssets(poolAddress))))
502514 then throw((("Pool address " + poolAddress) + " already registered."))
503515 else {
504516 let internalAmountAssetData = getInternalAssetIdOrCreate(amountAssetStr, 1)
505517 let internalAmountAssetId = internalAmountAssetData._1
506518 let internalPriceAssetData = getInternalAssetIdOrCreate(priceAssetStr, if (internalAmountAssetData._3)
507519 then 2
508520 else 1)
509521 let internalPriceAssetId = internalPriceAssetData._1
510522 let poolAccountScriptHash = valueOrErrorMessage(scriptHash(addressFromStringValue(poolAddress)), ("No script has been found on pool account " + poolAddress))
511523 let ethalonPoolAccountScriptHash = getBinaryValue(keyPoolScriptHash())
512524 let poolExists = poolExistsInternal(amountAssetStr, priceAssetStr)
513525 if (poolExists)
514526 then throw((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated."))
515527 else {
516528 let poolConfigValue = value(getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId))))
517529 let amountAssetsDecimals = if ((amountAssetStr == "WAVES"))
518530 then decimalsMultPrice
519531 else pow(10, 0, value(assetInfo(fromBase58String(amountAssetStr))).decimals, 0, 0, DOWN)
520532 let priceAssetsDecimals = if ((priceAssetStr == "WAVES"))
521533 then decimalsMultPrice
522534 else pow(10, 0, value(assetInfo(fromBase58String(priceAssetStr))).decimals, 0, 0, DOWN)
523535 let lpAssetIssueAction = Issue(lpAssetName, lpAssetDescr, 1, 8, true)
524536 let lpAssetId = calculateAssetId(lpAssetIssueAction)
525537 let lpAssetIdStr = toBase58String(lpAssetId)
526538 let poolActivateInvokeResult = invoke(addressFromStringValue(poolAddress), "activate", [amountAssetStr, priceAssetStr], nil)
527539 if ((poolActivateInvokeResult == poolActivateInvokeResult))
528540 then if ((poolActivateInvokeResult != "success"))
529541 then throw("Pool initialisation error happened.")
530542 else {
531543 let assetsStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract()))
532544 let createOrUpdateLpAssetInv = invoke(assetsStoreContract, "createOrUpdate", [lpAssetIdStr, lpAssetName, false], nil)
533545 if ((createOrUpdateLpAssetInv == createOrUpdateLpAssetInv))
534546 then {
535547 let addPoolsLpLabelInv = invoke(assetsStoreContract, "addLabel", [lpAssetIdStr, labelPoolsLp], nil)
536548 if ((addPoolsLpLabelInv == addPoolsLpLabelInv))
537549 then {
538550 let setLogoInv = invoke(assetsStoreContract, "setLogo", [lpAssetIdStr, logo], nil)
539551 if ((setLogoInv == setLogoInv))
540552 then {
541553 let addAssetsLinkInv = invoke(assetsStoreContract, "addAssetsLink", [amountAssetStr, priceAssetStr, lpAssetIdStr], nil)
542554 if ((addAssetsLinkInv == addAssetsLinkInv))
543555 then {
544556 let increaseAssetPoolsNumberInv = invoke(assetsStoreContract, "increaseAssetPoolsNumber", [amountAssetStr], nil)
545557 if ((increaseAssetPoolsNumberInv == increaseAssetPoolsNumberInv))
546558 then $Tuple2(((internalAmountAssetData._2 ++ internalPriceAssetData._2) ++ [lpAssetIssueAction, Burn(lpAssetId, 1), StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(PoolActive), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, decimalsMultPrice, poolType)), StringEntry(keyMappingLpAssetToPoolAssets(lpAssetIdStr), dataMappingPoolAssets(internalAmountAssetId, internalPriceAssetId)), StringEntry(keyMappingPoolAssetsToLpasset(toString(internalAmountAssetId), toString(internalPriceAssetId)), ("%s__" + lpAssetIdStr)), StringEntry(keyMappingPoolContractAddressToPoolAssets(poolAddress), dataMappingPoolAssets(internalAmountAssetId, internalPriceAssetId)), StringEntry(keyMappingPoolAssetsToPoolContractAddress(internalAmountAssetId, internalPriceAssetId), poolAddress), StringEntry(keyMappingPoolLPAssetToPoolContractAddress(lpAssetIdStr), poolAddress), StringEntry(keyMappingPoolContractToLPAsset(poolAddress), lpAssetIdStr), IntegerEntry(keyPoolToWeight(poolAddress), poolWeight), IntegerEntry(keyPoolSpread(poolAddress), defaultSpread)]), lpAssetIdStr)
547559 else throw("Strict value is not equal to itself.")
548560 }
549561 else throw("Strict value is not equal to itself.")
550562 }
551563 else throw("Strict value is not equal to itself.")
552564 }
553565 else throw("Strict value is not equal to itself.")
554566 }
555567 else throw("Strict value is not equal to itself.")
556568 }
557569 else throw("Strict value is not equal to itself.")
558570 }
559571 }
560572 else throw("Strict value is not equal to itself.")
561573 }
562574
563575
564576
565577 @Callable(i)
566578 func managePool (poolAddress,newStatus) = {
567579 let checkCaller = mustManager(i)
568580 if ((checkCaller == checkCaller))
569581 then {
570582 let poolConfig = getPoolConfig(poolAddress)
571583 let poolStatus = poolConfig[idxPoolStatus]
572584 let lpAssetIdStr = poolConfig[idxPoolLPAssetId]
573585 let amountAssetStr = poolConfig[idxAmtAssetId]
574586 let priceAssetStr = poolConfig[idxPriceAssetId]
575587 let amountAssetsDecimals = parseIntValue(poolConfig[idxAmtAssetDcm])
576588 let priceAssetsDecimals = parseIntValue(poolConfig[idxPriceAssetDcm])
577589 let internalAmountAssetId = parseIntValue(poolConfig[idxIAmtAssetId])
578590 let internalPriceAssetId = parseIntValue(poolConfig[idxIPriceAssetId])
579591 let lpAssetDcm = parseIntValue(poolConfig[idxLPAssetDcm])
580592 let poolType = poolConfig[idxPoolType]
581593 [StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(newStatus), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, lpAssetDcm, poolType))]
582594 }
583595 else throw("Strict value is not equal to itself.")
584596 }
585597
586598
587599
588600 @Callable(i)
589601 func emit (amountToEmit) = {
590602 let caller = i.caller
591603 let originCaller = i.originCaller
592604 let lpAssetRequested = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
593605 let lpAsset = fromBase58String(lpAssetRequested)
594606 let legacyPools = split(valueOrElse(getString(keyLegacyPools()), EMPTY), SEP)
595607 let legacyFactoryContract = addressFromStringValue(valueOrErrorMessage(getString(keyLegacyFactoryContract()), "Legacy factory contract does not exists."))
596608 if ((0 >= amountToEmit))
597609 then nil
598610 else if (containsElement(legacyPools, toString(caller)))
599611 then $Tuple2(nil, legacyFactoryContract)
600612 else $Tuple2([Reissue(lpAsset, amountToEmit, true), ScriptTransfer(i.caller, amountToEmit, lpAsset)], "success")
601613 }
602614
603615
604616
605617 @Callable(i)
606618 func burn (amountToBurn) = {
607619 let caller = i.caller
608620 let originCaller = i.originCaller
609621 let payment = value(i.payments[0])
610622 let paymentAmount = value(payment.amount)
611623 let inAmountAssetId = toBase58String(value(payment.assetId))
612624 let lpAssetRequestedForBurning = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
613625 if ((inAmountAssetId != lpAssetRequestedForBurning))
614626 then throw("Invalid asset passed.")
615627 else if ((amountToBurn != paymentAmount))
616628 then throw("Invalid amount passed.")
617629 else {
618630 let lpAsset = fromBase58String(lpAssetRequestedForBurning)
619631 $Tuple2([Burn(lpAsset, amountToBurn)], "success")
620632 }
621633 }
622634
623635
624636
625637 @Callable(i)
626638 func modifyWeight (lpAssetId,share) = {
627639 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionContract()), "")))
628640 then true
629641 else mustManager(i)
630642 if ((checkCaller == checkCaller))
631643 then {
632644 let poolContractAddress = getStringOrFail(keyMappingPoolLPAssetToPoolContractAddress(lpAssetId))
633645 let poolWeightKey = keyPoolToWeight(poolContractAddress)
634646 let gwxWeightKey = keyPoolToWeight(GWXvirtualPOOL)
635647 let gwxWeight = valueOrElse(getInteger(gwxWeightKey), 0)
636648 let poolWeight = valueOrElse(getInteger(poolWeightKey), 0)
637649 let poolWeightNew = share
638650 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
639651 let stakingContract = getStakingAddressOrFail(factoryCfg)
640652 let onModifyWeightInv = invoke(stakingContract, "onModifyWeight", [lpAssetId, poolContractAddress], nil)
641653 if ((onModifyWeightInv == onModifyWeightInv))
642654 then {
643655 let gwxVirtualPoolActions = if ((gwxWeight == 0))
644656 then nil
645657 else [IntegerEntry(gwxWeightKey, 0)]
646658 let poolWeightHistoryKey = keyPoolToWeightHistory(poolContractAddress, 0)
647659 let poolWeightHistoryOrUnit = getInteger(poolWeightHistoryKey)
648660 let poolWeightHistoryActions = if ((poolWeightHistoryOrUnit == unit))
649661 then nil
650662 else [DeleteEntry(poolWeightHistoryKey)]
651663 (([IntegerEntry(poolWeightKey, poolWeightNew)] ++ gwxVirtualPoolActions) ++ poolWeightHistoryActions)
652664 }
653665 else throw("Strict value is not equal to itself.")
654666 }
655667 else throw("Strict value is not equal to itself.")
656668 }
657669
658670
659671
660672 @Callable(i)
661673 func modifyWeights (btcPoolAddress,ethPoolAddress,ethBtcPoolAddress,usdcUsdtPoolAddress) = {
662674 let checkCaller = mustManager(i)
663675 if ((checkCaller == checkCaller))
664676 then {
665677 let ethBtcWeightNew = ((5 * POOLWEIGHTMULT) / 100)
666678 let usdcUsdtWeightNew = ((5 * POOLWEIGHTMULT) / 100)
667679 let weightDecrement = ((5 * POOLWEIGHTMULT) / 100)
668680 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
669681 let stakingDapp = getStakingAddressOrFail(factoryCfg)
670682 let gwxRewardDapp = getGwxRewardAddressOrFail(factoryCfg)
671683 let btcWeightKEY = keyPoolToWeight(btcPoolAddress)
672684 let ethWeightKEY = keyPoolToWeight(ethPoolAddress)
673685 let ethBtcWeightKEY = keyPoolToWeight(ethBtcPoolAddress)
674686 let usdcUsdtWeightKEY = keyPoolToWeight(usdcUsdtPoolAddress)
675687 let btcWeight = getIntOrFail(btcWeightKEY)
676688 let ethWeight = getIntOrFail(ethWeightKEY)
677689 let btcWeightNew = (btcWeight - weightDecrement)
678690 let ethWeightNew = (ethWeight - weightDecrement)
679691 if ((0 >= btcWeightNew))
680692 then throw(("invalid btcWeightNew: " + toString(btcWeightNew)))
681693 else if ((0 >= ethWeightNew))
682694 then throw(("invalid ethWeightNew: " + toString(ethWeightNew)))
683695 else {
684696 let btcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(btcPoolAddress))
685697 let ethLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethPoolAddress))
686698 let ethBtcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethBtcPoolAddress))
687699 let usdcUsdtLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(usdcUsdtPoolAddress))
688700 let onModifyWeightBtc = invoke(stakingDapp, "onModifyWeight", [btcLpAssetIdStr, btcPoolAddress], nil)
689701 if ((onModifyWeightBtc == onModifyWeightBtc))
690702 then {
691703 let onModifyWeightEth = invoke(stakingDapp, "onModifyWeight", [ethLpAssetIdStr, ethPoolAddress], nil)
692704 if ((onModifyWeightEth == onModifyWeightEth))
693705 then {
694706 let onModifyWeightEthBtc = invoke(stakingDapp, "onModifyWeight", [ethBtcLpAssetIdStr, ethBtcPoolAddress], nil)
695707 if ((onModifyWeightEthBtc == onModifyWeightEthBtc))
696708 then {
697709 let onModifyWeightUsdcUsdt = invoke(stakingDapp, "onModifyWeight", [usdcUsdtLpAssetIdStr, usdcUsdtPoolAddress], nil)
698710 if ((onModifyWeightUsdcUsdt == onModifyWeightUsdcUsdt))
699711 then [IntegerEntry(btcWeightKEY, btcWeightNew), IntegerEntry(ethWeightKEY, ethWeightNew), IntegerEntry(ethBtcWeightKEY, ethBtcWeightNew), IntegerEntry(usdcUsdtWeightKEY, usdcUsdtWeightNew), IntegerEntry(keyPoolToWeightHistory(btcPoolAddress, 0), btcWeight), IntegerEntry(keyPoolToWeightHistory(ethPoolAddress, 0), ethWeight), IntegerEntry(keyPoolToWeightHistory(ethBtcPoolAddress, 0), ethBtcWeightNew), IntegerEntry(keyPoolToWeightHistory(usdcUsdtPoolAddress, 0), usdcUsdtWeightNew)]
700712 else throw("Strict value is not equal to itself.")
701713 }
702714 else throw("Strict value is not equal to itself.")
703715 }
704716 else throw("Strict value is not equal to itself.")
705717 }
706718 else throw("Strict value is not equal to itself.")
707719 }
708720 }
709721 else throw("Strict value is not equal to itself.")
710722 }
711723
712724
713725
714726 @Callable(i)
715727 func checkWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
716728 let haveLabel = match getBoolean(keyWxEmission(amountAssetId, priceAssetId)) {
717729 case b: Boolean =>
718730 b
719731 case _ =>
720732 false
721733 }
722734 $Tuple2(nil, haveLabel)
723735 }
724736
725737
726738
727739 @Callable(i)
728740 func setWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
729741 let checkCaller = mustAdmin(i)
730742 if ((checkCaller == checkCaller))
731743 then $Tuple2([BooleanEntry(keyWxEmission(amountAssetId, priceAssetId), true)], unit)
732744 else throw("Strict value is not equal to itself.")
733745 }
734746
735747
736748
737749 @Callable(i)
738750 func deleteWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
739751 let checkCaller = if (mustThis(i))
740752 then true
741753 else mustAdmin(i)
742754 if ((checkCaller == checkCaller))
743755 then $Tuple2([DeleteEntry(keyWxEmission(amountAssetId, priceAssetId))], unit)
744756 else throw("Strict value is not equal to itself.")
745757 }
746758
747759
748760
749761 @Callable(i)
750762 func onVerificationLoss (assetId) = {
751763 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyAssetsStoreContract()), "")))
752764 then true
753765 else mustManager(i)
754766 if ((checkCaller == checkCaller))
755767 then {
756768 let priceAssets = getPriceAssets()
757769 let checkPriceAssetsSize = if ((size(priceAssets) > 0))
758770 then true
759771 else throw("invalid price assets")
760772 if ((checkPriceAssetsSize == checkPriceAssetsSize))
761773 then {
762774 func cb (acc,priceAsset) = {
763775 let r = invoke(this, "deleteWxEmissionPoolLabel", [assetId, priceAsset], nil)
764776 if ((r == r))
765777 then unit
766778 else throw("Strict value is not equal to itself.")
767779 }
768780
769781 let actions = {
770782 let $l = priceAssets
771783 let $s = size($l)
772784 let $acc0 = unit
773785 func $f0_1 ($a,$i) = if (($i >= $s))
774786 then $a
775787 else cb($a, $l[$i])
776788
777789 func $f0_2 ($a,$i) = if (($i >= $s))
778790 then $a
779791 else throw("List size exceeds 2")
780792
781793 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
782794 }
783795 if ((actions == actions))
784796 then $Tuple2(nil, unit)
785797 else throw("Strict value is not equal to itself.")
786798 }
787799 else throw("Strict value is not equal to itself.")
788800 }
789801 else throw("Strict value is not equal to itself.")
790802 }
791803
792804
793805
794806 @Callable(i)
795807 func isPoolOneTokenOperationsDisabledREADONLY (poolAddress) = {
796808 let poolConfig = getPoolConfig(poolAddress)
797809 let assetsInternal = $Tuple2(parseIntValue(poolConfig[idxIAmtAssetId]), parseIntValue(poolConfig[idxIPriceAssetId]))
798810 let poolOneTokenOperationsDisabled = valueOrElse(getBoolean(keyPoolOneTokenOperationsDisabled(assetsInternal)), false)
799811 let allPoolsOneTokenOperationsDisabled = valueOrElse(getBoolean(keyAllPoolsOneTokenOperationsDisabled()), false)
800812 $Tuple2(nil, if (allPoolsOneTokenOperationsDisabled)
801813 then true
802814 else poolOneTokenOperationsDisabled)
803815 }
804816
805817
806818
807819 @Callable(i)
808820 func getInFeeREADONLY (poolAddress) = {
809821 let fee = intOrDefaultOrFallback(keyInFee(poolAddress), keyInFeeDefault(), 0)
810822 $Tuple2(nil, fee)
811823 }
812824
813825
814826
815827 @Callable(i)
816828 func getOutFeeREADONLY (poolAddress) = {
817829 let fee = intOrDefaultOrFallback(keyOutFee(poolAddress), keyOutFeeDefault(), fraction(10, MULT8, 10000))
818830 $Tuple2(nil, fee)
819831 }
820832
821833
822834
823835 @Callable(i)
824836 func poolInfoREADONLY (amountAssetIdStr,priceAssetIdStr) = {
825837 let amountAssetInternalIdOption = getInteger(this, keyMappingsBaseAsset2internalId(amountAssetIdStr))
826838 let priceAssetInternalIdOption = getInteger(this, keyMappingsBaseAsset2internalId(priceAssetIdStr))
827839 let poolContractAddressOption = getString(this, keyMappingPoolAssetsToPoolContractAddress(value(amountAssetInternalIdOption), value(priceAssetInternalIdOption)))
828840 let lpAssetIdOption = getString(this, keyMappingPoolContractToLPAsset(value(poolContractAddressOption)))
829841 let poolExists = if (if (isDefined(amountAssetInternalIdOption))
830842 then isDefined(priceAssetInternalIdOption)
831843 else false)
832844 then isDefined(poolContractAddressOption)
833845 else false
834846 let poolInfo = if (poolExists)
835847 then $Tuple2(addressFromStringValue(value(poolContractAddressOption)), parseAssetId(value(lpAssetIdOption)))
836848 else unit
837849 $Tuple2(nil, poolInfo)
838850 }
839851
840852
841853
842854 @Callable(i)
843855 func getPoolStatusREADONLY (poolAddress) = {
844856 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
845857 let amountAssetInternal = poolAssets[1]
846858 let priceAssetInternal = poolAssets[2]
847859 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
848860 $Tuple2(nil, parseIntValue(cfg[idxPoolStatus]))
849861 }
850862
851863
852864
853865 @Callable(i)
854866 func getPoolConfigREADONLY (poolAddress) = {
855867 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
856868 let amountAssetInternal = poolAssets[1]
857869 let priceAssetInternal = poolAssets[2]
858870 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
859871 $Tuple2(nil, cfg)
860872 }
861873
862874
863875
864876 @Callable(i)
865-func getPoolConfigByLpAssetIdREADONLY (lpAssetIdStr) = {
877+func getPoolConfigByLpAssetId (lpAssetIdStr) = {
866878 let poolAssets = split(getStringOrFail(keyMappingLpAssetToPoolAssets(lpAssetIdStr)), SEP)
867879 let amountAssetInternal = poolAssets[1]
868880 let priceAssetInternal = poolAssets[2]
869881 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
870882 $Tuple2(nil, cfg)
871883 }
872884
873885
874886
875887 @Callable(i)
876888 func poolExistsREADONLY (amountAssetId,priceAssetId) = $Tuple2(nil, poolExistsInternal(amountAssetId, priceAssetId))
889+
890+
891+
892+@Callable(i)
893+func skipOrderValidationREADONLY (poolAddress) = $Tuple2(nil, valueOrElse(getBoolean(keySkipOrderValidation(poolAddress)), false))
894+
895+
896+
897+@Callable(i)
898+func getChangeAmpConfigREADONLY (poolAddress) = {
899+ let delay = getIntegerValue(keyChangeAmpDelay(poolAddress))
900+ let delta = getIntegerValue(keyChangeAmpDelta(poolAddress))
901+ let target = getIntegerValue(keyChangeAmpTarget(poolAddress))
902+ $Tuple2(nil, [delay, delta, target])
903+ }
877904
878905
879906 @Verifier(tx)
880907 func verify () = {
881908 let targetPublicKey = match managerPublicKeyOrUnit() {
882909 case pk: ByteVector =>
883910 pk
884911 case _: Unit =>
885912 tx.senderPublicKey
886913 case _ =>
887914 throw("Match error")
888915 }
889916 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
890917 }
891918

github/deemru/w8io/3ef1775 
116.21 ms