tx · 83dMzBzhGqG9tMz2gmpGm4HXYV2tvj3vzyVN6kNWyrpW

3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai:  -0.02200000 Waves

2023.02.09 15:48 [2442106] smart account 3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai > SELF 0.00000000 Waves

{ "type": 13, "id": "83dMzBzhGqG9tMz2gmpGm4HXYV2tvj3vzyVN6kNWyrpW", "fee": 2200000, "feeAssetId": null, "timestamp": 1675946903215, "version": 1, "sender": "3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai", "senderPublicKey": "2JEaBjtjvMoNGKZmL9QxYefa1VkMJM3vMW8rNvTs9R2H", "proofs": [ "25fqeUUfBHBTyoUZXFo8stEeK7USYmXc1uXJqTpSqLEtjbdFWvQpstK5wDxAiPLGJG6BdW2MfPdWkvawncccGkdo" ], "script": "base64:BgKMJQgCEgoKCAgICAgICAgBEgMKAQgSBgoECAgICBIECgIIGBIDCgEIEgQKAggYEgMKAQgSABIDCgEYEgoKCAgICAgIAQgIEgQKAggBEgMKAQESAwoBARIECgIIARIGCgQICAgIEgQKAggIEgQKAggIEgQKAggIEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBCCIGU0NBTEU4IgVNVUxUOCIHU0NBTEUxOCIGTVVMVDE4Ig5QT09MV0VJR0hUTVVMVCIOR1dYdmlydHVhbFBPT0wiDGxhYmVsUG9vbHNMcCINZGVmYXVsdFNwcmVhZCIRZGVjaW1hbHNNdWx0UHJpY2UiA1NFUCIFRU1QVFkiClBvb2xBY3RpdmUiD1Bvb2xQdXREaXNhYmxlZCITUG9vbE1hdGNoZXJEaXNhYmxlZCIMUG9vbFNodXRkb3duIhJpZHhJbnRlcm5hbEFzc2V0SWQiD2lkeFJlc3V0QWN0aW9ucyIgaWR4SWZBc3NldElkQ2FsY3VsYXRpb25QZXJmb3JtZWQiDmlkeFBvb2xBZGRyZXNzIg1pZHhQb29sU3RhdHVzIhBpZHhQb29sTFBBc3NldElkIg1pZHhBbXRBc3NldElkIg9pZHhQcmljZUFzc2V0SWQiDmlkeEFtdEFzc2V0RGNtIhBpZHhQcmljZUFzc2V0RGNtIg5pZHhJQW10QXNzZXRJZCIQaWR4SVByaWNlQXNzZXRJZCINaWR4TFBBc3NldERjbSILaWR4UG9vbFR5cGUiE3Bvb2xMYWJlbFd4RW1pc3Npb24iD3ZhbGlkUG9vbExhYmVscyIWa2V5QWxsb3dlZExwU2NyaXB0SGFzaCIca2V5QWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaCIha2V5QWxsb3dlZExwU3RhYmxlQWRkb25TY3JpcHRIYXNoIhBrZXlGYWN0b3J5Q29uZmlnIg9rZXlMcFRva2Vuc0xpc3QiEWtleVBvb2xTY3JpcHRIYXNoIg1rZXlNYXRjaGVyUHViIhhrZXlMZWdhY3lGYWN0b3J5Q29udHJhY3QiDmtleUxlZ2FjeVBvb2xzIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIPa2V5QWRtaW5QdWJLZXlzIhZrZXlBc3NldHNTdG9yZUNvbnRyYWN0IhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0Ig5rZXlQcmljZUFzc2V0cyIQa2V5UHJpY2VEZWNpbWFscyITa2V5QWxsUG9vbHNTaHV0ZG93biIWa2V5TmV4dEludGVybmFsQXNzZXRJZCIPa2V5UG9vbFRvV2VpZ2h0Igtwb29sQWRkcmVzcyIWa2V5UG9vbFRvV2VpZ2h0SGlzdG9yeSIDbnVtIh9rZXlNYXBwaW5nc0ludGVybmFsMmJhc2VBc3NldElkIhFpbnRlcm5hbEJhc2VBc3NldCIfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZCIMYmFzZUFzc2V0U3RyIg1rZXlQb29sQ29uZmlnIhNhbW91bnRBc3NldEludGVybmFsIhJwcmljZUFzc2V0SW50ZXJuYWwiIWtleVBvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZCIOYXNzZXRzSW50ZXJuYWwiCyR0MDM2MzIzNjk0IiVrZXlBbGxQb29sc09uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIh1rZXlNYXBwaW5nTHBBc3NldFRvUG9vbEFzc2V0cyIKbHBBc3NldFN0ciIda2V5TWFwcGluZ1Bvb2xBc3NldHNUb0xwYXNzZXQiGGludGVybmFsQW1vdW50QXNzZXRJZFN0ciIXaW50ZXJuYWxQcmljZUFzc2V0SWRTdHIiDWtleVBvb2xTcHJlYWQiKWtleU1hcHBpbmdQb29sQ29udHJhY3RBZGRyZXNzVG9Qb29sQXNzZXRzIhNwb29sQ29udHJhY3RBZGRyZXNzIilrZXlNYXBwaW5nUG9vbEFzc2V0c1RvUG9vbENvbnRyYWN0QWRkcmVzcyIfa2V5TWFwcGluZ1Bvb2xDb250cmFjdFRvTFBBc3NldCIqa2V5TWFwcGluZ1Bvb2xMUEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzIg1rZXlXeEVtaXNzaW9uIg1hbW91bnRBc3NldElkIgxwcmljZUFzc2V0SWQiCGtleUluRmVlIg9rZXlJbkZlZURlZmF1bHQiCWtleU91dEZlZSIQa2V5T3V0RmVlRGVmYXVsdCIPZ2V0U3RyaW5nT3JGYWlsIgNrZXkiEGdldEJvb2xlYW5PckZhaWwiDGdldEludE9yRmFpbCIYSWR4RmFjdG9yeUNmZ1N0YWtpbmdEYXBwIhlJZHhGYWN0b3J5Q2ZnQm9vc3RpbmdEYXBwIhRJZHhGYWN0b3J5Q2ZnSWRvRGFwcCIVSWR4RmFjdG9yeUNmZ1RlYW1EYXBwIhlJZHhGYWN0b3J5Q2ZnRW1pc3Npb25EYXBwIhVJZHhGYWN0b3J5Q2ZnUmVzdERhcHAiGUlkeEZhY3RvcnlDZmdTbGlwcGFnZURhcHAiFElkeEZhY3RvcnlDZmdEYW9EYXBwIhpJZHhGYWN0b3J5Q2ZnTWFya2V0aW5nRGFwcCIaSWR4RmFjdG9yeUNmZ0d3eFJld2FyZERhcHAiFklkeEZhY3RvcnlDZmdCaXJkc0RhcHAiGGdldEJvb3N0aW5nQWRkcmVzc09yRmFpbCIKZmFjdG9yeUNmZyIYZ2V0RW1pc3Npb25BZGRyZXNzT3JGYWlsIhdnZXRTdGFraW5nQWRkcmVzc09yRmFpbCIZZ2V0R3d4UmV3YXJkQWRkcmVzc09yRmFpbCIOZ2V0UHJpY2VBc3NldHMiByRtYXRjaDAiAXMiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0IhVwZXJtaXNzaW9uRGVuaWVkRXJyb3IiCG11c3RUaGlzIgFpIgttdXN0TWFuYWdlciICcGsiEGRhdGFGYWN0b3J5Q2ZnVjMiDnN0YWtpbmdBZGRyZXNzIg9ib29zdGluZ0FkZHJlc3MiC2lkb0NvbnRyYWN0Igx0ZWFtQ29udHJhY3QiEGVtaXNzaW9uQ29udHJhY3QiDHJlc3RDb250cmFjdCIQc2xpcHBhZ2VDb250cmFjdCILZGFvQ29udHJhY3QiEW1hcmtldGluZ0NvbnRyYWN0IhJnd3hSZXdhcmRzQ29udHJhY3QiDWJpcmRzQ29udHJhY3QiDmRhdGFGYWN0b3J5Q2ZnIgtkYXRhUG9vbENmZyIKcG9vbFN0YXR1cyIJbHBBc3NldElkIg5hbW91bnRBc3NldFN0ciINcHJpY2VBc3NldFN0ciITYW1vdW50QXNzZXREZWNpbWFscyIScHJpY2VBc3NldERlY2ltYWxzIhVhbW91bnRBc3NldEludGVybmFsSWQiFHByaWNlQXNzZXRJbnRlcm5hbElkIg9scEFzc2V0RGVjaW1hbHMiCHBvb2xUeXBlIhVkYXRhTWFwcGluZ1Bvb2xBc3NldHMiFmludGVybmFsQW1vdW50QXNzZXRTdHIiFWludGVybmFsUHJpY2VBc3NldFN0ciINZ2V0UG9vbENvbmZpZyIKcG9vbEFzc2V0cyIaZ2V0SW50ZXJuYWxBc3NldElkT3JDcmVhdGUiCmFzc2V0SWRTdHIiC2luY3JlbWVudG9yIg9pbnRlcm5hbEFzc2V0SWQiGGN1cnJlbnRJbmRleE9mSW50ZXJuYWxJZCIGcmVzdWx0IhJuZXdJbnRlcm5hbEFzc2V0SWQiCW11c3RBZG1pbiIIYWRtaW5QS3MiCWlzTWFuYWdlciIWaW50T3JEZWZhdWx0T3JGYWxsYmFjayIKa2V5RGVmYXVsdCINdmFsdWVGYWxsYmFjayIPc3Rha2luZ0NvbnRyYWN0IhBib29zdGluZ0NvbnRyYWN0IhBzbHBpcGFnZUNvbnRyYWN0Ig1wcmljZURlY2ltYWxzIgtjaGVja0NhbGxlciIQbWF0aGNoZXJQdWI1OFN0ciIKbWF0aGNlclB1YiIVbGVnYWN5RmFjdG9yeUNvbnRyYWN0IgtsZWdhY3lQb29scyITYXNzZXRzU3RvcmVDb250cmFjdCIWdm90aW5nRW1pc3Npb25Db250cmFjdCILcHJpY2VBc3NldHMiBWNoZWtzIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSIVY2hlY2tNYW5hZ2VyUHVibGljS2V5IgJwbSIFaGFzUE0iB2NoZWNrUE0iDGFkbWluUHViS2V5cyILbHBBc3NldE5hbWUiDGxwQXNzZXREZXNjciIKcG9vbFdlaWdodCIEbG9nbyIXaW50ZXJuYWxBbW91bnRBc3NldERhdGEiFWludGVybmFsQW1vdW50QXNzZXRJZCIWaW50ZXJuYWxQcmljZUFzc2V0RGF0YSIUaW50ZXJuYWxQcmljZUFzc2V0SWQiFXBvb2xBY2NvdW50U2NyaXB0SGFzaCIcZXRoYWxvblBvb2xBY2NvdW50U2NyaXB0SGFzaCIKcG9vbENvbmZpZyIPcG9vbENvbmZpZ1ZhbHVlIhRhbW91bnRBc3NldHNEZWNpbWFscyITcHJpY2VBc3NldHNEZWNpbWFscyISbHBBc3NldElzc3VlQWN0aW9uIgxscEFzc2V0SWRTdHIiGHBvb2xBY3RpdmF0ZUludm9rZVJlc3VsdCIYY3JlYXRlT3JVcGRhdGVMcEFzc2V0SW52IhJhZGRQb29sc0xwTGFiZWxJbnYiCnNldExvZ29JbnYiEGFkZEFzc2V0c0xpbmtJbnYiG2luY3JlYXNlQXNzZXRQb29sc051bWJlckludiIJbmV3U3RhdHVzIgpscEFzc2V0RGNtIgxhbW91bnRUb0VtaXQiBmNhbGxlciIMb3JpZ2luQ2FsbGVyIhBscEFzc2V0UmVxdWVzdGVkIgdscEFzc2V0IgxhbW91bnRUb0J1cm4iB3BheW1lbnQiDXBheW1lbnRBbW91bnQiD2luQW1vdW50QXNzZXRJZCIabHBBc3NldFJlcXVlc3RlZEZvckJ1cm5pbmciBXNoYXJlIg1wb29sV2VpZ2h0S2V5Igxnd3hXZWlnaHRLZXkiCWd3eFdlaWdodCINcG9vbFdlaWdodE5ldyIRb25Nb2RpZnlXZWlnaHRJbnYiFWd3eFZpcnR1YWxQb29sQWN0aW9ucyIUcG9vbFdlaWdodEhpc3RvcnlLZXkiF3Bvb2xXZWlnaHRIaXN0b3J5T3JVbml0Ihhwb29sV2VpZ2h0SGlzdG9yeUFjdGlvbnMiDmJ0Y1Bvb2xBZGRyZXNzIg5ldGhQb29sQWRkcmVzcyIRZXRoQnRjUG9vbEFkZHJlc3MiE3VzZGNVc2R0UG9vbEFkZHJlc3MiD2V0aEJ0Y1dlaWdodE5ldyIRdXNkY1VzZHRXZWlnaHROZXciD3dlaWdodERlY3JlbWVudCILc3Rha2luZ0RhcHAiDWd3eFJld2FyZERhcHAiDGJ0Y1dlaWdodEtFWSIMZXRoV2VpZ2h0S0VZIg9ldGhCdGNXZWlnaHRLRVkiEXVzZGNVc2R0V2VpZ2h0S0VZIglidGNXZWlnaHQiCWV0aFdlaWdodCIMYnRjV2VpZ2h0TmV3IgxldGhXZWlnaHROZXciD2J0Y0xwQXNzZXRJZFN0ciIPZXRoTHBBc3NldElkU3RyIhJldGhCdGNMcEFzc2V0SWRTdHIiFHVzZGNVc2R0THBBc3NldElkU3RyIhFvbk1vZGlmeVdlaWdodEJ0YyIRb25Nb2RpZnlXZWlnaHRFdGgiFG9uTW9kaWZ5V2VpZ2h0RXRoQnRjIhZvbk1vZGlmeVdlaWdodFVzZGNVc2R0IgloYXZlTGFiZWwiAWIiB2Fzc2V0SWQiFGNoZWNrUHJpY2VBc3NldHNTaXplIgJjYiIDYWNjIgpwcmljZUFzc2V0IgFyIgdhY3Rpb25zIgIkbCICJHMiBSRhY2MwIgUkZjBfMSICJGEiAiRpIgUkZjBfMiIecG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIiJhbGxQb29sc09uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIgNmZWUiA2NmZyICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5ZAABYQAIAAFiAIDC1y8AAWMAEgABZAkAtgIBAICAkLu61q3wDQABZQUBYgABZgIOR1dYdmlydHVhbFBPT0wAAWcCCFBPT0xTX0xQAAFoAICJegABaQkAaAIJAGgCAGQA6AcA6AcAAWoCAl9fAAFrAgAAAWwAAQABbQACAAFuAAMAAW8ABAABcAABAAFxAAIAAXIAAwABcwABAAF0AAIAAXUAAwABdgAEAAF3AAUAAXgABgABeQAHAAF6AAgAAUEACQABQgAKAAFDAAsAAUQCC1dYX0VNSVNTSU9OAAFFCQDMCAIFAUQFA25pbAEBRgACFyVzX19hbGxvd2VkTHBTY3JpcHRIYXNoAQFHAAIdJXNfX2FsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2gBAUgAAiIlc19fYWxsb3dlZExwU3RhYmxlQWRkb25TY3JpcHRIYXNoAQFJAAIRJXNfX2ZhY3RvcnlDb25maWcBAUoAAhAlc19fbHBUb2tlbnNMaXN0AQFLAAIWJXMlc19fcG9vbF9fc2NyaXB0SGFzaAEBTAACGCVzJXNfX21hdGNoZXJfX3B1YmxpY0tleQEBTQACGSVzX19sZWdhY3lGYWN0b3J5Q29udHJhY3QBAU4AAg8lc19fbGVnYWN5UG9vbHMBAU8AAhQlc19fbWFuYWdlclB1YmxpY0tleQEBUAACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBUQACECVzX19hZG1pblB1YktleXMBAVIAAhclc19fYXNzZXRzU3RvcmVDb250cmFjdAEBUwACGiVzX192b3RpbmdFbWlzc2lvbkNvbnRyYWN0AQFUAAkAuQkCCQDMCAICAiVzCQDMCAICC3ByaWNlQXNzZXRzBQNuaWwFAWoBAVUAAhElc19fcHJpY2VEZWNpbWFscwEBVgACDCVzX19zaHV0ZG93bgEBVwACFyVzX19uZXh0SW50ZXJuYWxBc3NldElkAQFYAQFZCQCsAgICEiVzJXNfX3Bvb2xXZWlnaHRfXwUBWQEBWgIBWQJhYQkArAICCQCsAgIJAKwCAgISJXMlc19fcG9vbFdlaWdodF9fBQFZAgJfXwkApAMBBQJhYQECYWIBAmFjCQCsAgICKCVzJXMlZF9fbWFwcGluZ3NfX2ludGVybmFsMmJhc2VBc3NldElkX18JAKQDAQUCYWMBAmFkAQJhZQkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQJhZQECYWYCAmFnAmFoCQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQJhZwICX18FAmFoAghfX2NvbmZpZwECYWkBAmFqBAJhawUCYWoEAmFnCAUCYWsCXzEEAmFoCAUCYWsCXzIJALkJAgkAzAgCAgYlZCVkJXMJAMwIAgkApAMBBQJhZwkAzAgCCQCkAwEFAmFoCQDMCAICGm9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkBQNuaWwFAWoBAmFsAAkAuQkCCQDMCAICAiVzCQDMCAICGm9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkBQNuaWwFAWoBAmFtAQJhbgkArAICCQCsAgICCCVzJXMlc19fBQJhbgIYX19tYXBwaW5nc19fbHBBc3NldDJQb29sAQJhbwICYXACYXEJAKwCAgkArAICCQCsAgIJAKwCAgIKJWQlZCVzJXNfXwUCYXACAl9fBQJhcQIeX19tYXBwaW5nc19fUG9vbEFzc2V0czJMcEFzc2V0AQJhcgEBWQkArAICAg4lcyVzX19zcHJlYWRfXwUBWQECYXMBAmF0CQCsAgIJAKwCAgIIJXMlcyVzX18FAmF0AiNfX21hcHBpbmdzX19wb29sQ29udHJhY3QyUG9vbEFzc2V0cwECYXUCAmFwAmFxCQCsAgIJAKwCAgkArAICCQCsAgICCiVkJWQlcyVzX18JAKQDAQUCYXACAl9fCQCkAwEFAmFxAiNfX21hcHBpbmdzX19wb29sQXNzZXRzMlBvb2xDb250cmFjdAECYXYBAmF0CQCsAgIJAKwCAgIIJXMlcyVzX18FAmF0AiBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAECYXcBAmFuCQCsAgIJAKwCAgIIJXMlcyVzX18FAmFuAiBfX21hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAECYXgCAmF5AmF6CQCsAgIJAKwCAgkArAICAhQlcyVzJXNfX3d4RW1pc3Npb25fXwUCYXkCAl9fBQJhegECYUEBAVkJAKwCAgINJXMlc19faW5GZWVfXwUBWQECYUIAAhAlc19faW5GZWVEZWZhdWx0AQJhQwEBWQkArAICAg4lcyVzX19vdXRGZWVfXwUBWQECYUQAAhElc19fb3V0RmVlRGVmYXVsdAECYUUBAmFGCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUCYUYJAKwCAgIVTm8gZGF0YSBmb3IgdGhpcy5rZXk9BQJhRgECYUcBAmFGCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJsIAgUEdGhpcwUCYUYJAKwCAgIVTm8gZGF0YSBmb3IgdGhpcy5rZXk9BQJhRgECYUgBAmFGCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUCYUYJAKwCAgIVTm8gZGF0YSBmb3IgdGhpcy5rZXk9BQJhRgACYUkAAQACYUoAAgACYUsAAwACYUwABAACYU0ABQACYU4ABgACYU8ABwACYVAACAACYVEACQACYVIACgACYVMACwECYVQBAmFVCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFVBQJhSgECYVYBAmFVCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFVBQJhTQECYVcBAmFVCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFVBQJhSQECYVgBAmFVCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFVBQJhUgECYVkABAJhWgkAoggBCQEBVAADCQABAgUCYVoCBlN0cmluZwQCYmEFAmFaAwkAAAIJALECAQUCYmEAAAUDbmlsCQC1CQIFAmJhBQFqBQNuaWwBAmJiAAQCYVoJAKIIAQkBAU8AAwkAAQIFAmFaAgZTdHJpbmcEAmJhBQJhWgkA2QQBBQJiYQMJAAECBQJhWgIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJiYwAEAmFaCQCiCAEJAQFQAAMJAAECBQJhWgIGU3RyaW5nBAJiYQUCYVoJANkEAQUCYmEDCQABAgUCYVoCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACYmQJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECYmUBAmJmAwkAAAIIBQJiZgZjYWxsZXIFBHRoaXMGBQJiZAECYmcBAmJmBAJhWgkBAmJiAAMJAAECBQJhWgIKQnl0ZVZlY3RvcgQCYmgFAmFaAwkAAAIIBQJiZg9jYWxsZXJQdWJsaWNLZXkFAmJoBgUCYmQDCQABAgUCYVoCBFVuaXQJAQJiZQEFAmJmCQACAQILTWF0Y2ggZXJyb3IBAmJpCwJiagJiawJibAJibQJibgJibwJicAJicQJicgJicwJidAkAuQkCCQDMCAICFiVzJXMlcyVzJXMlcyVzJXMlcyVzJXMJAMwIAgUCYmoJAMwIAgUCYmsJAMwIAgUCYmwJAMwIAgUCYm0JAMwIAgUCYm4JAMwIAgUCYm8JAMwIAgUCYnAJAMwIAgUCYnEJAMwIAgUCYnIJAMwIAgUCYnMJAMwIAgUCYnQFA25pbAUBagECYnUHAmJqAmJrAmJsAmJtAmJuAmJvAmJwCQC5CQIJAMwIAgIMJXMlcyVzJXMlcyVzCQDMCAIFAmJqCQDMCAIFAmJrCQDMCAIFAmJsCQDMCAIFAmJtCQDMCAIFAmJuCQDMCAIFAmJvCQDMCAIFAmJwBQNuaWwFAWoBAmJ2CwFZAmJ3AmJ4AmJ5AmJ6AmJBAmJCAmJDAmJEAmJFAmJGCQC5CQIJAMwIAgIWJXMlZCVzJXMlcyVkJWQlZCVkJWQlcwkAzAgCBQFZCQDMCAIFAmJ3CQDMCAIFAmJ4CQDMCAIFAmJ5CQDMCAIFAmJ6CQDMCAIJAKQDAQUCYkEJAMwIAgkApAMBBQJiQgkAzAgCCQCkAwEFAmJDCQDMCAIJAKQDAQUCYkQJAMwIAgkApAMBBQJiRQkAzAgCBQJiRgUDbmlsBQFqAQJiRwICYkgCYkkJALkJAgkAzAgCAgQlZCVkCQDMCAIJAKQDAQUCYkgJAMwIAgkApAMBBQJiSQUDbmlsBQFqAQJiSgEBWQQCYksJALUJAgkBAmFFAQkBAmFzAQUBWQUBagQCYWcJAJEDAgUCYksAAQQCYWgJAJEDAgUCYksAAgkAtQkCCQECYUUBCQECYWYCBQJhZwUCYWgFAWoBAmJMAgJiTQJiTgQCYk8JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmFkAQUCYk0AAAQCYlAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAVcAAAAEAmJRAwkAAAIFAmJPAAAEAmJSCQBkAgUCYlAFAmJOCQCVCgMFAmJSCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVwAFAmJSCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWQBBQJiTQUCYlIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFiAQUCYlIFAmJNBQNuaWwGCQCVCgMFAmJPBQNuaWwHBQJiUQECYlMBAmJmBAJiVAkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJAQFRAAUBawUBagMJAQ9jb250YWluc0VsZW1lbnQCBQJiVAkA2AQBCAUCYmYPY2FsbGVyUHVibGljS2V5BgQCYlUJAQJiZwEFAmJmAwkAAAIFAmJVBQJiVQYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmJWAwJhRgJiVwJiWAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJhRgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJiVwUCYlgXAmJmAQtjb25zdHJ1Y3RvcggCYlkCYloCYmwCYm0CYm4CYm8CY2ECY2IEAmNjCQECYmcBBQJiZgMJAAACBQJjYwUCY2MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUkACQECYnUHBQJiWQUCYloFAmJsBQJibQUCYm4FAmJvBQJjYQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUABQJjYgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJmAQ1jb25zdHJ1Y3RvclYyAQJjZAQCY2MJAQJiZwEFAmJmAwkAAAIFAmNjBQJjYwQCY2UJAKcIAQkA2QQBBQJjZAMJAAACBQJjZQUCY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUwABQJjZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJmAQ1jb25zdHJ1Y3RvclYzBAJicQJicgJicwJidAQCY2MJAQJiZwEFAmJmAwkAAAIFAmNjBQJjYwQCYVUJALUJAgkBAmFFAQkBAUkABQFqCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFJAAkBAmJpCwkAkQMCBQJhVQABCQCRAwIFAmFVAAIJAJEDAgUCYVUAAwkAkQMCBQJhVQAECQCRAwIFAmFVAAUJAJEDAgUCYVUABgkAkQMCBQJhVQAHBQJicQUCYnIFAmJzBQJidAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJmAQ1jb25zdHJ1Y3RvclY0AgJjZgJjZwQCY2MJAQJiZwEFAmJmAwkAAAIFAmNjBQJjYwkAzAgCCQELU3RyaW5nRW50cnkCCQEBTQAFAmNmCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFOAAkAuQkCBQJjZwUBagUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJmAQ1jb25zdHJ1Y3RvclY1AQJjaAQCY2MJAQJiZwEFAmJmAwkAAAIFAmNjBQJjYwkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgAFAmNoBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmYBDWNvbnN0cnVjdG9yVjYCAmNpAmNqBAJjawkAzAgCCQECYmcBBQJiZgkAzAgCAwkBAiE9AgkApggBBQJjaQUEdW5pdAYCKGludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNvbnRyYWN0IGFkZHJlc3MFA25pbAMJAAACBQJjawUCY2sJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMABQJjaQkAzAgCCQELU3RyaW5nRW50cnkCCQEBVAAJALkJAgUCY2oFAWoFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiZgEKc2V0TWFuYWdlcgECY2wEAmNjCQECYmcBBQJiZgMJAAACBQJjYwUCY2MEAmNtCQDZBAEFAmNsAwkAAAIFAmNtBQJjbQkAzAgCCQELU3RyaW5nRW50cnkCCQEBUAAFAmNsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmYBDmNvbmZpcm1NYW5hZ2VyAAQCY24JAQJiYwAEAmNvAwkBCWlzRGVmaW5lZAEFAmNuBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJjbwUCY28EAmNwAwkAAAIIBQJiZg9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmNuBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJjcAUCY3AJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU8ACQDYBAEJAQV2YWx1ZQEFAmNuCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFQAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJmAQlzZXRBZG1pbnMBAmNxBAJjYwkBAmJnAQUCYmYDCQAAAgUCY2MFAmNjCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFRAAkAuQkCBQJjcQUBagUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJmAQ9hY3RpdmF0ZU5ld1Bvb2wIAVkCYnkCYnoCY3ICY3MCY3QCYkYCY3UEAmNjCQECYlMBBQJiZgMJAAACBQJjYwUCY2MDCQEJaXNEZWZpbmVkAQkAoggBCQECYXMBBQFZCQACAQkArAICCQCsAgICDVBvb2wgYWRkcmVzcyAFAVkCFCBhbHJlYWR5IHJlZ2lzdGVyZWQuBAJjdgkBAmJMAgUCYnkAAQQCY3cIBQJjdgJfMQQCY3gJAQJiTAIFAmJ6AwgFAmN2Al8zAAIAAQQCY3kIBQJjeAJfMQQCY3oJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA8QcBCQERQGV4dHJOYXRpdmUoMTA2MikBBQFZCQCsAgICKU5vIHNjcmlwdCBoYXMgYmVlbiBmb3VuZCBvbiBwb29sIGFjY291bnQgBQFZBAJjQQkBEUBleHRyTmF0aXZlKDEwNTcpAQkBAUsABAJjQgkAnQgCBQR0aGlzCQECYWYCCQCkAwEFAmN3CQCkAwEFAmN5AwkBCWlzRGVmaW5lZAEFAmNCCQACAQkArAICCQCsAgIJAKwCAgkArAICAgVQb29sIAUCYnkCAS8FAmJ6AhwgaGFzIGFscmVhZHkgYmVlbiBhY3RpdmF0ZWQuBAJjQwkBBXZhbHVlAQkAnQgCBQR0aGlzCQECYWYCCQCkAwEFAmN3CQCkAwEFAmN5BAJjRAMJAAACBQJieQIFV0FWRVMFAWkJAGwGAAoAAAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQJieQhkZWNpbWFscwAAAAAFBERPV04EAmNFAwkAAAIFAmJ6AgVXQVZFUwUBaQkAbAYACgAACAkBBXZhbHVlAQkA7AcBCQDZBAEFAmJ6CGRlY2ltYWxzAAAAAAUERE9XTgQCY0YJAMIIBQUCY3IFAmNzAAEACAYEAmJ4CQC4CAEFAmNGBAJjRwkA2AQBBQJieAQCY0gJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBWQIIYWN0aXZhdGUJAMwIAgUCYnkJAMwIAgUCYnoFA25pbAUDbmlsAwkAAAIFAmNIBQJjSAMJAQIhPQIFAmNIAgdzdWNjZXNzCQACAQIjUG9vbCBpbml0aWFsaXNhdGlvbiBlcnJvciBoYXBwZW5lZC4EAmNoCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYUUBCQEBUgAEAmNJCQD8BwQFAmNoAg5jcmVhdGVPclVwZGF0ZQkAzAgCBQJjRwkAzAgCBQJjcgkAzAgCBwUDbmlsBQNuaWwDCQAAAgUCY0kFAmNJBAJjSgkA/AcEBQJjaAIIYWRkTGFiZWwJAMwIAgUCY0cJAMwIAgUBZwUDbmlsBQNuaWwDCQAAAgUCY0oFAmNKBAJjSwkA/AcEBQJjaAIHc2V0TG9nbwkAzAgCBQJjRwkAzAgCBQJjdQUDbmlsBQNuaWwDCQAAAgUCY0sFAmNLBAJjTAkA/AcEBQJjaAINYWRkQXNzZXRzTGluawkAzAgCBQJieQkAzAgCBQJiegkAzAgCBQJjRwUDbmlsBQNuaWwDCQAAAgUCY0wFAmNMBAJjTQkA/AcEBQJjaAIYaW5jcmVhc2VBc3NldFBvb2xzTnVtYmVyCQDMCAIFAmJ5BQNuaWwFA25pbAMJAAACBQJjTQUCY00JAJQKAgkAzggCCQDOCAIIBQJjdgJfMggFAmN4Al8yCQDMCAIFAmNGCQDMCAIJAQRCdXJuAgUCYngAAQkAzAgCCQELU3RyaW5nRW50cnkCCQECYWYCCQCkAwEFAmN3CQCkAwEFAmN5CQECYnYLBQFZCQCkAwEFAWwFAmNHBQJieQUCYnoFAmNEBQJjRQUCY3cFAmN5BQFpBQJiRgkAzAgCCQELU3RyaW5nRW50cnkCCQECYW0BBQJjRwkBAmJHAgUCY3cFAmN5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhbwIJAKQDAQUCY3cJAKQDAQUCY3kJAKwCAgIEJXNfXwUCY0cJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFzAQUBWQkBAmJHAgUCY3cFAmN5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhdQIFAmN3BQJjeQUBWQkAzAgCCQELU3RyaW5nRW50cnkCCQECYXcBBQJjRwUBWQkAzAgCCQELU3RyaW5nRW50cnkCCQECYXYBBQFZBQJjRwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVgBBQFZBQJjdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFyAQUBWQUBaAUDbmlsBQJjRwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiZgEKbWFuYWdlUG9vbAIBWQJjTgQCY2MJAQJiZwEFAmJmAwkAAAIFAmNjBQJjYwQCY0IJAQJiSgEFAVkEAmJ3CQCRAwIFAmNCBQF0BAJjRwkAkQMCBQJjQgUBdQQCYnkJAJEDAgUCY0IFAXYEAmJ6CQCRAwIFAmNCBQF3BAJjRAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNCBQF4BAJjRQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNCBQF5BAJjdwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNCBQF6BAJjeQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNCBQFBBAJjTwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNCBQFCBAJiRgkAkQMCBQJjQgUBQwkAzAgCCQELU3RyaW5nRW50cnkCCQECYWYCCQCkAwEFAmN3CQCkAwEFAmN5CQECYnYLBQFZCQCkAwEFAmNOBQJjRwUCYnkFAmJ6BQJjRAUCY0UFAmN3BQJjeQUCY08FAmJGBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmYBBGVtaXQBAmNQBAJjUQgFAmJmBmNhbGxlcgQCY1IIBQJiZgxvcmlnaW5DYWxsZXIEAmNTCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBAmF2AQkApQgBBQJjUQIdSW52YWxpZCBMUCBhZGRyZXNzIGNhbGxlZCBtZS4EAmNUCQDZBAEFAmNTBAJjZwkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJAQFOAAUBawUBagQCY2YJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEBTQACKExlZ2FjeSBmYWN0b3J5IGNvbnRyYWN0IGRvZXMgbm90IGV4aXN0cy4DCQBnAgAABQJjUAUDbmlsAwkBD2NvbnRhaW5zRWxlbWVudAIFAmNnCQClCAEFAmNRCQCUCgIFA25pbAUCY2YJAJQKAgkAzAgCCQEHUmVpc3N1ZQMFAmNUBQJjUAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmJmBmNhbGxlcgUCY1AFAmNUBQNuaWwCB3N1Y2Nlc3MCYmYBBGJ1cm4BAmNVBAJjUQgFAmJmBmNhbGxlcgQCY1IIBQJiZgxvcmlnaW5DYWxsZXIEAmNWCQEFdmFsdWUBCQCRAwIIBQJiZghwYXltZW50cwAABAJjVwkBBXZhbHVlAQgFAmNWBmFtb3VudAQCY1gJANgEAQkBBXZhbHVlAQgFAmNWB2Fzc2V0SWQEAmNZCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBAmF2AQkApQgBBQJjUQIdSW52YWxpZCBMUCBhZGRyZXNzIGNhbGxlZCBtZS4DCQECIT0CBQJjWAUCY1kJAAIBAhVJbnZhbGlkIGFzc2V0IHBhc3NlZC4DCQECIT0CBQJjVQUCY1cJAAIBAhZJbnZhbGlkIGFtb3VudCBwYXNzZWQuBAJjVAkA2QQBBQJjWQkAlAoCCQDMCAIJAQRCdXJuAgUCY1QFAmNVBQNuaWwCB3N1Y2Nlc3MCYmYBDG1vZGlmeVdlaWdodAICYngCY1oEAmNjAwkAAAIJANgEAQgIBQJiZgZjYWxsZXIFYnl0ZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAVMAAgAGCQECYmcBBQJiZgMJAAACBQJjYwUCY2MEAmF0CQECYUUBCQECYXcBBQJieAQCZGEJAQFYAQUCYXQEAmRiCQEBWAEFAWYEAmRjCQELdmFsdWVPckVsc2UCCQCfCAEFAmRiAAAEAmN0CQELdmFsdWVPckVsc2UCCQCfCAEFAmRhAAAEAmRkBQJjWgQCYVUJALUJAgkBAmFFAQkBAUkABQFqBAJiWQkBAmFXAQUCYVUEAmRlCQD8BwQFAmJZAg5vbk1vZGlmeVdlaWdodAkAzAgCBQJieAkAzAgCBQJhdAUDbmlsBQNuaWwDCQAAAgUCZGUFAmRlBAJkZgMJAAACBQJkYwAABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFAmRiAAAFA25pbAQCZGcJAQFaAgUCYXQAAAQCZGgJAJ8IAQUCZGcEAmRpAwkAAAIFAmRoBQR1bml0BQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQUCZGcFA25pbAkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmRhBQJkZAUDbmlsBQJkZgUCZGkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmYBDW1vZGlmeVdlaWdodHMEAmRqAmRrAmRsAmRtBAJjYwkBAmJnAQUCYmYDCQAAAgUCY2MFAmNjBAJkbgkAaQIJAGgCAAUFAWUAZAQCZG8JAGkCCQBoAgAFBQFlAGQEAmRwCQBpAgkAaAIABQUBZQBkBAJhVQkAtQkCCQECYUUBCQEBSQAFAWoEAmRxCQECYVcBBQJhVQQCZHIJAQJhWAEFAmFVBAJkcwkBAVgBBQJkagQCZHQJAQFYAQUCZGsEAmR1CQEBWAEFAmRsBAJkdgkBAVgBBQJkbQQCZHcJAQJhSAEFAmRzBAJkeAkBAmFIAQUCZHQEAmR5CQBlAgUCZHcFAmRwBAJkegkAZQIFAmR4BQJkcAMJAGcCAAAFAmR5CQACAQkArAICAhZpbnZhbGlkIGJ0Y1dlaWdodE5ldzogCQCkAwEFAmR5AwkAZwIAAAUCZHoJAAIBCQCsAgICFmludmFsaWQgZXRoV2VpZ2h0TmV3OiAJAKQDAQUCZHoEAmRBCQECYUUBCQECYXYBBQJkagQCZEIJAQJhRQEJAQJhdgEFAmRrBAJkQwkBAmFFAQkBAmF2AQUCZGwEAmRECQECYUUBCQECYXYBBQJkbQQCZEUJAPwHBAUCZHECDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmRBCQDMCAIFAmRqBQNuaWwFA25pbAMJAAACBQJkRQUCZEUEAmRGCQD8BwQFAmRxAg5vbk1vZGlmeVdlaWdodAkAzAgCBQJkQgkAzAgCBQJkawUDbmlsBQNuaWwDCQAAAgUCZEYFAmRGBAJkRwkA/AcEBQJkcQIOb25Nb2RpZnlXZWlnaHQJAMwIAgUCZEMJAMwIAgUCZGwFA25pbAUDbmlsAwkAAAIFAmRHBQJkRwQCZEgJAPwHBAUCZHECDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmRECQDMCAIFAmRtBQNuaWwFA25pbAMJAAACBQJkSAUCZEgJAMwIAgkBDEludGVnZXJFbnRyeQIFAmRzBQJkeQkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZHQFAmR6CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkdQUCZG4JAMwIAgkBDEludGVnZXJFbnRyeQIFAmR2BQJkbwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVoCBQJkagAABQJkdwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVoCBQJkawAABQJkeAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVoCBQJkbAAABQJkbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVoCBQJkbQAABQJkbwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJmARhjaGVja1d4RW1pc3Npb25Qb29sTGFiZWwCAmF5AmF6BAJkSQQCYVoJAKAIAQkBAmF4AgUCYXkFAmF6AwkAAQIFAmFaAgdCb29sZWFuBAJkSgUCYVoFAmRKBwkAlAoCBQNuaWwFAmRJAmJmARZzZXRXeEVtaXNzaW9uUG9vbExhYmVsAgJheQJhegQCY2MJAQJiUwEFAmJmAwkAAAIFAmNjBQJjYwkAlAoCCQDMCAIJAQxCb29sZWFuRW50cnkCCQECYXgCBQJheQUCYXoGBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmYBGWRlbGV0ZVd4RW1pc3Npb25Qb29sTGFiZWwCAmF5AmF6BAJjYwMJAQJiZQEFAmJmBgkBAmJTAQUCYmYDCQAAAgUCY2MFAmNjCQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmF4AgUCYXkFAmF6BQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmYBEm9uVmVyaWZpY2F0aW9uTG9zcwECZEsEAmNjAwkAAAIJANgEAQgIBQJiZgZjYWxsZXIFYnl0ZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAVIAAgAGCQECYmcBBQJiZgMJAAACBQJjYwUCY2MEAmNqCQECYVkABAJkTAMJAGYCCQCQAwEFAmNqAAAGCQACAQIUaW52YWxpZCBwcmljZSBhc3NldHMDCQAAAgUCZEwFAmRMCgECZE0CAmROAmRPBAJkUAkA/AcEBQR0aGlzAhlkZWxldGVXeEVtaXNzaW9uUG9vbExhYmVsCQDMCAIFAmRLCQDMCAIFAmRPBQNuaWwFA25pbAMJAAACBQJkUAUCZFAFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAmRRCgACZFIFAmNqCgACZFMJAJADAQUCZFIKAAJkVAUEdW5pdAoBAmRVAgJkVgJkVwMJAGcCBQJkVwUCZFMFAmRWCQECZE0CBQJkVgkAkQMCBQJkUgUCZFcKAQJkWAICZFYCZFcDCQBnAgUCZFcFAmRTBQJkVgkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDEJAQJkWAIJAQJkVQIFAmRUAAAAAQMJAAACBQJkUQUCZFEJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJmAShpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZAQFZBAJjQgkBAmJKAQUBWQQCYWoJAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNCBQF6CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCY0IFAUEEAmRZCQELdmFsdWVPckVsc2UCCQCgCAEJAQJhaQEFAmFqBwQCZFoJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBAmFsAAcJAJQKAgUDbmlsAwUCZFoGBQJkWQJiZgEQZ2V0SW5GZWVSRUFET05MWQEBWQQCZWEJAQJiVgMJAQJhQQEFAVkJAQJhQgAAAAkAlAoCBQNuaWwFAmVhAmJmARFnZXRPdXRGZWVSRUFET05MWQEBWQQCZWEJAQJiVgMJAQJhQwEFAVkJAQJhRAAJAGsDAAoFAWIAkE4JAJQKAgUDbmlsBQJlYQJiZgEVZ2V0UG9vbFN0YXR1c1JFQURPTkxZAQFZBAJiSwkAtQkCCQECYUUBCQECYXMBBQFZBQFqBAJhZwkAkQMCBQJiSwABBAJhaAkAkQMCBQJiSwACBAJlYgkAtQkCCQECYUUBCQECYWYCBQJhZwUCYWgFAWoJAJQKAgUDbmlsCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZWIFAXQBAmVjAQJlZAAEAmVlBAJhWgkBAmJiAAMJAAECBQJhWgIKQnl0ZVZlY3RvcgQCYmgFAmFaBQJiaAMJAAECBQJhWgIEVW5pdAgFAmVjD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJlYwlib2R5Qnl0ZXMJAJEDAggFAmVjBnByb29mcwAABQJlZXkwRLg=", "chainId": 84, "height": 2442106, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BBHpcy3MTZPjYp2kx7aJK39Nw1FD1fqDJ9C8ScAxy8T Next: 9HajWY2gqWuyC1i3pCZYg4QDe7ijQpPX36NbWtEhxj6V Diff:
OldNewDifferences
7272 func keyAllowedLpStableAddonScriptHash () = "%s__allowedLpStableAddonScriptHash"
7373
7474
75-func swapContract () = "%s__swapContract"
76-
77-
7875 func keyFactoryConfig () = "%s__factoryConfig"
7976
8077
136133
137134
138135 func keyPoolOneTokenOperationsDisabled (assetsInternal) = {
139- let $t037003762 = assetsInternal
140- let amountAssetInternal = $t037003762._1
141- let priceAssetInternal = $t037003762._2
136+ let $t036323694 = assetsInternal
137+ let amountAssetInternal = $t036323694._1
138+ let priceAssetInternal = $t036323694._2
142139 makeString(["%d%d%s", toString(amountAssetInternal), toString(priceAssetInternal), "oneTokenOperationsDisabled"], SEP)
143140 }
144141
257254
258255 let permissionDeniedError = throw("Permission denied")
259256
260-let testError = throw("Test error here")
261-
262257 func mustThis (i) = if ((i.caller == this))
263258 then true
264259 else permissionDeniedError
323318
324319
325320 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-
349321
350322
351323 @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-
7875 func keyFactoryConfig () = "%s__factoryConfig"
7976
8077
8178 func keyLpTokensList () = "%s__lpTokensList"
8279
8380
8481 func keyPoolScriptHash () = "%s%s__pool__scriptHash"
8582
8683
8784 func keyMatcherPub () = "%s%s__matcher__publicKey"
8885
8986
9087 func keyLegacyFactoryContract () = "%s__legacyFactoryContract"
9188
9289
9390 func keyLegacyPools () = "%s__legacyPools"
9491
9592
9693 func keyManagerPublicKey () = "%s__managerPublicKey"
9794
9895
9996 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
10097
10198
10299 func keyAdminPubKeys () = "%s__adminPubKeys"
103100
104101
105102 func keyAssetsStoreContract () = "%s__assetsStoreContract"
106103
107104
108105 func keyVotingEmissionContract () = "%s__votingEmissionContract"
109106
110107
111108 func keyPriceAssets () = makeString(["%s", "priceAssets"], SEP)
112109
113110
114111 func keyPriceDecimals () = "%s__priceDecimals"
115112
116113
117114 func keyAllPoolsShutdown () = "%s__shutdown"
118115
119116
120117 func keyNextInternalAssetId () = "%s__nextInternalAssetId"
121118
122119
123120 func keyPoolToWeight (poolAddress) = ("%s%s__poolWeight__" + poolAddress)
124121
125122
126123 func keyPoolToWeightHistory (poolAddress,num) = ((("%s%s__poolWeight__" + poolAddress) + "__") + toString(num))
127124
128125
129126 func keyMappingsInternal2baseAssetId (internalBaseAsset) = ("%s%s%d__mappings__internal2baseAssetId__" + toString(internalBaseAsset))
130127
131128
132129 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
133130
134131
135132 func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config")
136133
137134
138135 func keyPoolOneTokenOperationsDisabled (assetsInternal) = {
139- let $t037003762 = assetsInternal
140- let amountAssetInternal = $t037003762._1
141- let priceAssetInternal = $t037003762._2
136+ let $t036323694 = assetsInternal
137+ let amountAssetInternal = $t036323694._1
138+ let priceAssetInternal = $t036323694._2
142139 makeString(["%d%d%s", toString(amountAssetInternal), toString(priceAssetInternal), "oneTokenOperationsDisabled"], SEP)
143140 }
144141
145142
146143 func keyAllPoolsOneTokenOperationsDisabled () = makeString(["%s", "oneTokenOperationsDisabled"], SEP)
147144
148145
149146 func keyMappingLpAssetToPoolAssets (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2Pool")
150147
151148
152149 func keyMappingPoolAssetsToLpasset (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + internalAmountAssetIdStr) + "__") + internalPriceAssetIdStr) + "__mappings__PoolAssets2LpAsset")
153150
154151
155152 func keyPoolSpread (poolAddress) = ("%s%s__spread__" + poolAddress)
156153
157154
158155 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2PoolAssets")
159156
160157
161158 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
162159
163160
164161 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
165162
166163
167164 func keyMappingPoolLPAssetToPoolContractAddress (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2PoolContract")
168165
169166
170167 func keyWxEmission (amountAssetId,priceAssetId) = ((("%s%s%s__wxEmission__" + amountAssetId) + "__") + priceAssetId)
171168
172169
173170 func keyInFee (poolAddress) = ("%s%s__inFee__" + poolAddress)
174171
175172
176173 func keyInFeeDefault () = "%s__inFeeDefault"
177174
178175
179176 func keyOutFee (poolAddress) = ("%s%s__outFee__" + poolAddress)
180177
181178
182179 func keyOutFeeDefault () = "%s__outFeeDefault"
183180
184181
185182 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
186183
187184
188185 func getBooleanOrFail (key) = valueOrErrorMessage(getBoolean(this, key), ("No data for this.key=" + key))
189186
190187
191188 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), ("No data for this.key=" + key))
192189
193190
194191 let IdxFactoryCfgStakingDapp = 1
195192
196193 let IdxFactoryCfgBoostingDapp = 2
197194
198195 let IdxFactoryCfgIdoDapp = 3
199196
200197 let IdxFactoryCfgTeamDapp = 4
201198
202199 let IdxFactoryCfgEmissionDapp = 5
203200
204201 let IdxFactoryCfgRestDapp = 6
205202
206203 let IdxFactoryCfgSlippageDapp = 7
207204
208205 let IdxFactoryCfgDaoDapp = 8
209206
210207 let IdxFactoryCfgMarketingDapp = 9
211208
212209 let IdxFactoryCfgGwxRewardDapp = 10
213210
214211 let IdxFactoryCfgBirdsDapp = 11
215212
216213 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
217214
218215
219216 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
220217
221218
222219 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
223220
224221
225222 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
226223
227224
228225 func getPriceAssets () = match getString(keyPriceAssets()) {
229226 case s: String =>
230227 if ((size(s) == 0))
231228 then nil
232229 else split(s, SEP)
233230 case _ =>
234231 nil
235232 }
236233
237234
238235 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
239236 case s: String =>
240237 fromBase58String(s)
241238 case _: Unit =>
242239 unit
243240 case _ =>
244241 throw("Match error")
245242 }
246243
247244
248245 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
249246 case s: String =>
250247 fromBase58String(s)
251248 case _: Unit =>
252249 unit
253250 case _ =>
254251 throw("Match error")
255252 }
256253
257254
258255 let permissionDeniedError = throw("Permission denied")
259256
260-let testError = throw("Test error here")
261-
262257 func mustThis (i) = if ((i.caller == this))
263258 then true
264259 else permissionDeniedError
265260
266261
267262 func mustManager (i) = match managerPublicKeyOrUnit() {
268263 case pk: ByteVector =>
269264 if ((i.callerPublicKey == pk))
270265 then true
271266 else permissionDeniedError
272267 case _: Unit =>
273268 mustThis(i)
274269 case _ =>
275270 throw("Match error")
276271 }
277272
278273
279274 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)
280275
281276
282277 func dataFactoryCfg (stakingAddress,boostingAddress,idoContract,teamContract,emissionContract,restContract,slippageContract) = makeString(["%s%s%s%s%s%s", stakingAddress, boostingAddress, idoContract, teamContract, emissionContract, restContract, slippageContract], SEP)
283278
284279
285280 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)
286281
287282
288283 func dataMappingPoolAssets (internalAmountAssetStr,internalPriceAssetStr) = makeString(["%d%d", toString(internalAmountAssetStr), toString(internalPriceAssetStr)], SEP)
289284
290285
291286 func getPoolConfig (poolAddress) = {
292287 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
293288 let amountAssetInternal = poolAssets[1]
294289 let priceAssetInternal = poolAssets[2]
295290 split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
296291 }
297292
298293
299294 func getInternalAssetIdOrCreate (assetIdStr,incrementor) = {
300295 let internalAssetId = valueOrElse(getInteger(this, keyMappingsBaseAsset2internalId(assetIdStr)), 0)
301296 let currentIndexOfInternalId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0)
302297 let result = if ((internalAssetId == 0))
303298 then {
304299 let newInternalAssetId = (currentIndexOfInternalId + incrementor)
305300 $Tuple3(newInternalAssetId, [IntegerEntry(keyNextInternalAssetId(), newInternalAssetId), IntegerEntry(keyMappingsBaseAsset2internalId(assetIdStr), newInternalAssetId), StringEntry(keyMappingsInternal2baseAssetId(newInternalAssetId), assetIdStr)], true)
306301 }
307302 else $Tuple3(internalAssetId, nil, false)
308303 result
309304 }
310305
311306
312307 func mustAdmin (i) = {
313308 let adminPKs = split(valueOrElse(getString(keyAdminPubKeys()), EMPTY), SEP)
314309 if (containsElement(adminPKs, toBase58String(i.callerPublicKey)))
315310 then true
316311 else {
317312 let isManager = mustManager(i)
318313 if ((isManager == isManager))
319314 then true
320315 else throw("Strict value is not equal to itself.")
321316 }
322317 }
323318
324319
325320 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-
349321
350322
351323 @Callable(i)
352324 func constructor (stakingContract,boostingContract,idoContract,teamContract,emissionContract,restContract,slpipageContract,priceDecimals) = {
353325 let checkCaller = mustManager(i)
354326 if ((checkCaller == checkCaller))
355327 then [StringEntry(keyFactoryConfig(), dataFactoryCfg(stakingContract, boostingContract, idoContract, teamContract, emissionContract, restContract, slpipageContract)), IntegerEntry(keyPriceDecimals(), priceDecimals)]
356328 else throw("Strict value is not equal to itself.")
357329 }
358330
359331
360332
361333 @Callable(i)
362334 func constructorV2 (mathcherPub58Str) = {
363335 let checkCaller = mustManager(i)
364336 if ((checkCaller == checkCaller))
365337 then {
366338 let mathcerPub = addressFromPublicKey(fromBase58String(mathcherPub58Str))
367339 if ((mathcerPub == mathcerPub))
368340 then [StringEntry(keyMatcherPub(), mathcherPub58Str)]
369341 else throw("Strict value is not equal to itself.")
370342 }
371343 else throw("Strict value is not equal to itself.")
372344 }
373345
374346
375347
376348 @Callable(i)
377349 func constructorV3 (daoContract,marketingContract,gwxRewardsContract,birdsContract) = {
378350 let checkCaller = mustManager(i)
379351 if ((checkCaller == checkCaller))
380352 then {
381353 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
382354 [StringEntry(keyFactoryConfig(), dataFactoryCfgV3(factoryCfg[1], factoryCfg[2], factoryCfg[3], factoryCfg[4], factoryCfg[5], factoryCfg[6], factoryCfg[7], daoContract, marketingContract, gwxRewardsContract, birdsContract))]
383355 }
384356 else throw("Strict value is not equal to itself.")
385357 }
386358
387359
388360
389361 @Callable(i)
390362 func constructorV4 (legacyFactoryContract,legacyPools) = {
391363 let checkCaller = mustManager(i)
392364 if ((checkCaller == checkCaller))
393365 then [StringEntry(keyLegacyFactoryContract(), legacyFactoryContract), StringEntry(keyLegacyPools(), makeString(legacyPools, SEP))]
394366 else throw("Strict value is not equal to itself.")
395367 }
396368
397369
398370
399371 @Callable(i)
400372 func constructorV5 (assetsStoreContract) = {
401373 let checkCaller = mustManager(i)
402374 if ((checkCaller == checkCaller))
403375 then [StringEntry(keyAssetsStoreContract(), assetsStoreContract)]
404376 else throw("Strict value is not equal to itself.")
405377 }
406378
407379
408380
409381 @Callable(i)
410382 func constructorV6 (votingEmissionContract,priceAssets) = {
411383 let cheks = [mustManager(i), if ((addressFromString(votingEmissionContract) != unit))
412384 then true
413385 else "invalid voting emission contract address"]
414386 if ((cheks == cheks))
415387 then [StringEntry(keyVotingEmissionContract(), votingEmissionContract), StringEntry(keyPriceAssets(), makeString(priceAssets, SEP))]
416388 else throw("Strict value is not equal to itself.")
417389 }
418390
419391
420392
421393 @Callable(i)
422394 func setManager (pendingManagerPublicKey) = {
423395 let checkCaller = mustManager(i)
424396 if ((checkCaller == checkCaller))
425397 then {
426398 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
427399 if ((checkManagerPublicKey == checkManagerPublicKey))
428400 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
429401 else throw("Strict value is not equal to itself.")
430402 }
431403 else throw("Strict value is not equal to itself.")
432404 }
433405
434406
435407
436408 @Callable(i)
437409 func confirmManager () = {
438410 let pm = pendingManagerPublicKeyOrUnit()
439411 let hasPM = if (isDefined(pm))
440412 then true
441413 else throw("No pending manager")
442414 if ((hasPM == hasPM))
443415 then {
444416 let checkPM = if ((i.callerPublicKey == value(pm)))
445417 then true
446418 else throw("You are not pending manager")
447419 if ((checkPM == checkPM))
448420 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
449421 else throw("Strict value is not equal to itself.")
450422 }
451423 else throw("Strict value is not equal to itself.")
452424 }
453425
454426
455427
456428 @Callable(i)
457429 func setAdmins (adminPubKeys) = {
458430 let checkCaller = mustManager(i)
459431 if ((checkCaller == checkCaller))
460432 then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
461433 else throw("Strict value is not equal to itself.")
462434 }
463435
464436
465437
466438 @Callable(i)
467439 func activateNewPool (poolAddress,amountAssetStr,priceAssetStr,lpAssetName,lpAssetDescr,poolWeight,poolType,logo) = {
468440 let checkCaller = mustAdmin(i)
469441 if ((checkCaller == checkCaller))
470442 then if (isDefined(getString(keyMappingPoolContractAddressToPoolAssets(poolAddress))))
471443 then throw((("Pool address " + poolAddress) + " already registered."))
472444 else {
473445 let internalAmountAssetData = getInternalAssetIdOrCreate(amountAssetStr, 1)
474446 let internalAmountAssetId = internalAmountAssetData._1
475447 let internalPriceAssetData = getInternalAssetIdOrCreate(priceAssetStr, if (internalAmountAssetData._3)
476448 then 2
477449 else 1)
478450 let internalPriceAssetId = internalPriceAssetData._1
479451 let poolAccountScriptHash = valueOrErrorMessage(scriptHash(addressFromStringValue(poolAddress)), ("No script has been found on pool account " + poolAddress))
480452 let ethalonPoolAccountScriptHash = getBinaryValue(keyPoolScriptHash())
481453 let poolConfig = getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)))
482454 if (isDefined(poolConfig))
483455 then throw((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated."))
484456 else {
485457 let poolConfigValue = value(getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId))))
486458 let amountAssetsDecimals = if ((amountAssetStr == "WAVES"))
487459 then decimalsMultPrice
488460 else pow(10, 0, value(assetInfo(fromBase58String(amountAssetStr))).decimals, 0, 0, DOWN)
489461 let priceAssetsDecimals = if ((priceAssetStr == "WAVES"))
490462 then decimalsMultPrice
491463 else pow(10, 0, value(assetInfo(fromBase58String(priceAssetStr))).decimals, 0, 0, DOWN)
492464 let lpAssetIssueAction = Issue(lpAssetName, lpAssetDescr, 1, 8, true)
493465 let lpAssetId = calculateAssetId(lpAssetIssueAction)
494466 let lpAssetIdStr = toBase58String(lpAssetId)
495467 let poolActivateInvokeResult = invoke(addressFromStringValue(poolAddress), "activate", [amountAssetStr, priceAssetStr], nil)
496468 if ((poolActivateInvokeResult == poolActivateInvokeResult))
497469 then if ((poolActivateInvokeResult != "success"))
498470 then throw("Pool initialisation error happened.")
499471 else {
500472 let assetsStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract()))
501473 let createOrUpdateLpAssetInv = invoke(assetsStoreContract, "createOrUpdate", [lpAssetIdStr, lpAssetName, false], nil)
502474 if ((createOrUpdateLpAssetInv == createOrUpdateLpAssetInv))
503475 then {
504476 let addPoolsLpLabelInv = invoke(assetsStoreContract, "addLabel", [lpAssetIdStr, labelPoolsLp], nil)
505477 if ((addPoolsLpLabelInv == addPoolsLpLabelInv))
506478 then {
507479 let setLogoInv = invoke(assetsStoreContract, "setLogo", [lpAssetIdStr, logo], nil)
508480 if ((setLogoInv == setLogoInv))
509481 then {
510482 let addAssetsLinkInv = invoke(assetsStoreContract, "addAssetsLink", [amountAssetStr, priceAssetStr, lpAssetIdStr], nil)
511483 if ((addAssetsLinkInv == addAssetsLinkInv))
512484 then {
513485 let increaseAssetPoolsNumberInv = invoke(assetsStoreContract, "increaseAssetPoolsNumber", [amountAssetStr], nil)
514486 if ((increaseAssetPoolsNumberInv == increaseAssetPoolsNumberInv))
515487 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)
516488 else throw("Strict value is not equal to itself.")
517489 }
518490 else throw("Strict value is not equal to itself.")
519491 }
520492 else throw("Strict value is not equal to itself.")
521493 }
522494 else throw("Strict value is not equal to itself.")
523495 }
524496 else throw("Strict value is not equal to itself.")
525497 }
526498 else throw("Strict value is not equal to itself.")
527499 }
528500 }
529501 else throw("Strict value is not equal to itself.")
530502 }
531503
532504
533505
534506 @Callable(i)
535507 func managePool (poolAddress,newStatus) = {
536508 let checkCaller = mustManager(i)
537509 if ((checkCaller == checkCaller))
538510 then {
539511 let poolConfig = getPoolConfig(poolAddress)
540512 let poolStatus = poolConfig[idxPoolStatus]
541513 let lpAssetIdStr = poolConfig[idxPoolLPAssetId]
542514 let amountAssetStr = poolConfig[idxAmtAssetId]
543515 let priceAssetStr = poolConfig[idxPriceAssetId]
544516 let amountAssetsDecimals = parseIntValue(poolConfig[idxAmtAssetDcm])
545517 let priceAssetsDecimals = parseIntValue(poolConfig[idxPriceAssetDcm])
546518 let internalAmountAssetId = parseIntValue(poolConfig[idxIAmtAssetId])
547519 let internalPriceAssetId = parseIntValue(poolConfig[idxIPriceAssetId])
548520 let lpAssetDcm = parseIntValue(poolConfig[idxLPAssetDcm])
549521 let poolType = poolConfig[idxPoolType]
550522 [StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(newStatus), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, lpAssetDcm, poolType))]
551523 }
552524 else throw("Strict value is not equal to itself.")
553525 }
554526
555527
556528
557529 @Callable(i)
558530 func emit (amountToEmit) = {
559531 let caller = i.caller
560532 let originCaller = i.originCaller
561533 let lpAssetRequested = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
562534 let lpAsset = fromBase58String(lpAssetRequested)
563535 let legacyPools = split(valueOrElse(getString(keyLegacyPools()), EMPTY), SEP)
564536 let legacyFactoryContract = addressFromStringValue(valueOrErrorMessage(getString(keyLegacyFactoryContract()), "Legacy factory contract does not exists."))
565537 if ((0 >= amountToEmit))
566538 then nil
567539 else if (containsElement(legacyPools, toString(caller)))
568540 then $Tuple2(nil, legacyFactoryContract)
569541 else $Tuple2([Reissue(lpAsset, amountToEmit, true), ScriptTransfer(i.caller, amountToEmit, lpAsset)], "success")
570542 }
571543
572544
573545
574546 @Callable(i)
575547 func burn (amountToBurn) = {
576548 let caller = i.caller
577549 let originCaller = i.originCaller
578550 let payment = value(i.payments[0])
579551 let paymentAmount = value(payment.amount)
580552 let inAmountAssetId = toBase58String(value(payment.assetId))
581553 let lpAssetRequestedForBurning = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
582554 if ((inAmountAssetId != lpAssetRequestedForBurning))
583555 then throw("Invalid asset passed.")
584556 else if ((amountToBurn != paymentAmount))
585557 then throw("Invalid amount passed.")
586558 else {
587559 let lpAsset = fromBase58String(lpAssetRequestedForBurning)
588560 $Tuple2([Burn(lpAsset, amountToBurn)], "success")
589561 }
590562 }
591563
592564
593565
594566 @Callable(i)
595567 func modifyWeight (lpAssetId,share) = {
596568 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionContract()), "")))
597569 then true
598570 else mustManager(i)
599571 if ((checkCaller == checkCaller))
600572 then {
601573 let poolContractAddress = getStringOrFail(keyMappingPoolLPAssetToPoolContractAddress(lpAssetId))
602574 let poolWeightKey = keyPoolToWeight(poolContractAddress)
603575 let gwxWeightKey = keyPoolToWeight(GWXvirtualPOOL)
604576 let gwxWeight = valueOrElse(getInteger(gwxWeightKey), 0)
605577 let poolWeight = valueOrElse(getInteger(poolWeightKey), 0)
606578 let poolWeightNew = share
607579 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
608580 let stakingContract = getStakingAddressOrFail(factoryCfg)
609581 let onModifyWeightInv = invoke(stakingContract, "onModifyWeight", [lpAssetId, poolContractAddress], nil)
610582 if ((onModifyWeightInv == onModifyWeightInv))
611583 then {
612584 let gwxVirtualPoolActions = if ((gwxWeight == 0))
613585 then nil
614586 else [IntegerEntry(gwxWeightKey, 0)]
615587 let poolWeightHistoryKey = keyPoolToWeightHistory(poolContractAddress, 0)
616588 let poolWeightHistoryOrUnit = getInteger(poolWeightHistoryKey)
617589 let poolWeightHistoryActions = if ((poolWeightHistoryOrUnit == unit))
618590 then nil
619591 else [DeleteEntry(poolWeightHistoryKey)]
620592 (([IntegerEntry(poolWeightKey, poolWeightNew)] ++ gwxVirtualPoolActions) ++ poolWeightHistoryActions)
621593 }
622594 else throw("Strict value is not equal to itself.")
623595 }
624596 else throw("Strict value is not equal to itself.")
625597 }
626598
627599
628600
629601 @Callable(i)
630602 func modifyWeights (btcPoolAddress,ethPoolAddress,ethBtcPoolAddress,usdcUsdtPoolAddress) = {
631603 let checkCaller = mustManager(i)
632604 if ((checkCaller == checkCaller))
633605 then {
634606 let ethBtcWeightNew = ((5 * POOLWEIGHTMULT) / 100)
635607 let usdcUsdtWeightNew = ((5 * POOLWEIGHTMULT) / 100)
636608 let weightDecrement = ((5 * POOLWEIGHTMULT) / 100)
637609 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
638610 let stakingDapp = getStakingAddressOrFail(factoryCfg)
639611 let gwxRewardDapp = getGwxRewardAddressOrFail(factoryCfg)
640612 let btcWeightKEY = keyPoolToWeight(btcPoolAddress)
641613 let ethWeightKEY = keyPoolToWeight(ethPoolAddress)
642614 let ethBtcWeightKEY = keyPoolToWeight(ethBtcPoolAddress)
643615 let usdcUsdtWeightKEY = keyPoolToWeight(usdcUsdtPoolAddress)
644616 let btcWeight = getIntOrFail(btcWeightKEY)
645617 let ethWeight = getIntOrFail(ethWeightKEY)
646618 let btcWeightNew = (btcWeight - weightDecrement)
647619 let ethWeightNew = (ethWeight - weightDecrement)
648620 if ((0 >= btcWeightNew))
649621 then throw(("invalid btcWeightNew: " + toString(btcWeightNew)))
650622 else if ((0 >= ethWeightNew))
651623 then throw(("invalid ethWeightNew: " + toString(ethWeightNew)))
652624 else {
653625 let btcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(btcPoolAddress))
654626 let ethLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethPoolAddress))
655627 let ethBtcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethBtcPoolAddress))
656628 let usdcUsdtLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(usdcUsdtPoolAddress))
657629 let onModifyWeightBtc = invoke(stakingDapp, "onModifyWeight", [btcLpAssetIdStr, btcPoolAddress], nil)
658630 if ((onModifyWeightBtc == onModifyWeightBtc))
659631 then {
660632 let onModifyWeightEth = invoke(stakingDapp, "onModifyWeight", [ethLpAssetIdStr, ethPoolAddress], nil)
661633 if ((onModifyWeightEth == onModifyWeightEth))
662634 then {
663635 let onModifyWeightEthBtc = invoke(stakingDapp, "onModifyWeight", [ethBtcLpAssetIdStr, ethBtcPoolAddress], nil)
664636 if ((onModifyWeightEthBtc == onModifyWeightEthBtc))
665637 then {
666638 let onModifyWeightUsdcUsdt = invoke(stakingDapp, "onModifyWeight", [usdcUsdtLpAssetIdStr, usdcUsdtPoolAddress], nil)
667639 if ((onModifyWeightUsdcUsdt == onModifyWeightUsdcUsdt))
668640 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)]
669641 else throw("Strict value is not equal to itself.")
670642 }
671643 else throw("Strict value is not equal to itself.")
672644 }
673645 else throw("Strict value is not equal to itself.")
674646 }
675647 else throw("Strict value is not equal to itself.")
676648 }
677649 }
678650 else throw("Strict value is not equal to itself.")
679651 }
680652
681653
682654
683655 @Callable(i)
684656 func checkWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
685657 let haveLabel = match getBoolean(keyWxEmission(amountAssetId, priceAssetId)) {
686658 case b: Boolean =>
687659 b
688660 case _ =>
689661 false
690662 }
691663 $Tuple2(nil, haveLabel)
692664 }
693665
694666
695667
696668 @Callable(i)
697669 func setWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
698670 let checkCaller = mustAdmin(i)
699671 if ((checkCaller == checkCaller))
700672 then $Tuple2([BooleanEntry(keyWxEmission(amountAssetId, priceAssetId), true)], unit)
701673 else throw("Strict value is not equal to itself.")
702674 }
703675
704676
705677
706678 @Callable(i)
707679 func deleteWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
708680 let checkCaller = if (mustThis(i))
709681 then true
710682 else mustAdmin(i)
711683 if ((checkCaller == checkCaller))
712684 then $Tuple2([DeleteEntry(keyWxEmission(amountAssetId, priceAssetId))], unit)
713685 else throw("Strict value is not equal to itself.")
714686 }
715687
716688
717689
718690 @Callable(i)
719691 func onVerificationLoss (assetId) = {
720692 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyAssetsStoreContract()), "")))
721693 then true
722694 else mustManager(i)
723695 if ((checkCaller == checkCaller))
724696 then {
725697 let priceAssets = getPriceAssets()
726698 let checkPriceAssetsSize = if ((size(priceAssets) > 0))
727699 then true
728700 else throw("invalid price assets")
729701 if ((checkPriceAssetsSize == checkPriceAssetsSize))
730702 then {
731703 func cb (acc,priceAsset) = {
732704 let r = invoke(this, "deleteWxEmissionPoolLabel", [assetId, priceAsset], nil)
733705 if ((r == r))
734706 then unit
735707 else throw("Strict value is not equal to itself.")
736708 }
737709
738710 let actions = {
739711 let $l = priceAssets
740712 let $s = size($l)
741713 let $acc0 = unit
742714 func $f0_1 ($a,$i) = if (($i >= $s))
743715 then $a
744716 else cb($a, $l[$i])
745717
746718 func $f0_2 ($a,$i) = if (($i >= $s))
747719 then $a
748720 else throw("List size exceeds 1")
749721
750722 $f0_2($f0_1($acc0, 0), 1)
751723 }
752724 if ((actions == actions))
753725 then $Tuple2(nil, unit)
754726 else throw("Strict value is not equal to itself.")
755727 }
756728 else throw("Strict value is not equal to itself.")
757729 }
758730 else throw("Strict value is not equal to itself.")
759731 }
760732
761733
762734
763735 @Callable(i)
764736 func isPoolOneTokenOperationsDisabledREADONLY (poolAddress) = {
765737 let poolConfig = getPoolConfig(poolAddress)
766738 let assetsInternal = $Tuple2(parseIntValue(poolConfig[idxIAmtAssetId]), parseIntValue(poolConfig[idxIPriceAssetId]))
767739 let poolOneTokenOperationsDisabled = valueOrElse(getBoolean(keyPoolOneTokenOperationsDisabled(assetsInternal)), false)
768740 let allPoolsOneTokenOperationsDisabled = valueOrElse(getBoolean(keyAllPoolsOneTokenOperationsDisabled()), false)
769741 $Tuple2(nil, if (allPoolsOneTokenOperationsDisabled)
770742 then true
771743 else poolOneTokenOperationsDisabled)
772744 }
773745
774746
775747
776748 @Callable(i)
777749 func getInFeeREADONLY (poolAddress) = {
778750 let fee = intOrDefaultOrFallback(keyInFee(poolAddress), keyInFeeDefault(), 0)
779751 $Tuple2(nil, fee)
780752 }
781753
782754
783755
784756 @Callable(i)
785757 func getOutFeeREADONLY (poolAddress) = {
786758 let fee = intOrDefaultOrFallback(keyOutFee(poolAddress), keyOutFeeDefault(), fraction(10, MULT8, 10000))
787759 $Tuple2(nil, fee)
788760 }
789761
790762
791763
792764 @Callable(i)
793765 func getPoolStatusREADONLY (poolAddress) = {
794766 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
795767 let amountAssetInternal = poolAssets[1]
796768 let priceAssetInternal = poolAssets[2]
797769 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
798770 $Tuple2(nil, parseIntValue(cfg[idxPoolStatus]))
799771 }
800772
801773
802774 @Verifier(tx)
803775 func verify () = {
804776 let targetPublicKey = match managerPublicKeyOrUnit() {
805777 case pk: ByteVector =>
806778 pk
807779 case _: Unit =>
808780 tx.senderPublicKey
809781 case _ =>
810782 throw("Match error")
811783 }
812784 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
813785 }
814786

github/deemru/w8io/3ef1775 
119.70 ms