tx · 9HajWY2gqWuyC1i3pCZYg4QDe7ijQpPX36NbWtEhxj6V

3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai:  -0.02200000 Waves

2023.02.09 15:56 [2442113] smart account 3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai > SELF 0.00000000 Waves

{ "type": 13, "id": "9HajWY2gqWuyC1i3pCZYg4QDe7ijQpPX36NbWtEhxj6V", "fee": 2200000, "feeAssetId": null, "timestamp": 1675947455989, "version": 1, "sender": "3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai", "senderPublicKey": "2JEaBjtjvMoNGKZmL9QxYefa1VkMJM3vMW8rNvTs9R2H", "proofs": [ "5dJFStfGx1XbKNSNb9vWhJyR8ap28JsZtAbDS5McaVycEgUkJhWxS96A47MbWPeQUY2tC4TiPXoox7JG6k9TZXbw" ], "script": "base64:BgLlJQgCEgASBAoCCAgSAwoBCBIKCggICAgICAgIARIDCgEIEgYKBAgICAgSBAoCCBgSAwoBCBIECgIIGBIDCgEIEgASAwoBGBIKCggICAgICAEICBIECgIIARIDCgEBEgMKAQESBAoCCAESBgoECAgICBIECgIICBIECgIICBIECgIICBIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgiBlNDQUxFOCIFTVVMVDgiB1NDQUxFMTgiBk1VTFQxOCIOUE9PTFdFSUdIVE1VTFQiDkdXWHZpcnR1YWxQT09MIgxsYWJlbFBvb2xzTHAiDWRlZmF1bHRTcHJlYWQiEWRlY2ltYWxzTXVsdFByaWNlIgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIg9Qb29sUHV0RGlzYWJsZWQiE1Bvb2xNYXRjaGVyRGlzYWJsZWQiDFBvb2xTaHV0ZG93biISaWR4SW50ZXJuYWxBc3NldElkIg9pZHhSZXN1dEFjdGlvbnMiIGlkeElmQXNzZXRJZENhbGN1bGF0aW9uUGVyZm9ybWVkIg5pZHhQb29sQWRkcmVzcyINaWR4UG9vbFN0YXR1cyIQaWR4UG9vbExQQXNzZXRJZCINaWR4QW10QXNzZXRJZCIPaWR4UHJpY2VBc3NldElkIg5pZHhBbXRBc3NldERjbSIQaWR4UHJpY2VBc3NldERjbSIOaWR4SUFtdEFzc2V0SWQiEGlkeElQcmljZUFzc2V0SWQiDWlkeExQQXNzZXREY20iC2lkeFBvb2xUeXBlIhNwb29sTGFiZWxXeEVtaXNzaW9uIg92YWxpZFBvb2xMYWJlbHMiFmtleUFsbG93ZWRMcFNjcmlwdEhhc2giHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giIWtleUFsbG93ZWRMcFN0YWJsZUFkZG9uU2NyaXB0SGFzaCIMc3dhcENvbnRyYWN0IhBrZXlGYWN0b3J5Q29uZmlnIg9rZXlMcFRva2Vuc0xpc3QiEWtleVBvb2xTY3JpcHRIYXNoIg1rZXlNYXRjaGVyUHViIhhrZXlMZWdhY3lGYWN0b3J5Q29udHJhY3QiDmtleUxlZ2FjeVBvb2xzIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIPa2V5QWRtaW5QdWJLZXlzIhZrZXlBc3NldHNTdG9yZUNvbnRyYWN0IhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0Ig5rZXlQcmljZUFzc2V0cyIQa2V5UHJpY2VEZWNpbWFscyITa2V5QWxsUG9vbHNTaHV0ZG93biIWa2V5TmV4dEludGVybmFsQXNzZXRJZCIPa2V5UG9vbFRvV2VpZ2h0Igtwb29sQWRkcmVzcyIWa2V5UG9vbFRvV2VpZ2h0SGlzdG9yeSIDbnVtIh9rZXlNYXBwaW5nc0ludGVybmFsMmJhc2VBc3NldElkIhFpbnRlcm5hbEJhc2VBc3NldCIfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZCIMYmFzZUFzc2V0U3RyIg1rZXlQb29sQ29uZmlnIhNhbW91bnRBc3NldEludGVybmFsIhJwcmljZUFzc2V0SW50ZXJuYWwiIWtleVBvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZCIOYXNzZXRzSW50ZXJuYWwiCyR0MDM3MDAzNzYyIiVrZXlBbGxQb29sc09uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIh1rZXlNYXBwaW5nTHBBc3NldFRvUG9vbEFzc2V0cyIKbHBBc3NldFN0ciIda2V5TWFwcGluZ1Bvb2xBc3NldHNUb0xwYXNzZXQiGGludGVybmFsQW1vdW50QXNzZXRJZFN0ciIXaW50ZXJuYWxQcmljZUFzc2V0SWRTdHIiDWtleVBvb2xTcHJlYWQiKWtleU1hcHBpbmdQb29sQ29udHJhY3RBZGRyZXNzVG9Qb29sQXNzZXRzIhNwb29sQ29udHJhY3RBZGRyZXNzIilrZXlNYXBwaW5nUG9vbEFzc2V0c1RvUG9vbENvbnRyYWN0QWRkcmVzcyIfa2V5TWFwcGluZ1Bvb2xDb250cmFjdFRvTFBBc3NldCIqa2V5TWFwcGluZ1Bvb2xMUEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzIg1rZXlXeEVtaXNzaW9uIg1hbW91bnRBc3NldElkIgxwcmljZUFzc2V0SWQiCGtleUluRmVlIg9rZXlJbkZlZURlZmF1bHQiCWtleU91dEZlZSIQa2V5T3V0RmVlRGVmYXVsdCIPZ2V0U3RyaW5nT3JGYWlsIgNrZXkiEGdldEJvb2xlYW5PckZhaWwiDGdldEludE9yRmFpbCIYSWR4RmFjdG9yeUNmZ1N0YWtpbmdEYXBwIhlJZHhGYWN0b3J5Q2ZnQm9vc3RpbmdEYXBwIhRJZHhGYWN0b3J5Q2ZnSWRvRGFwcCIVSWR4RmFjdG9yeUNmZ1RlYW1EYXBwIhlJZHhGYWN0b3J5Q2ZnRW1pc3Npb25EYXBwIhVJZHhGYWN0b3J5Q2ZnUmVzdERhcHAiGUlkeEZhY3RvcnlDZmdTbGlwcGFnZURhcHAiFElkeEZhY3RvcnlDZmdEYW9EYXBwIhpJZHhGYWN0b3J5Q2ZnTWFya2V0aW5nRGFwcCIaSWR4RmFjdG9yeUNmZ0d3eFJld2FyZERhcHAiFklkeEZhY3RvcnlDZmdCaXJkc0RhcHAiGGdldEJvb3N0aW5nQWRkcmVzc09yRmFpbCIKZmFjdG9yeUNmZyIYZ2V0RW1pc3Npb25BZGRyZXNzT3JGYWlsIhdnZXRTdGFraW5nQWRkcmVzc09yRmFpbCIZZ2V0R3d4UmV3YXJkQWRkcmVzc09yRmFpbCIOZ2V0UHJpY2VBc3NldHMiByRtYXRjaDAiAXMiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0IhVwZXJtaXNzaW9uRGVuaWVkRXJyb3IiCXRlc3RFcnJvciIIbXVzdFRoaXMiAWkiC211c3RNYW5hZ2VyIgJwayIQZGF0YUZhY3RvcnlDZmdWMyIOc3Rha2luZ0FkZHJlc3MiD2Jvb3N0aW5nQWRkcmVzcyILaWRvQ29udHJhY3QiDHRlYW1Db250cmFjdCIQZW1pc3Npb25Db250cmFjdCIMcmVzdENvbnRyYWN0IhBzbGlwcGFnZUNvbnRyYWN0IgtkYW9Db250cmFjdCIRbWFya2V0aW5nQ29udHJhY3QiEmd3eFJld2FyZHNDb250cmFjdCINYmlyZHNDb250cmFjdCIOZGF0YUZhY3RvcnlDZmciC2RhdGFQb29sQ2ZnIgpwb29sU3RhdHVzIglscEFzc2V0SWQiDmFtb3VudEFzc2V0U3RyIg1wcmljZUFzc2V0U3RyIhNhbW91bnRBc3NldERlY2ltYWxzIhJwcmljZUFzc2V0RGVjaW1hbHMiFWFtb3VudEFzc2V0SW50ZXJuYWxJZCIUcHJpY2VBc3NldEludGVybmFsSWQiD2xwQXNzZXREZWNpbWFscyIIcG9vbFR5cGUiFWRhdGFNYXBwaW5nUG9vbEFzc2V0cyIWaW50ZXJuYWxBbW91bnRBc3NldFN0ciIVaW50ZXJuYWxQcmljZUFzc2V0U3RyIg1nZXRQb29sQ29uZmlnIgpwb29sQXNzZXRzIhpnZXRJbnRlcm5hbEFzc2V0SWRPckNyZWF0ZSIKYXNzZXRJZFN0ciILaW5jcmVtZW50b3IiD2ludGVybmFsQXNzZXRJZCIYY3VycmVudEluZGV4T2ZJbnRlcm5hbElkIgZyZXN1bHQiEm5ld0ludGVybmFsQXNzZXRJZCIJbXVzdEFkbWluIghhZG1pblBLcyIJaXNNYW5hZ2VyIhZpbnRPckRlZmF1bHRPckZhbGxiYWNrIgprZXlEZWZhdWx0Ig12YWx1ZUZhbGxiYWNrIgZhc3NldDEiBmFzc2V0MiIJYXNzZXROdW0xIglhc3NldE51bTIiAmVlIgNyZXMiAmxwIg9zdGFraW5nQ29udHJhY3QiEGJvb3N0aW5nQ29udHJhY3QiEHNscGlwYWdlQ29udHJhY3QiDXByaWNlRGVjaW1hbHMiC2NoZWNrQ2FsbGVyIhBtYXRoY2hlclB1YjU4U3RyIgptYXRoY2VyUHViIhVsZWdhY3lGYWN0b3J5Q29udHJhY3QiC2xlZ2FjeVBvb2xzIhNhc3NldHNTdG9yZUNvbnRyYWN0IhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0IgtwcmljZUFzc2V0cyIFY2hla3MiF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5IhVjaGVja01hbmFnZXJQdWJsaWNLZXkiAnBtIgVoYXNQTSIHY2hlY2tQTSIMYWRtaW5QdWJLZXlzIgtscEFzc2V0TmFtZSIMbHBBc3NldERlc2NyIgpwb29sV2VpZ2h0IgRsb2dvIhdpbnRlcm5hbEFtb3VudEFzc2V0RGF0YSIVaW50ZXJuYWxBbW91bnRBc3NldElkIhZpbnRlcm5hbFByaWNlQXNzZXREYXRhIhRpbnRlcm5hbFByaWNlQXNzZXRJZCIVcG9vbEFjY291bnRTY3JpcHRIYXNoIhxldGhhbG9uUG9vbEFjY291bnRTY3JpcHRIYXNoIgpwb29sQ29uZmlnIg9wb29sQ29uZmlnVmFsdWUiFGFtb3VudEFzc2V0c0RlY2ltYWxzIhNwcmljZUFzc2V0c0RlY2ltYWxzIhJscEFzc2V0SXNzdWVBY3Rpb24iDGxwQXNzZXRJZFN0ciIYcG9vbEFjdGl2YXRlSW52b2tlUmVzdWx0IhhjcmVhdGVPclVwZGF0ZUxwQXNzZXRJbnYiEmFkZFBvb2xzTHBMYWJlbEludiIKc2V0TG9nb0ludiIQYWRkQXNzZXRzTGlua0ludiIbaW5jcmVhc2VBc3NldFBvb2xzTnVtYmVySW52IgluZXdTdGF0dXMiCmxwQXNzZXREY20iDGFtb3VudFRvRW1pdCIGY2FsbGVyIgxvcmlnaW5DYWxsZXIiEGxwQXNzZXRSZXF1ZXN0ZWQiB2xwQXNzZXQiDGFtb3VudFRvQnVybiIHcGF5bWVudCINcGF5bWVudEFtb3VudCIPaW5BbW91bnRBc3NldElkIhpscEFzc2V0UmVxdWVzdGVkRm9yQnVybmluZyIFc2hhcmUiDXBvb2xXZWlnaHRLZXkiDGd3eFdlaWdodEtleSIJZ3d4V2VpZ2h0Ig1wb29sV2VpZ2h0TmV3IhFvbk1vZGlmeVdlaWdodEludiIVZ3d4VmlydHVhbFBvb2xBY3Rpb25zIhRwb29sV2VpZ2h0SGlzdG9yeUtleSIXcG9vbFdlaWdodEhpc3RvcnlPclVuaXQiGHBvb2xXZWlnaHRIaXN0b3J5QWN0aW9ucyIOYnRjUG9vbEFkZHJlc3MiDmV0aFBvb2xBZGRyZXNzIhFldGhCdGNQb29sQWRkcmVzcyITdXNkY1VzZHRQb29sQWRkcmVzcyIPZXRoQnRjV2VpZ2h0TmV3IhF1c2RjVXNkdFdlaWdodE5ldyIPd2VpZ2h0RGVjcmVtZW50IgtzdGFraW5nRGFwcCINZ3d4UmV3YXJkRGFwcCIMYnRjV2VpZ2h0S0VZIgxldGhXZWlnaHRLRVkiD2V0aEJ0Y1dlaWdodEtFWSIRdXNkY1VzZHRXZWlnaHRLRVkiCWJ0Y1dlaWdodCIJZXRoV2VpZ2h0IgxidGNXZWlnaHROZXciDGV0aFdlaWdodE5ldyIPYnRjTHBBc3NldElkU3RyIg9ldGhMcEFzc2V0SWRTdHIiEmV0aEJ0Y0xwQXNzZXRJZFN0ciIUdXNkY1VzZHRMcEFzc2V0SWRTdHIiEW9uTW9kaWZ5V2VpZ2h0QnRjIhFvbk1vZGlmeVdlaWdodEV0aCIUb25Nb2RpZnlXZWlnaHRFdGhCdGMiFm9uTW9kaWZ5V2VpZ2h0VXNkY1VzZHQiCWhhdmVMYWJlbCIBYiIHYXNzZXRJZCIUY2hlY2tQcmljZUFzc2V0c1NpemUiAmNiIgNhY2MiCnByaWNlQXNzZXQiAXIiB2FjdGlvbnMiAiRsIgIkcyIFJGFjYzAiBSRmMF8xIgIkYSICJGkiBSRmMF8yIh5wb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiImFsbFBvb2xzT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiA2ZlZSIDY2ZnIgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXlmAAFhAAgAAWIAgMLXLwABYwASAAFkCQC2AgEAgICQu7rWrfANAAFlBQFiAAFmAg5HV1h2aXJ0dWFsUE9PTAABZwIIUE9PTFNfTFAAAWgAgIl6AAFpCQBoAgkAaAIAZADoBwDoBwABagICX18AAWsCAAABbAABAAFtAAIAAW4AAwABbwAEAAFwAAEAAXEAAgABcgADAAFzAAEAAXQAAgABdQADAAF2AAQAAXcABQABeAAGAAF5AAcAAXoACAABQQAJAAFCAAoAAUMACwABRAILV1hfRU1JU1NJT04AAUUJAMwIAgUBRAUDbmlsAQFGAAIXJXNfX2FsbG93ZWRMcFNjcmlwdEhhc2gBAUcAAh0lc19fYWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaAEBSAACIiVzX19hbGxvd2VkTHBTdGFibGVBZGRvblNjcmlwdEhhc2gBAUkAAhAlc19fc3dhcENvbnRyYWN0AQFKAAIRJXNfX2ZhY3RvcnlDb25maWcBAUsAAhAlc19fbHBUb2tlbnNMaXN0AQFMAAIWJXMlc19fcG9vbF9fc2NyaXB0SGFzaAEBTQACGCVzJXNfX21hdGNoZXJfX3B1YmxpY0tleQEBTgACGSVzX19sZWdhY3lGYWN0b3J5Q29udHJhY3QBAU8AAg8lc19fbGVnYWN5UG9vbHMBAVAAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBUQACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBUgACECVzX19hZG1pblB1YktleXMBAVMAAhclc19fYXNzZXRzU3RvcmVDb250cmFjdAEBVAACGiVzX192b3RpbmdFbWlzc2lvbkNvbnRyYWN0AQFVAAkAuQkCCQDMCAICAiVzCQDMCAICC3ByaWNlQXNzZXRzBQNuaWwFAWoBAVYAAhElc19fcHJpY2VEZWNpbWFscwEBVwACDCVzX19zaHV0ZG93bgEBWAACFyVzX19uZXh0SW50ZXJuYWxBc3NldElkAQFZAQFaCQCsAgICEiVzJXNfX3Bvb2xXZWlnaHRfXwUBWgECYWECAVoCYWIJAKwCAgkArAICCQCsAgICEiVzJXNfX3Bvb2xXZWlnaHRfXwUBWgICX18JAKQDAQUCYWIBAmFjAQJhZAkArAICAiglcyVzJWRfX21hcHBpbmdzX19pbnRlcm5hbDJiYXNlQXNzZXRJZF9fCQCkAwEFAmFkAQJhZQECYWYJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYWYBAmFnAgJhaAJhaQkArAICCQCsAgIJAKwCAgkArAICAgglZCVkJXNfXwUCYWgCAl9fBQJhaQIIX19jb25maWcBAmFqAQJhawQCYWwFAmFrBAJhaAgFAmFsAl8xBAJhaQgFAmFsAl8yCQC5CQIJAMwIAgIGJWQlZCVzCQDMCAIJAKQDAQUCYWgJAMwIAgkApAMBBQJhaQkAzAgCAhpvbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAUDbmlsBQFqAQJhbQAJALkJAgkAzAgCAgIlcwkAzAgCAhpvbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAUDbmlsBQFqAQJhbgECYW8JAKwCAgkArAICAgglcyVzJXNfXwUCYW8CGF9fbWFwcGluZ3NfX2xwQXNzZXQyUG9vbAECYXACAmFxAmFyCQCsAgIJAKwCAgkArAICCQCsAgICCiVkJWQlcyVzX18FAmFxAgJfXwUCYXICHl9fbWFwcGluZ3NfX1Bvb2xBc3NldHMyTHBBc3NldAECYXMBAVoJAKwCAgIOJXMlc19fc3ByZWFkX18FAVoBAmF0AQJhdQkArAICCQCsAgICCCVzJXMlc19fBQJhdQIjX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MlBvb2xBc3NldHMBAmF2AgJhcQJhcgkArAICCQCsAgIJAKwCAgkArAICAgolZCVkJXMlc19fCQCkAwEFAmFxAgJfXwkApAMBBQJhcgIjX19tYXBwaW5nc19fcG9vbEFzc2V0czJQb29sQ29udHJhY3QBAmF3AQJhdQkArAICCQCsAgICCCVzJXMlc19fBQJhdQIgX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MkxwQXNzZXQBAmF4AQJhbwkArAICCQCsAgICCCVzJXMlc19fBQJhbwIgX19tYXBwaW5nc19fbHBBc3NldDJQb29sQ29udHJhY3QBAmF5AgJhegJhQQkArAICCQCsAgIJAKwCAgIUJXMlcyVzX193eEVtaXNzaW9uX18FAmF6AgJfXwUCYUEBAmFCAQFaCQCsAgICDSVzJXNfX2luRmVlX18FAVoBAmFDAAIQJXNfX2luRmVlRGVmYXVsdAECYUQBAVoJAKwCAgIOJXMlc19fb3V0RmVlX18FAVoBAmFFAAIRJXNfX291dEZlZURlZmF1bHQBAmFGAQJhRwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFAmFHCQCsAgICFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUCYUcBAmFIAQJhRwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCbCAIFBHRoaXMFAmFHCQCsAgICFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUCYUcBAmFJAQJhRwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAmFHCQCsAgICFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUCYUcAAmFKAAEAAmFLAAIAAmFMAAMAAmFNAAQAAmFOAAUAAmFPAAYAAmFQAAcAAmFRAAgAAmFSAAkAAmFTAAoAAmFUAAsBAmFVAQJhVgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhVgUCYUsBAmFXAQJhVgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhVgUCYU4BAmFYAQJhVgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhVgUCYUoBAmFZAQJhVgkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhVgUCYVMBAmFaAAQCYmEJAKIIAQkBAVUAAwkAAQIFAmJhAgZTdHJpbmcEAmJiBQJiYQMJAAACCQCxAgEFAmJiAAAFA25pbAkAtQkCBQJiYgUBagUDbmlsAQJiYwAEAmJhCQCiCAEJAQFQAAMJAAECBQJiYQIGU3RyaW5nBAJiYgUCYmEJANkEAQUCYmIDCQABAgUCYmECBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECYmQABAJiYQkAoggBCQEBUQADCQABAgUCYmECBlN0cmluZwQCYmIFAmJhCQDZBAEFAmJiAwkAAQIFAmJhAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAAmJlCQACAQIRUGVybWlzc2lvbiBkZW5pZWQAAmJmCQACAQIPVGVzdCBlcnJvciBoZXJlAQJiZwECYmgDCQAAAggFAmJoBmNhbGxlcgUEdGhpcwYFAmJlAQJiaQECYmgEAmJhCQECYmMAAwkAAQIFAmJhAgpCeXRlVmVjdG9yBAJiagUCYmEDCQAAAggFAmJoD2NhbGxlclB1YmxpY0tleQUCYmoGBQJiZQMJAAECBQJiYQIEVW5pdAkBAmJnAQUCYmgJAAIBAgtNYXRjaCBlcnJvcgECYmsLAmJsAmJtAmJuAmJvAmJwAmJxAmJyAmJzAmJ0AmJ1AmJ2CQC5CQIJAMwIAgIWJXMlcyVzJXMlcyVzJXMlcyVzJXMlcwkAzAgCBQJibAkAzAgCBQJibQkAzAgCBQJibgkAzAgCBQJibwkAzAgCBQJicAkAzAgCBQJicQkAzAgCBQJicgkAzAgCBQJicwkAzAgCBQJidAkAzAgCBQJidQkAzAgCBQJidgUDbmlsBQFqAQJidwcCYmwCYm0CYm4CYm8CYnACYnECYnIJALkJAgkAzAgCAgwlcyVzJXMlcyVzJXMJAMwIAgUCYmwJAMwIAgUCYm0JAMwIAgUCYm4JAMwIAgUCYm8JAMwIAgUCYnAJAMwIAgUCYnEJAMwIAgUCYnIFA25pbAUBagECYngLAVoCYnkCYnoCYkECYkICYkMCYkQCYkUCYkYCYkcCYkgJALkJAgkAzAgCAhYlcyVkJXMlcyVzJWQlZCVkJWQlZCVzCQDMCAIFAVoJAMwIAgUCYnkJAMwIAgUCYnoJAMwIAgUCYkEJAMwIAgUCYkIJAMwIAgkApAMBBQJiQwkAzAgCCQCkAwEFAmJECQDMCAIJAKQDAQUCYkUJAMwIAgkApAMBBQJiRgkAzAgCCQCkAwEFAmJHCQDMCAIFAmJIBQNuaWwFAWoBAmJJAgJiSgJiSwkAuQkCCQDMCAICBCVkJWQJAMwIAgkApAMBBQJiSgkAzAgCCQCkAwEFAmJLBQNuaWwFAWoBAmJMAQFaBAJiTQkAtQkCCQECYUYBCQECYXQBBQFaBQFqBAJhaAkAkQMCBQJiTQABBAJhaQkAkQMCBQJiTQACCQC1CQIJAQJhRgEJAQJhZwIFAmFoBQJhaQUBagECYk4CAmJPAmJQBAJiUQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYWUBBQJiTwAABAJiUgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEBWAAAAAQCYlMDCQAAAgUCYlEAAAQCYlQJAGQCBQJiUgUCYlAJAJUKAwUCYlQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAAUCYlQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhZQEFAmJPBQJiVAkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMBBQJiVAUCYk8FA25pbAYJAJUKAwUCYlEFA25pbAcFAmJTAQJiVQECYmgEAmJWCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBAVIABQFrBQFqAwkBD2NvbnRhaW5zRWxlbWVudAIFAmJWCQDYBAEIBQJiaA9jYWxsZXJQdWJsaWNLZXkGBAJiVwkBAmJpAQUCYmgDCQAAAgUCYlcFAmJXBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECYlgDAmFHAmJZAmJaCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFHCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmJZBQJiWhoCYmgBF2dldFN3YXBDb250cmFjdFJFQURPTkxZAAkAlAoCBQNuaWwJAQJhRgEJAQFJAAJiaAEgZ2V0THBBc3NldEZyb21Qb29sQXNzZXRzUkVBRE9OTFkCAmNhAmNiBAJjYwkBBXZhbHVlAQkAmggCBQR0aGlzCQECYWUBBQJjYQQCY2QJAQV2YWx1ZQEJAJoIAgUEdGhpcwkBAmFlAQUCY2IEAmNlCQCdCAIFBHRoaXMJAQJhcAIJAKQDAQUCY2MJAKQDAQUCY2QEAmNmAwkAAAIFAmNlBQR1bml0BQR1bml0CQCwAgIJAQV2YWx1ZQEFAmNlAAQJAJQKAgUDbmlsBQJjZgJiaAEhZ2V0UG9vbEFkZHJlc3NGcm9tTHBBc3NldFJFQURPTkxZAQJjZwkAlAoCBQNuaWwJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAmF4AQUCY2cCAAJiaAELY29uc3RydWN0b3IIAmNoAmNpAmJuAmJvAmJwAmJxAmNqAmNrBAJjbAkBAmJpAQUCYmgDCQAAAgUCY2wFAmNsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFKAAkBAmJ3BwUCY2gFAmNpBQJibgUCYm8FAmJwBQJicQUCY2oJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAAUCY2sFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAENY29uc3RydWN0b3JWMgECY20EAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wEAmNuCQCnCAEJANkEAQUCY20DCQAAAgUCY24FAmNuCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFNAAUCY20FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAENY29uc3RydWN0b3JWMwQCYnMCYnQCYnUCYnYEAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wEAmFWCQC1CQIJAQJhRgEJAQFKAAUBagkAzAgCCQELU3RyaW5nRW50cnkCCQEBSgAJAQJiawsJAJEDAgUCYVYAAQkAkQMCBQJhVgACCQCRAwIFAmFWAAMJAJEDAgUCYVYABAkAkQMCBQJhVgAFCQCRAwIFAmFWAAYJAJEDAgUCYVYABwUCYnMFAmJ0BQJidQUCYnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAENY29uc3RydWN0b3JWNAICY28CY3AEAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU4ABQJjbwkAzAgCCQELU3RyaW5nRW50cnkCCQEBTwAJALkJAgUCY3AFAWoFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAENY29uc3RydWN0b3JWNQECY3EEAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMABQJjcQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQ1jb25zdHJ1Y3RvclY2AgJjcgJjcwQCY3QJAMwIAgkBAmJpAQUCYmgJAMwIAgMJAQIhPQIJAKYIAQUCY3IFBHVuaXQGAihpbnZhbGlkIHZvdGluZyBlbWlzc2lvbiBjb250cmFjdCBhZGRyZXNzBQNuaWwDCQAAAgUCY3QFAmN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAAUCY3IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUACQC5CQIFAmNzBQFqBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmgBCnNldE1hbmFnZXIBAmN1BAJjbAkBAmJpAQUCYmgDCQAAAgUCY2wFAmNsBAJjdgkA2QQBBQJjdQMJAAACBQJjdgUCY3YJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVEABQJjdQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQ5jb25maXJtTWFuYWdlcgAEAmN3CQECYmQABAJjeAMJAQlpc0RlZmluZWQBBQJjdwYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCY3gFAmN4BAJjeQMJAAACCAUCYmgPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJjdwYJAAIBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCY3kFAmN5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFQAAkA2AQBCQEFdmFsdWUBBQJjdwkAzAgCCQELRGVsZXRlRW50cnkBCQEBUQAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAEJc2V0QWRtaW5zAQJjegQCY2wJAQJiaQEFAmJoAwkAAAIFAmNsBQJjbAkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgAJALkJAgUCY3oFAWoFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAEPYWN0aXZhdGVOZXdQb29sCAFaAmJBAmJCAmNBAmNCAmNDAmJIAmNEBAJjbAkBAmJVAQUCYmgDCQAAAgUCY2wFAmNsAwkBCWlzRGVmaW5lZAEJAKIIAQkBAmF0AQUBWgkAAgEJAKwCAgkArAICAg1Qb29sIGFkZHJlc3MgBQFaAhQgYWxyZWFkeSByZWdpc3RlcmVkLgQCY0UJAQJiTgIFAmJBAAEEAmNGCAUCY0UCXzEEAmNHCQECYk4CBQJiQgMIBQJjRQJfMwACAAEEAmNICAUCY0cCXzEEAmNJCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAPEHAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUBWgkArAICAilObyBzY3JpcHQgaGFzIGJlZW4gZm91bmQgb24gcG9vbCBhY2NvdW50IAUBWgQCY0oJARFAZXh0ck5hdGl2ZSgxMDU3KQEJAQFMAAQCY0sJAJ0IAgUEdGhpcwkBAmFnAgkApAMBBQJjRgkApAMBBQJjSAMJAQlpc0RlZmluZWQBBQJjSwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIFUG9vbCAFAmJBAgEvBQJiQgIcIGhhcyBhbHJlYWR5IGJlZW4gYWN0aXZhdGVkLgQCY0wJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkBAmFnAgkApAMBBQJjRgkApAMBBQJjSAQCY00DCQAAAgUCYkECBVdBVkVTBQFpCQBsBgAKAAAICQEFdmFsdWUBCQDsBwEJANkEAQUCYkEIZGVjaW1hbHMAAAAABQRET1dOBAJjTgMJAAACBQJiQgIFV0FWRVMFAWkJAGwGAAoAAAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQJiQghkZWNpbWFscwAAAAAFBERPV04EAmNPCQDCCAUFAmNBBQJjQgABAAgGBAJiegkAuAgBBQJjTwQCY1AJANgEAQUCYnoEAmNRCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAVoCCGFjdGl2YXRlCQDMCAIFAmJBCQDMCAIFAmJCBQNuaWwFA25pbAMJAAACBQJjUQUCY1EDCQECIT0CBQJjUQIHc3VjY2VzcwkAAgECI1Bvb2wgaW5pdGlhbGlzYXRpb24gZXJyb3IgaGFwcGVuZWQuBAJjcQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFGAQkBAVMABAJjUgkA/AcEBQJjcQIOY3JlYXRlT3JVcGRhdGUJAMwIAgUCY1AJAMwIAgUCY0EJAMwIAgcFA25pbAUDbmlsAwkAAAIFAmNSBQJjUgQCY1MJAPwHBAUCY3ECCGFkZExhYmVsCQDMCAIFAmNQCQDMCAIFAWcFA25pbAUDbmlsAwkAAAIFAmNTBQJjUwQCY1QJAPwHBAUCY3ECB3NldExvZ28JAMwIAgUCY1AJAMwIAgUCY0QFA25pbAUDbmlsAwkAAAIFAmNUBQJjVAQCY1UJAPwHBAUCY3ECDWFkZEFzc2V0c0xpbmsJAMwIAgUCYkEJAMwIAgUCYkIJAMwIAgUCY1AFA25pbAUDbmlsAwkAAAIFAmNVBQJjVQQCY1YJAPwHBAUCY3ECGGluY3JlYXNlQXNzZXRQb29sc051bWJlcgkAzAgCBQJiQQUDbmlsBQNuaWwDCQAAAgUCY1YFAmNWCQCUCgIJAM4IAgkAzggCCAUCY0UCXzIIBQJjRwJfMgkAzAgCBQJjTwkAzAgCCQEEQnVybgIFAmJ6AAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFnAgkApAMBBQJjRgkApAMBBQJjSAkBAmJ4CwUBWgkApAMBBQFsBQJjUAUCYkEFAmJCBQJjTQUCY04FAmNGBQJjSAUBaQUCYkgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFuAQUCY1AJAQJiSQIFAmNGBQJjSAkAzAgCCQELU3RyaW5nRW50cnkCCQECYXACCQCkAwEFAmNGCQCkAwEFAmNICQCsAgICBCVzX18FAmNQCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhdAEFAVoJAQJiSQIFAmNGBQJjSAkAzAgCCQELU3RyaW5nRW50cnkCCQECYXYCBQJjRgUCY0gFAVoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF4AQUCY1AFAVoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF3AQUBWgUCY1AJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFZAQUBWgUCY0MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhcwEFAVoFAWgFA25pbAUCY1AJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmgBCm1hbmFnZVBvb2wCAVoCY1cEAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wEAmNLCQECYkwBBQFaBAJieQkAkQMCBQJjSwUBdAQCY1AJAJEDAgUCY0sFAXUEAmJBCQCRAwIFAmNLBQF2BAJiQgkAkQMCBQJjSwUBdwQCY00JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjSwUBeAQCY04JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjSwUBeQQCY0YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjSwUBegQCY0gJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjSwUBQQQCY1gJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjSwUBQgQCYkgJAJEDAgUCY0sFAUMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFnAgkApAMBBQJjRgkApAMBBQJjSAkBAmJ4CwUBWgkApAMBBQJjVwUCY1AFAmJBBQJiQgUCY00FAmNOBQJjRgUCY0gFAmNYBQJiSAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQRlbWl0AQJjWQQCY1oIBQJiaAZjYWxsZXIEAmRhCAUCYmgMb3JpZ2luQ2FsbGVyBAJkYgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAQJhdwEJAKUIAQUCY1oCHUludmFsaWQgTFAgYWRkcmVzcyBjYWxsZWQgbWUuBAJkYwkA2QQBBQJkYgQCY3AJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEBTwAFAWsFAWoEAmNvCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBAU4AAihMZWdhY3kgZmFjdG9yeSBjb250cmFjdCBkb2VzIG5vdCBleGlzdHMuAwkAZwIAAAUCY1kFA25pbAMJAQ9jb250YWluc0VsZW1lbnQCBQJjcAkApQgBBQJjWgkAlAoCBQNuaWwFAmNvCQCUCgIJAMwIAgkBB1JlaXNzdWUDBQJkYwUCY1kGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJiaAZjYWxsZXIFAmNZBQJkYwUDbmlsAgdzdWNjZXNzAmJoAQRidXJuAQJkZAQCY1oIBQJiaAZjYWxsZXIEAmRhCAUCYmgMb3JpZ2luQ2FsbGVyBAJkZQkBBXZhbHVlAQkAkQMCCAUCYmgIcGF5bWVudHMAAAQCZGYJAQV2YWx1ZQEIBQJkZQZhbW91bnQEAmRnCQDYBAEJAQV2YWx1ZQEIBQJkZQdhc3NldElkBAJkaAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAQJhdwEJAKUIAQUCY1oCHUludmFsaWQgTFAgYWRkcmVzcyBjYWxsZWQgbWUuAwkBAiE9AgUCZGcFAmRoCQACAQIVSW52YWxpZCBhc3NldCBwYXNzZWQuAwkBAiE9AgUCZGQFAmRmCQACAQIWSW52YWxpZCBhbW91bnQgcGFzc2VkLgQCZGMJANkEAQUCZGgJAJQKAgkAzAgCCQEEQnVybgIFAmRjBQJkZAUDbmlsAgdzdWNjZXNzAmJoAQxtb2RpZnlXZWlnaHQCAmJ6AmRpBAJjbAMJAAACCQDYBAEICAUCYmgGY2FsbGVyBWJ5dGVzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQFUAAIABgkBAmJpAQUCYmgDCQAAAgUCY2wFAmNsBAJhdQkBAmFGAQkBAmF4AQUCYnoEAmRqCQEBWQEFAmF1BAJkawkBAVkBBQFmBAJkbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQJkawAABAJjQwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQJkagAABAJkbQUCZGkEAmFWCQC1CQIJAQJhRgEJAQFKAAUBagQCY2gJAQJhWAEFAmFWBAJkbgkA/AcEBQJjaAIOb25Nb2RpZnlXZWlnaHQJAMwIAgUCYnoJAMwIAgUCYXUFA25pbAUDbmlsAwkAAAIFAmRuBQJkbgQCZG8DCQAAAgUCZGwAAAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkawAABQNuaWwEAmRwCQECYWECBQJhdQAABAJkcQkAnwgBBQJkcAQCZHIDCQAAAgUCZHEFBHVuaXQFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBBQJkcAUDbmlsCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZGoFAmRtBQNuaWwFAmRvBQJkcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAENbW9kaWZ5V2VpZ2h0cwQCZHMCZHQCZHUCZHYEAmNsCQECYmkBBQJiaAMJAAACBQJjbAUCY2wEAmR3CQBpAgkAaAIABQUBZQBkBAJkeAkAaQIJAGgCAAUFAWUAZAQCZHkJAGkCCQBoAgAFBQFlAGQEAmFWCQC1CQIJAQJhRgEJAQFKAAUBagQCZHoJAQJhWAEFAmFWBAJkQQkBAmFZAQUCYVYEAmRCCQEBWQEFAmRzBAJkQwkBAVkBBQJkdAQCZEQJAQFZAQUCZHUEAmRFCQEBWQEFAmR2BAJkRgkBAmFJAQUCZEIEAmRHCQECYUkBBQJkQwQCZEgJAGUCBQJkRgUCZHkEAmRJCQBlAgUCZEcFAmR5AwkAZwIAAAUCZEgJAAIBCQCsAgICFmludmFsaWQgYnRjV2VpZ2h0TmV3OiAJAKQDAQUCZEgDCQBnAgAABQJkSQkAAgEJAKwCAgIWaW52YWxpZCBldGhXZWlnaHROZXc6IAkApAMBBQJkSQQCZEoJAQJhRgEJAQJhdwEFAmRzBAJkSwkBAmFGAQkBAmF3AQUCZHQEAmRMCQECYUYBCQECYXcBBQJkdQQCZE0JAQJhRgEJAQJhdwEFAmR2BAJkTgkA/AcEBQJkegIOb25Nb2RpZnlXZWlnaHQJAMwIAgUCZEoJAMwIAgUCZHMFA25pbAUDbmlsAwkAAAIFAmROBQJkTgQCZE8JAPwHBAUCZHoCDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmRLCQDMCAIFAmR0BQNuaWwFA25pbAMJAAACBQJkTwUCZE8EAmRQCQD8BwQFAmR6Ag5vbk1vZGlmeVdlaWdodAkAzAgCBQJkTAkAzAgCBQJkdQUDbmlsBQNuaWwDCQAAAgUCZFAFAmRQBAJkUQkA/AcEBQJkegIOb25Nb2RpZnlXZWlnaHQJAMwIAgUCZE0JAMwIAgUCZHYFA25pbAUDbmlsAwkAAAIFAmRRBQJkUQkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZEIFAmRICQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkQwUCZEkJAMwIAgkBDEludGVnZXJFbnRyeQIFAmREBQJkdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZEUFAmR4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWECBQJkcwAABQJkRgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFhAgUCZHQAAAUCZEcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYQIFAmR1AAAFAmR3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWECBQJkdgAABQJkeAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoARhjaGVja1d4RW1pc3Npb25Qb29sTGFiZWwCAmF6AmFBBAJkUgQCYmEJAKAIAQkBAmF5AgUCYXoFAmFBAwkAAQIFAmJhAgdCb29sZWFuBAJkUwUCYmEFAmRTBwkAlAoCBQNuaWwFAmRSAmJoARZzZXRXeEVtaXNzaW9uUG9vbExhYmVsAgJhegJhQQQCY2wJAQJiVQEFAmJoAwkAAAIFAmNsBQJjbAkAlAoCCQDMCAIJAQxCb29sZWFuRW50cnkCCQECYXkCBQJhegUCYUEGBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmgBGWRlbGV0ZVd4RW1pc3Npb25Qb29sTGFiZWwCAmF6AmFBBAJjbAMJAQJiZwEFAmJoBgkBAmJVAQUCYmgDCQAAAgUCY2wFAmNsCQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmF5AgUCYXoFAmFBBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmgBEm9uVmVyaWZpY2F0aW9uTG9zcwECZFQEAmNsAwkAAAIJANgEAQgIBQJiaAZjYWxsZXIFYnl0ZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAVMAAgAGCQECYmkBBQJiaAMJAAACBQJjbAUCY2wEAmNzCQECYVoABAJkVQMJAGYCCQCQAwEFAmNzAAAGCQACAQIUaW52YWxpZCBwcmljZSBhc3NldHMDCQAAAgUCZFUFAmRVCgECZFYCAmRXAmRYBAJkWQkA/AcEBQR0aGlzAhlkZWxldGVXeEVtaXNzaW9uUG9vbExhYmVsCQDMCAIFAmRUCQDMCAIFAmRYBQNuaWwFA25pbAMJAAACBQJkWQUCZFkFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAmRaCgACZWEFAmNzCgACZWIJAJADAQUCZWEKAAJlYwUEdW5pdAoBAmVkAgJlZQJlZgMJAGcCBQJlZgUCZWIFAmVlCQECZFYCBQJlZQkAkQMCBQJlYQUCZWYKAQJlZwICZWUCZWYDCQBnAgUCZWYFAmViBQJlZQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDEJAQJlZwIJAQJlZAIFAmVjAAAAAQMJAAACBQJkWgUCZFoJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAShpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZAQFaBAJjSwkBAmJMAQUBWgQCYWsJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNLBQF6CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCY0sFAUEEAmVoCQELdmFsdWVPckVsc2UCCQCgCAEJAQJhagEFAmFrBwQCZWkJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBAmFtAAcJAJQKAgUDbmlsAwUCZWkGBQJlaAJiaAEQZ2V0SW5GZWVSRUFET05MWQEBWgQCZWoJAQJiWAMJAQJhQgEFAVoJAQJhQwAAAAkAlAoCBQNuaWwFAmVqAmJoARFnZXRPdXRGZWVSRUFET05MWQEBWgQCZWoJAQJiWAMJAQJhRAEFAVoJAQJhRQAJAGsDAAoFAWIAkE4JAJQKAgUDbmlsBQJlagJiaAEVZ2V0UG9vbFN0YXR1c1JFQURPTkxZAQFaBAJiTQkAtQkCCQECYUYBCQECYXQBBQFaBQFqBAJhaAkAkQMCBQJiTQABBAJhaQkAkQMCBQJiTQACBAJlawkAtQkCCQECYUYBCQECYWcCBQJhaAUCYWkFAWoJAJQKAgUDbmlsCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZWsFAXQBAmVsAQJlbQAEAmVuBAJiYQkBAmJjAAMJAAECBQJiYQIKQnl0ZVZlY3RvcgQCYmoFAmJhBQJiagMJAAECBQJiYQIEVW5pdAgFAmVsD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJlbAlib2R5Qnl0ZXMJAJEDAggFAmVsBnByb29mcwAABQJlbvyMy0c=", "chainId": 84, "height": 2442113, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 83dMzBzhGqG9tMz2gmpGm4HXYV2tvj3vzyVN6kNWyrpW Next: 6rHDHg4HtAMbDg7ErtEDeXfvfauGpV6aR7i7D8MW28pL 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
254257
255258 let permissionDeniedError = throw("Permission denied")
256259
260+let testError = throw("Test error here")
261+
257262 func mustThis (i) = if ((i.caller == this))
258263 then true
259264 else permissionDeniedError
318323
319324
320325 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+
331+
332+
333+@Callable(i)
334+func getLpAssetFromPoolAssetsREADONLY (asset1,asset2) = {
335+ let assetNum1 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset1)))
336+ let assetNum2 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset2)))
337+ let ee = getString(this, keyMappingPoolAssetsToLpasset(toString(assetNum1), toString(assetNum2)))
338+ let res = if ((ee == unit))
339+ then unit
340+ else drop(value(ee), 4)
341+ $Tuple2(nil, res)
342+ }
343+
344+
345+
346+@Callable(i)
347+func getPoolAddressFromLpAssetREADONLY (lp) = $Tuple2(nil, valueOrElse(getString(this, keyMappingPoolLPAssetToPoolContractAddress(lp)), ""))
348+
321349
322350
323351 @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
260+let testError = throw("Test error here")
261+
257262 func mustThis (i) = if ((i.caller == this))
258263 then true
259264 else permissionDeniedError
260265
261266
262267 func mustManager (i) = match managerPublicKeyOrUnit() {
263268 case pk: ByteVector =>
264269 if ((i.callerPublicKey == pk))
265270 then true
266271 else permissionDeniedError
267272 case _: Unit =>
268273 mustThis(i)
269274 case _ =>
270275 throw("Match error")
271276 }
272277
273278
274279 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)
275280
276281
277282 func dataFactoryCfg (stakingAddress,boostingAddress,idoContract,teamContract,emissionContract,restContract,slippageContract) = makeString(["%s%s%s%s%s%s", stakingAddress, boostingAddress, idoContract, teamContract, emissionContract, restContract, slippageContract], SEP)
278283
279284
280285 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)
281286
282287
283288 func dataMappingPoolAssets (internalAmountAssetStr,internalPriceAssetStr) = makeString(["%d%d", toString(internalAmountAssetStr), toString(internalPriceAssetStr)], SEP)
284289
285290
286291 func getPoolConfig (poolAddress) = {
287292 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
288293 let amountAssetInternal = poolAssets[1]
289294 let priceAssetInternal = poolAssets[2]
290295 split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
291296 }
292297
293298
294299 func getInternalAssetIdOrCreate (assetIdStr,incrementor) = {
295300 let internalAssetId = valueOrElse(getInteger(this, keyMappingsBaseAsset2internalId(assetIdStr)), 0)
296301 let currentIndexOfInternalId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0)
297302 let result = if ((internalAssetId == 0))
298303 then {
299304 let newInternalAssetId = (currentIndexOfInternalId + incrementor)
300305 $Tuple3(newInternalAssetId, [IntegerEntry(keyNextInternalAssetId(), newInternalAssetId), IntegerEntry(keyMappingsBaseAsset2internalId(assetIdStr), newInternalAssetId), StringEntry(keyMappingsInternal2baseAssetId(newInternalAssetId), assetIdStr)], true)
301306 }
302307 else $Tuple3(internalAssetId, nil, false)
303308 result
304309 }
305310
306311
307312 func mustAdmin (i) = {
308313 let adminPKs = split(valueOrElse(getString(keyAdminPubKeys()), EMPTY), SEP)
309314 if (containsElement(adminPKs, toBase58String(i.callerPublicKey)))
310315 then true
311316 else {
312317 let isManager = mustManager(i)
313318 if ((isManager == isManager))
314319 then true
315320 else throw("Strict value is not equal to itself.")
316321 }
317322 }
318323
319324
320325 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+
331+
332+
333+@Callable(i)
334+func getLpAssetFromPoolAssetsREADONLY (asset1,asset2) = {
335+ let assetNum1 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset1)))
336+ let assetNum2 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset2)))
337+ let ee = getString(this, keyMappingPoolAssetsToLpasset(toString(assetNum1), toString(assetNum2)))
338+ let res = if ((ee == unit))
339+ then unit
340+ else drop(value(ee), 4)
341+ $Tuple2(nil, res)
342+ }
343+
344+
345+
346+@Callable(i)
347+func getPoolAddressFromLpAssetREADONLY (lp) = $Tuple2(nil, valueOrElse(getString(this, keyMappingPoolLPAssetToPoolContractAddress(lp)), ""))
348+
321349
322350
323351 @Callable(i)
324352 func constructor (stakingContract,boostingContract,idoContract,teamContract,emissionContract,restContract,slpipageContract,priceDecimals) = {
325353 let checkCaller = mustManager(i)
326354 if ((checkCaller == checkCaller))
327355 then [StringEntry(keyFactoryConfig(), dataFactoryCfg(stakingContract, boostingContract, idoContract, teamContract, emissionContract, restContract, slpipageContract)), IntegerEntry(keyPriceDecimals(), priceDecimals)]
328356 else throw("Strict value is not equal to itself.")
329357 }
330358
331359
332360
333361 @Callable(i)
334362 func constructorV2 (mathcherPub58Str) = {
335363 let checkCaller = mustManager(i)
336364 if ((checkCaller == checkCaller))
337365 then {
338366 let mathcerPub = addressFromPublicKey(fromBase58String(mathcherPub58Str))
339367 if ((mathcerPub == mathcerPub))
340368 then [StringEntry(keyMatcherPub(), mathcherPub58Str)]
341369 else throw("Strict value is not equal to itself.")
342370 }
343371 else throw("Strict value is not equal to itself.")
344372 }
345373
346374
347375
348376 @Callable(i)
349377 func constructorV3 (daoContract,marketingContract,gwxRewardsContract,birdsContract) = {
350378 let checkCaller = mustManager(i)
351379 if ((checkCaller == checkCaller))
352380 then {
353381 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
354382 [StringEntry(keyFactoryConfig(), dataFactoryCfgV3(factoryCfg[1], factoryCfg[2], factoryCfg[3], factoryCfg[4], factoryCfg[5], factoryCfg[6], factoryCfg[7], daoContract, marketingContract, gwxRewardsContract, birdsContract))]
355383 }
356384 else throw("Strict value is not equal to itself.")
357385 }
358386
359387
360388
361389 @Callable(i)
362390 func constructorV4 (legacyFactoryContract,legacyPools) = {
363391 let checkCaller = mustManager(i)
364392 if ((checkCaller == checkCaller))
365393 then [StringEntry(keyLegacyFactoryContract(), legacyFactoryContract), StringEntry(keyLegacyPools(), makeString(legacyPools, SEP))]
366394 else throw("Strict value is not equal to itself.")
367395 }
368396
369397
370398
371399 @Callable(i)
372400 func constructorV5 (assetsStoreContract) = {
373401 let checkCaller = mustManager(i)
374402 if ((checkCaller == checkCaller))
375403 then [StringEntry(keyAssetsStoreContract(), assetsStoreContract)]
376404 else throw("Strict value is not equal to itself.")
377405 }
378406
379407
380408
381409 @Callable(i)
382410 func constructorV6 (votingEmissionContract,priceAssets) = {
383411 let cheks = [mustManager(i), if ((addressFromString(votingEmissionContract) != unit))
384412 then true
385413 else "invalid voting emission contract address"]
386414 if ((cheks == cheks))
387415 then [StringEntry(keyVotingEmissionContract(), votingEmissionContract), StringEntry(keyPriceAssets(), makeString(priceAssets, SEP))]
388416 else throw("Strict value is not equal to itself.")
389417 }
390418
391419
392420
393421 @Callable(i)
394422 func setManager (pendingManagerPublicKey) = {
395423 let checkCaller = mustManager(i)
396424 if ((checkCaller == checkCaller))
397425 then {
398426 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
399427 if ((checkManagerPublicKey == checkManagerPublicKey))
400428 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
401429 else throw("Strict value is not equal to itself.")
402430 }
403431 else throw("Strict value is not equal to itself.")
404432 }
405433
406434
407435
408436 @Callable(i)
409437 func confirmManager () = {
410438 let pm = pendingManagerPublicKeyOrUnit()
411439 let hasPM = if (isDefined(pm))
412440 then true
413441 else throw("No pending manager")
414442 if ((hasPM == hasPM))
415443 then {
416444 let checkPM = if ((i.callerPublicKey == value(pm)))
417445 then true
418446 else throw("You are not pending manager")
419447 if ((checkPM == checkPM))
420448 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
421449 else throw("Strict value is not equal to itself.")
422450 }
423451 else throw("Strict value is not equal to itself.")
424452 }
425453
426454
427455
428456 @Callable(i)
429457 func setAdmins (adminPubKeys) = {
430458 let checkCaller = mustManager(i)
431459 if ((checkCaller == checkCaller))
432460 then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
433461 else throw("Strict value is not equal to itself.")
434462 }
435463
436464
437465
438466 @Callable(i)
439467 func activateNewPool (poolAddress,amountAssetStr,priceAssetStr,lpAssetName,lpAssetDescr,poolWeight,poolType,logo) = {
440468 let checkCaller = mustAdmin(i)
441469 if ((checkCaller == checkCaller))
442470 then if (isDefined(getString(keyMappingPoolContractAddressToPoolAssets(poolAddress))))
443471 then throw((("Pool address " + poolAddress) + " already registered."))
444472 else {
445473 let internalAmountAssetData = getInternalAssetIdOrCreate(amountAssetStr, 1)
446474 let internalAmountAssetId = internalAmountAssetData._1
447475 let internalPriceAssetData = getInternalAssetIdOrCreate(priceAssetStr, if (internalAmountAssetData._3)
448476 then 2
449477 else 1)
450478 let internalPriceAssetId = internalPriceAssetData._1
451479 let poolAccountScriptHash = valueOrErrorMessage(scriptHash(addressFromStringValue(poolAddress)), ("No script has been found on pool account " + poolAddress))
452480 let ethalonPoolAccountScriptHash = getBinaryValue(keyPoolScriptHash())
453481 let poolConfig = getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)))
454482 if (isDefined(poolConfig))
455483 then throw((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated."))
456484 else {
457485 let poolConfigValue = value(getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId))))
458486 let amountAssetsDecimals = if ((amountAssetStr == "WAVES"))
459487 then decimalsMultPrice
460488 else pow(10, 0, value(assetInfo(fromBase58String(amountAssetStr))).decimals, 0, 0, DOWN)
461489 let priceAssetsDecimals = if ((priceAssetStr == "WAVES"))
462490 then decimalsMultPrice
463491 else pow(10, 0, value(assetInfo(fromBase58String(priceAssetStr))).decimals, 0, 0, DOWN)
464492 let lpAssetIssueAction = Issue(lpAssetName, lpAssetDescr, 1, 8, true)
465493 let lpAssetId = calculateAssetId(lpAssetIssueAction)
466494 let lpAssetIdStr = toBase58String(lpAssetId)
467495 let poolActivateInvokeResult = invoke(addressFromStringValue(poolAddress), "activate", [amountAssetStr, priceAssetStr], nil)
468496 if ((poolActivateInvokeResult == poolActivateInvokeResult))
469497 then if ((poolActivateInvokeResult != "success"))
470498 then throw("Pool initialisation error happened.")
471499 else {
472500 let assetsStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract()))
473501 let createOrUpdateLpAssetInv = invoke(assetsStoreContract, "createOrUpdate", [lpAssetIdStr, lpAssetName, false], nil)
474502 if ((createOrUpdateLpAssetInv == createOrUpdateLpAssetInv))
475503 then {
476504 let addPoolsLpLabelInv = invoke(assetsStoreContract, "addLabel", [lpAssetIdStr, labelPoolsLp], nil)
477505 if ((addPoolsLpLabelInv == addPoolsLpLabelInv))
478506 then {
479507 let setLogoInv = invoke(assetsStoreContract, "setLogo", [lpAssetIdStr, logo], nil)
480508 if ((setLogoInv == setLogoInv))
481509 then {
482510 let addAssetsLinkInv = invoke(assetsStoreContract, "addAssetsLink", [amountAssetStr, priceAssetStr, lpAssetIdStr], nil)
483511 if ((addAssetsLinkInv == addAssetsLinkInv))
484512 then {
485513 let increaseAssetPoolsNumberInv = invoke(assetsStoreContract, "increaseAssetPoolsNumber", [amountAssetStr], nil)
486514 if ((increaseAssetPoolsNumberInv == increaseAssetPoolsNumberInv))
487515 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)
488516 else throw("Strict value is not equal to itself.")
489517 }
490518 else throw("Strict value is not equal to itself.")
491519 }
492520 else throw("Strict value is not equal to itself.")
493521 }
494522 else throw("Strict value is not equal to itself.")
495523 }
496524 else throw("Strict value is not equal to itself.")
497525 }
498526 else throw("Strict value is not equal to itself.")
499527 }
500528 }
501529 else throw("Strict value is not equal to itself.")
502530 }
503531
504532
505533
506534 @Callable(i)
507535 func managePool (poolAddress,newStatus) = {
508536 let checkCaller = mustManager(i)
509537 if ((checkCaller == checkCaller))
510538 then {
511539 let poolConfig = getPoolConfig(poolAddress)
512540 let poolStatus = poolConfig[idxPoolStatus]
513541 let lpAssetIdStr = poolConfig[idxPoolLPAssetId]
514542 let amountAssetStr = poolConfig[idxAmtAssetId]
515543 let priceAssetStr = poolConfig[idxPriceAssetId]
516544 let amountAssetsDecimals = parseIntValue(poolConfig[idxAmtAssetDcm])
517545 let priceAssetsDecimals = parseIntValue(poolConfig[idxPriceAssetDcm])
518546 let internalAmountAssetId = parseIntValue(poolConfig[idxIAmtAssetId])
519547 let internalPriceAssetId = parseIntValue(poolConfig[idxIPriceAssetId])
520548 let lpAssetDcm = parseIntValue(poolConfig[idxLPAssetDcm])
521549 let poolType = poolConfig[idxPoolType]
522550 [StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(newStatus), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, lpAssetDcm, poolType))]
523551 }
524552 else throw("Strict value is not equal to itself.")
525553 }
526554
527555
528556
529557 @Callable(i)
530558 func emit (amountToEmit) = {
531559 let caller = i.caller
532560 let originCaller = i.originCaller
533561 let lpAssetRequested = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
534562 let lpAsset = fromBase58String(lpAssetRequested)
535563 let legacyPools = split(valueOrElse(getString(keyLegacyPools()), EMPTY), SEP)
536564 let legacyFactoryContract = addressFromStringValue(valueOrErrorMessage(getString(keyLegacyFactoryContract()), "Legacy factory contract does not exists."))
537565 if ((0 >= amountToEmit))
538566 then nil
539567 else if (containsElement(legacyPools, toString(caller)))
540568 then $Tuple2(nil, legacyFactoryContract)
541569 else $Tuple2([Reissue(lpAsset, amountToEmit, true), ScriptTransfer(i.caller, amountToEmit, lpAsset)], "success")
542570 }
543571
544572
545573
546574 @Callable(i)
547575 func burn (amountToBurn) = {
548576 let caller = i.caller
549577 let originCaller = i.originCaller
550578 let payment = value(i.payments[0])
551579 let paymentAmount = value(payment.amount)
552580 let inAmountAssetId = toBase58String(value(payment.assetId))
553581 let lpAssetRequestedForBurning = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
554582 if ((inAmountAssetId != lpAssetRequestedForBurning))
555583 then throw("Invalid asset passed.")
556584 else if ((amountToBurn != paymentAmount))
557585 then throw("Invalid amount passed.")
558586 else {
559587 let lpAsset = fromBase58String(lpAssetRequestedForBurning)
560588 $Tuple2([Burn(lpAsset, amountToBurn)], "success")
561589 }
562590 }
563591
564592
565593
566594 @Callable(i)
567595 func modifyWeight (lpAssetId,share) = {
568596 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionContract()), "")))
569597 then true
570598 else mustManager(i)
571599 if ((checkCaller == checkCaller))
572600 then {
573601 let poolContractAddress = getStringOrFail(keyMappingPoolLPAssetToPoolContractAddress(lpAssetId))
574602 let poolWeightKey = keyPoolToWeight(poolContractAddress)
575603 let gwxWeightKey = keyPoolToWeight(GWXvirtualPOOL)
576604 let gwxWeight = valueOrElse(getInteger(gwxWeightKey), 0)
577605 let poolWeight = valueOrElse(getInteger(poolWeightKey), 0)
578606 let poolWeightNew = share
579607 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
580608 let stakingContract = getStakingAddressOrFail(factoryCfg)
581609 let onModifyWeightInv = invoke(stakingContract, "onModifyWeight", [lpAssetId, poolContractAddress], nil)
582610 if ((onModifyWeightInv == onModifyWeightInv))
583611 then {
584612 let gwxVirtualPoolActions = if ((gwxWeight == 0))
585613 then nil
586614 else [IntegerEntry(gwxWeightKey, 0)]
587615 let poolWeightHistoryKey = keyPoolToWeightHistory(poolContractAddress, 0)
588616 let poolWeightHistoryOrUnit = getInteger(poolWeightHistoryKey)
589617 let poolWeightHistoryActions = if ((poolWeightHistoryOrUnit == unit))
590618 then nil
591619 else [DeleteEntry(poolWeightHistoryKey)]
592620 (([IntegerEntry(poolWeightKey, poolWeightNew)] ++ gwxVirtualPoolActions) ++ poolWeightHistoryActions)
593621 }
594622 else throw("Strict value is not equal to itself.")
595623 }
596624 else throw("Strict value is not equal to itself.")
597625 }
598626
599627
600628
601629 @Callable(i)
602630 func modifyWeights (btcPoolAddress,ethPoolAddress,ethBtcPoolAddress,usdcUsdtPoolAddress) = {
603631 let checkCaller = mustManager(i)
604632 if ((checkCaller == checkCaller))
605633 then {
606634 let ethBtcWeightNew = ((5 * POOLWEIGHTMULT) / 100)
607635 let usdcUsdtWeightNew = ((5 * POOLWEIGHTMULT) / 100)
608636 let weightDecrement = ((5 * POOLWEIGHTMULT) / 100)
609637 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
610638 let stakingDapp = getStakingAddressOrFail(factoryCfg)
611639 let gwxRewardDapp = getGwxRewardAddressOrFail(factoryCfg)
612640 let btcWeightKEY = keyPoolToWeight(btcPoolAddress)
613641 let ethWeightKEY = keyPoolToWeight(ethPoolAddress)
614642 let ethBtcWeightKEY = keyPoolToWeight(ethBtcPoolAddress)
615643 let usdcUsdtWeightKEY = keyPoolToWeight(usdcUsdtPoolAddress)
616644 let btcWeight = getIntOrFail(btcWeightKEY)
617645 let ethWeight = getIntOrFail(ethWeightKEY)
618646 let btcWeightNew = (btcWeight - weightDecrement)
619647 let ethWeightNew = (ethWeight - weightDecrement)
620648 if ((0 >= btcWeightNew))
621649 then throw(("invalid btcWeightNew: " + toString(btcWeightNew)))
622650 else if ((0 >= ethWeightNew))
623651 then throw(("invalid ethWeightNew: " + toString(ethWeightNew)))
624652 else {
625653 let btcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(btcPoolAddress))
626654 let ethLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethPoolAddress))
627655 let ethBtcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethBtcPoolAddress))
628656 let usdcUsdtLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(usdcUsdtPoolAddress))
629657 let onModifyWeightBtc = invoke(stakingDapp, "onModifyWeight", [btcLpAssetIdStr, btcPoolAddress], nil)
630658 if ((onModifyWeightBtc == onModifyWeightBtc))
631659 then {
632660 let onModifyWeightEth = invoke(stakingDapp, "onModifyWeight", [ethLpAssetIdStr, ethPoolAddress], nil)
633661 if ((onModifyWeightEth == onModifyWeightEth))
634662 then {
635663 let onModifyWeightEthBtc = invoke(stakingDapp, "onModifyWeight", [ethBtcLpAssetIdStr, ethBtcPoolAddress], nil)
636664 if ((onModifyWeightEthBtc == onModifyWeightEthBtc))
637665 then {
638666 let onModifyWeightUsdcUsdt = invoke(stakingDapp, "onModifyWeight", [usdcUsdtLpAssetIdStr, usdcUsdtPoolAddress], nil)
639667 if ((onModifyWeightUsdcUsdt == onModifyWeightUsdcUsdt))
640668 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)]
641669 else throw("Strict value is not equal to itself.")
642670 }
643671 else throw("Strict value is not equal to itself.")
644672 }
645673 else throw("Strict value is not equal to itself.")
646674 }
647675 else throw("Strict value is not equal to itself.")
648676 }
649677 }
650678 else throw("Strict value is not equal to itself.")
651679 }
652680
653681
654682
655683 @Callable(i)
656684 func checkWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
657685 let haveLabel = match getBoolean(keyWxEmission(amountAssetId, priceAssetId)) {
658686 case b: Boolean =>
659687 b
660688 case _ =>
661689 false
662690 }
663691 $Tuple2(nil, haveLabel)
664692 }
665693
666694
667695
668696 @Callable(i)
669697 func setWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
670698 let checkCaller = mustAdmin(i)
671699 if ((checkCaller == checkCaller))
672700 then $Tuple2([BooleanEntry(keyWxEmission(amountAssetId, priceAssetId), true)], unit)
673701 else throw("Strict value is not equal to itself.")
674702 }
675703
676704
677705
678706 @Callable(i)
679707 func deleteWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
680708 let checkCaller = if (mustThis(i))
681709 then true
682710 else mustAdmin(i)
683711 if ((checkCaller == checkCaller))
684712 then $Tuple2([DeleteEntry(keyWxEmission(amountAssetId, priceAssetId))], unit)
685713 else throw("Strict value is not equal to itself.")
686714 }
687715
688716
689717
690718 @Callable(i)
691719 func onVerificationLoss (assetId) = {
692720 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyAssetsStoreContract()), "")))
693721 then true
694722 else mustManager(i)
695723 if ((checkCaller == checkCaller))
696724 then {
697725 let priceAssets = getPriceAssets()
698726 let checkPriceAssetsSize = if ((size(priceAssets) > 0))
699727 then true
700728 else throw("invalid price assets")
701729 if ((checkPriceAssetsSize == checkPriceAssetsSize))
702730 then {
703731 func cb (acc,priceAsset) = {
704732 let r = invoke(this, "deleteWxEmissionPoolLabel", [assetId, priceAsset], nil)
705733 if ((r == r))
706734 then unit
707735 else throw("Strict value is not equal to itself.")
708736 }
709737
710738 let actions = {
711739 let $l = priceAssets
712740 let $s = size($l)
713741 let $acc0 = unit
714742 func $f0_1 ($a,$i) = if (($i >= $s))
715743 then $a
716744 else cb($a, $l[$i])
717745
718746 func $f0_2 ($a,$i) = if (($i >= $s))
719747 then $a
720748 else throw("List size exceeds 1")
721749
722750 $f0_2($f0_1($acc0, 0), 1)
723751 }
724752 if ((actions == actions))
725753 then $Tuple2(nil, unit)
726754 else throw("Strict value is not equal to itself.")
727755 }
728756 else throw("Strict value is not equal to itself.")
729757 }
730758 else throw("Strict value is not equal to itself.")
731759 }
732760
733761
734762
735763 @Callable(i)
736764 func isPoolOneTokenOperationsDisabledREADONLY (poolAddress) = {
737765 let poolConfig = getPoolConfig(poolAddress)
738766 let assetsInternal = $Tuple2(parseIntValue(poolConfig[idxIAmtAssetId]), parseIntValue(poolConfig[idxIPriceAssetId]))
739767 let poolOneTokenOperationsDisabled = valueOrElse(getBoolean(keyPoolOneTokenOperationsDisabled(assetsInternal)), false)
740768 let allPoolsOneTokenOperationsDisabled = valueOrElse(getBoolean(keyAllPoolsOneTokenOperationsDisabled()), false)
741769 $Tuple2(nil, if (allPoolsOneTokenOperationsDisabled)
742770 then true
743771 else poolOneTokenOperationsDisabled)
744772 }
745773
746774
747775
748776 @Callable(i)
749777 func getInFeeREADONLY (poolAddress) = {
750778 let fee = intOrDefaultOrFallback(keyInFee(poolAddress), keyInFeeDefault(), 0)
751779 $Tuple2(nil, fee)
752780 }
753781
754782
755783
756784 @Callable(i)
757785 func getOutFeeREADONLY (poolAddress) = {
758786 let fee = intOrDefaultOrFallback(keyOutFee(poolAddress), keyOutFeeDefault(), fraction(10, MULT8, 10000))
759787 $Tuple2(nil, fee)
760788 }
761789
762790
763791
764792 @Callable(i)
765793 func getPoolStatusREADONLY (poolAddress) = {
766794 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
767795 let amountAssetInternal = poolAssets[1]
768796 let priceAssetInternal = poolAssets[2]
769797 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
770798 $Tuple2(nil, parseIntValue(cfg[idxPoolStatus]))
771799 }
772800
773801
774802 @Verifier(tx)
775803 func verify () = {
776804 let targetPublicKey = match managerPublicKeyOrUnit() {
777805 case pk: ByteVector =>
778806 pk
779807 case _: Unit =>
780808 tx.senderPublicKey
781809 case _ =>
782810 throw("Match error")
783811 }
784812 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
785813 }
786814

github/deemru/w8io/3ef1775 
114.87 ms