tx · 6zdAhF1hVi7G2224ZGQpYb9jkZ8PZVBDPCfHFrdNCpK4

3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai:  -0.02400000 Waves

2023.03.22 10:50 [2500953] smart account 3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai > SELF 0.00000000 Waves

{ "type": 13, "id": "6zdAhF1hVi7G2224ZGQpYb9jkZ8PZVBDPCfHFrdNCpK4", "fee": 2400000, "feeAssetId": null, "timestamp": 1679471519427, "version": 2, "chainId": 84, "sender": "3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai", "senderPublicKey": "2JEaBjtjvMoNGKZmL9QxYefa1VkMJM3vMW8rNvTs9R2H", "proofs": [ "vZgpLZw3HWNkiL2X59qfDQwXagbWYvZ8uC9FmffXYWFGDgbBcc9Gk6oFv4oHjZWfuNnJUvEXwYhaSfd5WyyXbkD" ], "script": "base64:BgKMKAgCEgASBAoCCAgSAwoBCBIKCggICAgICAgIARIDCgEIEgYKBAgICAgSBAoCCBgSAwoBCBIECgIIGBIDCgEIEgASAwoBGBIKCggICAgICAEICBIECgIIARIDCgEBEgMKAQESBAoCCAESBgoECAgICBIECgIICBIECgIICBIECgIICBIDCgEIEgMKAQgSAwoBCBIDCgEIEgQKAggIEgMKAQgSAwoBCBIDCgEIEgQKAggIEgMKAQgiBlNDQUxFOCIFTVVMVDgiB1NDQUxFMTgiBk1VTFQxOCIOUE9PTFdFSUdIVE1VTFQiDkdXWHZpcnR1YWxQT09MIgxsYWJlbFBvb2xzTHAiDWRlZmF1bHRTcHJlYWQiC3dhdmVzU3RyaW5nIhFkZWNpbWFsc011bHRQcmljZSIDU0VQIgVFTVBUWSIKUG9vbEFjdGl2ZSIPUG9vbFB1dERpc2FibGVkIhNQb29sTWF0Y2hlckRpc2FibGVkIgxQb29sU2h1dGRvd24iEmlkeEludGVybmFsQXNzZXRJZCIPaWR4UmVzdXRBY3Rpb25zIiBpZHhJZkFzc2V0SWRDYWxjdWxhdGlvblBlcmZvcm1lZCIOaWR4UG9vbEFkZHJlc3MiDWlkeFBvb2xTdGF0dXMiEGlkeFBvb2xMUEFzc2V0SWQiDWlkeEFtdEFzc2V0SWQiD2lkeFByaWNlQXNzZXRJZCIOaWR4QW10QXNzZXREY20iEGlkeFByaWNlQXNzZXREY20iDmlkeElBbXRBc3NldElkIhBpZHhJUHJpY2VBc3NldElkIg1pZHhMUEFzc2V0RGNtIgtpZHhQb29sVHlwZSITcG9vbExhYmVsV3hFbWlzc2lvbiIPdmFsaWRQb29sTGFiZWxzIhZrZXlBbGxvd2VkTHBTY3JpcHRIYXNoIhxrZXlBbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoIiFrZXlBbGxvd2VkTHBTdGFibGVBZGRvblNjcmlwdEhhc2giDHN3YXBDb250cmFjdCIQa2V5RmFjdG9yeUNvbmZpZyIPa2V5THBUb2tlbnNMaXN0IhFrZXlQb29sU2NyaXB0SGFzaCINa2V5TWF0Y2hlclB1YiIYa2V5TGVnYWN5RmFjdG9yeUNvbnRyYWN0Ig5rZXlMZWdhY3lQb29scyITa2V5TWFuYWdlclB1YmxpY0tleSIaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiD2tleUFkbWluUHViS2V5cyIWa2V5QXNzZXRzU3RvcmVDb250cmFjdCIZa2V5Vm90aW5nRW1pc3Npb25Db250cmFjdCIOa2V5UHJpY2VBc3NldHMiEGtleVByaWNlRGVjaW1hbHMiE2tleUFsbFBvb2xzU2h1dGRvd24iFmtleU5leHRJbnRlcm5hbEFzc2V0SWQiD2tleVBvb2xUb1dlaWdodCILcG9vbEFkZHJlc3MiFmtleVBvb2xUb1dlaWdodEhpc3RvcnkiA251bSIfa2V5TWFwcGluZ3NJbnRlcm5hbDJiYXNlQXNzZXRJZCIRaW50ZXJuYWxCYXNlQXNzZXQiH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQiDGJhc2VBc3NldFN0ciINa2V5UG9vbENvbmZpZyITYW1vdW50QXNzZXRJbnRlcm5hbCIScHJpY2VBc3NldEludGVybmFsIiFrZXlQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiDmFzc2V0c0ludGVybmFsIgskdDAzNzI2Mzc4OCIla2V5QWxsUG9vbHNPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZCIda2V5TWFwcGluZ0xwQXNzZXRUb1Bvb2xBc3NldHMiCmxwQXNzZXRTdHIiHWtleU1hcHBpbmdQb29sQXNzZXRzVG9McGFzc2V0IhhpbnRlcm5hbEFtb3VudEFzc2V0SWRTdHIiF2ludGVybmFsUHJpY2VBc3NldElkU3RyIg1rZXlQb29sU3ByZWFkIilrZXlNYXBwaW5nUG9vbENvbnRyYWN0QWRkcmVzc1RvUG9vbEFzc2V0cyITcG9vbENvbnRyYWN0QWRkcmVzcyIpa2V5TWFwcGluZ1Bvb2xBc3NldHNUb1Bvb2xDb250cmFjdEFkZHJlc3MiH2tleU1hcHBpbmdQb29sQ29udHJhY3RUb0xQQXNzZXQiKmtleU1hcHBpbmdQb29sTFBBc3NldFRvUG9vbENvbnRyYWN0QWRkcmVzcyINa2V5V3hFbWlzc2lvbiINYW1vdW50QXNzZXRJZCIMcHJpY2VBc3NldElkIghrZXlJbkZlZSIPa2V5SW5GZWVEZWZhdWx0IglrZXlPdXRGZWUiEGtleU91dEZlZURlZmF1bHQiFmtleVNraXBPcmRlclZhbGlkYXRpb24iD2dldFN0cmluZ09yRmFpbCIDa2V5IhBnZXRCb29sZWFuT3JGYWlsIgxnZXRJbnRPckZhaWwiDHBhcnNlQXNzZXRJZCIFaW5wdXQiGElkeEZhY3RvcnlDZmdTdGFraW5nRGFwcCIZSWR4RmFjdG9yeUNmZ0Jvb3N0aW5nRGFwcCIUSWR4RmFjdG9yeUNmZ0lkb0RhcHAiFUlkeEZhY3RvcnlDZmdUZWFtRGFwcCIZSWR4RmFjdG9yeUNmZ0VtaXNzaW9uRGFwcCIVSWR4RmFjdG9yeUNmZ1Jlc3REYXBwIhlJZHhGYWN0b3J5Q2ZnU2xpcHBhZ2VEYXBwIhRJZHhGYWN0b3J5Q2ZnRGFvRGFwcCIaSWR4RmFjdG9yeUNmZ01hcmtldGluZ0RhcHAiGklkeEZhY3RvcnlDZmdHd3hSZXdhcmREYXBwIhZJZHhGYWN0b3J5Q2ZnQmlyZHNEYXBwIhhnZXRCb29zdGluZ0FkZHJlc3NPckZhaWwiCmZhY3RvcnlDZmciGGdldEVtaXNzaW9uQWRkcmVzc09yRmFpbCIXZ2V0U3Rha2luZ0FkZHJlc3NPckZhaWwiGWdldEd3eFJld2FyZEFkZHJlc3NPckZhaWwiDmdldFByaWNlQXNzZXRzIgckbWF0Y2gwIgFzIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0Ih1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdCIVcGVybWlzc2lvbkRlbmllZEVycm9yIgl0ZXN0RXJyb3IiCG11c3RUaGlzIgFpIgttdXN0TWFuYWdlciICcGsiEGRhdGFGYWN0b3J5Q2ZnVjMiDnN0YWtpbmdBZGRyZXNzIg9ib29zdGluZ0FkZHJlc3MiC2lkb0NvbnRyYWN0Igx0ZWFtQ29udHJhY3QiEGVtaXNzaW9uQ29udHJhY3QiDHJlc3RDb250cmFjdCIQc2xpcHBhZ2VDb250cmFjdCILZGFvQ29udHJhY3QiEW1hcmtldGluZ0NvbnRyYWN0IhJnd3hSZXdhcmRzQ29udHJhY3QiDWJpcmRzQ29udHJhY3QiDmRhdGFGYWN0b3J5Q2ZnIgtkYXRhUG9vbENmZyIKcG9vbFN0YXR1cyIJbHBBc3NldElkIg5hbW91bnRBc3NldFN0ciINcHJpY2VBc3NldFN0ciITYW1vdW50QXNzZXREZWNpbWFscyIScHJpY2VBc3NldERlY2ltYWxzIhVhbW91bnRBc3NldEludGVybmFsSWQiFHByaWNlQXNzZXRJbnRlcm5hbElkIg9scEFzc2V0RGVjaW1hbHMiCHBvb2xUeXBlIhVkYXRhTWFwcGluZ1Bvb2xBc3NldHMiFmludGVybmFsQW1vdW50QXNzZXRTdHIiFWludGVybmFsUHJpY2VBc3NldFN0ciINZ2V0UG9vbENvbmZpZyIKcG9vbEFzc2V0cyIaZ2V0SW50ZXJuYWxBc3NldElkT3JDcmVhdGUiCmFzc2V0SWRTdHIiC2luY3JlbWVudG9yIg9pbnRlcm5hbEFzc2V0SWQiGGN1cnJlbnRJbmRleE9mSW50ZXJuYWxJZCIGcmVzdWx0IhJuZXdJbnRlcm5hbEFzc2V0SWQiCW11c3RBZG1pbiIIYWRtaW5QS3MiCWlzTWFuYWdlciIWaW50T3JEZWZhdWx0T3JGYWxsYmFjayIKa2V5RGVmYXVsdCINdmFsdWVGYWxsYmFjayIScG9vbEV4aXN0c0ludGVybmFsIgRhbUFzIgRwckFzIgNjZmciCmNmZ1JldmVyc2UiBmV4aXN0cyIGYXNzZXQxIgZhc3NldDIiCWFzc2V0TnVtMSIJYXNzZXROdW0yIgJlZSIDcmVzIgJscCIPc3Rha2luZ0NvbnRyYWN0IhBib29zdGluZ0NvbnRyYWN0IhBzbHBpcGFnZUNvbnRyYWN0Ig1wcmljZURlY2ltYWxzIgtjaGVja0NhbGxlciIQbWF0aGNoZXJQdWI1OFN0ciIKbWF0aGNlclB1YiIVbGVnYWN5RmFjdG9yeUNvbnRyYWN0IgtsZWdhY3lQb29scyITYXNzZXRzU3RvcmVDb250cmFjdCIWdm90aW5nRW1pc3Npb25Db250cmFjdCILcHJpY2VBc3NldHMiBWNoZWtzIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSIVY2hlY2tNYW5hZ2VyUHVibGljS2V5IgJwbSIFaGFzUE0iB2NoZWNrUE0iDGFkbWluUHViS2V5cyILbHBBc3NldE5hbWUiDGxwQXNzZXREZXNjciIKcG9vbFdlaWdodCIEbG9nbyIXaW50ZXJuYWxBbW91bnRBc3NldERhdGEiFWludGVybmFsQW1vdW50QXNzZXRJZCIWaW50ZXJuYWxQcmljZUFzc2V0RGF0YSIUaW50ZXJuYWxQcmljZUFzc2V0SWQiFXBvb2xBY2NvdW50U2NyaXB0SGFzaCIcZXRoYWxvblBvb2xBY2NvdW50U2NyaXB0SGFzaCIKcG9vbEV4aXN0cyIPcG9vbENvbmZpZ1ZhbHVlIhRhbW91bnRBc3NldHNEZWNpbWFscyITcHJpY2VBc3NldHNEZWNpbWFscyISbHBBc3NldElzc3VlQWN0aW9uIgxscEFzc2V0SWRTdHIiGHBvb2xBY3RpdmF0ZUludm9rZVJlc3VsdCIYY3JlYXRlT3JVcGRhdGVMcEFzc2V0SW52IhJhZGRQb29sc0xwTGFiZWxJbnYiCnNldExvZ29JbnYiEGFkZEFzc2V0c0xpbmtJbnYiG2luY3JlYXNlQXNzZXRQb29sc051bWJlckludiIJbmV3U3RhdHVzIgpwb29sQ29uZmlnIgpscEFzc2V0RGNtIgxhbW91bnRUb0VtaXQiBmNhbGxlciIMb3JpZ2luQ2FsbGVyIhBscEFzc2V0UmVxdWVzdGVkIgdscEFzc2V0IgxhbW91bnRUb0J1cm4iB3BheW1lbnQiDXBheW1lbnRBbW91bnQiD2luQW1vdW50QXNzZXRJZCIabHBBc3NldFJlcXVlc3RlZEZvckJ1cm5pbmciBXNoYXJlIg1wb29sV2VpZ2h0S2V5Igxnd3hXZWlnaHRLZXkiCWd3eFdlaWdodCINcG9vbFdlaWdodE5ldyIRb25Nb2RpZnlXZWlnaHRJbnYiFWd3eFZpcnR1YWxQb29sQWN0aW9ucyIUcG9vbFdlaWdodEhpc3RvcnlLZXkiF3Bvb2xXZWlnaHRIaXN0b3J5T3JVbml0Ihhwb29sV2VpZ2h0SGlzdG9yeUFjdGlvbnMiDmJ0Y1Bvb2xBZGRyZXNzIg5ldGhQb29sQWRkcmVzcyIRZXRoQnRjUG9vbEFkZHJlc3MiE3VzZGNVc2R0UG9vbEFkZHJlc3MiD2V0aEJ0Y1dlaWdodE5ldyIRdXNkY1VzZHRXZWlnaHROZXciD3dlaWdodERlY3JlbWVudCILc3Rha2luZ0RhcHAiDWd3eFJld2FyZERhcHAiDGJ0Y1dlaWdodEtFWSIMZXRoV2VpZ2h0S0VZIg9ldGhCdGNXZWlnaHRLRVkiEXVzZGNVc2R0V2VpZ2h0S0VZIglidGNXZWlnaHQiCWV0aFdlaWdodCIMYnRjV2VpZ2h0TmV3IgxldGhXZWlnaHROZXciD2J0Y0xwQXNzZXRJZFN0ciIPZXRoTHBBc3NldElkU3RyIhJldGhCdGNMcEFzc2V0SWRTdHIiFHVzZGNVc2R0THBBc3NldElkU3RyIhFvbk1vZGlmeVdlaWdodEJ0YyIRb25Nb2RpZnlXZWlnaHRFdGgiFG9uTW9kaWZ5V2VpZ2h0RXRoQnRjIhZvbk1vZGlmeVdlaWdodFVzZGNVc2R0IgloYXZlTGFiZWwiAWIiB2Fzc2V0SWQiFGNoZWNrUHJpY2VBc3NldHNTaXplIgJjYiIDYWNjIgpwcmljZUFzc2V0IgFyIgdhY3Rpb25zIgIkbCICJHMiBSRhY2MwIgUkZjBfMSICJGEiAiRpIgUkZjBfMiIecG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIiJhbGxQb29sc09uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIgNmZWUiEGFtb3VudEFzc2V0SWRTdHIiD3ByaWNlQXNzZXRJZFN0ciIbYW1vdW50QXNzZXRJbnRlcm5hbElkT3B0aW9uIhpwcmljZUFzc2V0SW50ZXJuYWxJZE9wdGlvbiIZcG9vbENvbnRyYWN0QWRkcmVzc09wdGlvbiIPbHBBc3NldElkT3B0aW9uIghwb29sSW5mbyICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5agABYQAIAAFiAIDC1y8AAWMAEgABZAkAtgIBAICAkLu61q3wDQABZQUBYgABZgIOR1dYdmlydHVhbFBPT0wAAWcCCFBPT0xTX0xQAAFoAICJegABaQIFV0FWRVMAAWoJAGgCCQBoAgBkAOgHAOgHAAFrAgJfXwABbAIAAAFtAAEAAW4AAgABbwADAAFwAAQAAXEAAQABcgACAAFzAAMAAXQAAQABdQACAAF2AAMAAXcABAABeAAFAAF5AAYAAXoABwABQQAIAAFCAAkAAUMACgABRAALAAFFAgtXWF9FTUlTU0lPTgABRgkAzAgCBQFFBQNuaWwBAUcAAhclc19fYWxsb3dlZExwU2NyaXB0SGFzaAEBSAACHSVzX19hbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAQFJAAIiJXNfX2FsbG93ZWRMcFN0YWJsZUFkZG9uU2NyaXB0SGFzaAEBSgACECVzX19zd2FwQ29udHJhY3QBAUsAAhElc19fZmFjdG9yeUNvbmZpZwEBTAACECVzX19scFRva2Vuc0xpc3QBAU0AAhYlcyVzX19wb29sX19zY3JpcHRIYXNoAQFOAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQFPAAIZJXNfX2xlZ2FjeUZhY3RvcnlDb250cmFjdAEBUAACDyVzX19sZWdhY3lQb29scwEBUQACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFSAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQFTAAIQJXNfX2FkbWluUHViS2V5cwEBVAACFyVzX19hc3NldHNTdG9yZUNvbnRyYWN0AQFVAAIaJXNfX3ZvdGluZ0VtaXNzaW9uQ29udHJhY3QBAVYACQC5CQIJAMwIAgICJXMJAMwIAgILcHJpY2VBc3NldHMFA25pbAUBawEBVwACESVzX19wcmljZURlY2ltYWxzAQFYAAIMJXNfX3NodXRkb3duAQFZAAIXJXNfX25leHRJbnRlcm5hbEFzc2V0SWQBAVoBAmFhCQCsAgICEiVzJXNfX3Bvb2xXZWlnaHRfXwUCYWEBAmFiAgJhYQJhYwkArAICCQCsAgIJAKwCAgISJXMlc19fcG9vbFdlaWdodF9fBQJhYQICX18JAKQDAQUCYWMBAmFkAQJhZQkArAICAiglcyVzJWRfX21hcHBpbmdzX19pbnRlcm5hbDJiYXNlQXNzZXRJZF9fCQCkAwEFAmFlAQJhZgECYWcJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYWcBAmFoAgJhaQJhagkArAICCQCsAgIJAKwCAgkArAICAgglZCVkJXNfXwUCYWkCAl9fBQJhagIIX19jb25maWcBAmFrAQJhbAQCYW0FAmFsBAJhaQgFAmFtAl8xBAJhaggFAmFtAl8yCQC5CQIJAMwIAgIGJWQlZCVzCQDMCAIJAKQDAQUCYWkJAMwIAgkApAMBBQJhagkAzAgCAhpvbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAUDbmlsBQFrAQJhbgAJALkJAgkAzAgCAgIlcwkAzAgCAhpvbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAUDbmlsBQFrAQJhbwECYXAJAKwCAgkArAICAgglcyVzJXNfXwUCYXACGF9fbWFwcGluZ3NfX2xwQXNzZXQyUG9vbAECYXECAmFyAmFzCQCsAgIJAKwCAgkArAICCQCsAgICCiVkJWQlcyVzX18FAmFyAgJfXwUCYXMCHl9fbWFwcGluZ3NfX1Bvb2xBc3NldHMyTHBBc3NldAECYXQBAmFhCQCsAgICDiVzJXNfX3NwcmVhZF9fBQJhYQECYXUBAmF2CQCsAgIJAKwCAgIIJXMlcyVzX18FAmF2AiNfX21hcHBpbmdzX19wb29sQ29udHJhY3QyUG9vbEFzc2V0cwECYXcCAmFyAmFzCQCsAgIJAKwCAgkArAICCQCsAgICCiVkJWQlcyVzX18JAKQDAQUCYXICAl9fCQCkAwEFAmFzAiNfX21hcHBpbmdzX19wb29sQXNzZXRzMlBvb2xDb250cmFjdAECYXgBAmF2CQCsAgIJAKwCAgIIJXMlcyVzX18FAmF2AiBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAECYXkBAmFwCQCsAgIJAKwCAgIIJXMlcyVzX18FAmFwAiBfX21hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAECYXoCAmFBAmFCCQCsAgIJAKwCAgkArAICAhQlcyVzJXNfX3d4RW1pc3Npb25fXwUCYUECAl9fBQJhQgECYUMBAmFhCQCsAgICDSVzJXNfX2luRmVlX18FAmFhAQJhRAACECVzX19pbkZlZURlZmF1bHQBAmFFAQJhYQkArAICAg4lcyVzX19vdXRGZWVfXwUCYWEBAmFGAAIRJXNfX291dEZlZURlZmF1bHQBAmFHAQJhYQkArAICAhslcyVzX19za2lwT3JkZXJWYWxpZGF0aW9uX18FAmFhAQJhSAECYUkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQJhSQkArAICAhVObyBkYXRhIGZvciB0aGlzLmtleT0FAmFJAQJhSgECYUkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmwgCBQR0aGlzBQJhSQkArAICAhVObyBkYXRhIGZvciB0aGlzLmtleT0FAmFJAQJhSwECYUkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQJhSQkArAICAhVObyBkYXRhIGZvciB0aGlzLmtleT0FAmFJAQJhTAECYU0DCQAAAgUCYU0FAWkFBHVuaXQJANkEAQUCYU0AAmFOAAEAAmFPAAIAAmFQAAMAAmFRAAQAAmFSAAUAAmFTAAYAAmFUAAcAAmFVAAgAAmFWAAkAAmFXAAoAAmFYAAsBAmFZAQJhWgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhWgUCYU8BAmJhAQJhWgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhWgUCYVIBAmJiAQJhWgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhWgUCYU4BAmJjAQJhWgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhWgUCYVcBAmJkAAQCYmUJAKIIAQkBAVYAAwkAAQIFAmJlAgZTdHJpbmcEAmJmBQJiZQMJAAACCQCxAgEFAmJmAAAFA25pbAkAtQkCBQJiZgUBawUDbmlsAQJiZwAEAmJlCQCiCAEJAQFRAAMJAAECBQJiZQIGU3RyaW5nBAJiZgUCYmUJANkEAQUCYmYDCQABAgUCYmUCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECYmgABAJiZQkAoggBCQEBUgADCQABAgUCYmUCBlN0cmluZwQCYmYFAmJlCQDZBAEFAmJmAwkAAQIFAmJlAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAAmJpCQACAQIRUGVybWlzc2lvbiBkZW5pZWQAAmJqCQACAQIPVGVzdCBlcnJvciBoZXJlAQJiawECYmwDCQAAAggFAmJsBmNhbGxlcgUEdGhpcwYFAmJpAQJibQECYmwEAmJlCQECYmcAAwkAAQIFAmJlAgpCeXRlVmVjdG9yBAJibgUCYmUDCQAAAggFAmJsD2NhbGxlclB1YmxpY0tleQUCYm4GBQJiaQMJAAECBQJiZQIEVW5pdAkBAmJrAQUCYmwJAAIBAgtNYXRjaCBlcnJvcgECYm8LAmJwAmJxAmJyAmJzAmJ0AmJ1AmJ2AmJ3AmJ4AmJ5AmJ6CQC5CQIJAMwIAgIWJXMlcyVzJXMlcyVzJXMlcyVzJXMlcwkAzAgCBQJicAkAzAgCBQJicQkAzAgCBQJicgkAzAgCBQJicwkAzAgCBQJidAkAzAgCBQJidQkAzAgCBQJidgkAzAgCBQJidwkAzAgCBQJieAkAzAgCBQJieQkAzAgCBQJiegUDbmlsBQFrAQJiQQcCYnACYnECYnICYnMCYnQCYnUCYnYJALkJAgkAzAgCAgwlcyVzJXMlcyVzJXMJAMwIAgUCYnAJAMwIAgUCYnEJAMwIAgUCYnIJAMwIAgUCYnMJAMwIAgUCYnQJAMwIAgUCYnUJAMwIAgUCYnYFA25pbAUBawECYkILAmFhAmJDAmJEAmJFAmJGAmJHAmJIAmJJAmJKAmJLAmJMCQC5CQIJAMwIAgIWJXMlZCVzJXMlcyVkJWQlZCVkJWQlcwkAzAgCBQJhYQkAzAgCBQJiQwkAzAgCBQJiRAkAzAgCBQJiRQkAzAgCBQJiRgkAzAgCCQCkAwEFAmJHCQDMCAIJAKQDAQUCYkgJAMwIAgkApAMBBQJiSQkAzAgCCQCkAwEFAmJKCQDMCAIJAKQDAQUCYksJAMwIAgUCYkwFA25pbAUBawECYk0CAmJOAmJPCQC5CQIJAMwIAgIEJWQlZAkAzAgCCQCkAwEFAmJOCQDMCAIJAKQDAQUCYk8FA25pbAUBawECYlABAmFhBAJiUQkAtQkCCQECYUgBCQECYXUBBQJhYQUBawQCYWkJAJEDAgUCYlEAAQQCYWoJAJEDAgUCYlEAAgkAtQkCCQECYUgBCQECYWgCBQJhaQUCYWoFAWsBAmJSAgJiUwJiVAQCYlUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmFmAQUCYlMAAAQCYlYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAVkAAAAEAmJXAwkAAAIFAmJVAAAEAmJYCQBkAgUCYlYFAmJUCQCVCgMFAmJYCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWQAFAmJYCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWYBBQJiUwUCYlgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFkAQUCYlgFAmJTBQNuaWwGCQCVCgMFAmJVBQNuaWwHBQJiVwECYlkBAmJsBAJiWgkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJAQFTAAUBbAUBawMJAQ9jb250YWluc0VsZW1lbnQCBQJiWgkA2AQBCAUCYmwPY2FsbGVyUHVibGljS2V5BgQCY2EJAQJibQEFAmJsAwkAAAIFAmNhBQJjYQYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmNiAwJhSQJjYwJjZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJhSQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJjYwUCY2QBAmNlAgJhQQJhQgQCYWkJAJ8IAQkBAmFmAQUCYUEEAmFqCQCfCAEJAQJhZgEFAmFCAwMJAAACBQJhaQUEdW5pdAYJAAACBQJhagUEdW5pdAcEAmNmCQCkAwEJAQV2YWx1ZQEFAmFpBAJjZwkApAMBCQEFdmFsdWUBBQJhagQCY2gJAKIIAQkBAmFoAgUCY2YFAmNnBAJjaQkAoggBCQECYWgCBQJjZwUCY2YEAmNqAwkBAiE9AgUCY2gFBHVuaXQGCQECIT0CBQJjaQUEdW5pdAUCY2ofAmJsARdnZXRTd2FwQ29udHJhY3RSRUFET05MWQAJAJQKAgUDbmlsCQECYUgBCQEBSgACYmwBIGdldExwQXNzZXRGcm9tUG9vbEFzc2V0c1JFQURPTkxZAgJjawJjbAMDCQAAAgUCY2sCLDhMUVc4ZjdQNWQ1UFpNN0d0WkVCZ2FxUlBHU3pTM0RmUHVpWHJVUko0QUpTCQAAAgUCY2wCBVdBVkVTBwkAlAoCBQNuaWwFBHVuaXQEAmNtCQEFdmFsdWUBCQCaCAIFBHRoaXMJAQJhZgEFAmNrBAJjbgkBBXZhbHVlAQkAmggCBQR0aGlzCQECYWYBBQJjbAQCY28JAJ0IAgUEdGhpcwkBAmFxAgkApAMBBQJjbQkApAMBBQJjbgQCY3ADCQAAAgUCY28FBHVuaXQFBHVuaXQJALACAgkBBXZhbHVlAQUCY28ABAkAlAoCBQNuaWwFAmNwAmJsASFnZXRQb29sQWRkcmVzc0Zyb21McEFzc2V0UkVBRE9OTFkBAmNxCQCUCgIFA25pbAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQECYXkBBQJjcQIAAmJsAQtjb25zdHJ1Y3RvcggCY3ICY3MCYnICYnMCYnQCYnUCY3QCY3UEAmN2CQECYm0BBQJibAMJAAACBQJjdgUCY3YJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUsACQECYkEHBQJjcgUCY3MFAmJyBQJicwUCYnQFAmJ1BQJjdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVcABQJjdQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJsAQ1jb25zdHJ1Y3RvclYyAQJjdwQCY3YJAQJibQEFAmJsAwkAAAIFAmN2BQJjdgQCY3gJAKcIAQkA2QQBBQJjdwMJAAACBQJjeAUCY3gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU4ABQJjdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJsAQ1jb25zdHJ1Y3RvclYzBAJidwJieAJieQJiegQCY3YJAQJibQEFAmJsAwkAAAIFAmN2BQJjdgQCYVoJALUJAgkBAmFIAQkBAUsABQFrCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFLAAkBAmJvCwkAkQMCBQJhWgABCQCRAwIFAmFaAAIJAJEDAgUCYVoAAwkAkQMCBQJhWgAECQCRAwIFAmFaAAUJAJEDAgUCYVoABgkAkQMCBQJhWgAHBQJidwUCYngFAmJ5BQJiegUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJsAQ1jb25zdHJ1Y3RvclY0AgJjeQJjegQCY3YJAQJibQEFAmJsAwkAAAIFAmN2BQJjdgkAzAgCCQELU3RyaW5nRW50cnkCCQEBTwAFAmN5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFQAAkAuQkCBQJjegUBawUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJsAQ1jb25zdHJ1Y3RvclY1AQJjQQQCY3YJAQJibQEFAmJsAwkAAAIFAmN2BQJjdgkAzAgCCQELU3RyaW5nRW50cnkCCQEBVAAFAmNBBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmwBDWNvbnN0cnVjdG9yVjYCAmNCAmNDBAJjRAkAzAgCCQECYm0BBQJibAkAzAgCAwkBAiE9AgkApggBBQJjQgUEdW5pdAYCKGludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNvbnRyYWN0IGFkZHJlc3MFA25pbAMJAAACBQJjRAUCY0QJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUABQJjQgkAzAgCCQELU3RyaW5nRW50cnkCCQEBVgAJALkJAgUCY0MFAWsFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJibAEKc2V0TWFuYWdlcgECY0UEAmN2CQECYm0BBQJibAMJAAACBQJjdgUCY3YEAmNGCQDZBAEFAmNFAwkAAAIFAmNGBQJjRgkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgAFAmNFBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmwBDmNvbmZpcm1NYW5hZ2VyAAQCY0cJAQJiaAAEAmNIAwkBCWlzRGVmaW5lZAEFAmNHBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJjSAUCY0gEAmNJAwkAAAIIBQJibA9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmNHBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJjSQUCY0kJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVEACQDYBAEJAQV2YWx1ZQEFAmNHCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFSAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJsAQlzZXRBZG1pbnMBAmNKBAJjdgkBAmJtAQUCYmwDCQAAAgUCY3YFAmN2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFTAAkAuQkCBQJjSgUBawUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJsAQ9hY3RpdmF0ZU5ld1Bvb2wIAmFhAmJFAmJGAmNLAmNMAmNNAmJMAmNOBAJjdgkBAmJZAQUCYmwDCQAAAgUCY3YFAmN2AwkBCWlzRGVmaW5lZAEJAKIIAQkBAmF1AQUCYWEJAAIBCQCsAgIJAKwCAgINUG9vbCBhZGRyZXNzIAUCYWECFCBhbHJlYWR5IHJlZ2lzdGVyZWQuBAJjTwkBAmJSAgUCYkUAAQQCY1AIBQJjTwJfMQQCY1EJAQJiUgIFAmJGAwgFAmNPAl8zAAIAAQQCY1IIBQJjUQJfMQQCY1MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA8QcBCQERQGV4dHJOYXRpdmUoMTA2MikBBQJhYQkArAICAilObyBzY3JpcHQgaGFzIGJlZW4gZm91bmQgb24gcG9vbCBhY2NvdW50IAUCYWEEAmNUCQERQGV4dHJOYXRpdmUoMTA1NykBCQEBTQAEAmNVCQECY2UCBQJiRQUCYkYDBQJjVQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIFUG9vbCAFAmJFAgEvBQJiRgIcIGhhcyBhbHJlYWR5IGJlZW4gYWN0aXZhdGVkLgQCY1YJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkBAmFoAgkApAMBBQJjUAkApAMBBQJjUgQCY1cDCQAAAgUCYkUCBVdBVkVTBQFqCQBsBgAKAAAICQEFdmFsdWUBCQDsBwEJANkEAQUCYkUIZGVjaW1hbHMAAAAABQRET1dOBAJjWAMJAAACBQJiRgIFV0FWRVMFAWoJAGwGAAoAAAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQJiRghkZWNpbWFscwAAAAAFBERPV04EAmNZCQDCCAUFAmNLBQJjTAABAAgGBAJiRAkAuAgBBQJjWQQCY1oJANgEAQUCYkQEAmRhCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmFhAghhY3RpdmF0ZQkAzAgCBQJiRQkAzAgCBQJiRgUDbmlsBQNuaWwDCQAAAgUCZGEFAmRhAwkBAiE9AgUCZGECB3N1Y2Nlc3MJAAIBAiNQb29sIGluaXRpYWxpc2F0aW9uIGVycm9yIGhhcHBlbmVkLgQCY0EJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhSAEJAQFUAAQCZGIJAPwHBAUCY0ECDmNyZWF0ZU9yVXBkYXRlCQDMCAIFAmNaCQDMCAIFAmNLCQDMCAIHBQNuaWwFA25pbAMJAAACBQJkYgUCZGIEAmRjCQD8BwQFAmNBAghhZGRMYWJlbAkAzAgCBQJjWgkAzAgCBQFnBQNuaWwFA25pbAMJAAACBQJkYwUCZGMEAmRkCQD8BwQFAmNBAgdzZXRMb2dvCQDMCAIFAmNaCQDMCAIFAmNOBQNuaWwFA25pbAMJAAACBQJkZAUCZGQEAmRlCQD8BwQFAmNBAg1hZGRBc3NldHNMaW5rCQDMCAIFAmJFCQDMCAIFAmJGCQDMCAIFAmNaBQNuaWwFA25pbAMJAAACBQJkZQUCZGUEAmRmCQD8BwQFAmNBAhhpbmNyZWFzZUFzc2V0UG9vbHNOdW1iZXIJAMwIAgUCYkUFA25pbAUDbmlsAwkAAAIFAmRmBQJkZgkAlAoCCQDOCAIJAM4IAggFAmNPAl8yCAUCY1ECXzIJAMwIAgUCY1kJAMwIAgkBBEJ1cm4CBQJiRAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhaAIJAKQDAQUCY1AJAKQDAQUCY1IJAQJiQgsFAmFhCQCkAwEFAW0FAmNaBQJiRQUCYkYFAmNXBQJjWAUCY1AFAmNSBQFqBQJiTAkAzAgCCQELU3RyaW5nRW50cnkCCQECYW8BBQJjWgkBAmJNAgUCY1AFAmNSCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcQIJAKQDAQUCY1AJAKQDAQUCY1IJAKwCAgIEJXNfXwUCY1oJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF1AQUCYWEJAQJiTQIFAmNQBQJjUgkAzAgCCQELU3RyaW5nRW50cnkCCQECYXcCBQJjUAUCY1IFAmFhCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJheQEFAmNaBQJhYQkAzAgCCQELU3RyaW5nRW50cnkCCQECYXgBBQJhYQUCY1oJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFaAQUCYWEFAmNNCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXQBBQJhYQUBaAUDbmlsBQJjWgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJibAEKbWFuYWdlUG9vbAICYWECZGcEAmN2CQECYm0BBQJibAMJAAACBQJjdgUCY3YEAmRoCQECYlABBQJhYQQCYkMJAJEDAgUCZGgFAXUEAmNaCQCRAwIFAmRoBQF2BAJiRQkAkQMCBQJkaAUBdwQCYkYJAJEDAgUCZGgFAXgEAmNXCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGgFAXkEAmNYCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGgFAXoEAmNQCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGgFAUEEAmNSCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGgFAUIEAmRpCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGgFAUMEAmJMCQCRAwIFAmRoBQFECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhaAIJAKQDAQUCY1AJAKQDAQUCY1IJAQJiQgsFAmFhCQCkAwEFAmRnBQJjWgUCYkUFAmJGBQJjVwUCY1gFAmNQBQJjUgUCZGkFAmJMBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmwBBGVtaXQBAmRqBAJkawgFAmJsBmNhbGxlcgQCZGwIBQJibAxvcmlnaW5DYWxsZXIEAmRtCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBAmF4AQkApQgBBQJkawIdSW52YWxpZCBMUCBhZGRyZXNzIGNhbGxlZCBtZS4EAmRuCQDZBAEFAmRtBAJjegkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJAQFQAAUBbAUBawQCY3kJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEBTwACKExlZ2FjeSBmYWN0b3J5IGNvbnRyYWN0IGRvZXMgbm90IGV4aXN0cy4DCQBnAgAABQJkagUDbmlsAwkBD2NvbnRhaW5zRWxlbWVudAIFAmN6CQClCAEFAmRrCQCUCgIFA25pbAUCY3kJAJQKAgkAzAgCCQEHUmVpc3N1ZQMFAmRuBQJkagYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmJsBmNhbGxlcgUCZGoFAmRuBQNuaWwCB3N1Y2Nlc3MCYmwBBGJ1cm4BAmRvBAJkawgFAmJsBmNhbGxlcgQCZGwIBQJibAxvcmlnaW5DYWxsZXIEAmRwCQEFdmFsdWUBCQCRAwIIBQJibAhwYXltZW50cwAABAJkcQkBBXZhbHVlAQgFAmRwBmFtb3VudAQCZHIJANgEAQkBBXZhbHVlAQgFAmRwB2Fzc2V0SWQEAmRzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBAmF4AQkApQgBBQJkawIdSW52YWxpZCBMUCBhZGRyZXNzIGNhbGxlZCBtZS4DCQECIT0CBQJkcgUCZHMJAAIBAhVJbnZhbGlkIGFzc2V0IHBhc3NlZC4DCQECIT0CBQJkbwUCZHEJAAIBAhZJbnZhbGlkIGFtb3VudCBwYXNzZWQuBAJkbgkA2QQBBQJkcwkAlAoCCQDMCAIJAQRCdXJuAgUCZG4FAmRvBQNuaWwCB3N1Y2Nlc3MCYmwBDG1vZGlmeVdlaWdodAICYkQCZHQEAmN2AwkAAAIJANgEAQgIBQJibAZjYWxsZXIFYnl0ZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAVUAAgAGCQECYm0BBQJibAMJAAACBQJjdgUCY3YEAmF2CQECYUgBCQECYXkBBQJiRAQCZHUJAQFaAQUCYXYEAmR2CQEBWgEFAWYEAmR3CQELdmFsdWVPckVsc2UCCQCfCAEFAmR2AAAEAmNNCQELdmFsdWVPckVsc2UCCQCfCAEFAmR1AAAEAmR4BQJkdAQCYVoJALUJAgkBAmFIAQkBAUsABQFrBAJjcgkBAmJiAQUCYVoEAmR5CQD8BwQFAmNyAg5vbk1vZGlmeVdlaWdodAkAzAgCBQJiRAkAzAgCBQJhdgUDbmlsBQNuaWwDCQAAAgUCZHkFAmR5BAJkegMJAAACBQJkdwAABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFAmR2AAAFA25pbAQCZEEJAQJhYgIFAmF2AAAEAmRCCQCfCAEFAmRBBAJkQwMJAAACBQJkQgUEdW5pdAUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEFAmRBBQNuaWwJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkdQUCZHgFA25pbAUCZHoFAmRDCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJsAQ1tb2RpZnlXZWlnaHRzBAJkRAJkRQJkRgJkRwQCY3YJAQJibQEFAmJsAwkAAAIFAmN2BQJjdgQCZEgJAGkCCQBoAgAFBQFlAGQEAmRJCQBpAgkAaAIABQUBZQBkBAJkSgkAaQIJAGgCAAUFAWUAZAQCYVoJALUJAgkBAmFIAQkBAUsABQFrBAJkSwkBAmJiAQUCYVoEAmRMCQECYmMBBQJhWgQCZE0JAQFaAQUCZEQEAmROCQEBWgEFAmRFBAJkTwkBAVoBBQJkRgQCZFAJAQFaAQUCZEcEAmRRCQECYUsBBQJkTQQCZFIJAQJhSwEFAmROBAJkUwkAZQIFAmRRBQJkSgQCZFQJAGUCBQJkUgUCZEoDCQBnAgAABQJkUwkAAgEJAKwCAgIWaW52YWxpZCBidGNXZWlnaHROZXc6IAkApAMBBQJkUwMJAGcCAAAFAmRUCQACAQkArAICAhZpbnZhbGlkIGV0aFdlaWdodE5ldzogCQCkAwEFAmRUBAJkVQkBAmFIAQkBAmF4AQUCZEQEAmRWCQECYUgBCQECYXgBBQJkRQQCZFcJAQJhSAEJAQJheAEFAmRGBAJkWAkBAmFIAQkBAmF4AQUCZEcEAmRZCQD8BwQFAmRLAg5vbk1vZGlmeVdlaWdodAkAzAgCBQJkVQkAzAgCBQJkRAUDbmlsBQNuaWwDCQAAAgUCZFkFAmRZBAJkWgkA/AcEBQJkSwIOb25Nb2RpZnlXZWlnaHQJAMwIAgUCZFYJAMwIAgUCZEUFA25pbAUDbmlsAwkAAAIFAmRaBQJkWgQCZWEJAPwHBAUCZEsCDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmRXCQDMCAIFAmRGBQNuaWwFA25pbAMJAAACBQJlYQUCZWEEAmViCQD8BwQFAmRLAg5vbk1vZGlmeVdlaWdodAkAzAgCBQJkWAkAzAgCBQJkRwUDbmlsBQNuaWwDCQAAAgUCZWIFAmViCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkTQUCZFMJAMwIAgkBDEludGVnZXJFbnRyeQIFAmROBQJkVAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZE8FAmRICQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkUAUCZEkJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYgIFAmREAAAFAmRRCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWICBQJkRQAABQJkUgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFiAgUCZEYAAAUCZEgJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYgIFAmRHAAAFAmRJBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmwBGGNoZWNrV3hFbWlzc2lvblBvb2xMYWJlbAICYUECYUIEAmVjBAJiZQkAoAgBCQECYXoCBQJhQQUCYUIDCQABAgUCYmUCB0Jvb2xlYW4EAmVkBQJiZQUCZWQHCQCUCgIFA25pbAUCZWMCYmwBFnNldFd4RW1pc3Npb25Qb29sTGFiZWwCAmFBAmFCBAJjdgkBAmJZAQUCYmwDCQAAAgUCY3YFAmN2CQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQJhegIFAmFBBQJhQgYFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJibAEZZGVsZXRlV3hFbWlzc2lvblBvb2xMYWJlbAICYUECYUIEAmN2AwkBAmJrAQUCYmwGCQECYlkBBQJibAMJAAACBQJjdgUCY3YJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQECYXoCBQJhQQUCYUIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJibAESb25WZXJpZmljYXRpb25Mb3NzAQJlZQQCY3YDCQAAAgkA2AQBCAgFAmJsBmNhbGxlcgVieXRlcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEBVAACAAYJAQJibQEFAmJsAwkAAAIFAmN2BQJjdgQCY0MJAQJiZAAEAmVmAwkAZgIJAJADAQUCY0MAAAYJAAIBAhRpbnZhbGlkIHByaWNlIGFzc2V0cwMJAAACBQJlZgUCZWYKAQJlZwICZWgCZWkEAmVqCQD8BwQFBHRoaXMCGWRlbGV0ZVd4RW1pc3Npb25Qb29sTGFiZWwJAMwIAgUCZWUJAMwIAgUCZWkFA25pbAUDbmlsAwkAAAIFAmVqBQJlagUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQCZWsKAAJlbAUCY0MKAAJlbQkAkAMBBQJlbAoAAmVuBQR1bml0CgECZW8CAmVwAmVxAwkAZwIFAmVxBQJlbQUCZXAJAQJlZwIFAmVwCQCRAwIFAmVsBQJlcQoBAmVyAgJlcAJlcQMJAGcCBQJlcQUCZW0FAmVwCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMgkBAmVyAgkBAmVvAgkBAmVvAgUCZW4AAAABAAIDCQAAAgUCZWsFAmVrCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJibAEoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQECYWEEAmRoCQECYlABBQJhYQQCYWwJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmRoBQFBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGgFAUIEAmVzCQELdmFsdWVPckVsc2UCCQCgCAEJAQJhawEFAmFsBwQCZXQJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBAmFuAAcJAJQKAgUDbmlsAwUCZXQGBQJlcwJibAEQZ2V0SW5GZWVSRUFET05MWQECYWEEAmV1CQECY2IDCQECYUMBBQJhYQkBAmFEAAAACQCUCgIFA25pbAUCZXUCYmwBEWdldE91dEZlZVJFQURPTkxZAQJhYQQCZXUJAQJjYgMJAQJhRQEFAmFhCQECYUYACQBrAwAKBQFiAJBOCQCUCgIFA25pbAUCZXUCYmwBEHBvb2xJbmZvUkVBRE9OTFkCAmV2AmV3BAJleAkAmggCBQR0aGlzCQECYWYBBQJldgQCZXkJAJoIAgUEdGhpcwkBAmFmAQUCZXcEAmV6CQCdCAIFBHRoaXMJAQJhdwIJAQV2YWx1ZQEFAmV4CQEFdmFsdWUBBQJleQQCZUEJAJ0IAgUEdGhpcwkBAmF4AQkBBXZhbHVlAQUCZXoEAmNVAwMJAQlpc0RlZmluZWQBBQJleAkBCWlzRGVmaW5lZAEFAmV5BwkBCWlzRGVmaW5lZAEFAmV6BwQCZUIDBQJjVQkAlAoCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQJlegkBAmFMAQkBBXZhbHVlAQUCZUEFBHVuaXQJAJQKAgUDbmlsBQJlQgJibAEVZ2V0UG9vbFN0YXR1c1JFQURPTkxZAQJhYQQCYlEJALUJAgkBAmFIAQkBAmF1AQUCYWEFAWsEAmFpCQCRAwIFAmJRAAEEAmFqCQCRAwIFAmJRAAIEAmNoCQC1CQIJAQJhSAEJAQJhaAIFAmFpBQJhagUBawkAlAoCBQNuaWwJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjaAUBdQJibAEVZ2V0UG9vbENvbmZpZ1JFQURPTkxZAQJhYQQCYlEJALUJAgkBAmFIAQkBAmF1AQUCYWEFAWsEAmFpCQCRAwIFAmJRAAEEAmFqCQCRAwIFAmJRAAIEAmNoCQC1CQIJAQJhSAEJAQJhaAIFAmFpBQJhagUBawkAlAoCBQNuaWwFAmNoAmJsARhnZXRQb29sQ29uZmlnQnlMcEFzc2V0SWQBAmNaBAJiUQkAtQkCCQECYUgBCQECYW8BBQJjWgUBawQCYWkJAJEDAgUCYlEAAQQCYWoJAJEDAgUCYlEAAgQCY2gJALUJAgkBAmFIAQkBAmFoAgUCYWkFAmFqBQFrCQCUCgIFA25pbAUCY2gCYmwBEnBvb2xFeGlzdHNSRUFET05MWQICYUECYUIJAJQKAgUDbmlsCQECY2UCBQJhQQUCYUICYmwBG3NraXBPcmRlclZhbGlkYXRpb25SRUFET05MWQECYWEJAJQKAgUDbmlsCQELdmFsdWVPckVsc2UCCQCgCAEJAQJhRwEFAmFhBwECZUMBAmVEAAQCZUUEAmJlCQECYmcAAwkAAQIFAmJlAgpCeXRlVmVjdG9yBAJibgUCYmUFAmJuAwkAAQIFAmJlAgRVbml0CAUCZUMPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAmVDCWJvZHlCeXRlcwkAkQMCCAUCZUMGcHJvb2ZzAAAFAmVFnAp/eQ==", "height": 2500953, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4ZcotPz3pYBGAZRtmH9LZ3aydKRgCzs7jhWtWhUD99yT Next: 688tfSDQMrf7MWxvrsT6N8k4PUVPsV1TtyBW6L7ediJa Diff:
OldNewDifferences
182182
183183
184184 func keyOutFeeDefault () = "%s__outFeeDefault"
185+
186+
187+func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
185188
186189
187190 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
862865
863866
864867 @Callable(i)
865-func getPoolConfigByLpAssetIdREADONLY (lpAssetIdStr) = {
868+func getPoolConfigByLpAssetId (lpAssetIdStr) = {
866869 let poolAssets = split(getStringOrFail(keyMappingLpAssetToPoolAssets(lpAssetIdStr)), SEP)
867870 let amountAssetInternal = poolAssets[1]
868871 let priceAssetInternal = poolAssets[2]
874877
875878 @Callable(i)
876879 func poolExistsREADONLY (amountAssetId,priceAssetId) = $Tuple2(nil, poolExistsInternal(amountAssetId, priceAssetId))
880+
881+
882+
883+@Callable(i)
884+func skipOrderValidationREADONLY (poolAddress) = $Tuple2(nil, valueOrElse(getBoolean(keySkipOrderValidation(poolAddress)), false))
877885
878886
879887 @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)
185188
186189
187190 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
188191
189192
190193 func getBooleanOrFail (key) = valueOrErrorMessage(getBoolean(this, key), ("No data for this.key=" + key))
191194
192195
193196 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), ("No data for this.key=" + key))
194197
195198
196199 func parseAssetId (input) = if ((input == wavesString))
197200 then unit
198201 else fromBase58String(input)
199202
200203
201204 let IdxFactoryCfgStakingDapp = 1
202205
203206 let IdxFactoryCfgBoostingDapp = 2
204207
205208 let IdxFactoryCfgIdoDapp = 3
206209
207210 let IdxFactoryCfgTeamDapp = 4
208211
209212 let IdxFactoryCfgEmissionDapp = 5
210213
211214 let IdxFactoryCfgRestDapp = 6
212215
213216 let IdxFactoryCfgSlippageDapp = 7
214217
215218 let IdxFactoryCfgDaoDapp = 8
216219
217220 let IdxFactoryCfgMarketingDapp = 9
218221
219222 let IdxFactoryCfgGwxRewardDapp = 10
220223
221224 let IdxFactoryCfgBirdsDapp = 11
222225
223226 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
224227
225228
226229 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
227230
228231
229232 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
230233
231234
232235 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
233236
234237
235238 func getPriceAssets () = match getString(keyPriceAssets()) {
236239 case s: String =>
237240 if ((size(s) == 0))
238241 then nil
239242 else split(s, SEP)
240243 case _ =>
241244 nil
242245 }
243246
244247
245248 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
246249 case s: String =>
247250 fromBase58String(s)
248251 case _: Unit =>
249252 unit
250253 case _ =>
251254 throw("Match error")
252255 }
253256
254257
255258 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
256259 case s: String =>
257260 fromBase58String(s)
258261 case _: Unit =>
259262 unit
260263 case _ =>
261264 throw("Match error")
262265 }
263266
264267
265268 let permissionDeniedError = throw("Permission denied")
266269
267270 let testError = throw("Test error here")
268271
269272 func mustThis (i) = if ((i.caller == this))
270273 then true
271274 else permissionDeniedError
272275
273276
274277 func mustManager (i) = match managerPublicKeyOrUnit() {
275278 case pk: ByteVector =>
276279 if ((i.callerPublicKey == pk))
277280 then true
278281 else permissionDeniedError
279282 case _: Unit =>
280283 mustThis(i)
281284 case _ =>
282285 throw("Match error")
283286 }
284287
285288
286289 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)
287290
288291
289292 func dataFactoryCfg (stakingAddress,boostingAddress,idoContract,teamContract,emissionContract,restContract,slippageContract) = makeString(["%s%s%s%s%s%s", stakingAddress, boostingAddress, idoContract, teamContract, emissionContract, restContract, slippageContract], SEP)
290293
291294
292295 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)
293296
294297
295298 func dataMappingPoolAssets (internalAmountAssetStr,internalPriceAssetStr) = makeString(["%d%d", toString(internalAmountAssetStr), toString(internalPriceAssetStr)], SEP)
296299
297300
298301 func getPoolConfig (poolAddress) = {
299302 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
300303 let amountAssetInternal = poolAssets[1]
301304 let priceAssetInternal = poolAssets[2]
302305 split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
303306 }
304307
305308
306309 func getInternalAssetIdOrCreate (assetIdStr,incrementor) = {
307310 let internalAssetId = valueOrElse(getInteger(this, keyMappingsBaseAsset2internalId(assetIdStr)), 0)
308311 let currentIndexOfInternalId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0)
309312 let result = if ((internalAssetId == 0))
310313 then {
311314 let newInternalAssetId = (currentIndexOfInternalId + incrementor)
312315 $Tuple3(newInternalAssetId, [IntegerEntry(keyNextInternalAssetId(), newInternalAssetId), IntegerEntry(keyMappingsBaseAsset2internalId(assetIdStr), newInternalAssetId), StringEntry(keyMappingsInternal2baseAssetId(newInternalAssetId), assetIdStr)], true)
313316 }
314317 else $Tuple3(internalAssetId, nil, false)
315318 result
316319 }
317320
318321
319322 func mustAdmin (i) = {
320323 let adminPKs = split(valueOrElse(getString(keyAdminPubKeys()), EMPTY), SEP)
321324 if (containsElement(adminPKs, toBase58String(i.callerPublicKey)))
322325 then true
323326 else {
324327 let isManager = mustManager(i)
325328 if ((isManager == isManager))
326329 then true
327330 else throw("Strict value is not equal to itself.")
328331 }
329332 }
330333
331334
332335 func intOrDefaultOrFallback (key,keyDefault,valueFallback) = valueOrElse(getInteger(this, key), valueOrElse(getInteger(this, keyDefault), valueFallback))
333336
334337
335338 func poolExistsInternal (amountAssetId,priceAssetId) = {
336339 let amountAssetInternal = getInteger(keyMappingsBaseAsset2internalId(amountAssetId))
337340 let priceAssetInternal = getInteger(keyMappingsBaseAsset2internalId(priceAssetId))
338341 if (if ((amountAssetInternal == unit))
339342 then true
340343 else (priceAssetInternal == unit))
341344 then false
342345 else {
343346 let amAs = toString(value(amountAssetInternal))
344347 let prAs = toString(value(priceAssetInternal))
345348 let cfg = getString(keyPoolConfig(amAs, prAs))
346349 let cfgReverse = getString(keyPoolConfig(prAs, amAs))
347350 let exists = if ((cfg != unit))
348351 then true
349352 else (cfgReverse != unit)
350353 exists
351354 }
352355 }
353356
354357
355358 @Callable(i)
356359 func getSwapContractREADONLY () = $Tuple2(nil, getStringOrFail(swapContract()))
357360
358361
359362
360363 @Callable(i)
361364 func getLpAssetFromPoolAssetsREADONLY (asset1,asset2) = if (if ((asset1 == "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS"))
362365 then (asset2 == "WAVES")
363366 else false)
364367 then $Tuple2(nil, unit)
365368 else {
366369 let assetNum1 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset1)))
367370 let assetNum2 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset2)))
368371 let ee = getString(this, keyMappingPoolAssetsToLpasset(toString(assetNum1), toString(assetNum2)))
369372 let res = if ((ee == unit))
370373 then unit
371374 else drop(value(ee), 4)
372375 $Tuple2(nil, res)
373376 }
374377
375378
376379
377380 @Callable(i)
378381 func getPoolAddressFromLpAssetREADONLY (lp) = $Tuple2(nil, valueOrElse(getString(this, keyMappingPoolLPAssetToPoolContractAddress(lp)), ""))
379382
380383
381384
382385 @Callable(i)
383386 func constructor (stakingContract,boostingContract,idoContract,teamContract,emissionContract,restContract,slpipageContract,priceDecimals) = {
384387 let checkCaller = mustManager(i)
385388 if ((checkCaller == checkCaller))
386389 then [StringEntry(keyFactoryConfig(), dataFactoryCfg(stakingContract, boostingContract, idoContract, teamContract, emissionContract, restContract, slpipageContract)), IntegerEntry(keyPriceDecimals(), priceDecimals)]
387390 else throw("Strict value is not equal to itself.")
388391 }
389392
390393
391394
392395 @Callable(i)
393396 func constructorV2 (mathcherPub58Str) = {
394397 let checkCaller = mustManager(i)
395398 if ((checkCaller == checkCaller))
396399 then {
397400 let mathcerPub = addressFromPublicKey(fromBase58String(mathcherPub58Str))
398401 if ((mathcerPub == mathcerPub))
399402 then [StringEntry(keyMatcherPub(), mathcherPub58Str)]
400403 else throw("Strict value is not equal to itself.")
401404 }
402405 else throw("Strict value is not equal to itself.")
403406 }
404407
405408
406409
407410 @Callable(i)
408411 func constructorV3 (daoContract,marketingContract,gwxRewardsContract,birdsContract) = {
409412 let checkCaller = mustManager(i)
410413 if ((checkCaller == checkCaller))
411414 then {
412415 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
413416 [StringEntry(keyFactoryConfig(), dataFactoryCfgV3(factoryCfg[1], factoryCfg[2], factoryCfg[3], factoryCfg[4], factoryCfg[5], factoryCfg[6], factoryCfg[7], daoContract, marketingContract, gwxRewardsContract, birdsContract))]
414417 }
415418 else throw("Strict value is not equal to itself.")
416419 }
417420
418421
419422
420423 @Callable(i)
421424 func constructorV4 (legacyFactoryContract,legacyPools) = {
422425 let checkCaller = mustManager(i)
423426 if ((checkCaller == checkCaller))
424427 then [StringEntry(keyLegacyFactoryContract(), legacyFactoryContract), StringEntry(keyLegacyPools(), makeString(legacyPools, SEP))]
425428 else throw("Strict value is not equal to itself.")
426429 }
427430
428431
429432
430433 @Callable(i)
431434 func constructorV5 (assetsStoreContract) = {
432435 let checkCaller = mustManager(i)
433436 if ((checkCaller == checkCaller))
434437 then [StringEntry(keyAssetsStoreContract(), assetsStoreContract)]
435438 else throw("Strict value is not equal to itself.")
436439 }
437440
438441
439442
440443 @Callable(i)
441444 func constructorV6 (votingEmissionContract,priceAssets) = {
442445 let cheks = [mustManager(i), if ((addressFromString(votingEmissionContract) != unit))
443446 then true
444447 else "invalid voting emission contract address"]
445448 if ((cheks == cheks))
446449 then [StringEntry(keyVotingEmissionContract(), votingEmissionContract), StringEntry(keyPriceAssets(), makeString(priceAssets, SEP))]
447450 else throw("Strict value is not equal to itself.")
448451 }
449452
450453
451454
452455 @Callable(i)
453456 func setManager (pendingManagerPublicKey) = {
454457 let checkCaller = mustManager(i)
455458 if ((checkCaller == checkCaller))
456459 then {
457460 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
458461 if ((checkManagerPublicKey == checkManagerPublicKey))
459462 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
460463 else throw("Strict value is not equal to itself.")
461464 }
462465 else throw("Strict value is not equal to itself.")
463466 }
464467
465468
466469
467470 @Callable(i)
468471 func confirmManager () = {
469472 let pm = pendingManagerPublicKeyOrUnit()
470473 let hasPM = if (isDefined(pm))
471474 then true
472475 else throw("No pending manager")
473476 if ((hasPM == hasPM))
474477 then {
475478 let checkPM = if ((i.callerPublicKey == value(pm)))
476479 then true
477480 else throw("You are not pending manager")
478481 if ((checkPM == checkPM))
479482 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
480483 else throw("Strict value is not equal to itself.")
481484 }
482485 else throw("Strict value is not equal to itself.")
483486 }
484487
485488
486489
487490 @Callable(i)
488491 func setAdmins (adminPubKeys) = {
489492 let checkCaller = mustManager(i)
490493 if ((checkCaller == checkCaller))
491494 then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
492495 else throw("Strict value is not equal to itself.")
493496 }
494497
495498
496499
497500 @Callable(i)
498501 func activateNewPool (poolAddress,amountAssetStr,priceAssetStr,lpAssetName,lpAssetDescr,poolWeight,poolType,logo) = {
499502 let checkCaller = mustAdmin(i)
500503 if ((checkCaller == checkCaller))
501504 then if (isDefined(getString(keyMappingPoolContractAddressToPoolAssets(poolAddress))))
502505 then throw((("Pool address " + poolAddress) + " already registered."))
503506 else {
504507 let internalAmountAssetData = getInternalAssetIdOrCreate(amountAssetStr, 1)
505508 let internalAmountAssetId = internalAmountAssetData._1
506509 let internalPriceAssetData = getInternalAssetIdOrCreate(priceAssetStr, if (internalAmountAssetData._3)
507510 then 2
508511 else 1)
509512 let internalPriceAssetId = internalPriceAssetData._1
510513 let poolAccountScriptHash = valueOrErrorMessage(scriptHash(addressFromStringValue(poolAddress)), ("No script has been found on pool account " + poolAddress))
511514 let ethalonPoolAccountScriptHash = getBinaryValue(keyPoolScriptHash())
512515 let poolExists = poolExistsInternal(amountAssetStr, priceAssetStr)
513516 if (poolExists)
514517 then throw((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated."))
515518 else {
516519 let poolConfigValue = value(getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId))))
517520 let amountAssetsDecimals = if ((amountAssetStr == "WAVES"))
518521 then decimalsMultPrice
519522 else pow(10, 0, value(assetInfo(fromBase58String(amountAssetStr))).decimals, 0, 0, DOWN)
520523 let priceAssetsDecimals = if ((priceAssetStr == "WAVES"))
521524 then decimalsMultPrice
522525 else pow(10, 0, value(assetInfo(fromBase58String(priceAssetStr))).decimals, 0, 0, DOWN)
523526 let lpAssetIssueAction = Issue(lpAssetName, lpAssetDescr, 1, 8, true)
524527 let lpAssetId = calculateAssetId(lpAssetIssueAction)
525528 let lpAssetIdStr = toBase58String(lpAssetId)
526529 let poolActivateInvokeResult = invoke(addressFromStringValue(poolAddress), "activate", [amountAssetStr, priceAssetStr], nil)
527530 if ((poolActivateInvokeResult == poolActivateInvokeResult))
528531 then if ((poolActivateInvokeResult != "success"))
529532 then throw("Pool initialisation error happened.")
530533 else {
531534 let assetsStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract()))
532535 let createOrUpdateLpAssetInv = invoke(assetsStoreContract, "createOrUpdate", [lpAssetIdStr, lpAssetName, false], nil)
533536 if ((createOrUpdateLpAssetInv == createOrUpdateLpAssetInv))
534537 then {
535538 let addPoolsLpLabelInv = invoke(assetsStoreContract, "addLabel", [lpAssetIdStr, labelPoolsLp], nil)
536539 if ((addPoolsLpLabelInv == addPoolsLpLabelInv))
537540 then {
538541 let setLogoInv = invoke(assetsStoreContract, "setLogo", [lpAssetIdStr, logo], nil)
539542 if ((setLogoInv == setLogoInv))
540543 then {
541544 let addAssetsLinkInv = invoke(assetsStoreContract, "addAssetsLink", [amountAssetStr, priceAssetStr, lpAssetIdStr], nil)
542545 if ((addAssetsLinkInv == addAssetsLinkInv))
543546 then {
544547 let increaseAssetPoolsNumberInv = invoke(assetsStoreContract, "increaseAssetPoolsNumber", [amountAssetStr], nil)
545548 if ((increaseAssetPoolsNumberInv == increaseAssetPoolsNumberInv))
546549 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)
547550 else throw("Strict value is not equal to itself.")
548551 }
549552 else throw("Strict value is not equal to itself.")
550553 }
551554 else throw("Strict value is not equal to itself.")
552555 }
553556 else throw("Strict value is not equal to itself.")
554557 }
555558 else throw("Strict value is not equal to itself.")
556559 }
557560 else throw("Strict value is not equal to itself.")
558561 }
559562 }
560563 else throw("Strict value is not equal to itself.")
561564 }
562565
563566
564567
565568 @Callable(i)
566569 func managePool (poolAddress,newStatus) = {
567570 let checkCaller = mustManager(i)
568571 if ((checkCaller == checkCaller))
569572 then {
570573 let poolConfig = getPoolConfig(poolAddress)
571574 let poolStatus = poolConfig[idxPoolStatus]
572575 let lpAssetIdStr = poolConfig[idxPoolLPAssetId]
573576 let amountAssetStr = poolConfig[idxAmtAssetId]
574577 let priceAssetStr = poolConfig[idxPriceAssetId]
575578 let amountAssetsDecimals = parseIntValue(poolConfig[idxAmtAssetDcm])
576579 let priceAssetsDecimals = parseIntValue(poolConfig[idxPriceAssetDcm])
577580 let internalAmountAssetId = parseIntValue(poolConfig[idxIAmtAssetId])
578581 let internalPriceAssetId = parseIntValue(poolConfig[idxIPriceAssetId])
579582 let lpAssetDcm = parseIntValue(poolConfig[idxLPAssetDcm])
580583 let poolType = poolConfig[idxPoolType]
581584 [StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(newStatus), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, lpAssetDcm, poolType))]
582585 }
583586 else throw("Strict value is not equal to itself.")
584587 }
585588
586589
587590
588591 @Callable(i)
589592 func emit (amountToEmit) = {
590593 let caller = i.caller
591594 let originCaller = i.originCaller
592595 let lpAssetRequested = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
593596 let lpAsset = fromBase58String(lpAssetRequested)
594597 let legacyPools = split(valueOrElse(getString(keyLegacyPools()), EMPTY), SEP)
595598 let legacyFactoryContract = addressFromStringValue(valueOrErrorMessage(getString(keyLegacyFactoryContract()), "Legacy factory contract does not exists."))
596599 if ((0 >= amountToEmit))
597600 then nil
598601 else if (containsElement(legacyPools, toString(caller)))
599602 then $Tuple2(nil, legacyFactoryContract)
600603 else $Tuple2([Reissue(lpAsset, amountToEmit, true), ScriptTransfer(i.caller, amountToEmit, lpAsset)], "success")
601604 }
602605
603606
604607
605608 @Callable(i)
606609 func burn (amountToBurn) = {
607610 let caller = i.caller
608611 let originCaller = i.originCaller
609612 let payment = value(i.payments[0])
610613 let paymentAmount = value(payment.amount)
611614 let inAmountAssetId = toBase58String(value(payment.assetId))
612615 let lpAssetRequestedForBurning = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
613616 if ((inAmountAssetId != lpAssetRequestedForBurning))
614617 then throw("Invalid asset passed.")
615618 else if ((amountToBurn != paymentAmount))
616619 then throw("Invalid amount passed.")
617620 else {
618621 let lpAsset = fromBase58String(lpAssetRequestedForBurning)
619622 $Tuple2([Burn(lpAsset, amountToBurn)], "success")
620623 }
621624 }
622625
623626
624627
625628 @Callable(i)
626629 func modifyWeight (lpAssetId,share) = {
627630 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionContract()), "")))
628631 then true
629632 else mustManager(i)
630633 if ((checkCaller == checkCaller))
631634 then {
632635 let poolContractAddress = getStringOrFail(keyMappingPoolLPAssetToPoolContractAddress(lpAssetId))
633636 let poolWeightKey = keyPoolToWeight(poolContractAddress)
634637 let gwxWeightKey = keyPoolToWeight(GWXvirtualPOOL)
635638 let gwxWeight = valueOrElse(getInteger(gwxWeightKey), 0)
636639 let poolWeight = valueOrElse(getInteger(poolWeightKey), 0)
637640 let poolWeightNew = share
638641 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
639642 let stakingContract = getStakingAddressOrFail(factoryCfg)
640643 let onModifyWeightInv = invoke(stakingContract, "onModifyWeight", [lpAssetId, poolContractAddress], nil)
641644 if ((onModifyWeightInv == onModifyWeightInv))
642645 then {
643646 let gwxVirtualPoolActions = if ((gwxWeight == 0))
644647 then nil
645648 else [IntegerEntry(gwxWeightKey, 0)]
646649 let poolWeightHistoryKey = keyPoolToWeightHistory(poolContractAddress, 0)
647650 let poolWeightHistoryOrUnit = getInteger(poolWeightHistoryKey)
648651 let poolWeightHistoryActions = if ((poolWeightHistoryOrUnit == unit))
649652 then nil
650653 else [DeleteEntry(poolWeightHistoryKey)]
651654 (([IntegerEntry(poolWeightKey, poolWeightNew)] ++ gwxVirtualPoolActions) ++ poolWeightHistoryActions)
652655 }
653656 else throw("Strict value is not equal to itself.")
654657 }
655658 else throw("Strict value is not equal to itself.")
656659 }
657660
658661
659662
660663 @Callable(i)
661664 func modifyWeights (btcPoolAddress,ethPoolAddress,ethBtcPoolAddress,usdcUsdtPoolAddress) = {
662665 let checkCaller = mustManager(i)
663666 if ((checkCaller == checkCaller))
664667 then {
665668 let ethBtcWeightNew = ((5 * POOLWEIGHTMULT) / 100)
666669 let usdcUsdtWeightNew = ((5 * POOLWEIGHTMULT) / 100)
667670 let weightDecrement = ((5 * POOLWEIGHTMULT) / 100)
668671 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
669672 let stakingDapp = getStakingAddressOrFail(factoryCfg)
670673 let gwxRewardDapp = getGwxRewardAddressOrFail(factoryCfg)
671674 let btcWeightKEY = keyPoolToWeight(btcPoolAddress)
672675 let ethWeightKEY = keyPoolToWeight(ethPoolAddress)
673676 let ethBtcWeightKEY = keyPoolToWeight(ethBtcPoolAddress)
674677 let usdcUsdtWeightKEY = keyPoolToWeight(usdcUsdtPoolAddress)
675678 let btcWeight = getIntOrFail(btcWeightKEY)
676679 let ethWeight = getIntOrFail(ethWeightKEY)
677680 let btcWeightNew = (btcWeight - weightDecrement)
678681 let ethWeightNew = (ethWeight - weightDecrement)
679682 if ((0 >= btcWeightNew))
680683 then throw(("invalid btcWeightNew: " + toString(btcWeightNew)))
681684 else if ((0 >= ethWeightNew))
682685 then throw(("invalid ethWeightNew: " + toString(ethWeightNew)))
683686 else {
684687 let btcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(btcPoolAddress))
685688 let ethLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethPoolAddress))
686689 let ethBtcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethBtcPoolAddress))
687690 let usdcUsdtLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(usdcUsdtPoolAddress))
688691 let onModifyWeightBtc = invoke(stakingDapp, "onModifyWeight", [btcLpAssetIdStr, btcPoolAddress], nil)
689692 if ((onModifyWeightBtc == onModifyWeightBtc))
690693 then {
691694 let onModifyWeightEth = invoke(stakingDapp, "onModifyWeight", [ethLpAssetIdStr, ethPoolAddress], nil)
692695 if ((onModifyWeightEth == onModifyWeightEth))
693696 then {
694697 let onModifyWeightEthBtc = invoke(stakingDapp, "onModifyWeight", [ethBtcLpAssetIdStr, ethBtcPoolAddress], nil)
695698 if ((onModifyWeightEthBtc == onModifyWeightEthBtc))
696699 then {
697700 let onModifyWeightUsdcUsdt = invoke(stakingDapp, "onModifyWeight", [usdcUsdtLpAssetIdStr, usdcUsdtPoolAddress], nil)
698701 if ((onModifyWeightUsdcUsdt == onModifyWeightUsdcUsdt))
699702 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)]
700703 else throw("Strict value is not equal to itself.")
701704 }
702705 else throw("Strict value is not equal to itself.")
703706 }
704707 else throw("Strict value is not equal to itself.")
705708 }
706709 else throw("Strict value is not equal to itself.")
707710 }
708711 }
709712 else throw("Strict value is not equal to itself.")
710713 }
711714
712715
713716
714717 @Callable(i)
715718 func checkWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
716719 let haveLabel = match getBoolean(keyWxEmission(amountAssetId, priceAssetId)) {
717720 case b: Boolean =>
718721 b
719722 case _ =>
720723 false
721724 }
722725 $Tuple2(nil, haveLabel)
723726 }
724727
725728
726729
727730 @Callable(i)
728731 func setWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
729732 let checkCaller = mustAdmin(i)
730733 if ((checkCaller == checkCaller))
731734 then $Tuple2([BooleanEntry(keyWxEmission(amountAssetId, priceAssetId), true)], unit)
732735 else throw("Strict value is not equal to itself.")
733736 }
734737
735738
736739
737740 @Callable(i)
738741 func deleteWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
739742 let checkCaller = if (mustThis(i))
740743 then true
741744 else mustAdmin(i)
742745 if ((checkCaller == checkCaller))
743746 then $Tuple2([DeleteEntry(keyWxEmission(amountAssetId, priceAssetId))], unit)
744747 else throw("Strict value is not equal to itself.")
745748 }
746749
747750
748751
749752 @Callable(i)
750753 func onVerificationLoss (assetId) = {
751754 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyAssetsStoreContract()), "")))
752755 then true
753756 else mustManager(i)
754757 if ((checkCaller == checkCaller))
755758 then {
756759 let priceAssets = getPriceAssets()
757760 let checkPriceAssetsSize = if ((size(priceAssets) > 0))
758761 then true
759762 else throw("invalid price assets")
760763 if ((checkPriceAssetsSize == checkPriceAssetsSize))
761764 then {
762765 func cb (acc,priceAsset) = {
763766 let r = invoke(this, "deleteWxEmissionPoolLabel", [assetId, priceAsset], nil)
764767 if ((r == r))
765768 then unit
766769 else throw("Strict value is not equal to itself.")
767770 }
768771
769772 let actions = {
770773 let $l = priceAssets
771774 let $s = size($l)
772775 let $acc0 = unit
773776 func $f0_1 ($a,$i) = if (($i >= $s))
774777 then $a
775778 else cb($a, $l[$i])
776779
777780 func $f0_2 ($a,$i) = if (($i >= $s))
778781 then $a
779782 else throw("List size exceeds 2")
780783
781784 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
782785 }
783786 if ((actions == actions))
784787 then $Tuple2(nil, unit)
785788 else throw("Strict value is not equal to itself.")
786789 }
787790 else throw("Strict value is not equal to itself.")
788791 }
789792 else throw("Strict value is not equal to itself.")
790793 }
791794
792795
793796
794797 @Callable(i)
795798 func isPoolOneTokenOperationsDisabledREADONLY (poolAddress) = {
796799 let poolConfig = getPoolConfig(poolAddress)
797800 let assetsInternal = $Tuple2(parseIntValue(poolConfig[idxIAmtAssetId]), parseIntValue(poolConfig[idxIPriceAssetId]))
798801 let poolOneTokenOperationsDisabled = valueOrElse(getBoolean(keyPoolOneTokenOperationsDisabled(assetsInternal)), false)
799802 let allPoolsOneTokenOperationsDisabled = valueOrElse(getBoolean(keyAllPoolsOneTokenOperationsDisabled()), false)
800803 $Tuple2(nil, if (allPoolsOneTokenOperationsDisabled)
801804 then true
802805 else poolOneTokenOperationsDisabled)
803806 }
804807
805808
806809
807810 @Callable(i)
808811 func getInFeeREADONLY (poolAddress) = {
809812 let fee = intOrDefaultOrFallback(keyInFee(poolAddress), keyInFeeDefault(), 0)
810813 $Tuple2(nil, fee)
811814 }
812815
813816
814817
815818 @Callable(i)
816819 func getOutFeeREADONLY (poolAddress) = {
817820 let fee = intOrDefaultOrFallback(keyOutFee(poolAddress), keyOutFeeDefault(), fraction(10, MULT8, 10000))
818821 $Tuple2(nil, fee)
819822 }
820823
821824
822825
823826 @Callable(i)
824827 func poolInfoREADONLY (amountAssetIdStr,priceAssetIdStr) = {
825828 let amountAssetInternalIdOption = getInteger(this, keyMappingsBaseAsset2internalId(amountAssetIdStr))
826829 let priceAssetInternalIdOption = getInteger(this, keyMappingsBaseAsset2internalId(priceAssetIdStr))
827830 let poolContractAddressOption = getString(this, keyMappingPoolAssetsToPoolContractAddress(value(amountAssetInternalIdOption), value(priceAssetInternalIdOption)))
828831 let lpAssetIdOption = getString(this, keyMappingPoolContractToLPAsset(value(poolContractAddressOption)))
829832 let poolExists = if (if (isDefined(amountAssetInternalIdOption))
830833 then isDefined(priceAssetInternalIdOption)
831834 else false)
832835 then isDefined(poolContractAddressOption)
833836 else false
834837 let poolInfo = if (poolExists)
835838 then $Tuple2(addressFromStringValue(value(poolContractAddressOption)), parseAssetId(value(lpAssetIdOption)))
836839 else unit
837840 $Tuple2(nil, poolInfo)
838841 }
839842
840843
841844
842845 @Callable(i)
843846 func getPoolStatusREADONLY (poolAddress) = {
844847 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
845848 let amountAssetInternal = poolAssets[1]
846849 let priceAssetInternal = poolAssets[2]
847850 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
848851 $Tuple2(nil, parseIntValue(cfg[idxPoolStatus]))
849852 }
850853
851854
852855
853856 @Callable(i)
854857 func getPoolConfigREADONLY (poolAddress) = {
855858 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
856859 let amountAssetInternal = poolAssets[1]
857860 let priceAssetInternal = poolAssets[2]
858861 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
859862 $Tuple2(nil, cfg)
860863 }
861864
862865
863866
864867 @Callable(i)
865-func getPoolConfigByLpAssetIdREADONLY (lpAssetIdStr) = {
868+func getPoolConfigByLpAssetId (lpAssetIdStr) = {
866869 let poolAssets = split(getStringOrFail(keyMappingLpAssetToPoolAssets(lpAssetIdStr)), SEP)
867870 let amountAssetInternal = poolAssets[1]
868871 let priceAssetInternal = poolAssets[2]
869872 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
870873 $Tuple2(nil, cfg)
871874 }
872875
873876
874877
875878 @Callable(i)
876879 func poolExistsREADONLY (amountAssetId,priceAssetId) = $Tuple2(nil, poolExistsInternal(amountAssetId, priceAssetId))
880+
881+
882+
883+@Callable(i)
884+func skipOrderValidationREADONLY (poolAddress) = $Tuple2(nil, valueOrElse(getBoolean(keySkipOrderValidation(poolAddress)), false))
877885
878886
879887 @Verifier(tx)
880888 func verify () = {
881889 let targetPublicKey = match managerPublicKeyOrUnit() {
882890 case pk: ByteVector =>
883891 pk
884892 case _: Unit =>
885893 tx.senderPublicKey
886894 case _ =>
887895 throw("Match error")
888896 }
889897 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
890898 }
891899

github/deemru/w8io/3ef1775 
113.41 ms