tx · CBsJMtfca1ASq6C6nftddgzYuZ24BxZbrT6o3Z7jUqpH

3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai:  -0.02600000 Waves

2023.07.27 12:32 [2684077] smart account 3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai > SELF 0.00000000 Waves

{ "type": 13, "id": "CBsJMtfca1ASq6C6nftddgzYuZ24BxZbrT6o3Z7jUqpH", "fee": 2600000, "feeAssetId": null, "timestamp": 1690450362465, "version": 2, "chainId": 84, "sender": "3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai", "senderPublicKey": "2JEaBjtjvMoNGKZmL9QxYefa1VkMJM3vMW8rNvTs9R2H", "proofs": [ "2gbqPsGJqY9GwaTCtDUf66mbwd7UNtEH18tkhHb5TWAnzz8Y3VvpFtibgLTLMBN4GxXyWjtyzUppJArZ9TDYQbCx" ], "script": "base64:BgKiKwgCEgASBAoCCAgSBAoCCAgSAwoBCBIKCggICAgICAgIARIDCgEIEgYKBAgICAgSBAoCCBgSAwoBCBIECgIIGBIDCgEYEgoKCAgICAgIAQgIEgQKAggBEgMKAQESAwoBARIECgIIARIGCgQICAgIEgQKAggIEgQKAggIEgQKAggIEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBCBIECgIICBIDCgEIEgMKAQgSAwoBCBIECgIICBIDCgEIEgMKAQgSAwoBCCIGU0NBTEU4IgVNVUxUOCIGTVVMVDEyIgdTQ0FMRTE4IgZNVUxUMTgiDlBPT0xXRUlHSFRNVUxUIg5HV1h2aXJ0dWFsUE9PTCIMbGFiZWxQb29sc0xwIg1kZWZhdWx0U3ByZWFkIgt3YXZlc1N0cmluZyIRZGVjaW1hbHNNdWx0UHJpY2UiA1NFUCIFRU1QVFkiClBvb2xBY3RpdmUiD1Bvb2xQdXREaXNhYmxlZCITUG9vbE1hdGNoZXJEaXNhYmxlZCIMUG9vbFNodXRkb3duIhJpZHhJbnRlcm5hbEFzc2V0SWQiD2lkeFJlc3V0QWN0aW9ucyIgaWR4SWZBc3NldElkQ2FsY3VsYXRpb25QZXJmb3JtZWQiDmlkeFBvb2xBZGRyZXNzIg1pZHhQb29sU3RhdHVzIhBpZHhQb29sTFBBc3NldElkIg1pZHhBbXRBc3NldElkIg9pZHhQcmljZUFzc2V0SWQiDmlkeEFtdEFzc2V0RGNtIhBpZHhQcmljZUFzc2V0RGNtIg5pZHhJQW10QXNzZXRJZCIQaWR4SVByaWNlQXNzZXRJZCINaWR4TFBBc3NldERjbSILaWR4UG9vbFR5cGUiE3Bvb2xMYWJlbFd4RW1pc3Npb24iD3ZhbGlkUG9vbExhYmVscyIWa2V5QWxsb3dlZExwU2NyaXB0SGFzaCIca2V5QWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaCIMc3dhcENvbnRyYWN0IhBrZXlGYWN0b3J5Q29uZmlnIg9rZXlMcFRva2Vuc0xpc3QiEWtleVBvb2xTY3JpcHRIYXNoIg1rZXlNYXRjaGVyUHViIhhrZXlMZWdhY3lGYWN0b3J5Q29udHJhY3QiDmtleUxlZ2FjeVBvb2xzIhNrZXlNYW5hZ2VyUHVibGljS2V5IhZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzIg9rZXlBZG1pblB1YktleXMiFmtleUFzc2V0c1N0b3JlQ29udHJhY3QiGWtleVZvdGluZ0VtaXNzaW9uQ29udHJhY3QiDmtleVByaWNlQXNzZXRzIhBrZXlQcmljZURlY2ltYWxzIhNrZXlBbGxQb29sc1NodXRkb3duIhZrZXlOZXh0SW50ZXJuYWxBc3NldElkIg9rZXlQb29sVG9XZWlnaHQiC3Bvb2xBZGRyZXNzIhZrZXlQb29sVG9XZWlnaHRIaXN0b3J5IgNudW0iH2tleU1hcHBpbmdzSW50ZXJuYWwyYmFzZUFzc2V0SWQiEWludGVybmFsQmFzZUFzc2V0Ih9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkIgxiYXNlQXNzZXRTdHIiDWtleVBvb2xDb25maWciE2Ftb3VudEFzc2V0SW50ZXJuYWwiEnByaWNlQXNzZXRJbnRlcm5hbCIha2V5UG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIg5hc3NldHNJbnRlcm5hbCILJHQwMzY1ODM3MjAiJWtleUFsbFBvb2xzT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiHWtleU1hcHBpbmdMcEFzc2V0VG9Qb29sQXNzZXRzIgpscEFzc2V0U3RyIh1rZXlNYXBwaW5nUG9vbEFzc2V0c1RvTHBhc3NldCIYaW50ZXJuYWxBbW91bnRBc3NldElkU3RyIhdpbnRlcm5hbFByaWNlQXNzZXRJZFN0ciINa2V5UG9vbFNwcmVhZCIpa2V5TWFwcGluZ1Bvb2xDb250cmFjdEFkZHJlc3NUb1Bvb2xBc3NldHMiE3Bvb2xDb250cmFjdEFkZHJlc3MiKWtleU1hcHBpbmdQb29sQXNzZXRzVG9Qb29sQ29udHJhY3RBZGRyZXNzIh9rZXlNYXBwaW5nUG9vbENvbnRyYWN0VG9MUEFzc2V0IiprZXlNYXBwaW5nUG9vbExQQXNzZXRUb1Bvb2xDb250cmFjdEFkZHJlc3MiDWtleVd4RW1pc3Npb24iDWFtb3VudEFzc2V0SWQiDHByaWNlQXNzZXRJZCIIa2V5SW5GZWUiD2tleUluRmVlRGVmYXVsdCIKa2V5U3dhcEZlZSIJa2V5T3V0RmVlIhBrZXlPdXRGZWVEZWZhdWx0IhZrZXlTa2lwT3JkZXJWYWxpZGF0aW9uIhFrZXlDaGFuZ2VBbXBEZWxheSIRa2V5Q2hhbmdlQW1wRGVsdGEiEmtleUNoYW5nZUFtcFRhcmdldCIVa2V5U1dhdmVzUHJveHlBZGRyZXNzIhBrZXlTV2F2ZXNBc3NldElkIhdrZXlTdGFraW5nUHJvZml0QWRkcmVzcyIOa2V5TGVhc2VkUmF0aW8iB2Fzc2V0SWQiFWtleUxlYXNlZFJhdGlvRGVmYXVsdCIXa2V5TGVhc2VkUmF0aW9Ub2xlcmFuY2UiDWtleU1pbkJhbGFuY2UiFGtleU1pbkJhbGFuY2VEZWZhdWx0Ig9nZXRTdHJpbmdPckZhaWwiA2tleSIQZ2V0Qm9vbGVhbk9yRmFpbCIMZ2V0SW50T3JGYWlsIgxwYXJzZUFzc2V0SWQiBWlucHV0IhxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzIgckbWF0Y2gwIgFzIhhJZHhGYWN0b3J5Q2ZnU3Rha2luZ0RhcHAiGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHAiFElkeEZhY3RvcnlDZmdJZG9EYXBwIhVJZHhGYWN0b3J5Q2ZnVGVhbURhcHAiGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHAiFUlkeEZhY3RvcnlDZmdSZXN0RGFwcCIZSWR4RmFjdG9yeUNmZ1NsaXBwYWdlRGFwcCIUSWR4RmFjdG9yeUNmZ0Rhb0RhcHAiGklkeEZhY3RvcnlDZmdNYXJrZXRpbmdEYXBwIhpJZHhGYWN0b3J5Q2ZnR3d4UmV3YXJkRGFwcCIWSWR4RmFjdG9yeUNmZ0JpcmRzRGFwcCIYZ2V0Qm9vc3RpbmdBZGRyZXNzT3JGYWlsIgpmYWN0b3J5Q2ZnIhhnZXRFbWlzc2lvbkFkZHJlc3NPckZhaWwiF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsIhlnZXRHd3hSZXdhcmRBZGRyZXNzT3JGYWlsIg5nZXRQcmljZUFzc2V0cyIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCITbWFuYWdlclZhdWx0QWRkcmVzcyIVcGVybWlzc2lvbkRlbmllZEVycm9yIgl0ZXN0RXJyb3IiCG11c3RUaGlzIgFpIgttdXN0TWFuYWdlciICcGsiEGRhdGFGYWN0b3J5Q2ZnVjMiDnN0YWtpbmdBZGRyZXNzIg9ib29zdGluZ0FkZHJlc3MiC2lkb0NvbnRyYWN0Igx0ZWFtQ29udHJhY3QiEGVtaXNzaW9uQ29udHJhY3QiDHJlc3RDb250cmFjdCIQc2xpcHBhZ2VDb250cmFjdCILZGFvQ29udHJhY3QiEW1hcmtldGluZ0NvbnRyYWN0IhJnd3hSZXdhcmRzQ29udHJhY3QiDWJpcmRzQ29udHJhY3QiDmRhdGFGYWN0b3J5Q2ZnIgtkYXRhUG9vbENmZyIKcG9vbFN0YXR1cyIJbHBBc3NldElkIg5hbW91bnRBc3NldFN0ciINcHJpY2VBc3NldFN0ciITYW1vdW50QXNzZXREZWNpbWFscyIScHJpY2VBc3NldERlY2ltYWxzIhVhbW91bnRBc3NldEludGVybmFsSWQiFHByaWNlQXNzZXRJbnRlcm5hbElkIg9scEFzc2V0RGVjaW1hbHMiCHBvb2xUeXBlIhVkYXRhTWFwcGluZ1Bvb2xBc3NldHMiFmludGVybmFsQW1vdW50QXNzZXRTdHIiFWludGVybmFsUHJpY2VBc3NldFN0ciINZ2V0UG9vbENvbmZpZyIKcG9vbEFzc2V0cyIaZ2V0SW50ZXJuYWxBc3NldElkT3JDcmVhdGUiCmFzc2V0SWRTdHIiC2luY3JlbWVudG9yIg9pbnRlcm5hbEFzc2V0SWQiGGN1cnJlbnRJbmRleE9mSW50ZXJuYWxJZCIGcmVzdWx0IhJuZXdJbnRlcm5hbEFzc2V0SWQiCW11c3RBZG1pbiIIYWRtaW5QS3MiCWlzTWFuYWdlciIWaW50T3JEZWZhdWx0T3JGYWxsYmFjayIKa2V5RGVmYXVsdCINdmFsdWVGYWxsYmFjayIScG9vbEV4aXN0c0ludGVybmFsIgRhbUFzIgRwckFzIgNjZmciCmNmZ1JldmVyc2UiBmV4aXN0cyINJHQwMTQ0MDcxNDcxMSIBciIHJG1hdGNoMSICcmQiCmlzTGVhc2FibGUiC2xlYXNlZFJhdGlvIgptaW5CYWxhbmNlIgFiIgJiZCINJHQwMTQ5NzcxNTIwMSIMcHJveHlBZGRyZXNzIgxwcm94eUFzc2V0SWQiDHByb3h5UmF0ZU11bCIUc3Rha2luZ1Byb2ZpdEFkZHJlc3MiBmFzc2V0MSIGYXNzZXQyIglhc3NldE51bTEiCWFzc2V0TnVtMiICZWUiA3JlcyICbHAiD3N0YWtpbmdDb250cmFjdCIQYm9vc3RpbmdDb250cmFjdCIQc2xwaXBhZ2VDb250cmFjdCINcHJpY2VEZWNpbWFscyILY2hlY2tDYWxsZXIiEG1hdGhjaGVyUHViNThTdHIiCm1hdGhjZXJQdWIiFWxlZ2FjeUZhY3RvcnlDb250cmFjdCILbGVnYWN5UG9vbHMiE2Fzc2V0c1N0b3JlQ29udHJhY3QiFnZvdGluZ0VtaXNzaW9uQ29udHJhY3QiC3ByaWNlQXNzZXRzIgVjaGVrcyIMYWRtaW5QdWJLZXlzIgtscEFzc2V0TmFtZSIMbHBBc3NldERlc2NyIgpwb29sV2VpZ2h0IgRsb2dvIhdpbnRlcm5hbEFtb3VudEFzc2V0RGF0YSIVaW50ZXJuYWxBbW91bnRBc3NldElkIhZpbnRlcm5hbFByaWNlQXNzZXREYXRhIhRpbnRlcm5hbFByaWNlQXNzZXRJZCIVcG9vbEFjY291bnRTY3JpcHRIYXNoIhxldGhhbG9uUG9vbEFjY291bnRTY3JpcHRIYXNoIgpwb29sRXhpc3RzIg9wb29sQ29uZmlnVmFsdWUiFGFtb3VudEFzc2V0c0RlY2ltYWxzIhNwcmljZUFzc2V0c0RlY2ltYWxzIhJscEFzc2V0SXNzdWVBY3Rpb24iDGxwQXNzZXRJZFN0ciIYcG9vbEFjdGl2YXRlSW52b2tlUmVzdWx0IhhjcmVhdGVPclVwZGF0ZUxwQXNzZXRJbnYiEmFkZFBvb2xzTHBMYWJlbEludiIKc2V0TG9nb0ludiIQYWRkQXNzZXRzTGlua0ludiIbaW5jcmVhc2VBc3NldFBvb2xzTnVtYmVySW52IgluZXdTdGF0dXMiCnBvb2xDb25maWciCmxwQXNzZXREY20iDGFtb3VudFRvRW1pdCIGY2FsbGVyIgxvcmlnaW5DYWxsZXIiEGxwQXNzZXRSZXF1ZXN0ZWQiB2xwQXNzZXQiDGFtb3VudFRvQnVybiIHcGF5bWVudCINcGF5bWVudEFtb3VudCIPaW5BbW91bnRBc3NldElkIhpscEFzc2V0UmVxdWVzdGVkRm9yQnVybmluZyIFc2hhcmUiDXBvb2xXZWlnaHRLZXkiDGd3eFdlaWdodEtleSIJZ3d4V2VpZ2h0Ig1wb29sV2VpZ2h0TmV3IhFvbk1vZGlmeVdlaWdodEludiIVZ3d4VmlydHVhbFBvb2xBY3Rpb25zIhRwb29sV2VpZ2h0SGlzdG9yeUtleSIXcG9vbFdlaWdodEhpc3RvcnlPclVuaXQiGHBvb2xXZWlnaHRIaXN0b3J5QWN0aW9ucyIOYnRjUG9vbEFkZHJlc3MiDmV0aFBvb2xBZGRyZXNzIhFldGhCdGNQb29sQWRkcmVzcyITdXNkY1VzZHRQb29sQWRkcmVzcyIPZXRoQnRjV2VpZ2h0TmV3IhF1c2RjVXNkdFdlaWdodE5ldyIPd2VpZ2h0RGVjcmVtZW50IgtzdGFraW5nRGFwcCINZ3d4UmV3YXJkRGFwcCIMYnRjV2VpZ2h0S0VZIgxldGhXZWlnaHRLRVkiD2V0aEJ0Y1dlaWdodEtFWSIRdXNkY1VzZHRXZWlnaHRLRVkiCWJ0Y1dlaWdodCIJZXRoV2VpZ2h0IgxidGNXZWlnaHROZXciDGV0aFdlaWdodE5ldyIPYnRjTHBBc3NldElkU3RyIg9ldGhMcEFzc2V0SWRTdHIiEmV0aEJ0Y0xwQXNzZXRJZFN0ciIUdXNkY1VzZHRMcEFzc2V0SWRTdHIiEW9uTW9kaWZ5V2VpZ2h0QnRjIhFvbk1vZGlmeVdlaWdodEV0aCIUb25Nb2RpZnlXZWlnaHRFdGhCdGMiFm9uTW9kaWZ5V2VpZ2h0VXNkY1VzZHQiCWhhdmVMYWJlbCIUY2hlY2tQcmljZUFzc2V0c1NpemUiAmNiIgNhY2MiCnByaWNlQXNzZXQiB2FjdGlvbnMiAiRsIgIkcyIFJGFjYzAiBSRmMF8xIgIkYSICJGkiBSRmMF8yIh5wb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiImFsbFBvb2xzT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiA2ZlZSIOcG9vbEFkZHJlc3NTdHIiCWZlZU9wdGlvbiIFcGFydHMiB3Bvb2xGZWUiC3Byb3RvY29sRmVlIhBhbW91bnRBc3NldElkU3RyIg9wcmljZUFzc2V0SWRTdHIiG2Ftb3VudEFzc2V0SW50ZXJuYWxJZE9wdGlvbiIacHJpY2VBc3NldEludGVybmFsSWRPcHRpb24iGXBvb2xDb250cmFjdEFkZHJlc3NPcHRpb24iD2xwQXNzZXRJZE9wdGlvbiIIcG9vbEluZm8iBWRlbGF5IgVkZWx0YSIGdGFyZ2V0IgZ3ZWlnaHQiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleXYAAWEACAABYgCAwtcvAAFjAICglKWNHQABZAASAAFlCQC2AgEAgICQu7rWrfANAAFmBQFiAAFnAg5HV1h2aXJ0dWFsUE9PTAABaAIIUE9PTFNfTFAAAWkAgIl6AAFqAgVXQVZFUwABawkAaAIJAGgCAGQA6AcA6AcAAWwCAl9fAAFtAgAAAW4AAQABbwACAAFwAAMAAXEABAABcgABAAFzAAIAAXQAAwABdQABAAF2AAIAAXcAAwABeAAEAAF5AAUAAXoABgABQQAHAAFCAAgAAUMACQABRAAKAAFFAAsAAUYCC1dYX0VNSVNTSU9OAAFHCQDMCAIFAUYFA25pbAEBSAACFyVzX19hbGxvd2VkTHBTY3JpcHRIYXNoAQFJAAIdJXNfX2FsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2gBAUoAAhAlc19fc3dhcENvbnRyYWN0AQFLAAIRJXNfX2ZhY3RvcnlDb25maWcBAUwAAhAlc19fbHBUb2tlbnNMaXN0AQFNAAIWJXMlc19fcG9vbF9fc2NyaXB0SGFzaAEBTgACGCVzJXNfX21hdGNoZXJfX3B1YmxpY0tleQEBTwACGSVzX19sZWdhY3lGYWN0b3J5Q29udHJhY3QBAVAAAg8lc19fbGVnYWN5UG9vbHMBAVEAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBUgACFyVzX19tYW5hZ2VyVmF1bHRBZGRyZXNzAQFTAAIQJXNfX2FkbWluUHViS2V5cwEBVAACFyVzX19hc3NldHNTdG9yZUNvbnRyYWN0AQFVAAIaJXNfX3ZvdGluZ0VtaXNzaW9uQ29udHJhY3QBAVYACQC5CQIJAMwIAgICJXMJAMwIAgILcHJpY2VBc3NldHMFA25pbAUBbAEBVwACESVzX19wcmljZURlY2ltYWxzAQFYAAIMJXNfX3NodXRkb3duAQFZAAIXJXNfX25leHRJbnRlcm5hbEFzc2V0SWQBAVoBAmFhCQCsAgICEiVzJXNfX3Bvb2xXZWlnaHRfXwUCYWEBAmFiAgJhYQJhYwkArAICCQCsAgIJAKwCAgISJXMlc19fcG9vbFdlaWdodF9fBQJhYQICX18JAKQDAQUCYWMBAmFkAQJhZQkArAICAiglcyVzJWRfX21hcHBpbmdzX19pbnRlcm5hbDJiYXNlQXNzZXRJZF9fCQCkAwEFAmFlAQJhZgECYWcJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYWcBAmFoAgJhaQJhagkArAICCQCsAgIJAKwCAgkArAICAgglZCVkJXNfXwUCYWkCAl9fBQJhagIIX19jb25maWcBAmFrAQJhbAQCYW0FAmFsBAJhaQgFAmFtAl8xBAJhaggFAmFtAl8yCQC5CQIJAMwIAgIGJWQlZCVzCQDMCAIJAKQDAQUCYWkJAMwIAgkApAMBBQJhagkAzAgCAhpvbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAUDbmlsBQFsAQJhbgAJALkJAgkAzAgCAgIlcwkAzAgCAhpvbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAUDbmlsBQFsAQJhbwECYXAJAKwCAgkArAICAgglcyVzJXNfXwUCYXACGF9fbWFwcGluZ3NfX2xwQXNzZXQyUG9vbAECYXECAmFyAmFzCQCsAgIJAKwCAgkArAICCQCsAgICCiVkJWQlcyVzX18FAmFyAgJfXwUCYXMCHl9fbWFwcGluZ3NfX1Bvb2xBc3NldHMyTHBBc3NldAECYXQBAmFhCQCsAgICDiVzJXNfX3NwcmVhZF9fBQJhYQECYXUBAmF2CQCsAgIJAKwCAgIIJXMlcyVzX18FAmF2AiNfX21hcHBpbmdzX19wb29sQ29udHJhY3QyUG9vbEFzc2V0cwECYXcCAmFyAmFzCQCsAgIJAKwCAgkArAICCQCsAgICCiVkJWQlcyVzX18JAKQDAQUCYXICAl9fCQCkAwEFAmFzAiNfX21hcHBpbmdzX19wb29sQXNzZXRzMlBvb2xDb250cmFjdAECYXgBAmF2CQCsAgIJAKwCAgIIJXMlcyVzX18FAmF2AiBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAECYXkBAmFwCQCsAgIJAKwCAgIIJXMlcyVzX18FAmFwAiBfX21hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAECYXoCAmFBAmFCCQCsAgIJAKwCAgkArAICAhQlcyVzJXNfX3d4RW1pc3Npb25fXwUCYUECAl9fBQJhQgECYUMBAmFhCQCsAgICDSVzJXNfX2luRmVlX18FAmFhAQJhRAACECVzX19pbkZlZURlZmF1bHQBAmFFAQJhYQkArAICAg8lcyVzX19zd2FwRmVlX18FAmFhAQJhRgECYWEJAKwCAgIOJXMlc19fb3V0RmVlX18FAmFhAQJhRwACESVzX19vdXRGZWVEZWZhdWx0AQJhSAECYWEJAKwCAgIbJXMlc19fc2tpcE9yZGVyVmFsaWRhdGlvbl9fBQJhYQECYUkBAmFhCQCsAgICFiVzJXNfX2NoYW5nZUFtcERlbGF5X18FAmFhAQJhSgECYWEJAKwCAgIWJXMlc19fY2hhbmdlQW1wRGVsdGFfXwUCYWEBAmFLAQJhYQkArAICAhclcyVzX19jaGFuZ2VBbXBUYXJnZXRfXwUCYWEBAmFMAAIWJXNfX3NXYXZlc1Byb3h5QWRkcmVzcwECYU0AAhElc19fc1dhdmVzQXNzZXRJZAECYU4AAhglc19fc3Rha2luZ1Byb2ZpdEFkZHJlc3MBAmFPAgJhYQJhUAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtsZWFzZWRSYXRpbwkAzAgCBQJhYQkAzAgCBQJhUAUDbmlsBQFsAQJhUQECYVAJALkJAgkAzAgCAgQlcyVzCQDMCAICEmxlYXNlZFJhdGlvRGVmYXVsdAkAzAgCBQJhUAUDbmlsBQFsAQJhUgICYWECYVAJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIUbGVhc2VkUmF0aW9Ub2xlcmFuY2UJAMwIAgUCYWEJAMwIAgUCYVAFA25pbAUBbAECYVMCAmFhAmFQCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCm1pbkJhbGFuY2UJAMwIAgUCYWEJAMwIAgUCYVAFA25pbAUBbAECYVQBAmFQCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhFtaW5CYWxhbmNlRGVmYXVsdAkAzAgCBQJhUAUDbmlsBQFsAQJhVQECYVYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQJhVgkArAICAhVObyBkYXRhIGZvciB0aGlzLmtleT0FAmFWAQJhVwECYVYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmwgCBQR0aGlzBQJhVgkArAICAhVObyBkYXRhIGZvciB0aGlzLmtleT0FAmFWAQJhWAECYVYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQJhVgkArAICAhVObyBkYXRhIGZvciB0aGlzLmtleT0FAmFWAQJhWQECYVoDCQAAAgUCYVoFAWoFBHVuaXQJANkEAQUCYVoBAmJhAAQCYmIJAKIIAQkBAVIAAwkAAQIFAmJiAgZTdHJpbmcEAmJjBQJiYgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYmMFBHRoaXMAAmJkAAEAAmJlAAIAAmJmAAMAAmJnAAQAAmJoAAUAAmJpAAYAAmJqAAcAAmJrAAgAAmJsAAkAAmJtAAoAAmJuAAsBAmJvAQJicAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJicAUCYmUBAmJxAQJicAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJicAUCYmgBAmJyAQJicAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJicAUCYmQBAmJzAQJicAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJicAUCYm0BAmJ0AAQCYmIJAKIIAQkBAVYAAwkAAQIFAmJiAgZTdHJpbmcEAmJjBQJiYgMJAAACCQCxAgEFAmJjAAAFA25pbAkAvAkCBQJiYwUBbAUDbmlsAQJidQAEAmJ2CQECYmEABAJiYgkAnQgCBQJidgkBAVEAAwkAAQIFAmJiAgZTdHJpbmcEAmJjBQJiYgkA2QQBBQJiYwMJAAECBQJiYgIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAAJidwkAAgECEVBlcm1pc3Npb24gZGVuaWVkAAJieAkAAgECD1Rlc3QgZXJyb3IgaGVyZQECYnkBAmJ6AwkAAAIIBQJiegZjYWxsZXIFBHRoaXMGBQJidwECYkEBAmJ6BAJiYgkBAmJ1AAMJAAECBQJiYgIKQnl0ZVZlY3RvcgQCYkIFAmJiAwkAAAIIBQJieg9jYWxsZXJQdWJsaWNLZXkFAmJCBgUCYncDCQABAgUCYmICBFVuaXQJAQJieQEFAmJ6CQACAQILTWF0Y2ggZXJyb3IBAmJDCwJiRAJiRQJiRgJiRwJiSAJiSQJiSgJiSwJiTAJiTQJiTgkAuQkCCQDMCAICFiVzJXMlcyVzJXMlcyVzJXMlcyVzJXMJAMwIAgUCYkQJAMwIAgUCYkUJAMwIAgUCYkYJAMwIAgUCYkcJAMwIAgUCYkgJAMwIAgUCYkkJAMwIAgUCYkoJAMwIAgUCYksJAMwIAgUCYkwJAMwIAgUCYk0JAMwIAgUCYk4FA25pbAUBbAECYk8HAmJEAmJFAmJGAmJHAmJIAmJJAmJKCQC5CQIJAMwIAgIMJXMlcyVzJXMlcyVzCQDMCAIFAmJECQDMCAIFAmJFCQDMCAIFAmJGCQDMCAIFAmJHCQDMCAIFAmJICQDMCAIFAmJJCQDMCAIFAmJKBQNuaWwFAWwBAmJQCwJhYQJiUQJiUgJiUwJiVAJiVQJiVgJiVwJiWAJiWQJiWgkAuQkCCQDMCAICFiVzJWQlcyVzJXMlZCVkJWQlZCVkJXMJAMwIAgUCYWEJAMwIAgUCYlEJAMwIAgUCYlIJAMwIAgUCYlMJAMwIAgUCYlQJAMwIAgkApAMBBQJiVQkAzAgCCQCkAwEFAmJWCQDMCAIJAKQDAQUCYlcJAMwIAgkApAMBBQJiWAkAzAgCCQCkAwEFAmJZCQDMCAIFAmJaBQNuaWwFAWwBAmNhAgJjYgJjYwkAuQkCCQDMCAICBCVkJWQJAMwIAgkApAMBBQJjYgkAzAgCCQCkAwEFAmNjBQNuaWwFAWwBAmNkAQJhYQQCY2UJALUJAgkBAmFVAQkBAmF1AQUCYWEFAWwEAmFpCQCRAwIFAmNlAAEEAmFqCQCRAwIFAmNlAAIJALUJAgkBAmFVAQkBAmFoAgUCYWkFAmFqBQFsAQJjZgICY2cCY2gEAmNpCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQJhZgEFAmNnAAAEAmNqCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQFZAAAABAJjawMJAAACBQJjaQAABAJjbAkAZAIFAmNqBQJjaAkAlQoDBQJjbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVkABQJjbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFmAQUCY2cFAmNsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZAEFAmNsBQJjZwUDbmlsBgkAlQoDBQJjaQUDbmlsBwUCY2sBAmNtAQJiegQCY24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEBUwAFAW0FAWwDCQEPY29udGFpbnNFbGVtZW50AgUCY24JANgEAQgFAmJ6D2NhbGxlclB1YmxpY0tleQYEAmNvCQECYkEBBQJiegMJAAACBQJjbwUCY28GCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJjcAMCYVYCY3ECY3IJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYVYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCY3EFAmNyAQJjcwICYUECYUIEAmFpCQCfCAEJAQJhZgEFAmFBBAJhagkAnwgBCQECYWYBBQJhQgMDCQAAAgUCYWkFBHVuaXQGCQAAAgUCYWoFBHVuaXQHBAJjdAkApAMBCQEFdmFsdWUBBQJhaQQCY3UJAKQDAQkBBXZhbHVlAQUCYWoEAmN2CQCiCAEJAQJhaAIFAmN0BQJjdQQCY3cJAKIIAQkBAmFoAgUCY3UFAmN0BAJjeAMJAQIhPQIFAmN2BQR1bml0BgkBAiE9AgUCY3cFBHVuaXQFAmN4IQJiegEXZ2V0U3dhcENvbnRyYWN0UkVBRE9OTFkACQCUCgIFA25pbAkBAmFVAQkBAUoAAmJ6ARpnZXRQb29sTGVhc2VDb25maWdSRUFET05MWQICYWECYVAEAmN5BAJiYgkAmggCBQR0aGlzCQECYU8CBQJhYQUCYVADCQABAgUCYmICA0ludAQCY3oFAmJiCQCUCgIGCQCXAwEJAMwIAgBkCQDMCAIJAJYDAQkAzAgCAAAJAMwIAgUCY3oFA25pbAUDbmlsBAJjQQkAmggCBQR0aGlzCQECYVEBBQJhUAMJAAECBQJjQQIDSW50BAJjQgUCY0EJAJQKAgYJAJcDAQkAzAgCAGQJAMwIAgkAlgMBCQDMCAIAAAkAzAgCBQJjQgUDbmlsBQNuaWwJAJQKAgcAAAQCY0MIBQJjeQJfMQQCY0QIBQJjeQJfMgQCY0UEAmJiCQCaCAIFBHRoaXMJAQJhUwIFAmFhBQJhUAMJAAECBQJiYgIDSW50BAJjRgUCYmIJAJYDAQkAzAgCAAAJAMwIAgUCY0YFA25pbAQCY0EJAJoIAgUEdGhpcwkBAmFUAQUCYVADCQABAgUCY0ECA0ludAQCY0cFAmNBCQCWAwEJAMwIAgAACQDMCAIFAmNHBQNuaWwAAAQCY0gDCQAAAgUCYVACBVdBVkVTCQCVCgMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAmFMAAIACQCdCAIFBHRoaXMJAQt2YWx1ZU9yRWxzZQIJAQJhTQACAAUBYwkAlQoDAgACAAAABAJjSQgFAmNIAl8xBAJjSggFAmNIAl8yBAJjSwgFAmNIAl8zBAJjTAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQECYU4AAgAJAJQKAgUDbmlsCQCZCgcFAmNDBQJjRAUCY0UFAmNJBQJjSgUCY0sFAmNMAmJ6ASBnZXRMcEFzc2V0RnJvbVBvb2xBc3NldHNSRUFET05MWQICY00CY04DAwkAAAIFAmNNAiw4TFFXOGY3UDVkNVBaTTdHdFpFQmdhcVJQR1N6UzNEZlB1aVhyVVJKNEFKUwkAAAIFAmNOAgVXQVZFUwcJAJQKAgUDbmlsBQR1bml0BAJjTwkBBXZhbHVlAQkAmggCBQR0aGlzCQECYWYBBQJjTQQCY1AJAQV2YWx1ZQEJAJoIAgUEdGhpcwkBAmFmAQUCY04EAmNRCQCdCAIFBHRoaXMJAQJhcQIJAKQDAQUCY08JAKQDAQUCY1AEAmNSAwkAAAIFAmNRBQR1bml0BQR1bml0CQCwAgIJAQV2YWx1ZQEFAmNRAAQJAJQKAgUDbmlsBQJjUgJiegEhZ2V0UG9vbEFkZHJlc3NGcm9tTHBBc3NldFJFQURPTkxZAQJjUwkAlAoCBQNuaWwJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAmF5AQUCY1MCAAJiegELY29uc3RydWN0b3IIAmNUAmNVAmJGAmJHAmJIAmJJAmNWAmNXBAJjWAkBAmJBAQUCYnoDCQAAAgUCY1gFAmNYCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFLAAkBAmJPBwUCY1QFAmNVBQJiRgUCYkcFAmJIBQJiSQUCY1YJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFXAAUCY1cFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiegENY29uc3RydWN0b3JWMgECY1kEAmNYCQECYkEBBQJiegMJAAACBQJjWAUCY1gEAmNaCQCnCAEJANkEAQUCY1kDCQAAAgUCY1oFAmNaCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFOAAUCY1kFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiegENY29uc3RydWN0b3JWMwQCYksCYkwCYk0CYk4EAmNYCQECYkEBBQJiegMJAAACBQJjWAUCY1gEAmJwCQC1CQIJAQJhVQEJAQFLAAUBbAkAzAgCCQELU3RyaW5nRW50cnkCCQEBSwAJAQJiQwsJAJEDAgUCYnAAAQkAkQMCBQJicAACCQCRAwIFAmJwAAMJAJEDAgUCYnAABAkAkQMCBQJicAAFCQCRAwIFAmJwAAYJAJEDAgUCYnAABwUCYksFAmJMBQJiTQUCYk4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiegENY29uc3RydWN0b3JWNAICZGECZGIEAmNYCQECYkEBBQJiegMJAAACBQJjWAUCY1gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU8ABQJkYQkAzAgCCQELU3RyaW5nRW50cnkCCQEBUAAJALkJAgUCZGIFAWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiegENY29uc3RydWN0b3JWNQECZGMEAmNYCQECYkEBBQJiegMJAAACBQJjWAUCY1gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQABQJkYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJ6AQ1jb25zdHJ1Y3RvclY2AgJkZAJkZQQCZGYJAMwIAgkBAmJBAQUCYnoJAMwIAgMJAQIhPQIJAKYIAQUCZGQFBHVuaXQGAihpbnZhbGlkIHZvdGluZyBlbWlzc2lvbiBjb250cmFjdCBhZGRyZXNzBQNuaWwDCQAAAgUCZGYFAmRmCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAAUCZGQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVYACQC5CQIFAmRlBQFsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYnoBCXNldEFkbWlucwECZGcEAmNYCQECYkEBBQJiegMJAAACBQJjWAUCY1gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMACQC5CQIFAmRnBQFsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYnoBD2FjdGl2YXRlTmV3UG9vbAgCYWECYlMCYlQCZGgCZGkCZGoCYloCZGsEAmNYCQECY20BBQJiegMJAAACBQJjWAUCY1gDCQEJaXNEZWZpbmVkAQkAoggBCQECYXUBBQJhYQkAAgEJAKwCAgkArAICAg1Qb29sIGFkZHJlc3MgBQJhYQIUIGFscmVhZHkgcmVnaXN0ZXJlZC4EAmRsCQECY2YCBQJiUwABBAJkbQgFAmRsAl8xBAJkbgkBAmNmAgUCYlQDCAUCZGwCXzMAAgABBAJkbwgFAmRuAl8xBAJkcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDxBwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmFhCQCsAgICKU5vIHNjcmlwdCBoYXMgYmVlbiBmb3VuZCBvbiBwb29sIGFjY291bnQgBQJhYQQCZHEJARFAZXh0ck5hdGl2ZSgxMDU3KQEJAQFNAAQCZHIJAQJjcwIFAmJTBQJiVAMFAmRyCQACAQkArAICCQCsAgIJAKwCAgkArAICAgVQb29sIAUCYlMCAS8FAmJUAhwgaGFzIGFscmVhZHkgYmVlbiBhY3RpdmF0ZWQuBAJkcwkBBXZhbHVlAQkAnQgCBQR0aGlzCQECYWgCCQCkAwEFAmRtCQCkAwEFAmRvBAJkdAMJAAACBQJiUwIFV0FWRVMFAWsJAGwGAAoAAAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQJiUwhkZWNpbWFscwAAAAAFBERPV04EAmR1AwkAAAIFAmJUAgVXQVZFUwUBawkAbAYACgAACAkBBXZhbHVlAQkA7AcBCQDZBAEFAmJUCGRlY2ltYWxzAAAAAAUERE9XTgQCZHYJAMIIBQUCZGgFAmRpAAEACAYEAmJSCQC4CAEFAmR2BAJkdwkA2AQBBQJiUgQCZHgJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYWECCGFjdGl2YXRlCQDMCAIFAmJTCQDMCAIFAmJUBQNuaWwFA25pbAMJAAACBQJkeAUCZHgDCQECIT0CBQJkeAIHc3VjY2VzcwkAAgECI1Bvb2wgaW5pdGlhbGlzYXRpb24gZXJyb3IgaGFwcGVuZWQuBAJkYwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFVAQkBAVQABAJkeQkA/AcEBQJkYwIOY3JlYXRlT3JVcGRhdGUJAMwIAgUCZHcJAMwIAgUCZGgJAMwIAgcFA25pbAUDbmlsAwkAAAIFAmR5BQJkeQQCZHoJAPwHBAUCZGMCCGFkZExhYmVsCQDMCAIFAmR3CQDMCAIFAWgFA25pbAUDbmlsAwkAAAIFAmR6BQJkegQCZEEJAPwHBAUCZGMCB3NldExvZ28JAMwIAgUCZHcJAMwIAgUCZGsFA25pbAUDbmlsAwkAAAIFAmRBBQJkQQQCZEIJAPwHBAUCZGMCDWFkZEFzc2V0c0xpbmsJAMwIAgUCYlMJAMwIAgUCYlQJAMwIAgUCZHcFA25pbAUDbmlsAwkAAAIFAmRCBQJkQgQCZEMJAPwHBAUCZGMCGGluY3JlYXNlQXNzZXRQb29sc051bWJlcgkAzAgCBQJiUwUDbmlsBQNuaWwDCQAAAgUCZEMFAmRDCQCUCgIJAM4IAgkAzggCCAUCZGwCXzIIBQJkbgJfMgkAzAgCBQJkdgkAzAgCCQEEQnVybgIFAmJSAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFoAgkApAMBBQJkbQkApAMBBQJkbwkBAmJQCwUCYWEJAKQDAQUBbgUCZHcFAmJTBQJiVAUCZHQFAmR1BQJkbQUCZG8FAWsFAmJaCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhbwEFAmR3CQECY2ECBQJkbQUCZG8JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFxAgkApAMBBQJkbQkApAMBBQJkbwkArAICAgQlc19fBQJkdwkAzAgCCQELU3RyaW5nRW50cnkCCQECYXUBBQJhYQkBAmNhAgUCZG0FAmRvCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhdwIFAmRtBQJkbwUCYWEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF5AQUCZHcFAmFhCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJheAEFAmFhBQJkdwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVoBBQJhYQUCZGoJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhdAEFAmFhBQFpBQNuaWwFAmR3CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJ6AQptYW5hZ2VQb29sAgJhYQJkRAQCY1gJAQJiQQEFAmJ6AwkAAAIFAmNYBQJjWAQCZEUJAQJjZAEFAmFhBAJiUQkAkQMCBQJkRQUBdgQCZHcJAJEDAgUCZEUFAXcEAmJTCQCRAwIFAmRFBQF4BAJiVAkAkQMCBQJkRQUBeQQCZHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkRQUBegQCZHUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkRQUBQQQCZG0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkRQUBQgQCZG8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkRQUBQwQCZEYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkRQUBRAQCYloJAJEDAgUCZEUFAUUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFoAgkApAMBBQJkbQkApAMBBQJkbwkBAmJQCwUCYWEJAKQDAQUCZEQFAmR3BQJiUwUCYlQFAmR0BQJkdQUCZG0FAmRvBQJkRgUCYloFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiegEEZW1pdAECZEcEAmRICAUCYnoGY2FsbGVyBAJkSQgFAmJ6DG9yaWdpbkNhbGxlcgQCZEoJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQECYXgBCQClCAEFAmRIAh1JbnZhbGlkIExQIGFkZHJlc3MgY2FsbGVkIG1lLgQCZEsJANkEAQUCZEoEAmRiCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBAVAABQFtBQFsBAJkYQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAQFPAAIoTGVnYWN5IGZhY3RvcnkgY29udHJhY3QgZG9lcyBub3QgZXhpc3RzLgMJAGcCAAAFAmRHBQNuaWwDCQEPY29udGFpbnNFbGVtZW50AgUCZGIJAKUIAQUCZEgJAJQKAgUDbmlsBQJkYQkAlAoCCQDMCAIJAQdSZWlzc3VlAwUCZEsFAmRHBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCYnoGY2FsbGVyBQJkRwUCZEsFA25pbAIHc3VjY2VzcwJiegEEYnVybgECZEwEAmRICAUCYnoGY2FsbGVyBAJkSQgFAmJ6DG9yaWdpbkNhbGxlcgQCZE0JAQV2YWx1ZQEJAJEDAggFAmJ6CHBheW1lbnRzAAAEAmROCQEFdmFsdWUBCAUCZE0GYW1vdW50BAJkTwkA2AQBCQEFdmFsdWUBCAUCZE0HYXNzZXRJZAQCZFAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQECYXgBCQClCAEFAmRIAh1JbnZhbGlkIExQIGFkZHJlc3MgY2FsbGVkIG1lLgMJAQIhPQIFAmRPBQJkUAkAAgECFUludmFsaWQgYXNzZXQgcGFzc2VkLgMJAQIhPQIFAmRMBQJkTgkAAgECFkludmFsaWQgYW1vdW50IHBhc3NlZC4EAmRLCQDZBAEFAmRQCQCUCgIJAMwIAgkBBEJ1cm4CBQJkSwUCZEwFA25pbAIHc3VjY2VzcwJiegEMbW9kaWZ5V2VpZ2h0AgJiUgJkUQQCY1gDCQAAAgkA2AQBCAgFAmJ6BmNhbGxlcgVieXRlcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEBVQACAAYJAQJiQQEFAmJ6AwkAAAIFAmNYBQJjWAQCYXYJAQJhVQEJAQJheQEFAmJSBAJkUgkBAVoBBQJhdgQCZFMJAQFaAQUBZwQCZFQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUCZFMAAAQCZGoJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUCZFIAAAQCZFUFAmRRBAJicAkAtQkCCQECYVUBCQEBSwAFAWwEAmNUCQECYnIBBQJicAQCZFYJAPwHBAUCY1QCDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmJSCQDMCAIFAmF2BQNuaWwFA25pbAMJAAACBQJkVgUCZFYEAmRXAwkAAAIFAmRUAAAFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZFMAAAUDbmlsBAJkWAkBAmFiAgUCYXYAAAQCZFkJAJ8IAQUCZFgEAmRaAwkAAAIFAmRZBQR1bml0BQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQUCZFgFA25pbAkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmRSBQJkVQUDbmlsBQJkVwUCZFoJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYnoBDW1vZGlmeVdlaWdodHMEAmVhAmViAmVjAmVkBAJjWAkBAmJBAQUCYnoDCQAAAgUCY1gFAmNYBAJlZQkAaQIJAGgCAAUFAWYAZAQCZWYJAGkCCQBoAgAFBQFmAGQEAmVnCQBpAgkAaAIABQUBZgBkBAJicAkAtQkCCQECYVUBCQEBSwAFAWwEAmVoCQECYnIBBQJicAQCZWkJAQJicwEFAmJwBAJlagkBAVoBBQJlYQQCZWsJAQFaAQUCZWIEAmVsCQEBWgEFAmVjBAJlbQkBAVoBBQJlZAQCZW4JAQJhWAEFAmVqBAJlbwkBAmFYAQUCZWsEAmVwCQBlAgUCZW4FAmVnBAJlcQkAZQIFAmVvBQJlZwMJAGcCAAAFAmVwCQACAQkArAICAhZpbnZhbGlkIGJ0Y1dlaWdodE5ldzogCQCkAwEFAmVwAwkAZwIAAAUCZXEJAAIBCQCsAgICFmludmFsaWQgZXRoV2VpZ2h0TmV3OiAJAKQDAQUCZXEEAmVyCQECYVUBCQECYXgBBQJlYQQCZXMJAQJhVQEJAQJheAEFAmViBAJldAkBAmFVAQkBAmF4AQUCZWMEAmV1CQECYVUBCQECYXgBBQJlZAQCZXYJAPwHBAUCZWgCDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmVyCQDMCAIFAmVhBQNuaWwFA25pbAMJAAACBQJldgUCZXYEAmV3CQD8BwQFAmVoAg5vbk1vZGlmeVdlaWdodAkAzAgCBQJlcwkAzAgCBQJlYgUDbmlsBQNuaWwDCQAAAgUCZXcFAmV3BAJleAkA/AcEBQJlaAIOb25Nb2RpZnlXZWlnaHQJAMwIAgUCZXQJAMwIAgUCZWMFA25pbAUDbmlsAwkAAAIFAmV4BQJleAQCZXkJAPwHBAUCZWgCDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmV1CQDMCAIFAmVkBQNuaWwFA25pbAMJAAACBQJleQUCZXkJAMwIAgkBDEludGVnZXJFbnRyeQIFAmVqBQJlcAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZWsFAmVxCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJlbAUCZWUJAMwIAgkBDEludGVnZXJFbnRyeQIFAmVtBQJlZgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFiAgUCZWEAAAUCZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYgIFAmViAAAFAmVvCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWICBQJlYwAABQJlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFiAgUCZWQAAAUCZWYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiegEYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsAgJhQQJhQgQCZXoEAmJiCQCgCAEJAQJhegIFAmFBBQJhQgMJAAECBQJiYgIHQm9vbGVhbgQCY0YFAmJiBQJjRgcJAJQKAgUDbmlsBQJlegJiegEWc2V0V3hFbWlzc2lvblBvb2xMYWJlbAICYUECYUIEAmNYCQECY20BBQJiegMJAAACBQJjWAUCY1gJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAmF6AgUCYUEFAmFCBgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJ6ARlkZWxldGVXeEVtaXNzaW9uUG9vbExhYmVsAgJhQQJhQgQCY1gDCQAAAggFAmJ6BmNhbGxlcgUEdGhpcwYJAQJjbQEFAmJ6AwkAAAIFAmNYBQJjWAkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhegIFAmFBBQJhQgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJ6ARJvblZlcmlmaWNhdGlvbkxvc3MBAmFQBAJjWAMJAAACCQDYBAEICAUCYnoGY2FsbGVyBWJ5dGVzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQFUAAIABgkBAmJBAQUCYnoDCQAAAgUCY1gFAmNYBAJkZQkBAmJ0AAQCZUEDCQBmAgkAkAMBBQJkZQAABgkAAgECFGludmFsaWQgcHJpY2UgYXNzZXRzAwkAAAIFAmVBBQJlQQoBAmVCAgJlQwJlRAQCY3oJAPwHBAUEdGhpcwIZZGVsZXRlV3hFbWlzc2lvblBvb2xMYWJlbAkAzAgCBQJhUAkAzAgCBQJlRAUDbmlsBQNuaWwDCQAAAgUCY3oFAmN6BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJlRQoAAmVGBQJkZQoAAmVHCQCQAwEFAmVGCgACZUgFBHVuaXQKAQJlSQICZUoCZUsDCQBnAgUCZUsFAmVHBQJlSgkBAmVCAgUCZUoJAJEDAgUCZUYFAmVLCgECZUwCAmVKAmVLAwkAZwIFAmVLBQJlRwUCZUoJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMwkBAmVMAgkBAmVJAgkBAmVJAgkBAmVJAgkBAmVJAgkBAmVJAgkBAmVJAgkBAmVJAgkBAmVJAgkBAmVJAgkBAmVJAgkBAmVJAgkBAmVJAgkBAmVJAgUCZUgAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAwkAAAIFAmVFBQJlRQkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYnoBKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkBAmFhBAJkRQkBAmNkAQUCYWEEAmFsCQCUCgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkRQUBQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmRFBQFDBAJlTQkBC3ZhbHVlT3JFbHNlAgkAoAgBCQECYWsBBQJhbAcEAmVOCQELdmFsdWVPckVsc2UCCQCgCAEJAQJhbgAHCQCUCgIFA25pbAMFAmVOBgUCZU0CYnoBEGdldEluRmVlUkVBRE9OTFkBAmFhBAJlTwkBAmNwAwkBAmFDAQUCYWEJAQJhRAAAAAkAlAoCBQNuaWwFAmVPAmJ6ARFnZXRPdXRGZWVSRUFET05MWQECYWEEAmVPCQECY3ADCQECYUYBBQJhYQkBAmFHAAkAawMACgUBYgCQTgkAlAoCBQNuaWwFAmVPAmJ6ARJnZXRTd2FwRmVlUkVBRE9OTFkBAmVQBAJlUQQCYmIJAJ0IAgUEdGhpcwkBAmFFAQUCZVADCQABAgUCYmICBlN0cmluZwQCYmMFAmJiBAJlUgkAtQkCBQJiYwUBbAQCZVMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJlUgABBAJlVAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVSAAIJAJQKAgUCZVMFAmVUAwkAAQIFAmJiAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IJAJQKAgUDbmlsBQJlUQJiegEQcG9vbEluZm9SRUFET05MWQICZVUCZVYEAmVXCQCaCAIFBHRoaXMJAQJhZgEFAmVVBAJlWAkAmggCBQR0aGlzCQECYWYBBQJlVgQCZVkJAJ0IAgUEdGhpcwkBAmF3AgkBBXZhbHVlAQUCZVcJAQV2YWx1ZQEFAmVYBAJlWgkAnQgCBQR0aGlzCQECYXgBCQEFdmFsdWUBBQJlWQQCZHIDAwkBCWlzRGVmaW5lZAEFAmVXCQEJaXNEZWZpbmVkAQUCZVgHCQEJaXNEZWZpbmVkAQUCZVkHBAJmYQMFAmRyCQCUCgIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFAmVZCQECYVkBCQEFdmFsdWUBBQJlWgUEdW5pdAkAlAoCBQNuaWwFAmZhAmJ6ARVnZXRQb29sU3RhdHVzUkVBRE9OTFkBAmFhBAJjZQkAtQkCCQECYVUBCQECYXUBBQJhYQUBbAQCYWkJAJEDAgUCY2UAAQQCYWoJAJEDAgUCY2UAAgQCY3YJALUJAgkBAmFVAQkBAmFoAgUCYWkFAmFqBQFsCQCUCgIFA25pbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmN2BQF2AmJ6ARVnZXRQb29sQ29uZmlnUkVBRE9OTFkBAmFhBAJjZQkAtQkCCQECYVUBCQECYXUBBQJhYQUBbAQCYWkJAJEDAgUCY2UAAQQCYWoJAJEDAgUCY2UAAgQCY3YJALUJAgkBAmFVAQkBAmFoAgUCYWkFAmFqBQFsCQCUCgIFA25pbAUCY3YCYnoBIGdldFBvb2xDb25maWdCeUxwQXNzZXRJZFJFQURPTkxZAQJkdwQCY2UJALUJAgkBAmFVAQkBAmFvAQUCZHcFAWwEAmFpCQCRAwIFAmNlAAEEAmFqCQCRAwIFAmNlAAIEAmN2CQC1CQIJAQJhVQEJAQJhaAIFAmFpBQJhagUBbAkAlAoCBQNuaWwFAmN2AmJ6ARJwb29sRXhpc3RzUkVBRE9OTFkCAmFBAmFCCQCUCgIFA25pbAkBAmNzAgUCYUEFAmFCAmJ6ARtza2lwT3JkZXJWYWxpZGF0aW9uUkVBRE9OTFkBAmFhCQCUCgIFA25pbAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQECYUgBBQJhYQcCYnoBGmdldENoYW5nZUFtcENvbmZpZ1JFQURPTkxZAQJhYQQCZmIJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQJhSQEFAmFhBAJmYwkBEUBleHRyTmF0aXZlKDEwNTUpAQkBAmFKAQUCYWEEAmZkCQERQGV4dHJOYXRpdmUoMTA1NSkBCQECYUsBBQJhYQkAlAoCBQNuaWwJAMwIAgUCZmIJAMwIAgUCZmMJAMwIAgUCZmQFA25pbAJiegEVZ2V0UG9vbFdlaWdodFJFQURPTkxZAQJiUgQCYWEJAQJhVQEJAQJheQEFAmJSBAJmZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBWgEFAmFhAAAJAJQKAgUDbmlsBQJmZQECZmYBAmZnAAQCZmgEAmJiCQECYnUAAwkAAQIFAmJiAgpCeXRlVmVjdG9yBAJiQgUCYmIFAmJCAwkAAQIFAmJiAgRVbml0CAUCZmYPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAmZmCWJvZHlCeXRlcwkAkQMCCAUCZmYGcHJvb2ZzAAAFAmZoDoVkTQ==", "height": 2684077, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Fw6T22x2kMq44ar2UAF6WnJTV2zdZJp61J3dAScAidbG Next: 5t4tRB83cdfbUHn6pyHJJYCdmjTAZMaGxGXjxNYaGvWM Diff:
OldNewDifferences
2020 let defaultSpread = 2000000
2121
2222 let wavesString = "WAVES"
23-
24-let contractFilename = "factory_v2.ride"
2523
2624 let decimalsMultPrice = ((100 * 1000) * 1000)
2725
6967
7068 let validPoolLabels = [poolLabelWxEmission]
7169
72-func wrapErr (msg) = makeString([contractFilename, ": ", msg], "")
73-
74-
75-func throwErr (msg) = throw(wrapErr(msg))
76-
77-
7870 func keyAllowedLpScriptHash () = "%s__allowedLpScriptHash"
7971
8072
117109 func keyVotingEmissionContract () = "%s__votingEmissionContract"
118110
119111
120-func keyUserPoolsContract () = "%s__userPoolsContract"
121-
122-
123112 func keyPriceAssets () = makeString(["%s", "priceAssets"], SEP)
124113
125114
148137
149138
150139 func keyPoolOneTokenOperationsDisabled (assetsInternal) = {
151- let $t038783940 = assetsInternal
152- let amountAssetInternal = $t038783940._1
153- let priceAssetInternal = $t038783940._2
140+ let $t036583720 = assetsInternal
141+ let amountAssetInternal = $t036583720._1
142+ let priceAssetInternal = $t036583720._2
154143 makeString(["%d%d%s", toString(amountAssetInternal), toString(priceAssetInternal), "oneTokenOperationsDisabled"], SEP)
155144 }
156145
312301 }
313302
314303
315-let permissionDeniedError = throwErr("Permission denied")
304+let permissionDeniedError = throw("Permission denied")
316305
317-let testError = throwErr("Test error here")
306+let testError = throw("Test error here")
318307
319308 func mustThis (i) = if ((i.caller == this))
320309 then true
402391 }
403392
404393
405-func getAssetsDataFromPoolAddress (poolContractAddress) = {
406- let poolAssets = match getString(keyMappingPoolContractAddressToPoolAssets(poolContractAddress)) {
407- case s: String =>
408- split(s, SEP)
409- case _ =>
410- throwErr(makeString([poolContractAddress, "pool is not found"], " "))
411- }
412- let amountAssetInternal = parseIntValue(poolAssets[1])
413- let priceAssetInternal = parseIntValue(poolAssets[2])
414- let amountAssetId = getStringValue(keyMappingsInternal2baseAssetId(amountAssetInternal))
415- let priceAssetId = getStringValue(keyMappingsInternal2baseAssetId(priceAssetInternal))
416- let lpAssetId = getStringValue(keyMappingPoolContractToLPAsset(poolContractAddress))
417- $Tuple5(amountAssetId, priceAssetId, lpAssetId, amountAssetInternal, priceAssetInternal)
418- }
419-
420-
421-func getPoolCreator (poolContractAddress) = {
422- let $t01526915406 = getAssetsDataFromPoolAddress(poolContractAddress)
423- let amountAssetId = $t01526915406._1
424- let priceAssetId = $t01526915406._2
425- let lpAssetId = $t01526915406._3
426- let amountAssetInternal = $t01526915406._4
427- let priceAssetInternal = $t01526915406._5
428- let userPoolsContract = addressFromStringValue(getStringValue(keyUserPoolsContract()))
429- let poolCreator = invoke(userPoolsContract, "getPoolCreatorREADONLY", [amountAssetId, priceAssetId], nil)
430- poolCreator
431- }
432-
433-
434-func getAddressBalance (addressString,assetIdString) = {
435- let address = addressFromStringValue(addressString)
436- if ((assetIdString == "WAVES"))
437- then wavesBalance(address).regular
438- else {
439- let assetId = fromBase58String(assetIdString)
440- assetBalance(address, assetId)
441- }
442- }
443-
444-
445-func isPoolEmpty (poolContractAddress) = {
446- let $t01598116118 = getAssetsDataFromPoolAddress(poolContractAddress)
447- let amountAssetId = $t01598116118._1
448- let priceAssetId = $t01598116118._2
449- let lpAssetId = $t01598116118._3
450- let amountAssetInternal = $t01598116118._4
451- let priceAssetInternal = $t01598116118._5
452- if ((getAddressBalance(poolContractAddress, amountAssetId) == 0))
453- then (getAddressBalance(poolContractAddress, priceAssetId) == 0)
454- else false
455- }
456-
457-
458394 @Callable(i)
459395 func getSwapContractREADONLY () = $Tuple2(nil, getStringOrFail(swapContract()))
460396
462398
463399 @Callable(i)
464400 func getPoolLeaseConfigREADONLY (poolAddress,assetId) = {
465- let $t01643316737 = match getInteger(this, keyLeasedRatio(poolAddress, assetId)) {
401+ let $t01440714711 = match getInteger(this, keyLeasedRatio(poolAddress, assetId)) {
466402 case r: Int =>
467403 $Tuple2(true, min([100, max([0, r])]))
468404 case _ =>
473409 $Tuple2(false, 0)
474410 }
475411 }
476- let isLeasable = $t01643316737._1
477- let leasedRatio = $t01643316737._2
412+ let isLeasable = $t01440714711._1
413+ let leasedRatio = $t01440714711._2
478414 let minBalance = match getInteger(this, keyMinBalance(poolAddress, assetId)) {
479415 case b: Int =>
480416 max([0, b])
486422 0
487423 }
488424 }
489- let $t01700317227 = if ((assetId == "WAVES"))
425+ let $t01497715201 = if ((assetId == "WAVES"))
490426 then $Tuple3(valueOrElse(getString(this, keySWavesProxyAddress()), ""), getString(this, valueOrElse(keySWavesAssetId(), "")), MULT12)
491427 else $Tuple3("", "", 0)
492- let proxyAddress = $t01700317227._1
493- let proxyAssetId = $t01700317227._2
494- let proxyRateMul = $t01700317227._3
428+ let proxyAddress = $t01497715201._1
429+ let proxyAssetId = $t01497715201._2
430+ let proxyRateMul = $t01497715201._3
495431 let stakingProfitAddress = valueOrElse(getString(this, keyStakingProfitAddress()), "")
496432 $Tuple2(nil, $Tuple7(isLeasable, leasedRatio, minBalance, proxyAddress, proxyAssetId, proxyRateMul, stakingProfitAddress))
497433 }
605541 let checkCaller = mustAdmin(i)
606542 if ((checkCaller == checkCaller))
607543 then if (isDefined(getString(keyMappingPoolContractAddressToPoolAssets(poolAddress))))
608- then throwErr((("Pool address " + poolAddress) + " already registered."))
544+ then throw((("Pool address " + poolAddress) + " already registered."))
609545 else {
610546 let internalAmountAssetData = getInternalAssetIdOrCreate(amountAssetStr, 1)
611547 let internalAmountAssetId = internalAmountAssetData._1
617553 let ethalonPoolAccountScriptHash = getBinaryValue(keyPoolScriptHash())
618554 let poolExists = poolExistsInternal(amountAssetStr, priceAssetStr)
619555 if (poolExists)
620- then throwErr((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated."))
556+ then throw((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated."))
621557 else {
622558 let poolConfigValue = value(getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId))))
623559 let amountAssetsDecimals = if ((amountAssetStr == "WAVES"))
632568 let poolActivateInvokeResult = invoke(addressFromStringValue(poolAddress), "activate", [amountAssetStr, priceAssetStr], nil)
633569 if ((poolActivateInvokeResult == poolActivateInvokeResult))
634570 then if ((poolActivateInvokeResult != "success"))
635- then throwErr("Pool initialisation error happened.")
571+ then throw("Pool initialisation error happened.")
636572 else {
637573 let assetsStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract()))
638574 let createOrUpdateLpAssetInv = invoke(assetsStoreContract, "createOrUpdate", [lpAssetIdStr, lpAssetName, false], nil)
717653 let inAmountAssetId = toBase58String(value(payment.assetId))
718654 let lpAssetRequestedForBurning = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
719655 if ((inAmountAssetId != lpAssetRequestedForBurning))
720- then throwErr("Invalid asset passed.")
656+ then throw("Invalid asset passed.")
721657 else if ((amountToBurn != paymentAmount))
722- then throwErr("Invalid amount passed.")
658+ then throw("Invalid amount passed.")
723659 else {
724660 let lpAsset = fromBase58String(lpAssetRequestedForBurning)
725661 $Tuple2([Burn(lpAsset, amountToBurn)], "success")
783719 let btcWeightNew = (btcWeight - weightDecrement)
784720 let ethWeightNew = (ethWeight - weightDecrement)
785721 if ((0 >= btcWeightNew))
786- then throwErr(("invalid btcWeightNew: " + toString(btcWeightNew)))
722+ then throw(("invalid btcWeightNew: " + toString(btcWeightNew)))
787723 else if ((0 >= ethWeightNew))
788- then throwErr(("invalid ethWeightNew: " + toString(ethWeightNew)))
724+ then throw(("invalid ethWeightNew: " + toString(ethWeightNew)))
789725 else {
790726 let btcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(btcPoolAddress))
791727 let ethLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethPoolAddress))
862798 let priceAssets = getPriceAssets()
863799 let checkPriceAssetsSize = if ((size(priceAssets) > 0))
864800 then true
865- else throwErr("invalid price assets")
801+ else throw("invalid price assets")
866802 if ((checkPriceAssetsSize == checkPriceAssetsSize))
867803 then {
868804 func cb (acc,priceAsset) = {
1024960 }
1025961
1026962
1027-
1028-@Callable(i)
1029-func deletePool (poolContractAddress) = {
1030- let poolConfig = getPoolConfig(poolContractAddress)
1031- let checkCaller = if ((toString(i.caller) == getPoolCreator(poolContractAddress)))
1032- then if (isPoolEmpty(poolContractAddress))
1033- then true
1034- else throwErr("Pool is not empty")
1035- else mustManager(i)
1036- if ((checkCaller == checkCaller))
1037- then {
1038- let checkWeight = if ((valueOrElse(getInteger(keyPoolToWeight(poolContractAddress)), 0) == 0))
1039- then true
1040- else throwErr("Pool weight is not Zero")
1041- if ((checkWeight == checkWeight))
1042- then {
1043- let checkStatus = if ((poolConfig[idxPoolStatus] == toString(PoolShutdown)))
1044- then true
1045- else throwErr("Pool must be SHUTDOWN (4)")
1046- if ((checkStatus == checkStatus))
1047- then {
1048- let $t03961739754 = getAssetsDataFromPoolAddress(poolContractAddress)
1049- let amountAssetId = $t03961739754._1
1050- let priceAssetId = $t03961739754._2
1051- let lpAssetId = $t03961739754._3
1052- let amountAssetInternal = $t03961739754._4
1053- let priceAssetInternal = $t03961739754._5
1054- let userPoolsContract = addressFromStringValue(getStringValue(keyUserPoolsContract()))
1055- let userPoolsInvoke = invoke(userPoolsContract, "deletePool", [amountAssetId, priceAssetId], nil)
1056- if ((userPoolsInvoke == userPoolsInvoke))
1057- then {
1058- let votingEmissionContract = addressFromStringValue(getStringValue(keyVotingEmissionContract()))
1059- let votingEmissionInvoke = invoke(votingEmissionContract, "deletePool", [amountAssetId, priceAssetId], nil)
1060- if ((votingEmissionInvoke == votingEmissionInvoke))
1061- then {
1062- let assetsStoreContract = addressFromStringValue(getStringValue(keyAssetsStoreContract()))
1063- let assetsStoreInvoke = invoke(assetsStoreContract, "deletePool", [amountAssetId, priceAssetId], nil)
1064- if ((assetsStoreInvoke == assetsStoreInvoke))
1065- then [DeleteEntry(keyMappingPoolContractToLPAsset(poolContractAddress)), DeleteEntry(keyMappingPoolContractAddressToPoolAssets(poolContractAddress)), DeleteEntry(keyMappingPoolAssetsToLpasset(toString(amountAssetInternal), toString(priceAssetInternal))), DeleteEntry(keyMappingPoolAssetsToPoolContractAddress(amountAssetInternal, priceAssetInternal)), DeleteEntry(keyPoolConfig(toString(amountAssetInternal), toString(priceAssetInternal))), DeleteEntry(keyMappingLpAssetToPoolAssets(lpAssetId)), DeleteEntry(keyMappingPoolLPAssetToPoolContractAddress(lpAssetId)), DeleteEntry(keyWxEmission(amountAssetId, priceAssetId)), DeleteEntry(keyPoolToWeight(poolContractAddress)), DeleteEntry(keyPoolSpread(poolContractAddress)), DeleteEntry(keyInFee(poolContractAddress)), DeleteEntry(keyOutFee(poolContractAddress)), DeleteEntry(keySkipOrderValidation(poolContractAddress)), DeleteEntry(keyChangeAmpDelay(poolContractAddress)), DeleteEntry(keyChangeAmpDelta(poolContractAddress)), DeleteEntry(keyChangeAmpTarget(poolContractAddress))]
1066- else throw("Strict value is not equal to itself.")
1067- }
1068- else throw("Strict value is not equal to itself.")
1069- }
1070- else throw("Strict value is not equal to itself.")
1071- }
1072- else throw("Strict value is not equal to itself.")
1073- }
1074- else throw("Strict value is not equal to itself.")
1075- }
1076- else throw("Strict value is not equal to itself.")
1077- }
1078-
1079-
1080963 @Verifier(tx)
1081964 func verify () = {
1082965 let targetPublicKey = match managerPublicKeyOrUnit() {
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 MULT12 = 1000000000000
99
1010 let SCALE18 = 18
1111
1212 let MULT18 = toBigInt(1000000000000000000)
1313
1414 let POOLWEIGHTMULT = MULT8
1515
1616 let GWXvirtualPOOL = "GWXvirtualPOOL"
1717
1818 let labelPoolsLp = "POOLS_LP"
1919
2020 let defaultSpread = 2000000
2121
2222 let wavesString = "WAVES"
23-
24-let contractFilename = "factory_v2.ride"
2523
2624 let decimalsMultPrice = ((100 * 1000) * 1000)
2725
2826 let SEP = "__"
2927
3028 let EMPTY = ""
3129
3230 let PoolActive = 1
3331
3432 let PoolPutDisabled = 2
3533
3634 let PoolMatcherDisabled = 3
3735
3836 let PoolShutdown = 4
3937
4038 let idxInternalAssetId = 1
4139
4240 let idxResutActions = 2
4341
4442 let idxIfAssetIdCalculationPerformed = 3
4543
4644 let idxPoolAddress = 1
4745
4846 let idxPoolStatus = 2
4947
5048 let idxPoolLPAssetId = 3
5149
5250 let idxAmtAssetId = 4
5351
5452 let idxPriceAssetId = 5
5553
5654 let idxAmtAssetDcm = 6
5755
5856 let idxPriceAssetDcm = 7
5957
6058 let idxIAmtAssetId = 8
6159
6260 let idxIPriceAssetId = 9
6361
6462 let idxLPAssetDcm = 10
6563
6664 let idxPoolType = 11
6765
6866 let poolLabelWxEmission = "WX_EMISSION"
6967
7068 let validPoolLabels = [poolLabelWxEmission]
7169
72-func wrapErr (msg) = makeString([contractFilename, ": ", msg], "")
73-
74-
75-func throwErr (msg) = throw(wrapErr(msg))
76-
77-
7870 func keyAllowedLpScriptHash () = "%s__allowedLpScriptHash"
7971
8072
8173 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
8274
8375
8476 func swapContract () = "%s__swapContract"
8577
8678
8779 func keyFactoryConfig () = "%s__factoryConfig"
8880
8981
9082 func keyLpTokensList () = "%s__lpTokensList"
9183
9284
9385 func keyPoolScriptHash () = "%s%s__pool__scriptHash"
9486
9587
9688 func keyMatcherPub () = "%s%s__matcher__publicKey"
9789
9890
9991 func keyLegacyFactoryContract () = "%s__legacyFactoryContract"
10092
10193
10294 func keyLegacyPools () = "%s__legacyPools"
10395
10496
10597 func keyManagerPublicKey () = "%s__managerPublicKey"
10698
10799
108100 func keyManagerVaultAddress () = "%s__managerVaultAddress"
109101
110102
111103 func keyAdminPubKeys () = "%s__adminPubKeys"
112104
113105
114106 func keyAssetsStoreContract () = "%s__assetsStoreContract"
115107
116108
117109 func keyVotingEmissionContract () = "%s__votingEmissionContract"
118110
119111
120-func keyUserPoolsContract () = "%s__userPoolsContract"
121-
122-
123112 func keyPriceAssets () = makeString(["%s", "priceAssets"], SEP)
124113
125114
126115 func keyPriceDecimals () = "%s__priceDecimals"
127116
128117
129118 func keyAllPoolsShutdown () = "%s__shutdown"
130119
131120
132121 func keyNextInternalAssetId () = "%s__nextInternalAssetId"
133122
134123
135124 func keyPoolToWeight (poolAddress) = ("%s%s__poolWeight__" + poolAddress)
136125
137126
138127 func keyPoolToWeightHistory (poolAddress,num) = ((("%s%s__poolWeight__" + poolAddress) + "__") + toString(num))
139128
140129
141130 func keyMappingsInternal2baseAssetId (internalBaseAsset) = ("%s%s%d__mappings__internal2baseAssetId__" + toString(internalBaseAsset))
142131
143132
144133 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
145134
146135
147136 func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config")
148137
149138
150139 func keyPoolOneTokenOperationsDisabled (assetsInternal) = {
151- let $t038783940 = assetsInternal
152- let amountAssetInternal = $t038783940._1
153- let priceAssetInternal = $t038783940._2
140+ let $t036583720 = assetsInternal
141+ let amountAssetInternal = $t036583720._1
142+ let priceAssetInternal = $t036583720._2
154143 makeString(["%d%d%s", toString(amountAssetInternal), toString(priceAssetInternal), "oneTokenOperationsDisabled"], SEP)
155144 }
156145
157146
158147 func keyAllPoolsOneTokenOperationsDisabled () = makeString(["%s", "oneTokenOperationsDisabled"], SEP)
159148
160149
161150 func keyMappingLpAssetToPoolAssets (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2Pool")
162151
163152
164153 func keyMappingPoolAssetsToLpasset (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + internalAmountAssetIdStr) + "__") + internalPriceAssetIdStr) + "__mappings__PoolAssets2LpAsset")
165154
166155
167156 func keyPoolSpread (poolAddress) = ("%s%s__spread__" + poolAddress)
168157
169158
170159 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2PoolAssets")
171160
172161
173162 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
174163
175164
176165 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
177166
178167
179168 func keyMappingPoolLPAssetToPoolContractAddress (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2PoolContract")
180169
181170
182171 func keyWxEmission (amountAssetId,priceAssetId) = ((("%s%s%s__wxEmission__" + amountAssetId) + "__") + priceAssetId)
183172
184173
185174 func keyInFee (poolAddress) = ("%s%s__inFee__" + poolAddress)
186175
187176
188177 func keyInFeeDefault () = "%s__inFeeDefault"
189178
190179
191180 func keySwapFee (poolAddress) = ("%s%s__swapFee__" + poolAddress)
192181
193182
194183 func keyOutFee (poolAddress) = ("%s%s__outFee__" + poolAddress)
195184
196185
197186 func keyOutFeeDefault () = "%s__outFeeDefault"
198187
199188
200189 func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
201190
202191
203192 func keyChangeAmpDelay (poolAddress) = ("%s%s__changeAmpDelay__" + poolAddress)
204193
205194
206195 func keyChangeAmpDelta (poolAddress) = ("%s%s__changeAmpDelta__" + poolAddress)
207196
208197
209198 func keyChangeAmpTarget (poolAddress) = ("%s%s__changeAmpTarget__" + poolAddress)
210199
211200
212201 func keySWavesProxyAddress () = "%s__sWavesProxyAddress"
213202
214203
215204 func keySWavesAssetId () = "%s__sWavesAssetId"
216205
217206
218207 func keyStakingProfitAddress () = "%s__stakingProfitAddress"
219208
220209
221210 func keyLeasedRatio (poolAddress,assetId) = makeString(["%s%s%s", "leasedRatio", poolAddress, assetId], SEP)
222211
223212
224213 func keyLeasedRatioDefault (assetId) = makeString(["%s%s", "leasedRatioDefault", assetId], SEP)
225214
226215
227216 func keyLeasedRatioTolerance (poolAddress,assetId) = makeString(["%s%s%s", "leasedRatioTolerance", poolAddress, assetId], SEP)
228217
229218
230219 func keyMinBalance (poolAddress,assetId) = makeString(["%s%s%s", "minBalance", poolAddress, assetId], SEP)
231220
232221
233222 func keyMinBalanceDefault (assetId) = makeString(["%s%s", "minBalanceDefault", assetId], SEP)
234223
235224
236225 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
237226
238227
239228 func getBooleanOrFail (key) = valueOrErrorMessage(getBoolean(this, key), ("No data for this.key=" + key))
240229
241230
242231 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), ("No data for this.key=" + key))
243232
244233
245234 func parseAssetId (input) = if ((input == wavesString))
246235 then unit
247236 else fromBase58String(input)
248237
249238
250239 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
251240 case s: String =>
252241 addressFromStringValue(s)
253242 case _ =>
254243 this
255244 }
256245
257246
258247 let IdxFactoryCfgStakingDapp = 1
259248
260249 let IdxFactoryCfgBoostingDapp = 2
261250
262251 let IdxFactoryCfgIdoDapp = 3
263252
264253 let IdxFactoryCfgTeamDapp = 4
265254
266255 let IdxFactoryCfgEmissionDapp = 5
267256
268257 let IdxFactoryCfgRestDapp = 6
269258
270259 let IdxFactoryCfgSlippageDapp = 7
271260
272261 let IdxFactoryCfgDaoDapp = 8
273262
274263 let IdxFactoryCfgMarketingDapp = 9
275264
276265 let IdxFactoryCfgGwxRewardDapp = 10
277266
278267 let IdxFactoryCfgBirdsDapp = 11
279268
280269 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
281270
282271
283272 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
284273
285274
286275 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
287276
288277
289278 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
290279
291280
292281 func getPriceAssets () = match getString(keyPriceAssets()) {
293282 case s: String =>
294283 if ((size(s) == 0))
295284 then nil
296285 else split_4C(s, SEP)
297286 case _ =>
298287 nil
299288 }
300289
301290
302291 func managerPublicKeyOrUnit () = {
303292 let managerVaultAddress = getManagerVaultAddressOrThis()
304293 match getString(managerVaultAddress, keyManagerPublicKey()) {
305294 case s: String =>
306295 fromBase58String(s)
307296 case _: Unit =>
308297 unit
309298 case _ =>
310299 throw("Match error")
311300 }
312301 }
313302
314303
315-let permissionDeniedError = throwErr("Permission denied")
304+let permissionDeniedError = throw("Permission denied")
316305
317-let testError = throwErr("Test error here")
306+let testError = throw("Test error here")
318307
319308 func mustThis (i) = if ((i.caller == this))
320309 then true
321310 else permissionDeniedError
322311
323312
324313 func mustManager (i) = match managerPublicKeyOrUnit() {
325314 case pk: ByteVector =>
326315 if ((i.callerPublicKey == pk))
327316 then true
328317 else permissionDeniedError
329318 case _: Unit =>
330319 mustThis(i)
331320 case _ =>
332321 throw("Match error")
333322 }
334323
335324
336325 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)
337326
338327
339328 func dataFactoryCfg (stakingAddress,boostingAddress,idoContract,teamContract,emissionContract,restContract,slippageContract) = makeString(["%s%s%s%s%s%s", stakingAddress, boostingAddress, idoContract, teamContract, emissionContract, restContract, slippageContract], SEP)
340329
341330
342331 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)
343332
344333
345334 func dataMappingPoolAssets (internalAmountAssetStr,internalPriceAssetStr) = makeString(["%d%d", toString(internalAmountAssetStr), toString(internalPriceAssetStr)], SEP)
346335
347336
348337 func getPoolConfig (poolAddress) = {
349338 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
350339 let amountAssetInternal = poolAssets[1]
351340 let priceAssetInternal = poolAssets[2]
352341 split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
353342 }
354343
355344
356345 func getInternalAssetIdOrCreate (assetIdStr,incrementor) = {
357346 let internalAssetId = valueOrElse(getInteger(this, keyMappingsBaseAsset2internalId(assetIdStr)), 0)
358347 let currentIndexOfInternalId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0)
359348 let result = if ((internalAssetId == 0))
360349 then {
361350 let newInternalAssetId = (currentIndexOfInternalId + incrementor)
362351 $Tuple3(newInternalAssetId, [IntegerEntry(keyNextInternalAssetId(), newInternalAssetId), IntegerEntry(keyMappingsBaseAsset2internalId(assetIdStr), newInternalAssetId), StringEntry(keyMappingsInternal2baseAssetId(newInternalAssetId), assetIdStr)], true)
363352 }
364353 else $Tuple3(internalAssetId, nil, false)
365354 result
366355 }
367356
368357
369358 func mustAdmin (i) = {
370359 let adminPKs = split(valueOrElse(getString(keyAdminPubKeys()), EMPTY), SEP)
371360 if (containsElement(adminPKs, toBase58String(i.callerPublicKey)))
372361 then true
373362 else {
374363 let isManager = mustManager(i)
375364 if ((isManager == isManager))
376365 then true
377366 else throw("Strict value is not equal to itself.")
378367 }
379368 }
380369
381370
382371 func intOrDefaultOrFallback (key,keyDefault,valueFallback) = valueOrElse(getInteger(this, key), valueOrElse(getInteger(this, keyDefault), valueFallback))
383372
384373
385374 func poolExistsInternal (amountAssetId,priceAssetId) = {
386375 let amountAssetInternal = getInteger(keyMappingsBaseAsset2internalId(amountAssetId))
387376 let priceAssetInternal = getInteger(keyMappingsBaseAsset2internalId(priceAssetId))
388377 if (if ((amountAssetInternal == unit))
389378 then true
390379 else (priceAssetInternal == unit))
391380 then false
392381 else {
393382 let amAs = toString(value(amountAssetInternal))
394383 let prAs = toString(value(priceAssetInternal))
395384 let cfg = getString(keyPoolConfig(amAs, prAs))
396385 let cfgReverse = getString(keyPoolConfig(prAs, amAs))
397386 let exists = if ((cfg != unit))
398387 then true
399388 else (cfgReverse != unit)
400389 exists
401390 }
402391 }
403392
404393
405-func getAssetsDataFromPoolAddress (poolContractAddress) = {
406- let poolAssets = match getString(keyMappingPoolContractAddressToPoolAssets(poolContractAddress)) {
407- case s: String =>
408- split(s, SEP)
409- case _ =>
410- throwErr(makeString([poolContractAddress, "pool is not found"], " "))
411- }
412- let amountAssetInternal = parseIntValue(poolAssets[1])
413- let priceAssetInternal = parseIntValue(poolAssets[2])
414- let amountAssetId = getStringValue(keyMappingsInternal2baseAssetId(amountAssetInternal))
415- let priceAssetId = getStringValue(keyMappingsInternal2baseAssetId(priceAssetInternal))
416- let lpAssetId = getStringValue(keyMappingPoolContractToLPAsset(poolContractAddress))
417- $Tuple5(amountAssetId, priceAssetId, lpAssetId, amountAssetInternal, priceAssetInternal)
418- }
419-
420-
421-func getPoolCreator (poolContractAddress) = {
422- let $t01526915406 = getAssetsDataFromPoolAddress(poolContractAddress)
423- let amountAssetId = $t01526915406._1
424- let priceAssetId = $t01526915406._2
425- let lpAssetId = $t01526915406._3
426- let amountAssetInternal = $t01526915406._4
427- let priceAssetInternal = $t01526915406._5
428- let userPoolsContract = addressFromStringValue(getStringValue(keyUserPoolsContract()))
429- let poolCreator = invoke(userPoolsContract, "getPoolCreatorREADONLY", [amountAssetId, priceAssetId], nil)
430- poolCreator
431- }
432-
433-
434-func getAddressBalance (addressString,assetIdString) = {
435- let address = addressFromStringValue(addressString)
436- if ((assetIdString == "WAVES"))
437- then wavesBalance(address).regular
438- else {
439- let assetId = fromBase58String(assetIdString)
440- assetBalance(address, assetId)
441- }
442- }
443-
444-
445-func isPoolEmpty (poolContractAddress) = {
446- let $t01598116118 = getAssetsDataFromPoolAddress(poolContractAddress)
447- let amountAssetId = $t01598116118._1
448- let priceAssetId = $t01598116118._2
449- let lpAssetId = $t01598116118._3
450- let amountAssetInternal = $t01598116118._4
451- let priceAssetInternal = $t01598116118._5
452- if ((getAddressBalance(poolContractAddress, amountAssetId) == 0))
453- then (getAddressBalance(poolContractAddress, priceAssetId) == 0)
454- else false
455- }
456-
457-
458394 @Callable(i)
459395 func getSwapContractREADONLY () = $Tuple2(nil, getStringOrFail(swapContract()))
460396
461397
462398
463399 @Callable(i)
464400 func getPoolLeaseConfigREADONLY (poolAddress,assetId) = {
465- let $t01643316737 = match getInteger(this, keyLeasedRatio(poolAddress, assetId)) {
401+ let $t01440714711 = match getInteger(this, keyLeasedRatio(poolAddress, assetId)) {
466402 case r: Int =>
467403 $Tuple2(true, min([100, max([0, r])]))
468404 case _ =>
469405 match getInteger(this, keyLeasedRatioDefault(assetId)) {
470406 case rd: Int =>
471407 $Tuple2(true, min([100, max([0, rd])]))
472408 case _ =>
473409 $Tuple2(false, 0)
474410 }
475411 }
476- let isLeasable = $t01643316737._1
477- let leasedRatio = $t01643316737._2
412+ let isLeasable = $t01440714711._1
413+ let leasedRatio = $t01440714711._2
478414 let minBalance = match getInteger(this, keyMinBalance(poolAddress, assetId)) {
479415 case b: Int =>
480416 max([0, b])
481417 case _ =>
482418 match getInteger(this, keyMinBalanceDefault(assetId)) {
483419 case bd: Int =>
484420 max([0, bd])
485421 case _ =>
486422 0
487423 }
488424 }
489- let $t01700317227 = if ((assetId == "WAVES"))
425+ let $t01497715201 = if ((assetId == "WAVES"))
490426 then $Tuple3(valueOrElse(getString(this, keySWavesProxyAddress()), ""), getString(this, valueOrElse(keySWavesAssetId(), "")), MULT12)
491427 else $Tuple3("", "", 0)
492- let proxyAddress = $t01700317227._1
493- let proxyAssetId = $t01700317227._2
494- let proxyRateMul = $t01700317227._3
428+ let proxyAddress = $t01497715201._1
429+ let proxyAssetId = $t01497715201._2
430+ let proxyRateMul = $t01497715201._3
495431 let stakingProfitAddress = valueOrElse(getString(this, keyStakingProfitAddress()), "")
496432 $Tuple2(nil, $Tuple7(isLeasable, leasedRatio, minBalance, proxyAddress, proxyAssetId, proxyRateMul, stakingProfitAddress))
497433 }
498434
499435
500436
501437 @Callable(i)
502438 func getLpAssetFromPoolAssetsREADONLY (asset1,asset2) = if (if ((asset1 == "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS"))
503439 then (asset2 == "WAVES")
504440 else false)
505441 then $Tuple2(nil, unit)
506442 else {
507443 let assetNum1 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset1)))
508444 let assetNum2 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset2)))
509445 let ee = getString(this, keyMappingPoolAssetsToLpasset(toString(assetNum1), toString(assetNum2)))
510446 let res = if ((ee == unit))
511447 then unit
512448 else drop(value(ee), 4)
513449 $Tuple2(nil, res)
514450 }
515451
516452
517453
518454 @Callable(i)
519455 func getPoolAddressFromLpAssetREADONLY (lp) = $Tuple2(nil, valueOrElse(getString(this, keyMappingPoolLPAssetToPoolContractAddress(lp)), ""))
520456
521457
522458
523459 @Callable(i)
524460 func constructor (stakingContract,boostingContract,idoContract,teamContract,emissionContract,restContract,slpipageContract,priceDecimals) = {
525461 let checkCaller = mustManager(i)
526462 if ((checkCaller == checkCaller))
527463 then [StringEntry(keyFactoryConfig(), dataFactoryCfg(stakingContract, boostingContract, idoContract, teamContract, emissionContract, restContract, slpipageContract)), IntegerEntry(keyPriceDecimals(), priceDecimals)]
528464 else throw("Strict value is not equal to itself.")
529465 }
530466
531467
532468
533469 @Callable(i)
534470 func constructorV2 (mathcherPub58Str) = {
535471 let checkCaller = mustManager(i)
536472 if ((checkCaller == checkCaller))
537473 then {
538474 let mathcerPub = addressFromPublicKey(fromBase58String(mathcherPub58Str))
539475 if ((mathcerPub == mathcerPub))
540476 then [StringEntry(keyMatcherPub(), mathcherPub58Str)]
541477 else throw("Strict value is not equal to itself.")
542478 }
543479 else throw("Strict value is not equal to itself.")
544480 }
545481
546482
547483
548484 @Callable(i)
549485 func constructorV3 (daoContract,marketingContract,gwxRewardsContract,birdsContract) = {
550486 let checkCaller = mustManager(i)
551487 if ((checkCaller == checkCaller))
552488 then {
553489 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
554490 [StringEntry(keyFactoryConfig(), dataFactoryCfgV3(factoryCfg[1], factoryCfg[2], factoryCfg[3], factoryCfg[4], factoryCfg[5], factoryCfg[6], factoryCfg[7], daoContract, marketingContract, gwxRewardsContract, birdsContract))]
555491 }
556492 else throw("Strict value is not equal to itself.")
557493 }
558494
559495
560496
561497 @Callable(i)
562498 func constructorV4 (legacyFactoryContract,legacyPools) = {
563499 let checkCaller = mustManager(i)
564500 if ((checkCaller == checkCaller))
565501 then [StringEntry(keyLegacyFactoryContract(), legacyFactoryContract), StringEntry(keyLegacyPools(), makeString(legacyPools, SEP))]
566502 else throw("Strict value is not equal to itself.")
567503 }
568504
569505
570506
571507 @Callable(i)
572508 func constructorV5 (assetsStoreContract) = {
573509 let checkCaller = mustManager(i)
574510 if ((checkCaller == checkCaller))
575511 then [StringEntry(keyAssetsStoreContract(), assetsStoreContract)]
576512 else throw("Strict value is not equal to itself.")
577513 }
578514
579515
580516
581517 @Callable(i)
582518 func constructorV6 (votingEmissionContract,priceAssets) = {
583519 let cheks = [mustManager(i), if ((addressFromString(votingEmissionContract) != unit))
584520 then true
585521 else "invalid voting emission contract address"]
586522 if ((cheks == cheks))
587523 then [StringEntry(keyVotingEmissionContract(), votingEmissionContract), StringEntry(keyPriceAssets(), makeString(priceAssets, SEP))]
588524 else throw("Strict value is not equal to itself.")
589525 }
590526
591527
592528
593529 @Callable(i)
594530 func setAdmins (adminPubKeys) = {
595531 let checkCaller = mustManager(i)
596532 if ((checkCaller == checkCaller))
597533 then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
598534 else throw("Strict value is not equal to itself.")
599535 }
600536
601537
602538
603539 @Callable(i)
604540 func activateNewPool (poolAddress,amountAssetStr,priceAssetStr,lpAssetName,lpAssetDescr,poolWeight,poolType,logo) = {
605541 let checkCaller = mustAdmin(i)
606542 if ((checkCaller == checkCaller))
607543 then if (isDefined(getString(keyMappingPoolContractAddressToPoolAssets(poolAddress))))
608- then throwErr((("Pool address " + poolAddress) + " already registered."))
544+ then throw((("Pool address " + poolAddress) + " already registered."))
609545 else {
610546 let internalAmountAssetData = getInternalAssetIdOrCreate(amountAssetStr, 1)
611547 let internalAmountAssetId = internalAmountAssetData._1
612548 let internalPriceAssetData = getInternalAssetIdOrCreate(priceAssetStr, if (internalAmountAssetData._3)
613549 then 2
614550 else 1)
615551 let internalPriceAssetId = internalPriceAssetData._1
616552 let poolAccountScriptHash = valueOrErrorMessage(scriptHash(addressFromStringValue(poolAddress)), ("No script has been found on pool account " + poolAddress))
617553 let ethalonPoolAccountScriptHash = getBinaryValue(keyPoolScriptHash())
618554 let poolExists = poolExistsInternal(amountAssetStr, priceAssetStr)
619555 if (poolExists)
620- then throwErr((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated."))
556+ then throw((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated."))
621557 else {
622558 let poolConfigValue = value(getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId))))
623559 let amountAssetsDecimals = if ((amountAssetStr == "WAVES"))
624560 then decimalsMultPrice
625561 else pow(10, 0, value(assetInfo(fromBase58String(amountAssetStr))).decimals, 0, 0, DOWN)
626562 let priceAssetsDecimals = if ((priceAssetStr == "WAVES"))
627563 then decimalsMultPrice
628564 else pow(10, 0, value(assetInfo(fromBase58String(priceAssetStr))).decimals, 0, 0, DOWN)
629565 let lpAssetIssueAction = Issue(lpAssetName, lpAssetDescr, 1, 8, true)
630566 let lpAssetId = calculateAssetId(lpAssetIssueAction)
631567 let lpAssetIdStr = toBase58String(lpAssetId)
632568 let poolActivateInvokeResult = invoke(addressFromStringValue(poolAddress), "activate", [amountAssetStr, priceAssetStr], nil)
633569 if ((poolActivateInvokeResult == poolActivateInvokeResult))
634570 then if ((poolActivateInvokeResult != "success"))
635- then throwErr("Pool initialisation error happened.")
571+ then throw("Pool initialisation error happened.")
636572 else {
637573 let assetsStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract()))
638574 let createOrUpdateLpAssetInv = invoke(assetsStoreContract, "createOrUpdate", [lpAssetIdStr, lpAssetName, false], nil)
639575 if ((createOrUpdateLpAssetInv == createOrUpdateLpAssetInv))
640576 then {
641577 let addPoolsLpLabelInv = invoke(assetsStoreContract, "addLabel", [lpAssetIdStr, labelPoolsLp], nil)
642578 if ((addPoolsLpLabelInv == addPoolsLpLabelInv))
643579 then {
644580 let setLogoInv = invoke(assetsStoreContract, "setLogo", [lpAssetIdStr, logo], nil)
645581 if ((setLogoInv == setLogoInv))
646582 then {
647583 let addAssetsLinkInv = invoke(assetsStoreContract, "addAssetsLink", [amountAssetStr, priceAssetStr, lpAssetIdStr], nil)
648584 if ((addAssetsLinkInv == addAssetsLinkInv))
649585 then {
650586 let increaseAssetPoolsNumberInv = invoke(assetsStoreContract, "increaseAssetPoolsNumber", [amountAssetStr], nil)
651587 if ((increaseAssetPoolsNumberInv == increaseAssetPoolsNumberInv))
652588 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)
653589 else throw("Strict value is not equal to itself.")
654590 }
655591 else throw("Strict value is not equal to itself.")
656592 }
657593 else throw("Strict value is not equal to itself.")
658594 }
659595 else throw("Strict value is not equal to itself.")
660596 }
661597 else throw("Strict value is not equal to itself.")
662598 }
663599 else throw("Strict value is not equal to itself.")
664600 }
665601 }
666602 else throw("Strict value is not equal to itself.")
667603 }
668604
669605
670606
671607 @Callable(i)
672608 func managePool (poolAddress,newStatus) = {
673609 let checkCaller = mustManager(i)
674610 if ((checkCaller == checkCaller))
675611 then {
676612 let poolConfig = getPoolConfig(poolAddress)
677613 let poolStatus = poolConfig[idxPoolStatus]
678614 let lpAssetIdStr = poolConfig[idxPoolLPAssetId]
679615 let amountAssetStr = poolConfig[idxAmtAssetId]
680616 let priceAssetStr = poolConfig[idxPriceAssetId]
681617 let amountAssetsDecimals = parseIntValue(poolConfig[idxAmtAssetDcm])
682618 let priceAssetsDecimals = parseIntValue(poolConfig[idxPriceAssetDcm])
683619 let internalAmountAssetId = parseIntValue(poolConfig[idxIAmtAssetId])
684620 let internalPriceAssetId = parseIntValue(poolConfig[idxIPriceAssetId])
685621 let lpAssetDcm = parseIntValue(poolConfig[idxLPAssetDcm])
686622 let poolType = poolConfig[idxPoolType]
687623 [StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(newStatus), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, lpAssetDcm, poolType))]
688624 }
689625 else throw("Strict value is not equal to itself.")
690626 }
691627
692628
693629
694630 @Callable(i)
695631 func emit (amountToEmit) = {
696632 let caller = i.caller
697633 let originCaller = i.originCaller
698634 let lpAssetRequested = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
699635 let lpAsset = fromBase58String(lpAssetRequested)
700636 let legacyPools = split(valueOrElse(getString(keyLegacyPools()), EMPTY), SEP)
701637 let legacyFactoryContract = addressFromStringValue(valueOrErrorMessage(getString(keyLegacyFactoryContract()), "Legacy factory contract does not exists."))
702638 if ((0 >= amountToEmit))
703639 then nil
704640 else if (containsElement(legacyPools, toString(caller)))
705641 then $Tuple2(nil, legacyFactoryContract)
706642 else $Tuple2([Reissue(lpAsset, amountToEmit, true), ScriptTransfer(i.caller, amountToEmit, lpAsset)], "success")
707643 }
708644
709645
710646
711647 @Callable(i)
712648 func burn (amountToBurn) = {
713649 let caller = i.caller
714650 let originCaller = i.originCaller
715651 let payment = value(i.payments[0])
716652 let paymentAmount = value(payment.amount)
717653 let inAmountAssetId = toBase58String(value(payment.assetId))
718654 let lpAssetRequestedForBurning = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
719655 if ((inAmountAssetId != lpAssetRequestedForBurning))
720- then throwErr("Invalid asset passed.")
656+ then throw("Invalid asset passed.")
721657 else if ((amountToBurn != paymentAmount))
722- then throwErr("Invalid amount passed.")
658+ then throw("Invalid amount passed.")
723659 else {
724660 let lpAsset = fromBase58String(lpAssetRequestedForBurning)
725661 $Tuple2([Burn(lpAsset, amountToBurn)], "success")
726662 }
727663 }
728664
729665
730666
731667 @Callable(i)
732668 func modifyWeight (lpAssetId,share) = {
733669 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionContract()), "")))
734670 then true
735671 else mustManager(i)
736672 if ((checkCaller == checkCaller))
737673 then {
738674 let poolContractAddress = getStringOrFail(keyMappingPoolLPAssetToPoolContractAddress(lpAssetId))
739675 let poolWeightKey = keyPoolToWeight(poolContractAddress)
740676 let gwxWeightKey = keyPoolToWeight(GWXvirtualPOOL)
741677 let gwxWeight = valueOrElse(getInteger(gwxWeightKey), 0)
742678 let poolWeight = valueOrElse(getInteger(poolWeightKey), 0)
743679 let poolWeightNew = share
744680 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
745681 let stakingContract = getStakingAddressOrFail(factoryCfg)
746682 let onModifyWeightInv = invoke(stakingContract, "onModifyWeight", [lpAssetId, poolContractAddress], nil)
747683 if ((onModifyWeightInv == onModifyWeightInv))
748684 then {
749685 let gwxVirtualPoolActions = if ((gwxWeight == 0))
750686 then nil
751687 else [IntegerEntry(gwxWeightKey, 0)]
752688 let poolWeightHistoryKey = keyPoolToWeightHistory(poolContractAddress, 0)
753689 let poolWeightHistoryOrUnit = getInteger(poolWeightHistoryKey)
754690 let poolWeightHistoryActions = if ((poolWeightHistoryOrUnit == unit))
755691 then nil
756692 else [DeleteEntry(poolWeightHistoryKey)]
757693 (([IntegerEntry(poolWeightKey, poolWeightNew)] ++ gwxVirtualPoolActions) ++ poolWeightHistoryActions)
758694 }
759695 else throw("Strict value is not equal to itself.")
760696 }
761697 else throw("Strict value is not equal to itself.")
762698 }
763699
764700
765701
766702 @Callable(i)
767703 func modifyWeights (btcPoolAddress,ethPoolAddress,ethBtcPoolAddress,usdcUsdtPoolAddress) = {
768704 let checkCaller = mustManager(i)
769705 if ((checkCaller == checkCaller))
770706 then {
771707 let ethBtcWeightNew = ((5 * POOLWEIGHTMULT) / 100)
772708 let usdcUsdtWeightNew = ((5 * POOLWEIGHTMULT) / 100)
773709 let weightDecrement = ((5 * POOLWEIGHTMULT) / 100)
774710 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
775711 let stakingDapp = getStakingAddressOrFail(factoryCfg)
776712 let gwxRewardDapp = getGwxRewardAddressOrFail(factoryCfg)
777713 let btcWeightKEY = keyPoolToWeight(btcPoolAddress)
778714 let ethWeightKEY = keyPoolToWeight(ethPoolAddress)
779715 let ethBtcWeightKEY = keyPoolToWeight(ethBtcPoolAddress)
780716 let usdcUsdtWeightKEY = keyPoolToWeight(usdcUsdtPoolAddress)
781717 let btcWeight = getIntOrFail(btcWeightKEY)
782718 let ethWeight = getIntOrFail(ethWeightKEY)
783719 let btcWeightNew = (btcWeight - weightDecrement)
784720 let ethWeightNew = (ethWeight - weightDecrement)
785721 if ((0 >= btcWeightNew))
786- then throwErr(("invalid btcWeightNew: " + toString(btcWeightNew)))
722+ then throw(("invalid btcWeightNew: " + toString(btcWeightNew)))
787723 else if ((0 >= ethWeightNew))
788- then throwErr(("invalid ethWeightNew: " + toString(ethWeightNew)))
724+ then throw(("invalid ethWeightNew: " + toString(ethWeightNew)))
789725 else {
790726 let btcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(btcPoolAddress))
791727 let ethLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethPoolAddress))
792728 let ethBtcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethBtcPoolAddress))
793729 let usdcUsdtLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(usdcUsdtPoolAddress))
794730 let onModifyWeightBtc = invoke(stakingDapp, "onModifyWeight", [btcLpAssetIdStr, btcPoolAddress], nil)
795731 if ((onModifyWeightBtc == onModifyWeightBtc))
796732 then {
797733 let onModifyWeightEth = invoke(stakingDapp, "onModifyWeight", [ethLpAssetIdStr, ethPoolAddress], nil)
798734 if ((onModifyWeightEth == onModifyWeightEth))
799735 then {
800736 let onModifyWeightEthBtc = invoke(stakingDapp, "onModifyWeight", [ethBtcLpAssetIdStr, ethBtcPoolAddress], nil)
801737 if ((onModifyWeightEthBtc == onModifyWeightEthBtc))
802738 then {
803739 let onModifyWeightUsdcUsdt = invoke(stakingDapp, "onModifyWeight", [usdcUsdtLpAssetIdStr, usdcUsdtPoolAddress], nil)
804740 if ((onModifyWeightUsdcUsdt == onModifyWeightUsdcUsdt))
805741 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)]
806742 else throw("Strict value is not equal to itself.")
807743 }
808744 else throw("Strict value is not equal to itself.")
809745 }
810746 else throw("Strict value is not equal to itself.")
811747 }
812748 else throw("Strict value is not equal to itself.")
813749 }
814750 }
815751 else throw("Strict value is not equal to itself.")
816752 }
817753
818754
819755
820756 @Callable(i)
821757 func checkWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
822758 let haveLabel = match getBoolean(keyWxEmission(amountAssetId, priceAssetId)) {
823759 case b: Boolean =>
824760 b
825761 case _ =>
826762 false
827763 }
828764 $Tuple2(nil, haveLabel)
829765 }
830766
831767
832768
833769 @Callable(i)
834770 func setWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
835771 let checkCaller = mustAdmin(i)
836772 if ((checkCaller == checkCaller))
837773 then $Tuple2([BooleanEntry(keyWxEmission(amountAssetId, priceAssetId), true)], unit)
838774 else throw("Strict value is not equal to itself.")
839775 }
840776
841777
842778
843779 @Callable(i)
844780 func deleteWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
845781 let checkCaller = if ((i.caller == this))
846782 then true
847783 else mustAdmin(i)
848784 if ((checkCaller == checkCaller))
849785 then $Tuple2([DeleteEntry(keyWxEmission(amountAssetId, priceAssetId))], unit)
850786 else throw("Strict value is not equal to itself.")
851787 }
852788
853789
854790
855791 @Callable(i)
856792 func onVerificationLoss (assetId) = {
857793 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyAssetsStoreContract()), "")))
858794 then true
859795 else mustManager(i)
860796 if ((checkCaller == checkCaller))
861797 then {
862798 let priceAssets = getPriceAssets()
863799 let checkPriceAssetsSize = if ((size(priceAssets) > 0))
864800 then true
865- else throwErr("invalid price assets")
801+ else throw("invalid price assets")
866802 if ((checkPriceAssetsSize == checkPriceAssetsSize))
867803 then {
868804 func cb (acc,priceAsset) = {
869805 let r = invoke(this, "deleteWxEmissionPoolLabel", [assetId, priceAsset], nil)
870806 if ((r == r))
871807 then unit
872808 else throw("Strict value is not equal to itself.")
873809 }
874810
875811 let actions = {
876812 let $l = priceAssets
877813 let $s = size($l)
878814 let $acc0 = unit
879815 func $f0_1 ($a,$i) = if (($i >= $s))
880816 then $a
881817 else cb($a, $l[$i])
882818
883819 func $f0_2 ($a,$i) = if (($i >= $s))
884820 then $a
885821 else throw("List size exceeds 13")
886822
887823 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13)
888824 }
889825 if ((actions == actions))
890826 then $Tuple2(nil, unit)
891827 else throw("Strict value is not equal to itself.")
892828 }
893829 else throw("Strict value is not equal to itself.")
894830 }
895831 else throw("Strict value is not equal to itself.")
896832 }
897833
898834
899835
900836 @Callable(i)
901837 func isPoolOneTokenOperationsDisabledREADONLY (poolAddress) = {
902838 let poolConfig = getPoolConfig(poolAddress)
903839 let assetsInternal = $Tuple2(parseIntValue(poolConfig[idxIAmtAssetId]), parseIntValue(poolConfig[idxIPriceAssetId]))
904840 let poolOneTokenOperationsDisabled = valueOrElse(getBoolean(keyPoolOneTokenOperationsDisabled(assetsInternal)), false)
905841 let allPoolsOneTokenOperationsDisabled = valueOrElse(getBoolean(keyAllPoolsOneTokenOperationsDisabled()), false)
906842 $Tuple2(nil, if (allPoolsOneTokenOperationsDisabled)
907843 then true
908844 else poolOneTokenOperationsDisabled)
909845 }
910846
911847
912848
913849 @Callable(i)
914850 func getInFeeREADONLY (poolAddress) = {
915851 let fee = intOrDefaultOrFallback(keyInFee(poolAddress), keyInFeeDefault(), 0)
916852 $Tuple2(nil, fee)
917853 }
918854
919855
920856
921857 @Callable(i)
922858 func getOutFeeREADONLY (poolAddress) = {
923859 let fee = intOrDefaultOrFallback(keyOutFee(poolAddress), keyOutFeeDefault(), fraction(10, MULT8, 10000))
924860 $Tuple2(nil, fee)
925861 }
926862
927863
928864
929865 @Callable(i)
930866 func getSwapFeeREADONLY (poolAddressStr) = {
931867 let feeOption = match getString(this, keySwapFee(poolAddressStr)) {
932868 case s: String =>
933869 let parts = split(s, SEP)
934870 let poolFee = parseIntValue(parts[1])
935871 let protocolFee = parseIntValue(parts[2])
936872 $Tuple2(poolFee, protocolFee)
937873 case _: Unit =>
938874 unit
939875 case _ =>
940876 throw("Match error")
941877 }
942878 $Tuple2(nil, feeOption)
943879 }
944880
945881
946882
947883 @Callable(i)
948884 func poolInfoREADONLY (amountAssetIdStr,priceAssetIdStr) = {
949885 let amountAssetInternalIdOption = getInteger(this, keyMappingsBaseAsset2internalId(amountAssetIdStr))
950886 let priceAssetInternalIdOption = getInteger(this, keyMappingsBaseAsset2internalId(priceAssetIdStr))
951887 let poolContractAddressOption = getString(this, keyMappingPoolAssetsToPoolContractAddress(value(amountAssetInternalIdOption), value(priceAssetInternalIdOption)))
952888 let lpAssetIdOption = getString(this, keyMappingPoolContractToLPAsset(value(poolContractAddressOption)))
953889 let poolExists = if (if (isDefined(amountAssetInternalIdOption))
954890 then isDefined(priceAssetInternalIdOption)
955891 else false)
956892 then isDefined(poolContractAddressOption)
957893 else false
958894 let poolInfo = if (poolExists)
959895 then $Tuple2(addressFromStringValue(value(poolContractAddressOption)), parseAssetId(value(lpAssetIdOption)))
960896 else unit
961897 $Tuple2(nil, poolInfo)
962898 }
963899
964900
965901
966902 @Callable(i)
967903 func getPoolStatusREADONLY (poolAddress) = {
968904 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
969905 let amountAssetInternal = poolAssets[1]
970906 let priceAssetInternal = poolAssets[2]
971907 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
972908 $Tuple2(nil, parseIntValue(cfg[idxPoolStatus]))
973909 }
974910
975911
976912
977913 @Callable(i)
978914 func getPoolConfigREADONLY (poolAddress) = {
979915 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
980916 let amountAssetInternal = poolAssets[1]
981917 let priceAssetInternal = poolAssets[2]
982918 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
983919 $Tuple2(nil, cfg)
984920 }
985921
986922
987923
988924 @Callable(i)
989925 func getPoolConfigByLpAssetIdREADONLY (lpAssetIdStr) = {
990926 let poolAssets = split(getStringOrFail(keyMappingLpAssetToPoolAssets(lpAssetIdStr)), SEP)
991927 let amountAssetInternal = poolAssets[1]
992928 let priceAssetInternal = poolAssets[2]
993929 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
994930 $Tuple2(nil, cfg)
995931 }
996932
997933
998934
999935 @Callable(i)
1000936 func poolExistsREADONLY (amountAssetId,priceAssetId) = $Tuple2(nil, poolExistsInternal(amountAssetId, priceAssetId))
1001937
1002938
1003939
1004940 @Callable(i)
1005941 func skipOrderValidationREADONLY (poolAddress) = $Tuple2(nil, valueOrElse(getBoolean(keySkipOrderValidation(poolAddress)), false))
1006942
1007943
1008944
1009945 @Callable(i)
1010946 func getChangeAmpConfigREADONLY (poolAddress) = {
1011947 let delay = getIntegerValue(keyChangeAmpDelay(poolAddress))
1012948 let delta = getIntegerValue(keyChangeAmpDelta(poolAddress))
1013949 let target = getIntegerValue(keyChangeAmpTarget(poolAddress))
1014950 $Tuple2(nil, [delay, delta, target])
1015951 }
1016952
1017953
1018954
1019955 @Callable(i)
1020956 func getPoolWeightREADONLY (lpAssetId) = {
1021957 let poolAddress = getStringOrFail(keyMappingPoolLPAssetToPoolContractAddress(lpAssetId))
1022958 let weight = valueOrElse(getInteger(keyPoolToWeight(poolAddress)), 0)
1023959 $Tuple2(nil, weight)
1024960 }
1025961
1026962
1027-
1028-@Callable(i)
1029-func deletePool (poolContractAddress) = {
1030- let poolConfig = getPoolConfig(poolContractAddress)
1031- let checkCaller = if ((toString(i.caller) == getPoolCreator(poolContractAddress)))
1032- then if (isPoolEmpty(poolContractAddress))
1033- then true
1034- else throwErr("Pool is not empty")
1035- else mustManager(i)
1036- if ((checkCaller == checkCaller))
1037- then {
1038- let checkWeight = if ((valueOrElse(getInteger(keyPoolToWeight(poolContractAddress)), 0) == 0))
1039- then true
1040- else throwErr("Pool weight is not Zero")
1041- if ((checkWeight == checkWeight))
1042- then {
1043- let checkStatus = if ((poolConfig[idxPoolStatus] == toString(PoolShutdown)))
1044- then true
1045- else throwErr("Pool must be SHUTDOWN (4)")
1046- if ((checkStatus == checkStatus))
1047- then {
1048- let $t03961739754 = getAssetsDataFromPoolAddress(poolContractAddress)
1049- let amountAssetId = $t03961739754._1
1050- let priceAssetId = $t03961739754._2
1051- let lpAssetId = $t03961739754._3
1052- let amountAssetInternal = $t03961739754._4
1053- let priceAssetInternal = $t03961739754._5
1054- let userPoolsContract = addressFromStringValue(getStringValue(keyUserPoolsContract()))
1055- let userPoolsInvoke = invoke(userPoolsContract, "deletePool", [amountAssetId, priceAssetId], nil)
1056- if ((userPoolsInvoke == userPoolsInvoke))
1057- then {
1058- let votingEmissionContract = addressFromStringValue(getStringValue(keyVotingEmissionContract()))
1059- let votingEmissionInvoke = invoke(votingEmissionContract, "deletePool", [amountAssetId, priceAssetId], nil)
1060- if ((votingEmissionInvoke == votingEmissionInvoke))
1061- then {
1062- let assetsStoreContract = addressFromStringValue(getStringValue(keyAssetsStoreContract()))
1063- let assetsStoreInvoke = invoke(assetsStoreContract, "deletePool", [amountAssetId, priceAssetId], nil)
1064- if ((assetsStoreInvoke == assetsStoreInvoke))
1065- then [DeleteEntry(keyMappingPoolContractToLPAsset(poolContractAddress)), DeleteEntry(keyMappingPoolContractAddressToPoolAssets(poolContractAddress)), DeleteEntry(keyMappingPoolAssetsToLpasset(toString(amountAssetInternal), toString(priceAssetInternal))), DeleteEntry(keyMappingPoolAssetsToPoolContractAddress(amountAssetInternal, priceAssetInternal)), DeleteEntry(keyPoolConfig(toString(amountAssetInternal), toString(priceAssetInternal))), DeleteEntry(keyMappingLpAssetToPoolAssets(lpAssetId)), DeleteEntry(keyMappingPoolLPAssetToPoolContractAddress(lpAssetId)), DeleteEntry(keyWxEmission(amountAssetId, priceAssetId)), DeleteEntry(keyPoolToWeight(poolContractAddress)), DeleteEntry(keyPoolSpread(poolContractAddress)), DeleteEntry(keyInFee(poolContractAddress)), DeleteEntry(keyOutFee(poolContractAddress)), DeleteEntry(keySkipOrderValidation(poolContractAddress)), DeleteEntry(keyChangeAmpDelay(poolContractAddress)), DeleteEntry(keyChangeAmpDelta(poolContractAddress)), DeleteEntry(keyChangeAmpTarget(poolContractAddress))]
1066- else throw("Strict value is not equal to itself.")
1067- }
1068- else throw("Strict value is not equal to itself.")
1069- }
1070- else throw("Strict value is not equal to itself.")
1071- }
1072- else throw("Strict value is not equal to itself.")
1073- }
1074- else throw("Strict value is not equal to itself.")
1075- }
1076- else throw("Strict value is not equal to itself.")
1077- }
1078-
1079-
1080963 @Verifier(tx)
1081964 func verify () = {
1082965 let targetPublicKey = match managerPublicKeyOrUnit() {
1083966 case pk: ByteVector =>
1084967 pk
1085968 case _: Unit =>
1086969 tx.senderPublicKey
1087970 case _ =>
1088971 throw("Match error")
1089972 }
1090973 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
1091974 }
1092975

github/deemru/w8io/3ef1775 
172.45 ms