tx · BBHpcy3MTZPjYp2kx7aJK39Nw1FD1fqDJ9C8ScAxy8T

3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai:  -0.02200000 Waves

2023.02.09 12:02 [2441896] smart account 3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai > SELF 0.00000000 Waves

{ "type": 13, "id": "BBHpcy3MTZPjYp2kx7aJK39Nw1FD1fqDJ9C8ScAxy8T", "fee": 2200000, "feeAssetId": null, "timestamp": 1675933390823, "version": 1, "sender": "3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai", "senderPublicKey": "2JEaBjtjvMoNGKZmL9QxYefa1VkMJM3vMW8rNvTs9R2H", "proofs": [ "5HtLx1wm674nMDAG2bRGmfz6nFPwfr2RJkZE1h8QU4h9rwhW8vuACvBd2sMUpP3ENYMGR8A61qmNYFfNsdzfihEJ" ], "script": "base64:BgLlJQgCEgASBAoCCAgSAwoBCBIKCggICAgICAgIARIDCgEIEgYKBAgICAgSBAoCCBgSAwoBCBIECgIIGBIDCgEIEgASAwoBGBIKCggICAgICAEICBIECgIIARIDCgEBEgMKAQESBAoCCAESBgoECAgICBIECgIICBIECgIICBIECgIICBIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgiBlNDQUxFOCIFTVVMVDgiB1NDQUxFMTgiBk1VTFQxOCIOUE9PTFdFSUdIVE1VTFQiDkdXWHZpcnR1YWxQT09MIgxsYWJlbFBvb2xzTHAiDWRlZmF1bHRTcHJlYWQiEWRlY2ltYWxzTXVsdFByaWNlIgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIg9Qb29sUHV0RGlzYWJsZWQiE1Bvb2xNYXRjaGVyRGlzYWJsZWQiDFBvb2xTaHV0ZG93biISaWR4SW50ZXJuYWxBc3NldElkIg9pZHhSZXN1dEFjdGlvbnMiIGlkeElmQXNzZXRJZENhbGN1bGF0aW9uUGVyZm9ybWVkIg5pZHhQb29sQWRkcmVzcyINaWR4UG9vbFN0YXR1cyIQaWR4UG9vbExQQXNzZXRJZCINaWR4QW10QXNzZXRJZCIPaWR4UHJpY2VBc3NldElkIg5pZHhBbXRBc3NldERjbSIQaWR4UHJpY2VBc3NldERjbSIOaWR4SUFtdEFzc2V0SWQiEGlkeElQcmljZUFzc2V0SWQiDWlkeExQQXNzZXREY20iC2lkeFBvb2xUeXBlIhNwb29sTGFiZWxXeEVtaXNzaW9uIg92YWxpZFBvb2xMYWJlbHMiFmtleUFsbG93ZWRMcFNjcmlwdEhhc2giHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giIWtleUFsbG93ZWRMcFN0YWJsZUFkZG9uU2NyaXB0SGFzaCIMc3dhcENvbnRyYWN0IhBrZXlGYWN0b3J5Q29uZmlnIg9rZXlMcFRva2Vuc0xpc3QiEWtleVBvb2xTY3JpcHRIYXNoIg1rZXlNYXRjaGVyUHViIhhrZXlMZWdhY3lGYWN0b3J5Q29udHJhY3QiDmtleUxlZ2FjeVBvb2xzIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIPa2V5QWRtaW5QdWJLZXlzIhZrZXlBc3NldHNTdG9yZUNvbnRyYWN0IhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0Ig5rZXlQcmljZUFzc2V0cyIQa2V5UHJpY2VEZWNpbWFscyITa2V5QWxsUG9vbHNTaHV0ZG93biIWa2V5TmV4dEludGVybmFsQXNzZXRJZCIPa2V5UG9vbFRvV2VpZ2h0Igtwb29sQWRkcmVzcyIWa2V5UG9vbFRvV2VpZ2h0SGlzdG9yeSIDbnVtIh9rZXlNYXBwaW5nc0ludGVybmFsMmJhc2VBc3NldElkIhFpbnRlcm5hbEJhc2VBc3NldCIfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZCIMYmFzZUFzc2V0U3RyIg1rZXlQb29sQ29uZmlnIhNhbW91bnRBc3NldEludGVybmFsIhJwcmljZUFzc2V0SW50ZXJuYWwiIWtleVBvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZCIOYXNzZXRzSW50ZXJuYWwiCyR0MDM3MDAzNzYyIiVrZXlBbGxQb29sc09uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIh1rZXlNYXBwaW5nTHBBc3NldFRvUG9vbEFzc2V0cyIKbHBBc3NldFN0ciIda2V5TWFwcGluZ1Bvb2xBc3NldHNUb0xwYXNzZXQiGGludGVybmFsQW1vdW50QXNzZXRJZFN0ciIXaW50ZXJuYWxQcmljZUFzc2V0SWRTdHIiDWtleVBvb2xTcHJlYWQiKWtleU1hcHBpbmdQb29sQ29udHJhY3RBZGRyZXNzVG9Qb29sQXNzZXRzIhNwb29sQ29udHJhY3RBZGRyZXNzIilrZXlNYXBwaW5nUG9vbEFzc2V0c1RvUG9vbENvbnRyYWN0QWRkcmVzcyIfa2V5TWFwcGluZ1Bvb2xDb250cmFjdFRvTFBBc3NldCIqa2V5TWFwcGluZ1Bvb2xMUEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzIg1rZXlXeEVtaXNzaW9uIg1hbW91bnRBc3NldElkIgxwcmljZUFzc2V0SWQiCGtleUluRmVlIg9rZXlJbkZlZURlZmF1bHQiCWtleU91dEZlZSIQa2V5T3V0RmVlRGVmYXVsdCIPZ2V0U3RyaW5nT3JGYWlsIgNrZXkiEGdldEJvb2xlYW5PckZhaWwiDGdldEludE9yRmFpbCIYSWR4RmFjdG9yeUNmZ1N0YWtpbmdEYXBwIhlJZHhGYWN0b3J5Q2ZnQm9vc3RpbmdEYXBwIhRJZHhGYWN0b3J5Q2ZnSWRvRGFwcCIVSWR4RmFjdG9yeUNmZ1RlYW1EYXBwIhlJZHhGYWN0b3J5Q2ZnRW1pc3Npb25EYXBwIhVJZHhGYWN0b3J5Q2ZnUmVzdERhcHAiGUlkeEZhY3RvcnlDZmdTbGlwcGFnZURhcHAiFElkeEZhY3RvcnlDZmdEYW9EYXBwIhpJZHhGYWN0b3J5Q2ZnTWFya2V0aW5nRGFwcCIaSWR4RmFjdG9yeUNmZ0d3eFJld2FyZERhcHAiFklkeEZhY3RvcnlDZmdCaXJkc0RhcHAiGGdldEJvb3N0aW5nQWRkcmVzc09yRmFpbCIKZmFjdG9yeUNmZyIYZ2V0RW1pc3Npb25BZGRyZXNzT3JGYWlsIhdnZXRTdGFraW5nQWRkcmVzc09yRmFpbCIZZ2V0R3d4UmV3YXJkQWRkcmVzc09yRmFpbCIOZ2V0UHJpY2VBc3NldHMiByRtYXRjaDAiAXMiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0IhVwZXJtaXNzaW9uRGVuaWVkRXJyb3IiCXRlc3RFcnJvciIIbXVzdFRoaXMiAWkiC211c3RNYW5hZ2VyIgJwayIQZGF0YUZhY3RvcnlDZmdWMyIOc3Rha2luZ0FkZHJlc3MiD2Jvb3N0aW5nQWRkcmVzcyILaWRvQ29udHJhY3QiDHRlYW1Db250cmFjdCIQZW1pc3Npb25Db250cmFjdCIMcmVzdENvbnRyYWN0IhBzbGlwcGFnZUNvbnRyYWN0IgtkYW9Db250cmFjdCIRbWFya2V0aW5nQ29udHJhY3QiEmd3eFJld2FyZHNDb250cmFjdCINYmlyZHNDb250cmFjdCIOZGF0YUZhY3RvcnlDZmciC2RhdGFQb29sQ2ZnIgpwb29sU3RhdHVzIglscEFzc2V0SWQiDmFtb3VudEFzc2V0U3RyIg1wcmljZUFzc2V0U3RyIhNhbW91bnRBc3NldERlY2ltYWxzIhJwcmljZUFzc2V0RGVjaW1hbHMiFWFtb3VudEFzc2V0SW50ZXJuYWxJZCIUcHJpY2VBc3NldEludGVybmFsSWQiD2xwQXNzZXREZWNpbWFscyIIcG9vbFR5cGUiFWRhdGFNYXBwaW5nUG9vbEFzc2V0cyIWaW50ZXJuYWxBbW91bnRBc3NldFN0ciIVaW50ZXJuYWxQcmljZUFzc2V0U3RyIg1nZXRQb29sQ29uZmlnIgpwb29sQXNzZXRzIhpnZXRJbnRlcm5hbEFzc2V0SWRPckNyZWF0ZSIKYXNzZXRJZFN0ciILaW5jcmVtZW50b3IiD2ludGVybmFsQXNzZXRJZCIYY3VycmVudEluZGV4T2ZJbnRlcm5hbElkIgZyZXN1bHQiEm5ld0ludGVybmFsQXNzZXRJZCIJbXVzdEFkbWluIghhZG1pblBLcyIJaXNNYW5hZ2VyIhZpbnRPckRlZmF1bHRPckZhbGxiYWNrIgprZXlEZWZhdWx0Ig12YWx1ZUZhbGxiYWNrIgZhc3NldDEiBmFzc2V0MiIJYXNzZXROdW0xIglhc3NldE51bTIiAmVlIgNyZXMiAmxwIg9zdGFraW5nQ29udHJhY3QiEGJvb3N0aW5nQ29udHJhY3QiEHNscGlwYWdlQ29udHJhY3QiDXByaWNlRGVjaW1hbHMiC2NoZWNrQ2FsbGVyIhBtYXRoY2hlclB1YjU4U3RyIgptYXRoY2VyUHViIhVsZWdhY3lGYWN0b3J5Q29udHJhY3QiC2xlZ2FjeVBvb2xzIhNhc3NldHNTdG9yZUNvbnRyYWN0IhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0IgtwcmljZUFzc2V0cyIFY2hla3MiF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5IhVjaGVja01hbmFnZXJQdWJsaWNLZXkiAnBtIgVoYXNQTSIHY2hlY2tQTSIMYWRtaW5QdWJLZXlzIgtscEFzc2V0TmFtZSIMbHBBc3NldERlc2NyIgpwb29sV2VpZ2h0IgRsb2dvIhdpbnRlcm5hbEFtb3VudEFzc2V0RGF0YSIVaW50ZXJuYWxBbW91bnRBc3NldElkIhZpbnRlcm5hbFByaWNlQXNzZXREYXRhIhRpbnRlcm5hbFByaWNlQXNzZXRJZCIVcG9vbEFjY291bnRTY3JpcHRIYXNoIhxldGhhbG9uUG9vbEFjY291bnRTY3JpcHRIYXNoIgpwb29sQ29uZmlnIg9wb29sQ29uZmlnVmFsdWUiFGFtb3VudEFzc2V0c0RlY2ltYWxzIhNwcmljZUFzc2V0c0RlY2ltYWxzIhJscEFzc2V0SXNzdWVBY3Rpb24iDGxwQXNzZXRJZFN0ciIYcG9vbEFjdGl2YXRlSW52b2tlUmVzdWx0IhhjcmVhdGVPclVwZGF0ZUxwQXNzZXRJbnYiEmFkZFBvb2xzTHBMYWJlbEludiIKc2V0TG9nb0ludiIQYWRkQXNzZXRzTGlua0ludiIbaW5jcmVhc2VBc3NldFBvb2xzTnVtYmVySW52IgluZXdTdGF0dXMiCmxwQXNzZXREY20iDGFtb3VudFRvRW1pdCIGY2FsbGVyIgxvcmlnaW5DYWxsZXIiEGxwQXNzZXRSZXF1ZXN0ZWQiB2xwQXNzZXQiDGFtb3VudFRvQnVybiIHcGF5bWVudCINcGF5bWVudEFtb3VudCIPaW5BbW91bnRBc3NldElkIhpscEFzc2V0UmVxdWVzdGVkRm9yQnVybmluZyIFc2hhcmUiDXBvb2xXZWlnaHRLZXkiDGd3eFdlaWdodEtleSIJZ3d4V2VpZ2h0Ig1wb29sV2VpZ2h0TmV3IhFvbk1vZGlmeVdlaWdodEludiIVZ3d4VmlydHVhbFBvb2xBY3Rpb25zIhRwb29sV2VpZ2h0SGlzdG9yeUtleSIXcG9vbFdlaWdodEhpc3RvcnlPclVuaXQiGHBvb2xXZWlnaHRIaXN0b3J5QWN0aW9ucyIOYnRjUG9vbEFkZHJlc3MiDmV0aFBvb2xBZGRyZXNzIhFldGhCdGNQb29sQWRkcmVzcyITdXNkY1VzZHRQb29sQWRkcmVzcyIPZXRoQnRjV2VpZ2h0TmV3IhF1c2RjVXNkdFdlaWdodE5ldyIPd2VpZ2h0RGVjcmVtZW50IgtzdGFraW5nRGFwcCINZ3d4UmV3YXJkRGFwcCIMYnRjV2VpZ2h0S0VZIgxldGhXZWlnaHRLRVkiD2V0aEJ0Y1dlaWdodEtFWSIRdXNkY1VzZHRXZWlnaHRLRVkiCWJ0Y1dlaWdodCIJZXRoV2VpZ2h0IgxidGNXZWlnaHROZXciDGV0aFdlaWdodE5ldyIPYnRjTHBBc3NldElkU3RyIg9ldGhMcEFzc2V0SWRTdHIiEmV0aEJ0Y0xwQXNzZXRJZFN0ciIUdXNkY1VzZHRMcEFzc2V0SWRTdHIiEW9uTW9kaWZ5V2VpZ2h0QnRjIhFvbk1vZGlmeVdlaWdodEV0aCIUb25Nb2RpZnlXZWlnaHRFdGhCdGMiFm9uTW9kaWZ5V2VpZ2h0VXNkY1VzZHQiCWhhdmVMYWJlbCIBYiIHYXNzZXRJZCIUY2hlY2tQcmljZUFzc2V0c1NpemUiAmNiIgNhY2MiCnByaWNlQXNzZXQiAXIiB2FjdGlvbnMiAiRsIgIkcyIFJGFjYzAiBSRmMF8xIgIkYSICJGkiBSRmMF8yIh5wb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiImFsbFBvb2xzT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiA2ZlZSIDY2ZnIgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXlmAAFhAAgAAWIAgMLXLwABYwASAAFkCQC2AgEAgICQu7rWrfANAAFlBQFiAAFmAg5HV1h2aXJ0dWFsUE9PTAABZwIIUE9PTFNfTFAAAWgAgIl6AAFpCQBoAgkAaAIAZADoBwDoBwABagICX18AAWsCAAABbAABAAFtAAIAAW4AAwABbwAEAAFwAAEAAXEAAgABcgADAAFzAAEAAXQAAgABdQADAAF2AAQAAXcABQABeAAGAAF5AAcAAXoACAABQQAJAAFCAAoAAUMACwABRAILV1hfRU1JU1NJT04AAUUJAMwIAgUBRAUDbmlsAQFGAAIXJXNfX2FsbG93ZWRMcFNjcmlwdEhhc2gBAUcAAh0lc19fYWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaAEBSAACIiVzX19hbGxvd2VkTHBTdGFibGVBZGRvblNjcmlwdEhhc2gBAUkAAhAlc19fc3dhcENvbnRyYWN0AQFKAAIRJXNfX2ZhY3RvcnlDb25maWcBAUsAAhAlc19fbHBUb2tlbnNMaXN0AQFMAAIWJXMlc19fcG9vbF9fc2NyaXB0SGFzaAEBTQACGCVzJXNfX21hdGNoZXJfX3B1YmxpY0tleQEBTgACGSVzX19sZWdhY3lGYWN0b3J5Q29udHJhY3QBAU8AAg8lc19fbGVnYWN5UG9vbHMBAVAAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBUQACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBUgACECVzX19hZG1pblB1YktleXMBAVMAAhclc19fYXNzZXRzU3RvcmVDb250cmFjdAEBVAACGiVzX192b3RpbmdFbWlzc2lvbkNvbnRyYWN0AQFVAAkAuQkCCQDMCAICAiVzCQDMCAICC3ByaWNlQXNzZXRzBQNuaWwFAWoBAVYAAhElc19fcHJpY2VEZWNpbWFscwEBVwACDCVzX19zaHV0ZG93bgEBWAACFyVzX19uZXh0SW50ZXJuYWxBc3NldElkAQFZAQFaCQCsAgICEiVzJXNfX3Bvb2xXZWlnaHRfXwUBWgECYWECAVoCYWIJAKwCAgkArAICCQCsAgICEiVzJXNfX3Bvb2xXZWlnaHRfXwUBWgICX18JAKQDAQUCYWIBAmFjAQJhZAkArAICAiglcyVzJWRfX21hcHBpbmdzX19pbnRlcm5hbDJiYXNlQXNzZXRJZF9fCQCkAwEFAmFkAQJhZQECYWYJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYWYBAmFnAgJhaAJhaQkArAICCQCsAgIJAKwCAgkArAICAgglZCVkJXNfXwUCYWgCAl9fBQJhaQIIX19jb25maWcBAmFqAQJhawQCYWwFAmFrBAJhaAgFAmFsAl8xBAJhaQgFAmFsAl8yCQC5CQIJAMwIAgIGJWQlZCVzCQDMCAIJAKQDAQUCYWgJAMwIAgkApAMBBQJhaQkAzAgCAhpvbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAUDbmlsBQFqAQJhbQAJALkJAgkAzAgCAgIlcwkAzAgCAhpvbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAUDbmlsBQFqAQJhbgECYW8JAKwCAgkArAICAgglcyVzJXNfXwUCYW8CGF9fbWFwcGluZ3NfX2xwQXNzZXQyUG9vbAECYXACAmFxAmFyCQCsAgIJAKwCAgkArAICCQCsAgICCiVkJWQlcyVzX18FAmFxAgJfXwUCYXICHl9fbWFwcGluZ3NfX1Bvb2xBc3NldHMyTHBBc3NldAECYXMBAVoJAKwCAgIOJXMlc19fc3ByZWFkX18FAVoBAmF0AQJhdQkArAICCQCsAgICCCVzJXMlc19fBQJhdQIjX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MlBvb2xBc3NldHMBAmF2AgJhcQJhcgkArAICCQCsAgIJAKwCAgkArAICAgolZCVkJXMlc19fCQCkAwEFAmFxAgJfXwkApAMBBQJhcgIjX19tYXBwaW5nc19fcG9vbEFzc2V0czJQb29sQ29udHJhY3QBAmF3AQJhdQkArAICCQCsAgICCCVzJXMlc19fBQJhdQIgX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MkxwQXNzZXQBAmF4AQJhbwkArAICCQCsAgICCCVzJXMlc19fBQJhbwIgX19tYXBwaW5nc19fbHBBc3NldDJQb29sQ29udHJhY3QBAmF5AgJhegJhQQkArAICCQCsAgIJAKwCAgIUJXMlcyVzX193eEVtaXNzaW9uX18FAmF6AgJfXwUCYUEBAmFCAQFaCQCsAgICDSVzJXNfX2luRmVlX18FAVoBAmFDAAIQJXNfX2luRmVlRGVmYXVsdAECYUQBAVoJAKwCAgIOJXMlc19fb3V0RmVlX18FAVoBAmFFAAIRJXNfX291dEZlZURlZmF1bHQBAmFGAQJhRwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFAmFHCQCsAgICFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUCYUcBAmFIAQJhRwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCbCAIFBHRoaXMFAmFHCQCsAgICFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUCYUcBAmFJAQJhRwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAmFHCQCsAgICFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUCYUcAAmFKAAEAAmFLAAIAAmFMAAMAAmFNAAQAAmFOAAUAAmFPAAYAAmFQAAcAAmFRAAgAAmFSAAkAAmFTAAoAAmFUAAsBAmFVAQJhVgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhVgUCYUsBAmFXAQJhVgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhVgUCYU4BAmFYAQJhVgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhVgUCYUoBAmFZAQJhVgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhVgUCYVMBAmFaAAQCYmEJAKIIAQkBAVUAAwkAAQIFAmJhAgZTdHJpbmcEAmJiBQJiYQMJAAACCQCxAgEFAmJiAAAFA25pbAkAtQkCBQJiYgUBagUDbmlsAQJiYwAEAmJhCQCiCAEJAQFQAAMJAAECBQJiYQIGU3RyaW5nBAJiYgUCYmEJANkEAQUCYmIDCQABAgUCYmECBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECYmQABAJiYQkAoggBCQEBUQADCQABAgUCYmECBlN0cmluZwQCYmIFAmJhCQDZBAEFAmJiAwkAAQIFAmJhAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAAmJlCQACAQIRUGVybWlzc2lvbiBkZW5pZWQAAmJmCQACAQIPVGVzdCBlcnJvciBoZXJlAQJiZwECYmgDCQAAAggFAmJoBmNhbGxlcgUEdGhpcwYFAmJlAQJiaQECYmgEAmJhCQECYmMAAwkAAQIFAmJhAgpCeXRlVmVjdG9yBAJiagUCYmEDCQAAAggFAmJoD2NhbGxlclB1YmxpY0tleQUCYmoGBQJiZQMJAAECBQJiYQIEVW5pdAkBAmJnAQUCYmgJAAIBAgtNYXRjaCBlcnJvcgECYmsLAmJsAmJtAmJuAmJvAmJwAmJxAmJyAmJzAmJ0AmJ1AmJ2CQC5CQIJAMwIAgIWJXMlcyVzJXMlcyVzJXMlcyVzJXMlcwkAzAgCBQJibAkAzAgCBQJibQkAzAgCBQJibgkAzAgCBQJibwkAzAgCBQJicAkAzAgCBQJicQkAzAgCBQJicgkAzAgCBQJicwkAzAgCBQJidAkAzAgCBQJidQkAzAgCBQJidgUDbmlsBQFqAQJidwcCYmwCYm0CYm4CYm8CYnACYnECYnIJALkJAgkAzAgCAgwlcyVzJXMlcyVzJXMJAMwIAgUCYmwJAMwIAgUCYm0JAMwIAgUCYm4JAMwIAgUCYm8JAMwIAgUCYnAJAMwIAgUCYnEJAMwIAgUCYnIFA25pbAUBagECYngLAVoCYnkCYnoCYkECYkICYkMCYkQCYkUCYkYCYkcCYkgJALkJAgkAzAgCAhYlcyVkJXMlcyVzJWQlZCVkJWQlZCVzCQDMCAIFAVoJAMwIAgUCYnkJAMwIAgUCYnoJAMwIAgUCYkEJAMwIAgUCYkIJAMwIAgkApAMBBQJiQwkAzAgCCQCkAwEFAmJECQDMCAIJAKQDAQUCYkUJAMwIAgkApAMBBQJiRgkAzAgCCQCkAwEFAmJHCQDMCAIFAmJIBQNuaWwFAWoBAmJJAgJiSgJiSwkAuQkCCQDMCAICBCVkJWQJAMwIAgkApAMBBQJiSgkAzAgCCQCkAwEFAmJLBQNuaWwFAWoBAmJMAQFaBAJiTQkAtQkCCQECYUYBCQECYXQBBQFaBQFqBAJhaAkAkQMCBQJiTQABBAJhaQkAkQMCBQJiTQACCQC1CQIJAQJhRgEJAQJhZwIFAmFoBQJhaQUBagECYk4CAmJPAmJQBAJiUQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYWUBBQJiTwAABAJiUgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBWAAAAAQCYlMDCQAAAgUCYlEAAAQCYlQJAGQCBQJiUgUCYlAJAJUKAwUCYlQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAAUCYlQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhZQEFAmJPBQJiVAkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMBBQJiVAUCYk8FA25pbAYJAJUKAwUCYlEFA25pbAcFAmJTAQJiVQECYmgEAmJWCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBAVIABQFrBQFqAwkBD2NvbnRhaW5zRWxlbWVudAIFAmJWCQDYBAEIBQJiaA9jYWxsZXJQdWJsaWNLZXkGBAJiVwkBAmJpAQUCYmgDCQAAAgUCYlcFAmJXBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECYlgDAmFHAmJZAmJaCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFHCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmJZBQJiWhoCYmgBF2dldFN3YXBDb250cmFjdFJFQURPTkxZAAkAlAoCBQNuaWwJAQJhRgEJAQFJAAJiaAEgZ2V0THBBc3NldEZyb21Qb29sQXNzZXRzUkVBRE9OTFkCAmNhAmNiBAJjYwkBBXZhbHVlAQkAmggCBQR0aGlzCQECYWUBBQJjYQQCY2QJAQV2YWx1ZQEJAJoIAgUEdGhpcwkBAmFlAQUCY2IEAmNlCQCdCAIFBHRoaXMJAQJhcAIJAKQDAQUCY2MJAKQDAQUCY2QEAmNmAwkAAAIFAmNlBQR1bml0BQR1bml0CQCwAgIJAQV2YWx1ZQEFAmNlAAQJAJQKAgUDbmlsBQJjZgJiaAEhZ2V0UG9vbEFkZHJlc3NGcm9tTHBBc3NldFJFQURPTkxZAQJjZwkAlAoCBQNuaWwJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAmF4AQUCY2cCAAJiaAELY29uc3RydWN0b3IIAmNoAmNpAmJuAmJvAmJwAmJxAmNqAmNrBAJjbAkBAmJpAQUCYmgDCQAAAgUCY2wFAmNsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFKAAkBAmJ3BwUCY2gFAmNpBQJibgUCYm8FAmJwBQJicQUCY2oJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAAUCY2sFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAENY29uc3RydWN0b3JWMgECY20EAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wEAmNuCQCnCAEJANkEAQUCY20DCQAAAgUCY24FAmNuCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFNAAUCY20FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAENY29uc3RydWN0b3JWMwQCYnMCYnQCYnUCYnYEAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wEAmFWCQC1CQIJAQJhRgEJAQFKAAUBagkAzAgCCQELU3RyaW5nRW50cnkCCQEBSgAJAQJiawsJAJEDAgUCYVYAAQkAkQMCBQJhVgACCQCRAwIFAmFWAAMJAJEDAgUCYVYABAkAkQMCBQJhVgAFCQCRAwIFAmFWAAYJAJEDAgUCYVYABwUCYnMFAmJ0BQJidQUCYnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAENY29uc3RydWN0b3JWNAICY28CY3AEAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU4ABQJjbwkAzAgCCQELU3RyaW5nRW50cnkCCQEBTwAJALkJAgUCY3AFAWoFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAENY29uc3RydWN0b3JWNQECY3EEAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMABQJjcQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQ1jb25zdHJ1Y3RvclY2AgJjcgJjcwQCY3QJAMwIAgkBAmJpAQUCYmgJAMwIAgMJAQIhPQIJAKYIAQUCY3IFBHVuaXQGAihpbnZhbGlkIHZvdGluZyBlbWlzc2lvbiBjb250cmFjdCBhZGRyZXNzBQNuaWwDCQAAAgUCY3QFAmN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAAUCY3IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUACQC5CQIFAmNzBQFqBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmgBCnNldE1hbmFnZXIBAmN1BAJjbAkBAmJpAQUCYmgDCQAAAgUCY2wFAmNsBAJjdgkA2QQBBQJjdQMJAAACBQJjdgUCY3YJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVEABQJjdQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQ5jb25maXJtTWFuYWdlcgAEAmN3CQECYmQABAJjeAMJAQlpc0RlZmluZWQBBQJjdwYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCY3gFAmN4BAJjeQMJAAACCAUCYmgPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJjdwYJAAIBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCY3kFAmN5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFQAAkA2AQBCQEFdmFsdWUBBQJjdwkAzAgCCQELRGVsZXRlRW50cnkBCQEBUQAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAEJc2V0QWRtaW5zAQJjegQCY2wJAQJiaQEFAmJoAwkAAAIFAmNsBQJjbAkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgAJALkJAgUCY3oFAWoFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAEPYWN0aXZhdGVOZXdQb29sCAFaAmJBAmJCAmNBAmNCAmNDAmJIAmNEBAJjbAkBAmJVAQUCYmgDCQAAAgUCY2wFAmNsAwkBCWlzRGVmaW5lZAEJAKIIAQkBAmF0AQUBWgkAAgEJAKwCAgkArAICAg1Qb29sIGFkZHJlc3MgBQFaAhQgYWxyZWFkeSByZWdpc3RlcmVkLgQCY0UJAQJiTgIFAmJBAAEEAmNGCAUCY0UCXzEEAmNHCQECYk4CBQJiQgMIBQJjRQJfMwACAAEEAmNICAUCY0cCXzEEAmNJCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAPEHAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUBWgkArAICAilObyBzY3JpcHQgaGFzIGJlZW4gZm91bmQgb24gcG9vbCBhY2NvdW50IAUBWgQCY0oJARFAZXh0ck5hdGl2ZSgxMDU3KQEJAQFMAAQCY0sJAJ0IAgUEdGhpcwkBAmFnAgkApAMBBQJjRgkApAMBBQJjSAMJAQlpc0RlZmluZWQBBQJjSwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIFUG9vbCAFAmJBAgEvBQJiQgIcIGhhcyBhbHJlYWR5IGJlZW4gYWN0aXZhdGVkLgQCY0wJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkBAmFnAgkApAMBBQJjRgkApAMBBQJjSAQCY00DCQAAAgUCYkECBVdBVkVTBQFpCQBsBgAKAAAICQEFdmFsdWUBCQDsBwEJANkEAQUCYkEIZGVjaW1hbHMAAAAABQRET1dOBAJjTgMJAAACBQJiQgIFV0FWRVMFAWkJAGwGAAoAAAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQJiQghkZWNpbWFscwAAAAAFBERPV04EAmNPCQDCCAUFAmNBBQJjQgABAAgGBAJiegkAuAgBBQJjTwQCY1AJANgEAQUCYnoEAmNRCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAVoCCGFjdGl2YXRlCQDMCAIFAmJBCQDMCAIFAmJCBQNuaWwFA25pbAMJAAACBQJjUQUCY1EDCQECIT0CBQJjUQIHc3VjY2VzcwkAAgECI1Bvb2wgaW5pdGlhbGlzYXRpb24gZXJyb3IgaGFwcGVuZWQuBAJjcQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFGAQkBAVMABAJjUgkA/AcEBQJjcQIOY3JlYXRlT3JVcGRhdGUJAMwIAgUCY1AJAMwIAgUCY0EJAMwIAgcFA25pbAUDbmlsAwkAAAIFAmNSBQJjUgQCY1MJAPwHBAUCY3ECCGFkZExhYmVsCQDMCAIFAmNQCQDMCAIFAWcFA25pbAUDbmlsAwkAAAIFAmNTBQJjUwQCY1QJAPwHBAUCY3ECB3NldExvZ28JAMwIAgUCY1AJAMwIAgUCY0QFA25pbAUDbmlsAwkAAAIFAmNUBQJjVAQCY1UJAPwHBAUCY3ECDWFkZEFzc2V0c0xpbmsJAMwIAgUCYkEJAMwIAgUCYkIJAMwIAgUCY1AFA25pbAUDbmlsAwkAAAIFAmNVBQJjVQQCY1YJAPwHBAUCY3ECGGluY3JlYXNlQXNzZXRQb29sc051bWJlcgkAzAgCBQJiQQUDbmlsBQNuaWwDCQAAAgUCY1YFAmNWCQCUCgIJAM4IAgkAzggCCAUCY0UCXzIIBQJjRwJfMgkAzAgCBQJjTwkAzAgCCQEEQnVybgIFAmJ6AAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFnAgkApAMBBQJjRgkApAMBBQJjSAkBAmJ4CwUBWgkApAMBBQFsBQJjUAUCYkEFAmJCBQJjTQUCY04FAmNGBQJjSAUBaQUCYkgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFuAQUCY1AJAQJiSQIFAmNGBQJjSAkAzAgCCQELU3RyaW5nRW50cnkCCQECYXACCQCkAwEFAmNGCQCkAwEFAmNICQCsAgICBCVzX18FAmNQCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhdAEFAVoJAQJiSQIFAmNGBQJjSAkAzAgCCQELU3RyaW5nRW50cnkCCQECYXYCBQJjRgUCY0gFAVoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF4AQUCY1AFAVoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF3AQUBWgUCY1AJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFZAQUBWgUCY0MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhcwEFAVoFAWgFA25pbAUCY1AJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmgBCm1hbmFnZVBvb2wCAVoCY1cEAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wEAmNLCQECYkwBBQFaBAJieQkAkQMCBQJjSwUBdAQCY1AJAJEDAgUCY0sFAXUEAmJBCQCRAwIFAmNLBQF2BAJiQgkAkQMCBQJjSwUBdwQCY00JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjSwUBeAQCY04JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjSwUBeQQCY0YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjSwUBegQCY0gJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjSwUBQQQCY1gJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjSwUBQgQCYkgJAJEDAgUCY0sFAUMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFnAgkApAMBBQJjRgkApAMBBQJjSAkBAmJ4CwUBWgkApAMBBQJjVwUCY1AFAmJBBQJiQgUCY00FAmNOBQJjRgUCY0gFAmNYBQJiSAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQRlbWl0AQJjWQQCY1oIBQJiaAZjYWxsZXIEAmRhCAUCYmgMb3JpZ2luQ2FsbGVyBAJkYgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAQJhdwEJAKUIAQUCY1oCHUludmFsaWQgTFAgYWRkcmVzcyBjYWxsZWQgbWUuBAJkYwkA2QQBBQJkYgQCY3AJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEBTwAFAWsFAWoEAmNvCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBAU4AAihMZWdhY3kgZmFjdG9yeSBjb250cmFjdCBkb2VzIG5vdCBleGlzdHMuAwkAZwIAAAUCY1kFA25pbAMJAQ9jb250YWluc0VsZW1lbnQCBQJjcAkApQgBBQJjWgkAlAoCBQNuaWwFAmNvCQCUCgIJAMwIAgkBB1JlaXNzdWUDBQJkYwUCY1kGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJiaAZjYWxsZXIFAmNZBQJkYwUDbmlsAgdzdWNjZXNzAmJoAQRidXJuAQJkZAQCY1oIBQJiaAZjYWxsZXIEAmRhCAUCYmgMb3JpZ2luQ2FsbGVyBAJkZQkBBXZhbHVlAQkAkQMCCAUCYmgIcGF5bWVudHMAAAQCZGYJAQV2YWx1ZQEIBQJkZQZhbW91bnQEAmRnCQDYBAEJAQV2YWx1ZQEIBQJkZQdhc3NldElkBAJkaAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAQJhdwEJAKUIAQUCY1oCHUludmFsaWQgTFAgYWRkcmVzcyBjYWxsZWQgbWUuAwkBAiE9AgUCZGcFAmRoCQACAQIVSW52YWxpZCBhc3NldCBwYXNzZWQuAwkBAiE9AgUCZGQFAmRmCQACAQIWSW52YWxpZCBhbW91bnQgcGFzc2VkLgQCZGMJANkEAQUCZGgJAJQKAgkAzAgCCQEEQnVybgIFAmRjBQJkZAUDbmlsAgdzdWNjZXNzAmJoAQxtb2RpZnlXZWlnaHQCAmJ6AmRpBAJjbAMJAAACCQDYBAEICAUCYmgGY2FsbGVyBWJ5dGVzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQFUAAIABgkBAmJpAQUCYmgDCQAAAgUCY2wFAmNsBAJhdQkBAmFGAQkBAmF4AQUCYnoEAmRqCQEBWQEFAmF1BAJkawkBAVkBBQFmBAJkbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQJkawAABAJjQwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQJkagAABAJkbQUCZGkEAmFWCQC1CQIJAQJhRgEJAQFKAAUBagQCY2gJAQJhWAEFAmFWBAJkbgkA/AcEBQJjaAIOb25Nb2RpZnlXZWlnaHQJAMwIAgUCYnoJAMwIAgUCYXUFA25pbAUDbmlsAwkAAAIFAmRuBQJkbgQCZG8DCQAAAgUCZGwAAAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkawAABQNuaWwEAmRwCQECYWECBQJhdQAABAJkcQkAnwgBBQJkcAQCZHIDCQAAAgUCZHEFBHVuaXQFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBBQJkcAUDbmlsCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZGoFAmRtBQNuaWwFAmRvBQJkcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAENbW9kaWZ5V2VpZ2h0cwQCZHMCZHQCZHUCZHYEAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wEAmR3CQBpAgkAaAIABQUBZQBkBAJkeAkAaQIJAGgCAAUFAWUAZAQCZHkJAGkCCQBoAgAFBQFlAGQEAmFWCQC1CQIJAQJhRgEJAQFKAAUBagQCZHoJAQJhWAEFAmFWBAJkQQkBAmFZAQUCYVYEAmRCCQEBWQEFAmRzBAJkQwkBAVkBBQJkdAQCZEQJAQFZAQUCZHUEAmRFCQEBWQEFAmR2BAJkRgkBAmFJAQUCZEIEAmRHCQECYUkBBQJkQwQCZEgJAGUCBQJkRgUCZHkEAmRJCQBlAgUCZEcFAmR5AwkAZwIAAAUCZEgJAAIBCQCsAgICFmludmFsaWQgYnRjV2VpZ2h0TmV3OiAJAKQDAQUCZEgDCQBnAgAABQJkSQkAAgEJAKwCAgIWaW52YWxpZCBldGhXZWlnaHROZXc6IAkApAMBBQJkSQQCZEoJAQJhRgEJAQJhdwEFAmRzBAJkSwkBAmFGAQkBAmF3AQUCZHQEAmRMCQECYUYBCQECYXcBBQJkdQQCZE0JAQJhRgEJAQJhdwEFAmR2BAJkTgkA/AcEBQJkegIOb25Nb2RpZnlXZWlnaHQJAMwIAgUCZEoJAMwIAgUCZHMFA25pbAUDbmlsAwkAAAIFAmROBQJkTgQCZE8JAPwHBAUCZHoCDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmRLCQDMCAIFAmR0BQNuaWwFA25pbAMJAAACBQJkTwUCZE8EAmRQCQD8BwQFAmR6Ag5vbk1vZGlmeVdlaWdodAkAzAgCBQJkTAkAzAgCBQJkdQUDbmlsBQNuaWwDCQAAAgUCZFAFAmRQBAJkUQkA/AcEBQJkegIOb25Nb2RpZnlXZWlnaHQJAMwIAgUCZE0JAMwIAgUCZHYFA25pbAUDbmlsAwkAAAIFAmRRBQJkUQkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZEIFAmRICQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkQwUCZEkJAMwIAgkBDEludGVnZXJFbnRyeQIFAmREBQJkdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZEUFAmR4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWECBQJkcwAABQJkRgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFhAgUCZHQAAAUCZEcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYQIFAmR1AAAFAmR3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWECBQJkdgAABQJkeAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoARhjaGVja1d4RW1pc3Npb25Qb29sTGFiZWwCAmF6AmFBBAJkUgQCYmEJAKAIAQkBAmF5AgUCYXoFAmFBAwkAAQIFAmJhAgdCb29sZWFuBAJkUwUCYmEFAmRTBwkAlAoCBQNuaWwFAmRSAmJoARZzZXRXeEVtaXNzaW9uUG9vbExhYmVsAgJhegJhQQQCY2wJAQJiVQEFAmJoAwkAAAIFAmNsBQJjbAkAlAoCCQDMCAIJAQxCb29sZWFuRW50cnkCCQECYXkCBQJhegUCYUEGBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmgBGWRlbGV0ZVd4RW1pc3Npb25Qb29sTGFiZWwCAmF6AmFBBAJjbAMJAQJiZwEFAmJoBgkBAmJVAQUCYmgDCQAAAgUCY2wFAmNsCQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmF5AgUCYXoFAmFBBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmgBEm9uVmVyaWZpY2F0aW9uTG9zcwECZFQEAmNsAwkAAAIJANgEAQgIBQJiaAZjYWxsZXIFYnl0ZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAVMAAgAGCQECYmkBBQJiaAMJAAACBQJjbAUCY2wEAmNzCQECYVoABAJkVQMJAGYCCQCQAwEFAmNzAAAGCQACAQIUaW52YWxpZCBwcmljZSBhc3NldHMDCQAAAgUCZFUFAmRVCgECZFYCAmRXAmRYBAJkWQkA/AcEBQR0aGlzAhlkZWxldGVXeEVtaXNzaW9uUG9vbExhYmVsCQDMCAIFAmRUCQDMCAIFAmRYBQNuaWwFA25pbAMJAAACBQJkWQUCZFkFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAmRaCgACZWEFAmNzCgACZWIJAJADAQUCZWEKAAJlYwUEdW5pdAoBAmVkAgJlZQJlZgMJAGcCBQJlZgUCZWIFAmVlCQECZFYCBQJlZQkAkQMCBQJlYQUCZWYKAQJlZwICZWUCZWYDCQBnAgUCZWYFAmViBQJlZQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDEJAQJlZwIJAQJlZAIFAmVjAAAAAQMJAAACBQJkWgUCZFoJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAShpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZAQFaBAJjSwkBAmJMAQUBWgQCYWsJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNLBQF6CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCY0sFAUEEAmVoCQELdmFsdWVPckVsc2UCCQCgCAEJAQJhagEFAmFrBwQCZWkJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBAmFtAAcJAJQKAgUDbmlsAwUCZWkGBQJlaAJiaAEQZ2V0SW5GZWVSRUFET05MWQEBWgQCZWoJAQJiWAMJAQJhQgEFAVoJAQJhQwAAAAkAlAoCBQNuaWwFAmVqAmJoARFnZXRPdXRGZWVSRUFET05MWQEBWgQCZWoJAQJiWAMJAQJhRAEFAVoJAQJhRQAJAGsDAAoFAWIAkE4JAJQKAgUDbmlsBQJlagJiaAEVZ2V0UG9vbFN0YXR1c1JFQURPTkxZAQFaBAJiTQkAtQkCCQECYUYBCQECYXQBBQFaBQFqBAJhaAkAkQMCBQJiTQABBAJhaQkAkQMCBQJiTQACBAJlawkAtQkCCQECYUYBCQECYWcCBQJhaAUCYWkFAWoJAJQKAgUDbmlsCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZWsFAXQBAmVsAQJlbQAEAmVuBAJiYQkBAmJjAAMJAAECBQJiYQIKQnl0ZVZlY3RvcgQCYmoFAmJhBQJiagMJAAECBQJiYQIEVW5pdAgFAmVsD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJlbAlib2R5Qnl0ZXMJAJEDAggFAmVsBnByb29mcwAABQJlbvyMy0c=", "chainId": 84, "height": 2441896, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FfuWMr24hFcBaSNE3S8Xq4UA314cxFhyvCC4P2Kp35sv Next: 83dMzBzhGqG9tMz2gmpGm4HXYV2tvj3vzyVN6kNWyrpW Diff:
OldNewDifferences
7272 func keyAllowedLpStableAddonScriptHash () = "%s__allowedLpStableAddonScriptHash"
7373
7474
75+func swapContract () = "%s__swapContract"
76+
77+
7578 func keyFactoryConfig () = "%s__factoryConfig"
7679
7780
133136
134137
135138 func keyPoolOneTokenOperationsDisabled (assetsInternal) = {
136- let $t036323694 = assetsInternal
137- let amountAssetInternal = $t036323694._1
138- let priceAssetInternal = $t036323694._2
139+ let $t037003762 = assetsInternal
140+ let amountAssetInternal = $t037003762._1
141+ let priceAssetInternal = $t037003762._2
139142 makeString(["%d%d%s", toString(amountAssetInternal), toString(priceAssetInternal), "oneTokenOperationsDisabled"], SEP)
140143 }
141144
320323
321324
322325 func intOrDefaultOrFallback (key,keyDefault,valueFallback) = valueOrElse(getInteger(this, key), valueOrElse(getInteger(this, keyDefault), valueFallback))
326+
327+
328+@Callable(i)
329+func getSwapContractREADONLY () = $Tuple2(nil, getStringOrFail(swapContract()))
330+
323331
324332
325333 @Callable(i)
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 decimalsMultPrice = ((100 * 1000) * 1000)
2121
2222 let SEP = "__"
2323
2424 let EMPTY = ""
2525
2626 let PoolActive = 1
2727
2828 let PoolPutDisabled = 2
2929
3030 let PoolMatcherDisabled = 3
3131
3232 let PoolShutdown = 4
3333
3434 let idxInternalAssetId = 1
3535
3636 let idxResutActions = 2
3737
3838 let idxIfAssetIdCalculationPerformed = 3
3939
4040 let idxPoolAddress = 1
4141
4242 let idxPoolStatus = 2
4343
4444 let idxPoolLPAssetId = 3
4545
4646 let idxAmtAssetId = 4
4747
4848 let idxPriceAssetId = 5
4949
5050 let idxAmtAssetDcm = 6
5151
5252 let idxPriceAssetDcm = 7
5353
5454 let idxIAmtAssetId = 8
5555
5656 let idxIPriceAssetId = 9
5757
5858 let idxLPAssetDcm = 10
5959
6060 let idxPoolType = 11
6161
6262 let poolLabelWxEmission = "WX_EMISSION"
6363
6464 let validPoolLabels = [poolLabelWxEmission]
6565
6666 func keyAllowedLpScriptHash () = "%s__allowedLpScriptHash"
6767
6868
6969 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
7070
7171
7272 func keyAllowedLpStableAddonScriptHash () = "%s__allowedLpStableAddonScriptHash"
7373
7474
75+func swapContract () = "%s__swapContract"
76+
77+
7578 func keyFactoryConfig () = "%s__factoryConfig"
7679
7780
7881 func keyLpTokensList () = "%s__lpTokensList"
7982
8083
8184 func keyPoolScriptHash () = "%s%s__pool__scriptHash"
8285
8386
8487 func keyMatcherPub () = "%s%s__matcher__publicKey"
8588
8689
8790 func keyLegacyFactoryContract () = "%s__legacyFactoryContract"
8891
8992
9093 func keyLegacyPools () = "%s__legacyPools"
9194
9295
9396 func keyManagerPublicKey () = "%s__managerPublicKey"
9497
9598
9699 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
97100
98101
99102 func keyAdminPubKeys () = "%s__adminPubKeys"
100103
101104
102105 func keyAssetsStoreContract () = "%s__assetsStoreContract"
103106
104107
105108 func keyVotingEmissionContract () = "%s__votingEmissionContract"
106109
107110
108111 func keyPriceAssets () = makeString(["%s", "priceAssets"], SEP)
109112
110113
111114 func keyPriceDecimals () = "%s__priceDecimals"
112115
113116
114117 func keyAllPoolsShutdown () = "%s__shutdown"
115118
116119
117120 func keyNextInternalAssetId () = "%s__nextInternalAssetId"
118121
119122
120123 func keyPoolToWeight (poolAddress) = ("%s%s__poolWeight__" + poolAddress)
121124
122125
123126 func keyPoolToWeightHistory (poolAddress,num) = ((("%s%s__poolWeight__" + poolAddress) + "__") + toString(num))
124127
125128
126129 func keyMappingsInternal2baseAssetId (internalBaseAsset) = ("%s%s%d__mappings__internal2baseAssetId__" + toString(internalBaseAsset))
127130
128131
129132 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
130133
131134
132135 func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config")
133136
134137
135138 func keyPoolOneTokenOperationsDisabled (assetsInternal) = {
136- let $t036323694 = assetsInternal
137- let amountAssetInternal = $t036323694._1
138- let priceAssetInternal = $t036323694._2
139+ let $t037003762 = assetsInternal
140+ let amountAssetInternal = $t037003762._1
141+ let priceAssetInternal = $t037003762._2
139142 makeString(["%d%d%s", toString(amountAssetInternal), toString(priceAssetInternal), "oneTokenOperationsDisabled"], SEP)
140143 }
141144
142145
143146 func keyAllPoolsOneTokenOperationsDisabled () = makeString(["%s", "oneTokenOperationsDisabled"], SEP)
144147
145148
146149 func keyMappingLpAssetToPoolAssets (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2Pool")
147150
148151
149152 func keyMappingPoolAssetsToLpasset (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + internalAmountAssetIdStr) + "__") + internalPriceAssetIdStr) + "__mappings__PoolAssets2LpAsset")
150153
151154
152155 func keyPoolSpread (poolAddress) = ("%s%s__spread__" + poolAddress)
153156
154157
155158 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2PoolAssets")
156159
157160
158161 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
159162
160163
161164 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
162165
163166
164167 func keyMappingPoolLPAssetToPoolContractAddress (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2PoolContract")
165168
166169
167170 func keyWxEmission (amountAssetId,priceAssetId) = ((("%s%s%s__wxEmission__" + amountAssetId) + "__") + priceAssetId)
168171
169172
170173 func keyInFee (poolAddress) = ("%s%s__inFee__" + poolAddress)
171174
172175
173176 func keyInFeeDefault () = "%s__inFeeDefault"
174177
175178
176179 func keyOutFee (poolAddress) = ("%s%s__outFee__" + poolAddress)
177180
178181
179182 func keyOutFeeDefault () = "%s__outFeeDefault"
180183
181184
182185 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
183186
184187
185188 func getBooleanOrFail (key) = valueOrErrorMessage(getBoolean(this, key), ("No data for this.key=" + key))
186189
187190
188191 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), ("No data for this.key=" + key))
189192
190193
191194 let IdxFactoryCfgStakingDapp = 1
192195
193196 let IdxFactoryCfgBoostingDapp = 2
194197
195198 let IdxFactoryCfgIdoDapp = 3
196199
197200 let IdxFactoryCfgTeamDapp = 4
198201
199202 let IdxFactoryCfgEmissionDapp = 5
200203
201204 let IdxFactoryCfgRestDapp = 6
202205
203206 let IdxFactoryCfgSlippageDapp = 7
204207
205208 let IdxFactoryCfgDaoDapp = 8
206209
207210 let IdxFactoryCfgMarketingDapp = 9
208211
209212 let IdxFactoryCfgGwxRewardDapp = 10
210213
211214 let IdxFactoryCfgBirdsDapp = 11
212215
213216 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
214217
215218
216219 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
217220
218221
219222 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
220223
221224
222225 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
223226
224227
225228 func getPriceAssets () = match getString(keyPriceAssets()) {
226229 case s: String =>
227230 if ((size(s) == 0))
228231 then nil
229232 else split(s, SEP)
230233 case _ =>
231234 nil
232235 }
233236
234237
235238 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
236239 case s: String =>
237240 fromBase58String(s)
238241 case _: Unit =>
239242 unit
240243 case _ =>
241244 throw("Match error")
242245 }
243246
244247
245248 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
246249 case s: String =>
247250 fromBase58String(s)
248251 case _: Unit =>
249252 unit
250253 case _ =>
251254 throw("Match error")
252255 }
253256
254257
255258 let permissionDeniedError = throw("Permission denied")
256259
257260 let testError = throw("Test error here")
258261
259262 func mustThis (i) = if ((i.caller == this))
260263 then true
261264 else permissionDeniedError
262265
263266
264267 func mustManager (i) = match managerPublicKeyOrUnit() {
265268 case pk: ByteVector =>
266269 if ((i.callerPublicKey == pk))
267270 then true
268271 else permissionDeniedError
269272 case _: Unit =>
270273 mustThis(i)
271274 case _ =>
272275 throw("Match error")
273276 }
274277
275278
276279 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)
277280
278281
279282 func dataFactoryCfg (stakingAddress,boostingAddress,idoContract,teamContract,emissionContract,restContract,slippageContract) = makeString(["%s%s%s%s%s%s", stakingAddress, boostingAddress, idoContract, teamContract, emissionContract, restContract, slippageContract], SEP)
280283
281284
282285 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)
283286
284287
285288 func dataMappingPoolAssets (internalAmountAssetStr,internalPriceAssetStr) = makeString(["%d%d", toString(internalAmountAssetStr), toString(internalPriceAssetStr)], SEP)
286289
287290
288291 func getPoolConfig (poolAddress) = {
289292 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
290293 let amountAssetInternal = poolAssets[1]
291294 let priceAssetInternal = poolAssets[2]
292295 split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
293296 }
294297
295298
296299 func getInternalAssetIdOrCreate (assetIdStr,incrementor) = {
297300 let internalAssetId = valueOrElse(getInteger(this, keyMappingsBaseAsset2internalId(assetIdStr)), 0)
298301 let currentIndexOfInternalId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0)
299302 let result = if ((internalAssetId == 0))
300303 then {
301304 let newInternalAssetId = (currentIndexOfInternalId + incrementor)
302305 $Tuple3(newInternalAssetId, [IntegerEntry(keyNextInternalAssetId(), newInternalAssetId), IntegerEntry(keyMappingsBaseAsset2internalId(assetIdStr), newInternalAssetId), StringEntry(keyMappingsInternal2baseAssetId(newInternalAssetId), assetIdStr)], true)
303306 }
304307 else $Tuple3(internalAssetId, nil, false)
305308 result
306309 }
307310
308311
309312 func mustAdmin (i) = {
310313 let adminPKs = split(valueOrElse(getString(keyAdminPubKeys()), EMPTY), SEP)
311314 if (containsElement(adminPKs, toBase58String(i.callerPublicKey)))
312315 then true
313316 else {
314317 let isManager = mustManager(i)
315318 if ((isManager == isManager))
316319 then true
317320 else throw("Strict value is not equal to itself.")
318321 }
319322 }
320323
321324
322325 func intOrDefaultOrFallback (key,keyDefault,valueFallback) = valueOrElse(getInteger(this, key), valueOrElse(getInteger(this, keyDefault), valueFallback))
326+
327+
328+@Callable(i)
329+func getSwapContractREADONLY () = $Tuple2(nil, getStringOrFail(swapContract()))
330+
323331
324332
325333 @Callable(i)
326334 func getLpAssetFromPoolAssetsREADONLY (asset1,asset2) = {
327335 let assetNum1 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset1)))
328336 let assetNum2 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset2)))
329337 let ee = getString(this, keyMappingPoolAssetsToLpasset(toString(assetNum1), toString(assetNum2)))
330338 let res = if ((ee == unit))
331339 then unit
332340 else drop(value(ee), 4)
333341 $Tuple2(nil, res)
334342 }
335343
336344
337345
338346 @Callable(i)
339347 func getPoolAddressFromLpAssetREADONLY (lp) = $Tuple2(nil, valueOrElse(getString(this, keyMappingPoolLPAssetToPoolContractAddress(lp)), ""))
340348
341349
342350
343351 @Callable(i)
344352 func constructor (stakingContract,boostingContract,idoContract,teamContract,emissionContract,restContract,slpipageContract,priceDecimals) = {
345353 let checkCaller = mustManager(i)
346354 if ((checkCaller == checkCaller))
347355 then [StringEntry(keyFactoryConfig(), dataFactoryCfg(stakingContract, boostingContract, idoContract, teamContract, emissionContract, restContract, slpipageContract)), IntegerEntry(keyPriceDecimals(), priceDecimals)]
348356 else throw("Strict value is not equal to itself.")
349357 }
350358
351359
352360
353361 @Callable(i)
354362 func constructorV2 (mathcherPub58Str) = {
355363 let checkCaller = mustManager(i)
356364 if ((checkCaller == checkCaller))
357365 then {
358366 let mathcerPub = addressFromPublicKey(fromBase58String(mathcherPub58Str))
359367 if ((mathcerPub == mathcerPub))
360368 then [StringEntry(keyMatcherPub(), mathcherPub58Str)]
361369 else throw("Strict value is not equal to itself.")
362370 }
363371 else throw("Strict value is not equal to itself.")
364372 }
365373
366374
367375
368376 @Callable(i)
369377 func constructorV3 (daoContract,marketingContract,gwxRewardsContract,birdsContract) = {
370378 let checkCaller = mustManager(i)
371379 if ((checkCaller == checkCaller))
372380 then {
373381 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
374382 [StringEntry(keyFactoryConfig(), dataFactoryCfgV3(factoryCfg[1], factoryCfg[2], factoryCfg[3], factoryCfg[4], factoryCfg[5], factoryCfg[6], factoryCfg[7], daoContract, marketingContract, gwxRewardsContract, birdsContract))]
375383 }
376384 else throw("Strict value is not equal to itself.")
377385 }
378386
379387
380388
381389 @Callable(i)
382390 func constructorV4 (legacyFactoryContract,legacyPools) = {
383391 let checkCaller = mustManager(i)
384392 if ((checkCaller == checkCaller))
385393 then [StringEntry(keyLegacyFactoryContract(), legacyFactoryContract), StringEntry(keyLegacyPools(), makeString(legacyPools, SEP))]
386394 else throw("Strict value is not equal to itself.")
387395 }
388396
389397
390398
391399 @Callable(i)
392400 func constructorV5 (assetsStoreContract) = {
393401 let checkCaller = mustManager(i)
394402 if ((checkCaller == checkCaller))
395403 then [StringEntry(keyAssetsStoreContract(), assetsStoreContract)]
396404 else throw("Strict value is not equal to itself.")
397405 }
398406
399407
400408
401409 @Callable(i)
402410 func constructorV6 (votingEmissionContract,priceAssets) = {
403411 let cheks = [mustManager(i), if ((addressFromString(votingEmissionContract) != unit))
404412 then true
405413 else "invalid voting emission contract address"]
406414 if ((cheks == cheks))
407415 then [StringEntry(keyVotingEmissionContract(), votingEmissionContract), StringEntry(keyPriceAssets(), makeString(priceAssets, SEP))]
408416 else throw("Strict value is not equal to itself.")
409417 }
410418
411419
412420
413421 @Callable(i)
414422 func setManager (pendingManagerPublicKey) = {
415423 let checkCaller = mustManager(i)
416424 if ((checkCaller == checkCaller))
417425 then {
418426 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
419427 if ((checkManagerPublicKey == checkManagerPublicKey))
420428 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
421429 else throw("Strict value is not equal to itself.")
422430 }
423431 else throw("Strict value is not equal to itself.")
424432 }
425433
426434
427435
428436 @Callable(i)
429437 func confirmManager () = {
430438 let pm = pendingManagerPublicKeyOrUnit()
431439 let hasPM = if (isDefined(pm))
432440 then true
433441 else throw("No pending manager")
434442 if ((hasPM == hasPM))
435443 then {
436444 let checkPM = if ((i.callerPublicKey == value(pm)))
437445 then true
438446 else throw("You are not pending manager")
439447 if ((checkPM == checkPM))
440448 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
441449 else throw("Strict value is not equal to itself.")
442450 }
443451 else throw("Strict value is not equal to itself.")
444452 }
445453
446454
447455
448456 @Callable(i)
449457 func setAdmins (adminPubKeys) = {
450458 let checkCaller = mustManager(i)
451459 if ((checkCaller == checkCaller))
452460 then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
453461 else throw("Strict value is not equal to itself.")
454462 }
455463
456464
457465
458466 @Callable(i)
459467 func activateNewPool (poolAddress,amountAssetStr,priceAssetStr,lpAssetName,lpAssetDescr,poolWeight,poolType,logo) = {
460468 let checkCaller = mustAdmin(i)
461469 if ((checkCaller == checkCaller))
462470 then if (isDefined(getString(keyMappingPoolContractAddressToPoolAssets(poolAddress))))
463471 then throw((("Pool address " + poolAddress) + " already registered."))
464472 else {
465473 let internalAmountAssetData = getInternalAssetIdOrCreate(amountAssetStr, 1)
466474 let internalAmountAssetId = internalAmountAssetData._1
467475 let internalPriceAssetData = getInternalAssetIdOrCreate(priceAssetStr, if (internalAmountAssetData._3)
468476 then 2
469477 else 1)
470478 let internalPriceAssetId = internalPriceAssetData._1
471479 let poolAccountScriptHash = valueOrErrorMessage(scriptHash(addressFromStringValue(poolAddress)), ("No script has been found on pool account " + poolAddress))
472480 let ethalonPoolAccountScriptHash = getBinaryValue(keyPoolScriptHash())
473481 let poolConfig = getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)))
474482 if (isDefined(poolConfig))
475483 then throw((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated."))
476484 else {
477485 let poolConfigValue = value(getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId))))
478486 let amountAssetsDecimals = if ((amountAssetStr == "WAVES"))
479487 then decimalsMultPrice
480488 else pow(10, 0, value(assetInfo(fromBase58String(amountAssetStr))).decimals, 0, 0, DOWN)
481489 let priceAssetsDecimals = if ((priceAssetStr == "WAVES"))
482490 then decimalsMultPrice
483491 else pow(10, 0, value(assetInfo(fromBase58String(priceAssetStr))).decimals, 0, 0, DOWN)
484492 let lpAssetIssueAction = Issue(lpAssetName, lpAssetDescr, 1, 8, true)
485493 let lpAssetId = calculateAssetId(lpAssetIssueAction)
486494 let lpAssetIdStr = toBase58String(lpAssetId)
487495 let poolActivateInvokeResult = invoke(addressFromStringValue(poolAddress), "activate", [amountAssetStr, priceAssetStr], nil)
488496 if ((poolActivateInvokeResult == poolActivateInvokeResult))
489497 then if ((poolActivateInvokeResult != "success"))
490498 then throw("Pool initialisation error happened.")
491499 else {
492500 let assetsStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract()))
493501 let createOrUpdateLpAssetInv = invoke(assetsStoreContract, "createOrUpdate", [lpAssetIdStr, lpAssetName, false], nil)
494502 if ((createOrUpdateLpAssetInv == createOrUpdateLpAssetInv))
495503 then {
496504 let addPoolsLpLabelInv = invoke(assetsStoreContract, "addLabel", [lpAssetIdStr, labelPoolsLp], nil)
497505 if ((addPoolsLpLabelInv == addPoolsLpLabelInv))
498506 then {
499507 let setLogoInv = invoke(assetsStoreContract, "setLogo", [lpAssetIdStr, logo], nil)
500508 if ((setLogoInv == setLogoInv))
501509 then {
502510 let addAssetsLinkInv = invoke(assetsStoreContract, "addAssetsLink", [amountAssetStr, priceAssetStr, lpAssetIdStr], nil)
503511 if ((addAssetsLinkInv == addAssetsLinkInv))
504512 then {
505513 let increaseAssetPoolsNumberInv = invoke(assetsStoreContract, "increaseAssetPoolsNumber", [amountAssetStr], nil)
506514 if ((increaseAssetPoolsNumberInv == increaseAssetPoolsNumberInv))
507515 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)
508516 else throw("Strict value is not equal to itself.")
509517 }
510518 else throw("Strict value is not equal to itself.")
511519 }
512520 else throw("Strict value is not equal to itself.")
513521 }
514522 else throw("Strict value is not equal to itself.")
515523 }
516524 else throw("Strict value is not equal to itself.")
517525 }
518526 else throw("Strict value is not equal to itself.")
519527 }
520528 }
521529 else throw("Strict value is not equal to itself.")
522530 }
523531
524532
525533
526534 @Callable(i)
527535 func managePool (poolAddress,newStatus) = {
528536 let checkCaller = mustManager(i)
529537 if ((checkCaller == checkCaller))
530538 then {
531539 let poolConfig = getPoolConfig(poolAddress)
532540 let poolStatus = poolConfig[idxPoolStatus]
533541 let lpAssetIdStr = poolConfig[idxPoolLPAssetId]
534542 let amountAssetStr = poolConfig[idxAmtAssetId]
535543 let priceAssetStr = poolConfig[idxPriceAssetId]
536544 let amountAssetsDecimals = parseIntValue(poolConfig[idxAmtAssetDcm])
537545 let priceAssetsDecimals = parseIntValue(poolConfig[idxPriceAssetDcm])
538546 let internalAmountAssetId = parseIntValue(poolConfig[idxIAmtAssetId])
539547 let internalPriceAssetId = parseIntValue(poolConfig[idxIPriceAssetId])
540548 let lpAssetDcm = parseIntValue(poolConfig[idxLPAssetDcm])
541549 let poolType = poolConfig[idxPoolType]
542550 [StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(newStatus), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, lpAssetDcm, poolType))]
543551 }
544552 else throw("Strict value is not equal to itself.")
545553 }
546554
547555
548556
549557 @Callable(i)
550558 func emit (amountToEmit) = {
551559 let caller = i.caller
552560 let originCaller = i.originCaller
553561 let lpAssetRequested = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
554562 let lpAsset = fromBase58String(lpAssetRequested)
555563 let legacyPools = split(valueOrElse(getString(keyLegacyPools()), EMPTY), SEP)
556564 let legacyFactoryContract = addressFromStringValue(valueOrErrorMessage(getString(keyLegacyFactoryContract()), "Legacy factory contract does not exists."))
557565 if ((0 >= amountToEmit))
558566 then nil
559567 else if (containsElement(legacyPools, toString(caller)))
560568 then $Tuple2(nil, legacyFactoryContract)
561569 else $Tuple2([Reissue(lpAsset, amountToEmit, true), ScriptTransfer(i.caller, amountToEmit, lpAsset)], "success")
562570 }
563571
564572
565573
566574 @Callable(i)
567575 func burn (amountToBurn) = {
568576 let caller = i.caller
569577 let originCaller = i.originCaller
570578 let payment = value(i.payments[0])
571579 let paymentAmount = value(payment.amount)
572580 let inAmountAssetId = toBase58String(value(payment.assetId))
573581 let lpAssetRequestedForBurning = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
574582 if ((inAmountAssetId != lpAssetRequestedForBurning))
575583 then throw("Invalid asset passed.")
576584 else if ((amountToBurn != paymentAmount))
577585 then throw("Invalid amount passed.")
578586 else {
579587 let lpAsset = fromBase58String(lpAssetRequestedForBurning)
580588 $Tuple2([Burn(lpAsset, amountToBurn)], "success")
581589 }
582590 }
583591
584592
585593
586594 @Callable(i)
587595 func modifyWeight (lpAssetId,share) = {
588596 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionContract()), "")))
589597 then true
590598 else mustManager(i)
591599 if ((checkCaller == checkCaller))
592600 then {
593601 let poolContractAddress = getStringOrFail(keyMappingPoolLPAssetToPoolContractAddress(lpAssetId))
594602 let poolWeightKey = keyPoolToWeight(poolContractAddress)
595603 let gwxWeightKey = keyPoolToWeight(GWXvirtualPOOL)
596604 let gwxWeight = valueOrElse(getInteger(gwxWeightKey), 0)
597605 let poolWeight = valueOrElse(getInteger(poolWeightKey), 0)
598606 let poolWeightNew = share
599607 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
600608 let stakingContract = getStakingAddressOrFail(factoryCfg)
601609 let onModifyWeightInv = invoke(stakingContract, "onModifyWeight", [lpAssetId, poolContractAddress], nil)
602610 if ((onModifyWeightInv == onModifyWeightInv))
603611 then {
604612 let gwxVirtualPoolActions = if ((gwxWeight == 0))
605613 then nil
606614 else [IntegerEntry(gwxWeightKey, 0)]
607615 let poolWeightHistoryKey = keyPoolToWeightHistory(poolContractAddress, 0)
608616 let poolWeightHistoryOrUnit = getInteger(poolWeightHistoryKey)
609617 let poolWeightHistoryActions = if ((poolWeightHistoryOrUnit == unit))
610618 then nil
611619 else [DeleteEntry(poolWeightHistoryKey)]
612620 (([IntegerEntry(poolWeightKey, poolWeightNew)] ++ gwxVirtualPoolActions) ++ poolWeightHistoryActions)
613621 }
614622 else throw("Strict value is not equal to itself.")
615623 }
616624 else throw("Strict value is not equal to itself.")
617625 }
618626
619627
620628
621629 @Callable(i)
622630 func modifyWeights (btcPoolAddress,ethPoolAddress,ethBtcPoolAddress,usdcUsdtPoolAddress) = {
623631 let checkCaller = mustManager(i)
624632 if ((checkCaller == checkCaller))
625633 then {
626634 let ethBtcWeightNew = ((5 * POOLWEIGHTMULT) / 100)
627635 let usdcUsdtWeightNew = ((5 * POOLWEIGHTMULT) / 100)
628636 let weightDecrement = ((5 * POOLWEIGHTMULT) / 100)
629637 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
630638 let stakingDapp = getStakingAddressOrFail(factoryCfg)
631639 let gwxRewardDapp = getGwxRewardAddressOrFail(factoryCfg)
632640 let btcWeightKEY = keyPoolToWeight(btcPoolAddress)
633641 let ethWeightKEY = keyPoolToWeight(ethPoolAddress)
634642 let ethBtcWeightKEY = keyPoolToWeight(ethBtcPoolAddress)
635643 let usdcUsdtWeightKEY = keyPoolToWeight(usdcUsdtPoolAddress)
636644 let btcWeight = getIntOrFail(btcWeightKEY)
637645 let ethWeight = getIntOrFail(ethWeightKEY)
638646 let btcWeightNew = (btcWeight - weightDecrement)
639647 let ethWeightNew = (ethWeight - weightDecrement)
640648 if ((0 >= btcWeightNew))
641649 then throw(("invalid btcWeightNew: " + toString(btcWeightNew)))
642650 else if ((0 >= ethWeightNew))
643651 then throw(("invalid ethWeightNew: " + toString(ethWeightNew)))
644652 else {
645653 let btcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(btcPoolAddress))
646654 let ethLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethPoolAddress))
647655 let ethBtcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethBtcPoolAddress))
648656 let usdcUsdtLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(usdcUsdtPoolAddress))
649657 let onModifyWeightBtc = invoke(stakingDapp, "onModifyWeight", [btcLpAssetIdStr, btcPoolAddress], nil)
650658 if ((onModifyWeightBtc == onModifyWeightBtc))
651659 then {
652660 let onModifyWeightEth = invoke(stakingDapp, "onModifyWeight", [ethLpAssetIdStr, ethPoolAddress], nil)
653661 if ((onModifyWeightEth == onModifyWeightEth))
654662 then {
655663 let onModifyWeightEthBtc = invoke(stakingDapp, "onModifyWeight", [ethBtcLpAssetIdStr, ethBtcPoolAddress], nil)
656664 if ((onModifyWeightEthBtc == onModifyWeightEthBtc))
657665 then {
658666 let onModifyWeightUsdcUsdt = invoke(stakingDapp, "onModifyWeight", [usdcUsdtLpAssetIdStr, usdcUsdtPoolAddress], nil)
659667 if ((onModifyWeightUsdcUsdt == onModifyWeightUsdcUsdt))
660668 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)]
661669 else throw("Strict value is not equal to itself.")
662670 }
663671 else throw("Strict value is not equal to itself.")
664672 }
665673 else throw("Strict value is not equal to itself.")
666674 }
667675 else throw("Strict value is not equal to itself.")
668676 }
669677 }
670678 else throw("Strict value is not equal to itself.")
671679 }
672680
673681
674682
675683 @Callable(i)
676684 func checkWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
677685 let haveLabel = match getBoolean(keyWxEmission(amountAssetId, priceAssetId)) {
678686 case b: Boolean =>
679687 b
680688 case _ =>
681689 false
682690 }
683691 $Tuple2(nil, haveLabel)
684692 }
685693
686694
687695
688696 @Callable(i)
689697 func setWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
690698 let checkCaller = mustAdmin(i)
691699 if ((checkCaller == checkCaller))
692700 then $Tuple2([BooleanEntry(keyWxEmission(amountAssetId, priceAssetId), true)], unit)
693701 else throw("Strict value is not equal to itself.")
694702 }
695703
696704
697705
698706 @Callable(i)
699707 func deleteWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
700708 let checkCaller = if (mustThis(i))
701709 then true
702710 else mustAdmin(i)
703711 if ((checkCaller == checkCaller))
704712 then $Tuple2([DeleteEntry(keyWxEmission(amountAssetId, priceAssetId))], unit)
705713 else throw("Strict value is not equal to itself.")
706714 }
707715
708716
709717
710718 @Callable(i)
711719 func onVerificationLoss (assetId) = {
712720 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyAssetsStoreContract()), "")))
713721 then true
714722 else mustManager(i)
715723 if ((checkCaller == checkCaller))
716724 then {
717725 let priceAssets = getPriceAssets()
718726 let checkPriceAssetsSize = if ((size(priceAssets) > 0))
719727 then true
720728 else throw("invalid price assets")
721729 if ((checkPriceAssetsSize == checkPriceAssetsSize))
722730 then {
723731 func cb (acc,priceAsset) = {
724732 let r = invoke(this, "deleteWxEmissionPoolLabel", [assetId, priceAsset], nil)
725733 if ((r == r))
726734 then unit
727735 else throw("Strict value is not equal to itself.")
728736 }
729737
730738 let actions = {
731739 let $l = priceAssets
732740 let $s = size($l)
733741 let $acc0 = unit
734742 func $f0_1 ($a,$i) = if (($i >= $s))
735743 then $a
736744 else cb($a, $l[$i])
737745
738746 func $f0_2 ($a,$i) = if (($i >= $s))
739747 then $a
740748 else throw("List size exceeds 1")
741749
742750 $f0_2($f0_1($acc0, 0), 1)
743751 }
744752 if ((actions == actions))
745753 then $Tuple2(nil, unit)
746754 else throw("Strict value is not equal to itself.")
747755 }
748756 else throw("Strict value is not equal to itself.")
749757 }
750758 else throw("Strict value is not equal to itself.")
751759 }
752760
753761
754762
755763 @Callable(i)
756764 func isPoolOneTokenOperationsDisabledREADONLY (poolAddress) = {
757765 let poolConfig = getPoolConfig(poolAddress)
758766 let assetsInternal = $Tuple2(parseIntValue(poolConfig[idxIAmtAssetId]), parseIntValue(poolConfig[idxIPriceAssetId]))
759767 let poolOneTokenOperationsDisabled = valueOrElse(getBoolean(keyPoolOneTokenOperationsDisabled(assetsInternal)), false)
760768 let allPoolsOneTokenOperationsDisabled = valueOrElse(getBoolean(keyAllPoolsOneTokenOperationsDisabled()), false)
761769 $Tuple2(nil, if (allPoolsOneTokenOperationsDisabled)
762770 then true
763771 else poolOneTokenOperationsDisabled)
764772 }
765773
766774
767775
768776 @Callable(i)
769777 func getInFeeREADONLY (poolAddress) = {
770778 let fee = intOrDefaultOrFallback(keyInFee(poolAddress), keyInFeeDefault(), 0)
771779 $Tuple2(nil, fee)
772780 }
773781
774782
775783
776784 @Callable(i)
777785 func getOutFeeREADONLY (poolAddress) = {
778786 let fee = intOrDefaultOrFallback(keyOutFee(poolAddress), keyOutFeeDefault(), fraction(10, MULT8, 10000))
779787 $Tuple2(nil, fee)
780788 }
781789
782790
783791
784792 @Callable(i)
785793 func getPoolStatusREADONLY (poolAddress) = {
786794 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
787795 let amountAssetInternal = poolAssets[1]
788796 let priceAssetInternal = poolAssets[2]
789797 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
790798 $Tuple2(nil, parseIntValue(cfg[idxPoolStatus]))
791799 }
792800
793801
794802 @Verifier(tx)
795803 func verify () = {
796804 let targetPublicKey = match managerPublicKeyOrUnit() {
797805 case pk: ByteVector =>
798806 pk
799807 case _: Unit =>
800808 tx.senderPublicKey
801809 case _ =>
802810 throw("Match error")
803811 }
804812 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
805813 }
806814

github/deemru/w8io/3ef1775 
113.07 ms