tx · B2xhnz7vEsqM2BvPsZMRag1e4UFpd1MFUmf8KN7p5S6g

3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai:  -0.02300000 Waves

2023.02.20 16:51 [2458058] smart account 3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai > SELF 0.00000000 Waves

{ "type": 13, "id": "B2xhnz7vEsqM2BvPsZMRag1e4UFpd1MFUmf8KN7p5S6g", "fee": 2300000, "feeAssetId": null, "timestamp": 1676901161097, "version": 2, "chainId": 84, "sender": "3MsMP2pb2p8MDd6Rxb7XEXqqwEhE8ATfyai", "senderPublicKey": "2JEaBjtjvMoNGKZmL9QxYefa1VkMJM3vMW8rNvTs9R2H", "proofs": [ "393cxLKqB7JMXbXdo2SY92WKGA5C7h1MDQA58Gx8XfbfmVvJwDu8df4vHHbDB3CLqzGVGfLvZ5iduXhSuTxux1BJ" ], "script": "base64:BgKrJggCEgASBAoCCAgSAwoBCBIKCggICAgICAgIARIDCgEIEgYKBAgICAgSBAoCCBgSAwoBCBIECgIIGBIDCgEIEgASAwoBGBIKCggICAgICAEICBIECgIIARIDCgEBEgMKAQESBAoCCAESBgoECAgICBIECgIICBIECgIICBIECgIICBIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgSBAoCCAgiBlNDQUxFOCIFTVVMVDgiB1NDQUxFMTgiBk1VTFQxOCIOUE9PTFdFSUdIVE1VTFQiDkdXWHZpcnR1YWxQT09MIgxsYWJlbFBvb2xzTHAiDWRlZmF1bHRTcHJlYWQiEWRlY2ltYWxzTXVsdFByaWNlIgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIg9Qb29sUHV0RGlzYWJsZWQiE1Bvb2xNYXRjaGVyRGlzYWJsZWQiDFBvb2xTaHV0ZG93biISaWR4SW50ZXJuYWxBc3NldElkIg9pZHhSZXN1dEFjdGlvbnMiIGlkeElmQXNzZXRJZENhbGN1bGF0aW9uUGVyZm9ybWVkIg5pZHhQb29sQWRkcmVzcyINaWR4UG9vbFN0YXR1cyIQaWR4UG9vbExQQXNzZXRJZCINaWR4QW10QXNzZXRJZCIPaWR4UHJpY2VBc3NldElkIg5pZHhBbXRBc3NldERjbSIQaWR4UHJpY2VBc3NldERjbSIOaWR4SUFtdEFzc2V0SWQiEGlkeElQcmljZUFzc2V0SWQiDWlkeExQQXNzZXREY20iC2lkeFBvb2xUeXBlIhNwb29sTGFiZWxXeEVtaXNzaW9uIg92YWxpZFBvb2xMYWJlbHMiFmtleUFsbG93ZWRMcFNjcmlwdEhhc2giHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giIWtleUFsbG93ZWRMcFN0YWJsZUFkZG9uU2NyaXB0SGFzaCIMc3dhcENvbnRyYWN0IhBrZXlGYWN0b3J5Q29uZmlnIg9rZXlMcFRva2Vuc0xpc3QiEWtleVBvb2xTY3JpcHRIYXNoIg1rZXlNYXRjaGVyUHViIhhrZXlMZWdhY3lGYWN0b3J5Q29udHJhY3QiDmtleUxlZ2FjeVBvb2xzIhNrZXlNYW5hZ2VyUHVibGljS2V5IhprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleSIPa2V5QWRtaW5QdWJLZXlzIhZrZXlBc3NldHNTdG9yZUNvbnRyYWN0IhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0Ig5rZXlQcmljZUFzc2V0cyIQa2V5UHJpY2VEZWNpbWFscyITa2V5QWxsUG9vbHNTaHV0ZG93biIWa2V5TmV4dEludGVybmFsQXNzZXRJZCIPa2V5UG9vbFRvV2VpZ2h0Igtwb29sQWRkcmVzcyIWa2V5UG9vbFRvV2VpZ2h0SGlzdG9yeSIDbnVtIh9rZXlNYXBwaW5nc0ludGVybmFsMmJhc2VBc3NldElkIhFpbnRlcm5hbEJhc2VBc3NldCIfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZCIMYmFzZUFzc2V0U3RyIg1rZXlQb29sQ29uZmlnIhNhbW91bnRBc3NldEludGVybmFsIhJwcmljZUFzc2V0SW50ZXJuYWwiIWtleVBvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZCIOYXNzZXRzSW50ZXJuYWwiCyR0MDM3MDAzNzYyIiVrZXlBbGxQb29sc09uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIh1rZXlNYXBwaW5nTHBBc3NldFRvUG9vbEFzc2V0cyIKbHBBc3NldFN0ciIda2V5TWFwcGluZ1Bvb2xBc3NldHNUb0xwYXNzZXQiGGludGVybmFsQW1vdW50QXNzZXRJZFN0ciIXaW50ZXJuYWxQcmljZUFzc2V0SWRTdHIiDWtleVBvb2xTcHJlYWQiKWtleU1hcHBpbmdQb29sQ29udHJhY3RBZGRyZXNzVG9Qb29sQXNzZXRzIhNwb29sQ29udHJhY3RBZGRyZXNzIilrZXlNYXBwaW5nUG9vbEFzc2V0c1RvUG9vbENvbnRyYWN0QWRkcmVzcyIfa2V5TWFwcGluZ1Bvb2xDb250cmFjdFRvTFBBc3NldCIqa2V5TWFwcGluZ1Bvb2xMUEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzIg1rZXlXeEVtaXNzaW9uIg1hbW91bnRBc3NldElkIgxwcmljZUFzc2V0SWQiCGtleUluRmVlIg9rZXlJbkZlZURlZmF1bHQiCWtleU91dEZlZSIQa2V5T3V0RmVlRGVmYXVsdCIPZ2V0U3RyaW5nT3JGYWlsIgNrZXkiEGdldEJvb2xlYW5PckZhaWwiDGdldEludE9yRmFpbCIYSWR4RmFjdG9yeUNmZ1N0YWtpbmdEYXBwIhlJZHhGYWN0b3J5Q2ZnQm9vc3RpbmdEYXBwIhRJZHhGYWN0b3J5Q2ZnSWRvRGFwcCIVSWR4RmFjdG9yeUNmZ1RlYW1EYXBwIhlJZHhGYWN0b3J5Q2ZnRW1pc3Npb25EYXBwIhVJZHhGYWN0b3J5Q2ZnUmVzdERhcHAiGUlkeEZhY3RvcnlDZmdTbGlwcGFnZURhcHAiFElkeEZhY3RvcnlDZmdEYW9EYXBwIhpJZHhGYWN0b3J5Q2ZnTWFya2V0aW5nRGFwcCIaSWR4RmFjdG9yeUNmZ0d3eFJld2FyZERhcHAiFklkeEZhY3RvcnlDZmdCaXJkc0RhcHAiGGdldEJvb3N0aW5nQWRkcmVzc09yRmFpbCIKZmFjdG9yeUNmZyIYZ2V0RW1pc3Npb25BZGRyZXNzT3JGYWlsIhdnZXRTdGFraW5nQWRkcmVzc09yRmFpbCIZZ2V0R3d4UmV3YXJkQWRkcmVzc09yRmFpbCIOZ2V0UHJpY2VBc3NldHMiByRtYXRjaDAiAXMiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0IhVwZXJtaXNzaW9uRGVuaWVkRXJyb3IiCXRlc3RFcnJvciIIbXVzdFRoaXMiAWkiC211c3RNYW5hZ2VyIgJwayIQZGF0YUZhY3RvcnlDZmdWMyIOc3Rha2luZ0FkZHJlc3MiD2Jvb3N0aW5nQWRkcmVzcyILaWRvQ29udHJhY3QiDHRlYW1Db250cmFjdCIQZW1pc3Npb25Db250cmFjdCIMcmVzdENvbnRyYWN0IhBzbGlwcGFnZUNvbnRyYWN0IgtkYW9Db250cmFjdCIRbWFya2V0aW5nQ29udHJhY3QiEmd3eFJld2FyZHNDb250cmFjdCINYmlyZHNDb250cmFjdCIOZGF0YUZhY3RvcnlDZmciC2RhdGFQb29sQ2ZnIgpwb29sU3RhdHVzIglscEFzc2V0SWQiDmFtb3VudEFzc2V0U3RyIg1wcmljZUFzc2V0U3RyIhNhbW91bnRBc3NldERlY2ltYWxzIhJwcmljZUFzc2V0RGVjaW1hbHMiFWFtb3VudEFzc2V0SW50ZXJuYWxJZCIUcHJpY2VBc3NldEludGVybmFsSWQiD2xwQXNzZXREZWNpbWFscyIIcG9vbFR5cGUiFWRhdGFNYXBwaW5nUG9vbEFzc2V0cyIWaW50ZXJuYWxBbW91bnRBc3NldFN0ciIVaW50ZXJuYWxQcmljZUFzc2V0U3RyIg1nZXRQb29sQ29uZmlnIgpwb29sQXNzZXRzIhpnZXRJbnRlcm5hbEFzc2V0SWRPckNyZWF0ZSIKYXNzZXRJZFN0ciILaW5jcmVtZW50b3IiD2ludGVybmFsQXNzZXRJZCIYY3VycmVudEluZGV4T2ZJbnRlcm5hbElkIgZyZXN1bHQiEm5ld0ludGVybmFsQXNzZXRJZCIJbXVzdEFkbWluIghhZG1pblBLcyIJaXNNYW5hZ2VyIhZpbnRPckRlZmF1bHRPckZhbGxiYWNrIgprZXlEZWZhdWx0Ig12YWx1ZUZhbGxiYWNrIhJwb29sRXhpc3RzSW50ZXJuYWwiBGFtQXMiBHByQXMiA2NmZyIKY2ZnUmV2ZXJzZSIGZXhpc3RzIgZhc3NldDEiBmFzc2V0MiIJYXNzZXROdW0xIglhc3NldE51bTIiAmVlIgNyZXMiAmxwIg9zdGFraW5nQ29udHJhY3QiEGJvb3N0aW5nQ29udHJhY3QiEHNscGlwYWdlQ29udHJhY3QiDXByaWNlRGVjaW1hbHMiC2NoZWNrQ2FsbGVyIhBtYXRoY2hlclB1YjU4U3RyIgptYXRoY2VyUHViIhVsZWdhY3lGYWN0b3J5Q29udHJhY3QiC2xlZ2FjeVBvb2xzIhNhc3NldHNTdG9yZUNvbnRyYWN0IhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0IgtwcmljZUFzc2V0cyIFY2hla3MiF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5IhVjaGVja01hbmFnZXJQdWJsaWNLZXkiAnBtIgVoYXNQTSIHY2hlY2tQTSIMYWRtaW5QdWJLZXlzIgtscEFzc2V0TmFtZSIMbHBBc3NldERlc2NyIgpwb29sV2VpZ2h0IgRsb2dvIhdpbnRlcm5hbEFtb3VudEFzc2V0RGF0YSIVaW50ZXJuYWxBbW91bnRBc3NldElkIhZpbnRlcm5hbFByaWNlQXNzZXREYXRhIhRpbnRlcm5hbFByaWNlQXNzZXRJZCIVcG9vbEFjY291bnRTY3JpcHRIYXNoIhxldGhhbG9uUG9vbEFjY291bnRTY3JpcHRIYXNoIgpwb29sRXhpc3RzIg9wb29sQ29uZmlnVmFsdWUiFGFtb3VudEFzc2V0c0RlY2ltYWxzIhNwcmljZUFzc2V0c0RlY2ltYWxzIhJscEFzc2V0SXNzdWVBY3Rpb24iDGxwQXNzZXRJZFN0ciIYcG9vbEFjdGl2YXRlSW52b2tlUmVzdWx0IhhjcmVhdGVPclVwZGF0ZUxwQXNzZXRJbnYiEmFkZFBvb2xzTHBMYWJlbEludiIKc2V0TG9nb0ludiIQYWRkQXNzZXRzTGlua0ludiIbaW5jcmVhc2VBc3NldFBvb2xzTnVtYmVySW52IgluZXdTdGF0dXMiCnBvb2xDb25maWciCmxwQXNzZXREY20iDGFtb3VudFRvRW1pdCIGY2FsbGVyIgxvcmlnaW5DYWxsZXIiEGxwQXNzZXRSZXF1ZXN0ZWQiB2xwQXNzZXQiDGFtb3VudFRvQnVybiIHcGF5bWVudCINcGF5bWVudEFtb3VudCIPaW5BbW91bnRBc3NldElkIhpscEFzc2V0UmVxdWVzdGVkRm9yQnVybmluZyIFc2hhcmUiDXBvb2xXZWlnaHRLZXkiDGd3eFdlaWdodEtleSIJZ3d4V2VpZ2h0Ig1wb29sV2VpZ2h0TmV3IhFvbk1vZGlmeVdlaWdodEludiIVZ3d4VmlydHVhbFBvb2xBY3Rpb25zIhRwb29sV2VpZ2h0SGlzdG9yeUtleSIXcG9vbFdlaWdodEhpc3RvcnlPclVuaXQiGHBvb2xXZWlnaHRIaXN0b3J5QWN0aW9ucyIOYnRjUG9vbEFkZHJlc3MiDmV0aFBvb2xBZGRyZXNzIhFldGhCdGNQb29sQWRkcmVzcyITdXNkY1VzZHRQb29sQWRkcmVzcyIPZXRoQnRjV2VpZ2h0TmV3IhF1c2RjVXNkdFdlaWdodE5ldyIPd2VpZ2h0RGVjcmVtZW50IgtzdGFraW5nRGFwcCINZ3d4UmV3YXJkRGFwcCIMYnRjV2VpZ2h0S0VZIgxldGhXZWlnaHRLRVkiD2V0aEJ0Y1dlaWdodEtFWSIRdXNkY1VzZHRXZWlnaHRLRVkiCWJ0Y1dlaWdodCIJZXRoV2VpZ2h0IgxidGNXZWlnaHROZXciDGV0aFdlaWdodE5ldyIPYnRjTHBBc3NldElkU3RyIg9ldGhMcEFzc2V0SWRTdHIiEmV0aEJ0Y0xwQXNzZXRJZFN0ciIUdXNkY1VzZHRMcEFzc2V0SWRTdHIiEW9uTW9kaWZ5V2VpZ2h0QnRjIhFvbk1vZGlmeVdlaWdodEV0aCIUb25Nb2RpZnlXZWlnaHRFdGhCdGMiFm9uTW9kaWZ5V2VpZ2h0VXNkY1VzZHQiCWhhdmVMYWJlbCIBYiIHYXNzZXRJZCIUY2hlY2tQcmljZUFzc2V0c1NpemUiAmNiIgNhY2MiCnByaWNlQXNzZXQiAXIiB2FjdGlvbnMiAiRsIgIkcyIFJGFjYzAiBSRmMF8xIgIkYSICJGkiBSRmMF8yIh5wb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiImFsbFBvb2xzT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiA2ZlZSICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5ZwABYQAIAAFiAIDC1y8AAWMAEgABZAkAtgIBAICAkLu61q3wDQABZQUBYgABZgIOR1dYdmlydHVhbFBPT0wAAWcCCFBPT0xTX0xQAAFoAICJegABaQkAaAIJAGgCAGQA6AcA6AcAAWoCAl9fAAFrAgAAAWwAAQABbQACAAFuAAMAAW8ABAABcAABAAFxAAIAAXIAAwABcwABAAF0AAIAAXUAAwABdgAEAAF3AAUAAXgABgABeQAHAAF6AAgAAUEACQABQgAKAAFDAAsAAUQCC1dYX0VNSVNTSU9OAAFFCQDMCAIFAUQFA25pbAEBRgACFyVzX19hbGxvd2VkTHBTY3JpcHRIYXNoAQFHAAIdJXNfX2FsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2gBAUgAAiIlc19fYWxsb3dlZExwU3RhYmxlQWRkb25TY3JpcHRIYXNoAQFJAAIQJXNfX3N3YXBDb250cmFjdAEBSgACESVzX19mYWN0b3J5Q29uZmlnAQFLAAIQJXNfX2xwVG9rZW5zTGlzdAEBTAACFiVzJXNfX3Bvb2xfX3NjcmlwdEhhc2gBAU0AAhglcyVzX19tYXRjaGVyX19wdWJsaWNLZXkBAU4AAhklc19fbGVnYWN5RmFjdG9yeUNvbnRyYWN0AQFPAAIPJXNfX2xlZ2FjeVBvb2xzAQFQAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAVEAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBAVIAAhAlc19fYWRtaW5QdWJLZXlzAQFTAAIXJXNfX2Fzc2V0c1N0b3JlQ29udHJhY3QBAVQAAholc19fdm90aW5nRW1pc3Npb25Db250cmFjdAEBVQAJALkJAgkAzAgCAgIlcwkAzAgCAgtwcmljZUFzc2V0cwUDbmlsBQFqAQFWAAIRJXNfX3ByaWNlRGVjaW1hbHMBAVcAAgwlc19fc2h1dGRvd24BAVgAAhclc19fbmV4dEludGVybmFsQXNzZXRJZAEBWQEBWgkArAICAhIlcyVzX19wb29sV2VpZ2h0X18FAVoBAmFhAgFaAmFiCQCsAgIJAKwCAgkArAICAhIlcyVzX19wb29sV2VpZ2h0X18FAVoCAl9fCQCkAwEFAmFiAQJhYwECYWQJAKwCAgIoJXMlcyVkX19tYXBwaW5nc19faW50ZXJuYWwyYmFzZUFzc2V0SWRfXwkApAMBBQJhZAECYWUBAmFmCQCsAgICKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAmFmAQJhZwICYWgCYWkJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFoAgJfXwUCYWkCCF9fY29uZmlnAQJhagECYWsEAmFsBQJhawQCYWgIBQJhbAJfMQQCYWkIBQJhbAJfMgkAuQkCCQDMCAICBiVkJWQlcwkAzAgCCQCkAwEFAmFoCQDMCAIJAKQDAQUCYWkJAMwIAgIab25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQFA25pbAUBagECYW0ACQC5CQIJAMwIAgICJXMJAMwIAgIab25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQFA25pbAUBagECYW4BAmFvCQCsAgIJAKwCAgIIJXMlcyVzX18FAmFvAhhfX21hcHBpbmdzX19scEFzc2V0MlBvb2wBAmFwAgJhcQJhcgkArAICCQCsAgIJAKwCAgkArAICAgolZCVkJXMlc19fBQJhcQICX18FAmFyAh5fX21hcHBpbmdzX19Qb29sQXNzZXRzMkxwQXNzZXQBAmFzAQFaCQCsAgICDiVzJXNfX3NwcmVhZF9fBQFaAQJhdAECYXUJAKwCAgkArAICAgglcyVzJXNfXwUCYXUCI19fbWFwcGluZ3NfX3Bvb2xDb250cmFjdDJQb29sQXNzZXRzAQJhdgICYXECYXIJAKwCAgkArAICCQCsAgIJAKwCAgIKJWQlZCVzJXNfXwkApAMBBQJhcQICX18JAKQDAQUCYXICI19fbWFwcGluZ3NfX3Bvb2xBc3NldHMyUG9vbENvbnRyYWN0AQJhdwECYXUJAKwCAgkArAICAgglcyVzJXNfXwUCYXUCIF9fbWFwcGluZ3NfX3Bvb2xDb250cmFjdDJMcEFzc2V0AQJheAECYW8JAKwCAgkArAICAgglcyVzJXNfXwUCYW8CIF9fbWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0AQJheQICYXoCYUEJAKwCAgkArAICCQCsAgICFCVzJXMlc19fd3hFbWlzc2lvbl9fBQJhegICX18FAmFBAQJhQgEBWgkArAICAg0lcyVzX19pbkZlZV9fBQFaAQJhQwACECVzX19pbkZlZURlZmF1bHQBAmFEAQFaCQCsAgICDiVzJXNfX291dEZlZV9fBQFaAQJhRQACESVzX19vdXRGZWVEZWZhdWx0AQJhRgECYUcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQJhRwkArAICAhVObyBkYXRhIGZvciB0aGlzLmtleT0FAmFHAQJhSAECYUcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmwgCBQR0aGlzBQJhRwkArAICAhVObyBkYXRhIGZvciB0aGlzLmtleT0FAmFHAQJhSQECYUcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQJhRwkArAICAhVObyBkYXRhIGZvciB0aGlzLmtleT0FAmFHAAJhSgABAAJhSwACAAJhTAADAAJhTQAEAAJhTgAFAAJhTwAGAAJhUAAHAAJhUQAIAAJhUgAJAAJhUwAKAAJhVAALAQJhVQECYVYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYVYFAmFLAQJhVwECYVYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYVYFAmFOAQJhWAECYVYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYVYFAmFKAQJhWQECYVYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYVYFAmFTAQJhWgAEAmJhCQCiCAEJAQFVAAMJAAECBQJiYQIGU3RyaW5nBAJiYgUCYmEDCQAAAgkAsQIBBQJiYgAABQNuaWwJALUJAgUCYmIFAWoFA25pbAECYmMABAJiYQkAoggBCQEBUAADCQABAgUCYmECBlN0cmluZwQCYmIFAmJhCQDZBAEFAmJiAwkAAQIFAmJhAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmJkAAQCYmEJAKIIAQkBAVEAAwkAAQIFAmJhAgZTdHJpbmcEAmJiBQJiYQkA2QQBBQJiYgMJAAECBQJiYQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAAJiZQkAAgECEVBlcm1pc3Npb24gZGVuaWVkAAJiZgkAAgECD1Rlc3QgZXJyb3IgaGVyZQECYmcBAmJoAwkAAAIIBQJiaAZjYWxsZXIFBHRoaXMGBQJiZQECYmkBAmJoBAJiYQkBAmJjAAMJAAECBQJiYQIKQnl0ZVZlY3RvcgQCYmoFAmJhAwkAAAIIBQJiaA9jYWxsZXJQdWJsaWNLZXkFAmJqBgUCYmUDCQABAgUCYmECBFVuaXQJAQJiZwEFAmJoCQACAQILTWF0Y2ggZXJyb3IBAmJrCwJibAJibQJibgJibwJicAJicQJicgJicwJidAJidQJidgkAuQkCCQDMCAICFiVzJXMlcyVzJXMlcyVzJXMlcyVzJXMJAMwIAgUCYmwJAMwIAgUCYm0JAMwIAgUCYm4JAMwIAgUCYm8JAMwIAgUCYnAJAMwIAgUCYnEJAMwIAgUCYnIJAMwIAgUCYnMJAMwIAgUCYnQJAMwIAgUCYnUJAMwIAgUCYnYFA25pbAUBagECYncHAmJsAmJtAmJuAmJvAmJwAmJxAmJyCQC5CQIJAMwIAgIMJXMlcyVzJXMlcyVzCQDMCAIFAmJsCQDMCAIFAmJtCQDMCAIFAmJuCQDMCAIFAmJvCQDMCAIFAmJwCQDMCAIFAmJxCQDMCAIFAmJyBQNuaWwFAWoBAmJ4CwFaAmJ5AmJ6AmJBAmJCAmJDAmJEAmJFAmJGAmJHAmJICQC5CQIJAMwIAgIWJXMlZCVzJXMlcyVkJWQlZCVkJWQlcwkAzAgCBQFaCQDMCAIFAmJ5CQDMCAIFAmJ6CQDMCAIFAmJBCQDMCAIFAmJCCQDMCAIJAKQDAQUCYkMJAMwIAgkApAMBBQJiRAkAzAgCCQCkAwEFAmJFCQDMCAIJAKQDAQUCYkYJAMwIAgkApAMBBQJiRwkAzAgCBQJiSAUDbmlsBQFqAQJiSQICYkoCYksJALkJAgkAzAgCAgQlZCVkCQDMCAIJAKQDAQUCYkoJAMwIAgkApAMBBQJiSwUDbmlsBQFqAQJiTAEBWgQCYk0JALUJAgkBAmFGAQkBAmF0AQUBWgUBagQCYWgJAJEDAgUCYk0AAQQCYWkJAJEDAgUCYk0AAgkAtQkCCQECYUYBCQECYWcCBQJhaAUCYWkFAWoBAmJOAgJiTwJiUAQCYlEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmFlAQUCYk8AAAQCYlIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAVgAAAAEAmJTAwkAAAIFAmJRAAAEAmJUCQBkAgUCYlIFAmJQCQCVCgMFAmJUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAAFAmJUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWUBBQJiTwUCYlQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFjAQUCYlQFAmJPBQNuaWwGCQCVCgMFAmJRBQNuaWwHBQJiUwECYlUBAmJoBAJiVgkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJAQFSAAUBawUBagMJAQ9jb250YWluc0VsZW1lbnQCBQJiVgkA2AQBCAUCYmgPY2FsbGVyUHVibGljS2V5BgQCYlcJAQJiaQEFAmJoAwkAAAIFAmJXBQJiVwYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmJYAwJhRwJiWQJiWgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJhRwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJiWQUCYloBAmNhAgJhegJhQQQCYWgJAJ8IAQkBAmFlAQUCYXoEAmFpCQCfCAEJAQJhZQEFAmFBAwMJAAACBQJhaAUEdW5pdAYJAAACBQJhaQUEdW5pdAcEAmNiCQCkAwEJAQV2YWx1ZQEFAmFoBAJjYwkApAMBCQEFdmFsdWUBBQJhaQQCY2QJAKIIAQkBAmFnAgUCY2IFAmNjBAJjZQkAoggBCQECYWcCBQJjYwUCY2IEAmNmAwkBAiE9AgUCY2QFBHVuaXQGCQECIT0CBQJjZQUEdW5pdAUCY2YbAmJoARdnZXRTd2FwQ29udHJhY3RSRUFET05MWQAJAJQKAgUDbmlsCQECYUYBCQEBSQACYmgBIGdldExwQXNzZXRGcm9tUG9vbEFzc2V0c1JFQURPTkxZAgJjZwJjaAMDCQAAAgUCY2cCLDhMUVc4ZjdQNWQ1UFpNN0d0WkVCZ2FxUlBHU3pTM0RmUHVpWHJVUko0QUpTCQAAAgUCY2gCBVdBVkVTBwkAlAoCBQNuaWwFBHVuaXQEAmNpCQEFdmFsdWUBCQCaCAIFBHRoaXMJAQJhZQEFAmNnBAJjagkBBXZhbHVlAQkAmggCBQR0aGlzCQECYWUBBQJjaAQCY2sJAJ0IAgUEdGhpcwkBAmFwAgkApAMBBQJjaQkApAMBBQJjagQCY2wDCQAAAgUCY2sFBHVuaXQFBHVuaXQJALACAgkBBXZhbHVlAQUCY2sABAkAlAoCBQNuaWwFAmNsAmJoASFnZXRQb29sQWRkcmVzc0Zyb21McEFzc2V0UkVBRE9OTFkBAmNtCQCUCgIFA25pbAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQECYXgBBQJjbQIAAmJoAQtjb25zdHJ1Y3RvcggCY24CY28CYm4CYm8CYnACYnECY3ACY3EEAmNyCQECYmkBBQJiaAMJAAACBQJjcgUCY3IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUoACQECYncHBQJjbgUCY28FAmJuBQJibwUCYnAFAmJxBQJjcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYABQJjcQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQ1jb25zdHJ1Y3RvclYyAQJjcwQCY3IJAQJiaQEFAmJoAwkAAAIFAmNyBQJjcgQCY3QJAKcIAQkA2QQBBQJjcwMJAAACBQJjdAUCY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU0ABQJjcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQ1jb25zdHJ1Y3RvclYzBAJicwJidAJidQJidgQCY3IJAQJiaQEFAmJoAwkAAAIFAmNyBQJjcgQCYVYJALUJAgkBAmFGAQkBAUoABQFqCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFKAAkBAmJrCwkAkQMCBQJhVgABCQCRAwIFAmFWAAIJAJEDAgUCYVYAAwkAkQMCBQJhVgAECQCRAwIFAmFWAAUJAJEDAgUCYVYABgkAkQMCBQJhVgAHBQJicwUCYnQFAmJ1BQJidgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQ1jb25zdHJ1Y3RvclY0AgJjdQJjdgQCY3IJAQJiaQEFAmJoAwkAAAIFAmNyBQJjcgkAzAgCCQELU3RyaW5nRW50cnkCCQEBTgAFAmN1CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFPAAkAuQkCBQJjdgUBagUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQ1jb25zdHJ1Y3RvclY1AQJjdwQCY3IJAQJiaQEFAmJoAwkAAAIFAmNyBQJjcgkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwAFAmN3BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmgBDWNvbnN0cnVjdG9yVjYCAmN4AmN5BAJjegkAzAgCCQECYmkBBQJiaAkAzAgCAwkBAiE9AgkApggBBQJjeAUEdW5pdAYCKGludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNvbnRyYWN0IGFkZHJlc3MFA25pbAMJAAACBQJjegUCY3oJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQABQJjeAkAzAgCCQELU3RyaW5nRW50cnkCCQEBVQAJALkJAgUCY3kFAWoFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAEKc2V0TWFuYWdlcgECY0EEAmNyCQECYmkBBQJiaAMJAAACBQJjcgUCY3IEAmNCCQDZBAEFAmNBAwkAAAIFAmNCBQJjQgkAzAgCCQELU3RyaW5nRW50cnkCCQEBUQAFAmNBBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmgBDmNvbmZpcm1NYW5hZ2VyAAQCY0MJAQJiZAAEAmNEAwkBCWlzRGVmaW5lZAEFAmNDBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJjRAUCY0QEAmNFAwkAAAIIBQJiaA9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmNDBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJjRQUCY0UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVAACQDYBAEJAQV2YWx1ZQEFAmNDCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFRAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQlzZXRBZG1pbnMBAmNGBAJjcgkBAmJpAQUCYmgDCQAAAgUCY3IFAmNyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFSAAkAuQkCBQJjRgUBagUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQ9hY3RpdmF0ZU5ld1Bvb2wIAVoCYkECYkICY0cCY0gCY0kCYkgCY0oEAmNyCQECYlUBBQJiaAMJAAACBQJjcgUCY3IDCQEJaXNEZWZpbmVkAQkAoggBCQECYXQBBQFaCQACAQkArAICCQCsAgICDVBvb2wgYWRkcmVzcyAFAVoCFCBhbHJlYWR5IHJlZ2lzdGVyZWQuBAJjSwkBAmJOAgUCYkEAAQQCY0wIBQJjSwJfMQQCY00JAQJiTgIFAmJCAwgFAmNLAl8zAAIAAQQCY04IBQJjTQJfMQQCY08JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA8QcBCQERQGV4dHJOYXRpdmUoMTA2MikBBQFaCQCsAgICKU5vIHNjcmlwdCBoYXMgYmVlbiBmb3VuZCBvbiBwb29sIGFjY291bnQgBQFaBAJjUAkBEUBleHRyTmF0aXZlKDEwNTcpAQkBAUwABAJjUQkBAmNhAgUCYkEFAmJCAwUCY1EJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICBVBvb2wgBQJiQQIBLwUCYkICHCBoYXMgYWxyZWFkeSBiZWVuIGFjdGl2YXRlZC4EAmNSCQEFdmFsdWUBCQCdCAIFBHRoaXMJAQJhZwIJAKQDAQUCY0wJAKQDAQUCY04EAmNTAwkAAAIFAmJBAgVXQVZFUwUBaQkAbAYACgAACAkBBXZhbHVlAQkA7AcBCQDZBAEFAmJBCGRlY2ltYWxzAAAAAAUERE9XTgQCY1QDCQAAAgUCYkICBVdBVkVTBQFpCQBsBgAKAAAICQEFdmFsdWUBCQDsBwEJANkEAQUCYkIIZGVjaW1hbHMAAAAABQRET1dOBAJjVQkAwggFBQJjRwUCY0gAAQAIBgQCYnoJALgIAQUCY1UEAmNWCQDYBAEFAmJ6BAJjVwkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQFaAghhY3RpdmF0ZQkAzAgCBQJiQQkAzAgCBQJiQgUDbmlsBQNuaWwDCQAAAgUCY1cFAmNXAwkBAiE9AgUCY1cCB3N1Y2Nlc3MJAAIBAiNQb29sIGluaXRpYWxpc2F0aW9uIGVycm9yIGhhcHBlbmVkLgQCY3cJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhRgEJAQFTAAQCY1gJAPwHBAUCY3cCDmNyZWF0ZU9yVXBkYXRlCQDMCAIFAmNWCQDMCAIFAmNHCQDMCAIHBQNuaWwFA25pbAMJAAACBQJjWAUCY1gEAmNZCQD8BwQFAmN3AghhZGRMYWJlbAkAzAgCBQJjVgkAzAgCBQFnBQNuaWwFA25pbAMJAAACBQJjWQUCY1kEAmNaCQD8BwQFAmN3AgdzZXRMb2dvCQDMCAIFAmNWCQDMCAIFAmNKBQNuaWwFA25pbAMJAAACBQJjWgUCY1oEAmRhCQD8BwQFAmN3Ag1hZGRBc3NldHNMaW5rCQDMCAIFAmJBCQDMCAIFAmJCCQDMCAIFAmNWBQNuaWwFA25pbAMJAAACBQJkYQUCZGEEAmRiCQD8BwQFAmN3AhhpbmNyZWFzZUFzc2V0UG9vbHNOdW1iZXIJAMwIAgUCYkEFA25pbAUDbmlsAwkAAAIFAmRiBQJkYgkAlAoCCQDOCAIJAM4IAggFAmNLAl8yCAUCY00CXzIJAMwIAgUCY1UJAMwIAgkBBEJ1cm4CBQJiegABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZwIJAKQDAQUCY0wJAKQDAQUCY04JAQJieAsFAVoJAKQDAQUBbAUCY1YFAmJBBQJiQgUCY1MFAmNUBQJjTAUCY04FAWkFAmJICQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhbgEFAmNWCQECYkkCBQJjTAUCY04JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFwAgkApAMBBQJjTAkApAMBBQJjTgkArAICAgQlc19fBQJjVgkAzAgCCQELU3RyaW5nRW50cnkCCQECYXQBBQFaCQECYkkCBQJjTAUCY04JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF2AgUCY0wFAmNOBQFaCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJheAEFAmNWBQFaCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhdwEFAVoFAmNWCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWQEFAVoFAmNJCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXMBBQFaBQFoBQNuaWwFAmNWCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoAQptYW5hZ2VQb29sAgFaAmRjBAJjcgkBAmJpAQUCYmgDCQAAAgUCY3IFAmNyBAJkZAkBAmJMAQUBWgQCYnkJAJEDAgUCZGQFAXQEAmNWCQCRAwIFAmRkBQF1BAJiQQkAkQMCBQJkZAUBdgQCYkIJAJEDAgUCZGQFAXcEAmNTCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGQFAXgEAmNUCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGQFAXkEAmNMCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGQFAXoEAmNOCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGQFAUEEAmRlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGQFAUIEAmJICQCRAwIFAmRkBQFDCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZwIJAKQDAQUCY0wJAKQDAQUCY04JAQJieAsFAVoJAKQDAQUCZGMFAmNWBQJiQQUCYkIFAmNTBQJjVAUCY0wFAmNOBQJkZQUCYkgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAEEZW1pdAECZGYEAmRnCAUCYmgGY2FsbGVyBAJkaAgFAmJoDG9yaWdpbkNhbGxlcgQCZGkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQECYXcBCQClCAEFAmRnAh1JbnZhbGlkIExQIGFkZHJlc3MgY2FsbGVkIG1lLgQCZGoJANkEAQUCZGkEAmN2CQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBAU8ABQFrBQFqBAJjdQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAQFOAAIoTGVnYWN5IGZhY3RvcnkgY29udHJhY3QgZG9lcyBub3QgZXhpc3RzLgMJAGcCAAAFAmRmBQNuaWwDCQEPY29udGFpbnNFbGVtZW50AgUCY3YJAKUIAQUCZGcJAJQKAgUDbmlsBQJjdQkAlAoCCQDMCAIJAQdSZWlzc3VlAwUCZGoFAmRmBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCYmgGY2FsbGVyBQJkZgUCZGoFA25pbAIHc3VjY2VzcwJiaAEEYnVybgECZGsEAmRnCAUCYmgGY2FsbGVyBAJkaAgFAmJoDG9yaWdpbkNhbGxlcgQCZGwJAQV2YWx1ZQEJAJEDAggFAmJoCHBheW1lbnRzAAAEAmRtCQEFdmFsdWUBCAUCZGwGYW1vdW50BAJkbgkA2AQBCQEFdmFsdWUBCAUCZGwHYXNzZXRJZAQCZG8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQECYXcBCQClCAEFAmRnAh1JbnZhbGlkIExQIGFkZHJlc3MgY2FsbGVkIG1lLgMJAQIhPQIFAmRuBQJkbwkAAgECFUludmFsaWQgYXNzZXQgcGFzc2VkLgMJAQIhPQIFAmRrBQJkbQkAAgECFkludmFsaWQgYW1vdW50IHBhc3NlZC4EAmRqCQDZBAEFAmRvCQCUCgIJAMwIAgkBBEJ1cm4CBQJkagUCZGsFA25pbAIHc3VjY2VzcwJiaAEMbW9kaWZ5V2VpZ2h0AgJiegJkcAQCY3IDCQAAAgkA2AQBCAgFAmJoBmNhbGxlcgVieXRlcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEBVAACAAYJAQJiaQEFAmJoAwkAAAIFAmNyBQJjcgQCYXUJAQJhRgEJAQJheAEFAmJ6BAJkcQkBAVkBBQJhdQQCZHIJAQFZAQUBZgQCZHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUCZHIAAAQCY0kJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUCZHEAAAQCZHQFAmRwBAJhVgkAtQkCCQECYUYBCQEBSgAFAWoEAmNuCQECYVgBBQJhVgQCZHUJAPwHBAUCY24CDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmJ6CQDMCAIFAmF1BQNuaWwFA25pbAMJAAACBQJkdQUCZHUEAmR2AwkAAAIFAmRzAAAFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZHIAAAUDbmlsBAJkdwkBAmFhAgUCYXUAAAQCZHgJAJ8IAQUCZHcEAmR5AwkAAAIFAmR4BQR1bml0BQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQUCZHcFA25pbAkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmRxBQJkdAUDbmlsBQJkdgUCZHkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYmgBDW1vZGlmeVdlaWdodHMEAmR6AmRBAmRCAmRDBAJjcgkBAmJpAQUCYmgDCQAAAgUCY3IFAmNyBAJkRAkAaQIJAGgCAAUFAWUAZAQCZEUJAGkCCQBoAgAFBQFlAGQEAmRGCQBpAgkAaAIABQUBZQBkBAJhVgkAtQkCCQECYUYBCQEBSgAFAWoEAmRHCQECYVgBBQJhVgQCZEgJAQJhWQEFAmFWBAJkSQkBAVkBBQJkegQCZEoJAQFZAQUCZEEEAmRLCQEBWQEFAmRCBAJkTAkBAVkBBQJkQwQCZE0JAQJhSQEFAmRJBAJkTgkBAmFJAQUCZEoEAmRPCQBlAgUCZE0FAmRGBAJkUAkAZQIFAmROBQJkRgMJAGcCAAAFAmRPCQACAQkArAICAhZpbnZhbGlkIGJ0Y1dlaWdodE5ldzogCQCkAwEFAmRPAwkAZwIAAAUCZFAJAAIBCQCsAgICFmludmFsaWQgZXRoV2VpZ2h0TmV3OiAJAKQDAQUCZFAEAmRRCQECYUYBCQECYXcBBQJkegQCZFIJAQJhRgEJAQJhdwEFAmRBBAJkUwkBAmFGAQkBAmF3AQUCZEIEAmRUCQECYUYBCQECYXcBBQJkQwQCZFUJAPwHBAUCZEcCDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmRRCQDMCAIFAmR6BQNuaWwFA25pbAMJAAACBQJkVQUCZFUEAmRWCQD8BwQFAmRHAg5vbk1vZGlmeVdlaWdodAkAzAgCBQJkUgkAzAgCBQJkQQUDbmlsBQNuaWwDCQAAAgUCZFYFAmRWBAJkVwkA/AcEBQJkRwIOb25Nb2RpZnlXZWlnaHQJAMwIAgUCZFMJAMwIAgUCZEIFA25pbAUDbmlsAwkAAAIFAmRXBQJkVwQCZFgJAPwHBAUCZEcCDm9uTW9kaWZ5V2VpZ2h0CQDMCAIFAmRUCQDMCAIFAmRDBQNuaWwFA25pbAMJAAACBQJkWAUCZFgJAMwIAgkBDEludGVnZXJFbnRyeQIFAmRJBQJkTwkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZEoFAmRQCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJkSwUCZEQJAMwIAgkBDEludGVnZXJFbnRyeQIFAmRMBQJkRQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFhAgUCZHoAAAUCZE0JAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYQIFAmRBAAAFAmROCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWECBQJkQgAABQJkRAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFhAgUCZEMAAAUCZEUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAEYY2hlY2tXeEVtaXNzaW9uUG9vbExhYmVsAgJhegJhQQQCZFkEAmJhCQCgCAEJAQJheQIFAmF6BQJhQQMJAAECBQJiYQIHQm9vbGVhbgQCZFoFAmJhBQJkWgcJAJQKAgUDbmlsBQJkWQJiaAEWc2V0V3hFbWlzc2lvblBvb2xMYWJlbAICYXoCYUEEAmNyCQECYlUBBQJiaAMJAAACBQJjcgUCY3IJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAmF5AgUCYXoFAmFBBgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoARlkZWxldGVXeEVtaXNzaW9uUG9vbExhYmVsAgJhegJhQQQCY3IDCQECYmcBBQJiaAYJAQJiVQEFAmJoAwkAAAIFAmNyBQJjcgkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJheQIFAmF6BQJhQQUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmJoARJvblZlcmlmaWNhdGlvbkxvc3MBAmVhBAJjcgMJAAACCQDYBAEICAUCYmgGY2FsbGVyBWJ5dGVzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQFTAAIABgkBAmJpAQUCYmgDCQAAAgUCY3IFAmNyBAJjeQkBAmFaAAQCZWIDCQBmAgkAkAMBBQJjeQAABgkAAgECFGludmFsaWQgcHJpY2UgYXNzZXRzAwkAAAIFAmViBQJlYgoBAmVjAgJlZAJlZQQCZWYJAPwHBAUEdGhpcwIZZGVsZXRlV3hFbWlzc2lvblBvb2xMYWJlbAkAzAgCBQJlYQkAzAgCBQJlZQUDbmlsBQNuaWwDCQAAAgUCZWYFAmVmBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJlZwoAAmVoBQJjeQoAAmVpCQCQAwEFAmVoCgACZWoFBHVuaXQKAQJlawICZWwCZW0DCQBnAgUCZW0FAmVpBQJlbAkBAmVjAgUCZWwJAJEDAgUCZWgFAmVtCgECZW4CAmVsAmVtAwkAZwIFAmVtBQJlaQUCZWwJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAxCQECZW4CCQECZWsCBQJlagAAAAEDCQAAAgUCZWcFAmVnCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJiaAEoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQEBWgQCZGQJAQJiTAEFAVoEAmFrCQCUCgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkZAUBegkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmRkBQFBBAJlbwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQECYWoBBQJhawcEAmVwCQELdmFsdWVPckVsc2UCCQCgCAEJAQJhbQAHCQCUCgIFA25pbAMFAmVwBgUCZW8CYmgBEGdldEluRmVlUkVBRE9OTFkBAVoEAmVxCQECYlgDCQECYUIBBQFaCQECYUMAAAAJAJQKAgUDbmlsBQJlcQJiaAERZ2V0T3V0RmVlUkVBRE9OTFkBAVoEAmVxCQECYlgDCQECYUQBBQFaCQECYUUACQBrAwAKBQFiAJBOCQCUCgIFA25pbAUCZXECYmgBFWdldFBvb2xTdGF0dXNSRUFET05MWQEBWgQCYk0JALUJAgkBAmFGAQkBAmF0AQUBWgUBagQCYWgJAJEDAgUCYk0AAQQCYWkJAJEDAgUCYk0AAgQCY2QJALUJAgkBAmFGAQkBAmFnAgUCYWgFAmFpBQFqCQCUCgIFA25pbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNkBQF0AmJoARJwb29sRXhpc3RzUkVBRE9OTFkCAmF6AmFBCQCUCgIFA25pbAkBAmNhAgUCYXoFAmFBAQJlcgECZXMABAJldAQCYmEJAQJiYwADCQABAgUCYmECCkJ5dGVWZWN0b3IEAmJqBQJiYQUCYmoDCQABAgUCYmECBFVuaXQIBQJlcg9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgkA9AMDCAUCZXIJYm9keUJ5dGVzCQCRAwIIBQJlcgZwcm9vZnMAAAUCZXQvXyNR", "height": 2458058, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GDy6DKPHHxygNKUq9udograSwJjBVz2kEcNaJrdPLF7E Next: BmtWjQQ8BMn8ZTHQBxmi3gQCzuba3ZnSiVdo3fWriUyQ Diff:
OldNewDifferences
825825
826826
827827 @Callable(i)
828-func getPoolConfigByLpAssetId (lpAssetIdStr) = {
829- let poolAssets = split(getStringOrFail(keyMappingLpAssetToPoolAssets(lpAssetIdStr)), SEP)
830- let amountAssetInternal = poolAssets[1]
831- let priceAssetInternal = poolAssets[2]
832- let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
833- $Tuple2(nil, cfg)
834- }
835-
836-
837-
838-@Callable(i)
839828 func poolExistsREADONLY (amountAssetId,priceAssetId) = $Tuple2(nil, poolExistsInternal(amountAssetId, priceAssetId))
840829
841830
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
7575 func swapContract () = "%s__swapContract"
7676
7777
7878 func keyFactoryConfig () = "%s__factoryConfig"
7979
8080
8181 func keyLpTokensList () = "%s__lpTokensList"
8282
8383
8484 func keyPoolScriptHash () = "%s%s__pool__scriptHash"
8585
8686
8787 func keyMatcherPub () = "%s%s__matcher__publicKey"
8888
8989
9090 func keyLegacyFactoryContract () = "%s__legacyFactoryContract"
9191
9292
9393 func keyLegacyPools () = "%s__legacyPools"
9494
9595
9696 func keyManagerPublicKey () = "%s__managerPublicKey"
9797
9898
9999 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
100100
101101
102102 func keyAdminPubKeys () = "%s__adminPubKeys"
103103
104104
105105 func keyAssetsStoreContract () = "%s__assetsStoreContract"
106106
107107
108108 func keyVotingEmissionContract () = "%s__votingEmissionContract"
109109
110110
111111 func keyPriceAssets () = makeString(["%s", "priceAssets"], SEP)
112112
113113
114114 func keyPriceDecimals () = "%s__priceDecimals"
115115
116116
117117 func keyAllPoolsShutdown () = "%s__shutdown"
118118
119119
120120 func keyNextInternalAssetId () = "%s__nextInternalAssetId"
121121
122122
123123 func keyPoolToWeight (poolAddress) = ("%s%s__poolWeight__" + poolAddress)
124124
125125
126126 func keyPoolToWeightHistory (poolAddress,num) = ((("%s%s__poolWeight__" + poolAddress) + "__") + toString(num))
127127
128128
129129 func keyMappingsInternal2baseAssetId (internalBaseAsset) = ("%s%s%d__mappings__internal2baseAssetId__" + toString(internalBaseAsset))
130130
131131
132132 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
133133
134134
135135 func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config")
136136
137137
138138 func keyPoolOneTokenOperationsDisabled (assetsInternal) = {
139139 let $t037003762 = assetsInternal
140140 let amountAssetInternal = $t037003762._1
141141 let priceAssetInternal = $t037003762._2
142142 makeString(["%d%d%s", toString(amountAssetInternal), toString(priceAssetInternal), "oneTokenOperationsDisabled"], SEP)
143143 }
144144
145145
146146 func keyAllPoolsOneTokenOperationsDisabled () = makeString(["%s", "oneTokenOperationsDisabled"], SEP)
147147
148148
149149 func keyMappingLpAssetToPoolAssets (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2Pool")
150150
151151
152152 func keyMappingPoolAssetsToLpasset (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + internalAmountAssetIdStr) + "__") + internalPriceAssetIdStr) + "__mappings__PoolAssets2LpAsset")
153153
154154
155155 func keyPoolSpread (poolAddress) = ("%s%s__spread__" + poolAddress)
156156
157157
158158 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2PoolAssets")
159159
160160
161161 func keyMappingPoolAssetsToPoolContractAddress (internalAmountAssetIdStr,internalPriceAssetIdStr) = (((("%d%d%s%s__" + toString(internalAmountAssetIdStr)) + "__") + toString(internalPriceAssetIdStr)) + "__mappings__poolAssets2PoolContract")
162162
163163
164164 func keyMappingPoolContractToLPAsset (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
165165
166166
167167 func keyMappingPoolLPAssetToPoolContractAddress (lpAssetStr) = (("%s%s%s__" + lpAssetStr) + "__mappings__lpAsset2PoolContract")
168168
169169
170170 func keyWxEmission (amountAssetId,priceAssetId) = ((("%s%s%s__wxEmission__" + amountAssetId) + "__") + priceAssetId)
171171
172172
173173 func keyInFee (poolAddress) = ("%s%s__inFee__" + poolAddress)
174174
175175
176176 func keyInFeeDefault () = "%s__inFeeDefault"
177177
178178
179179 func keyOutFee (poolAddress) = ("%s%s__outFee__" + poolAddress)
180180
181181
182182 func keyOutFeeDefault () = "%s__outFeeDefault"
183183
184184
185185 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
186186
187187
188188 func getBooleanOrFail (key) = valueOrErrorMessage(getBoolean(this, key), ("No data for this.key=" + key))
189189
190190
191191 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), ("No data for this.key=" + key))
192192
193193
194194 let IdxFactoryCfgStakingDapp = 1
195195
196196 let IdxFactoryCfgBoostingDapp = 2
197197
198198 let IdxFactoryCfgIdoDapp = 3
199199
200200 let IdxFactoryCfgTeamDapp = 4
201201
202202 let IdxFactoryCfgEmissionDapp = 5
203203
204204 let IdxFactoryCfgRestDapp = 6
205205
206206 let IdxFactoryCfgSlippageDapp = 7
207207
208208 let IdxFactoryCfgDaoDapp = 8
209209
210210 let IdxFactoryCfgMarketingDapp = 9
211211
212212 let IdxFactoryCfgGwxRewardDapp = 10
213213
214214 let IdxFactoryCfgBirdsDapp = 11
215215
216216 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
217217
218218
219219 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
220220
221221
222222 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
223223
224224
225225 func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
226226
227227
228228 func getPriceAssets () = match getString(keyPriceAssets()) {
229229 case s: String =>
230230 if ((size(s) == 0))
231231 then nil
232232 else split(s, SEP)
233233 case _ =>
234234 nil
235235 }
236236
237237
238238 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
239239 case s: String =>
240240 fromBase58String(s)
241241 case _: Unit =>
242242 unit
243243 case _ =>
244244 throw("Match error")
245245 }
246246
247247
248248 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
249249 case s: String =>
250250 fromBase58String(s)
251251 case _: Unit =>
252252 unit
253253 case _ =>
254254 throw("Match error")
255255 }
256256
257257
258258 let permissionDeniedError = throw("Permission denied")
259259
260260 let testError = throw("Test error here")
261261
262262 func mustThis (i) = if ((i.caller == this))
263263 then true
264264 else permissionDeniedError
265265
266266
267267 func mustManager (i) = match managerPublicKeyOrUnit() {
268268 case pk: ByteVector =>
269269 if ((i.callerPublicKey == pk))
270270 then true
271271 else permissionDeniedError
272272 case _: Unit =>
273273 mustThis(i)
274274 case _ =>
275275 throw("Match error")
276276 }
277277
278278
279279 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)
280280
281281
282282 func dataFactoryCfg (stakingAddress,boostingAddress,idoContract,teamContract,emissionContract,restContract,slippageContract) = makeString(["%s%s%s%s%s%s", stakingAddress, boostingAddress, idoContract, teamContract, emissionContract, restContract, slippageContract], SEP)
283283
284284
285285 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)
286286
287287
288288 func dataMappingPoolAssets (internalAmountAssetStr,internalPriceAssetStr) = makeString(["%d%d", toString(internalAmountAssetStr), toString(internalPriceAssetStr)], SEP)
289289
290290
291291 func getPoolConfig (poolAddress) = {
292292 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
293293 let amountAssetInternal = poolAssets[1]
294294 let priceAssetInternal = poolAssets[2]
295295 split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
296296 }
297297
298298
299299 func getInternalAssetIdOrCreate (assetIdStr,incrementor) = {
300300 let internalAssetId = valueOrElse(getInteger(this, keyMappingsBaseAsset2internalId(assetIdStr)), 0)
301301 let currentIndexOfInternalId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0)
302302 let result = if ((internalAssetId == 0))
303303 then {
304304 let newInternalAssetId = (currentIndexOfInternalId + incrementor)
305305 $Tuple3(newInternalAssetId, [IntegerEntry(keyNextInternalAssetId(), newInternalAssetId), IntegerEntry(keyMappingsBaseAsset2internalId(assetIdStr), newInternalAssetId), StringEntry(keyMappingsInternal2baseAssetId(newInternalAssetId), assetIdStr)], true)
306306 }
307307 else $Tuple3(internalAssetId, nil, false)
308308 result
309309 }
310310
311311
312312 func mustAdmin (i) = {
313313 let adminPKs = split(valueOrElse(getString(keyAdminPubKeys()), EMPTY), SEP)
314314 if (containsElement(adminPKs, toBase58String(i.callerPublicKey)))
315315 then true
316316 else {
317317 let isManager = mustManager(i)
318318 if ((isManager == isManager))
319319 then true
320320 else throw("Strict value is not equal to itself.")
321321 }
322322 }
323323
324324
325325 func intOrDefaultOrFallback (key,keyDefault,valueFallback) = valueOrElse(getInteger(this, key), valueOrElse(getInteger(this, keyDefault), valueFallback))
326326
327327
328328 func poolExistsInternal (amountAssetId,priceAssetId) = {
329329 let amountAssetInternal = getInteger(keyMappingsBaseAsset2internalId(amountAssetId))
330330 let priceAssetInternal = getInteger(keyMappingsBaseAsset2internalId(priceAssetId))
331331 if (if ((amountAssetInternal == unit))
332332 then true
333333 else (priceAssetInternal == unit))
334334 then false
335335 else {
336336 let amAs = toString(value(amountAssetInternal))
337337 let prAs = toString(value(priceAssetInternal))
338338 let cfg = getString(keyPoolConfig(amAs, prAs))
339339 let cfgReverse = getString(keyPoolConfig(prAs, amAs))
340340 let exists = if ((cfg != unit))
341341 then true
342342 else (cfgReverse != unit)
343343 exists
344344 }
345345 }
346346
347347
348348 @Callable(i)
349349 func getSwapContractREADONLY () = $Tuple2(nil, getStringOrFail(swapContract()))
350350
351351
352352
353353 @Callable(i)
354354 func getLpAssetFromPoolAssetsREADONLY (asset1,asset2) = if (if ((asset1 == "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS"))
355355 then (asset2 == "WAVES")
356356 else false)
357357 then $Tuple2(nil, unit)
358358 else {
359359 let assetNum1 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset1)))
360360 let assetNum2 = value(getInteger(this, keyMappingsBaseAsset2internalId(asset2)))
361361 let ee = getString(this, keyMappingPoolAssetsToLpasset(toString(assetNum1), toString(assetNum2)))
362362 let res = if ((ee == unit))
363363 then unit
364364 else drop(value(ee), 4)
365365 $Tuple2(nil, res)
366366 }
367367
368368
369369
370370 @Callable(i)
371371 func getPoolAddressFromLpAssetREADONLY (lp) = $Tuple2(nil, valueOrElse(getString(this, keyMappingPoolLPAssetToPoolContractAddress(lp)), ""))
372372
373373
374374
375375 @Callable(i)
376376 func constructor (stakingContract,boostingContract,idoContract,teamContract,emissionContract,restContract,slpipageContract,priceDecimals) = {
377377 let checkCaller = mustManager(i)
378378 if ((checkCaller == checkCaller))
379379 then [StringEntry(keyFactoryConfig(), dataFactoryCfg(stakingContract, boostingContract, idoContract, teamContract, emissionContract, restContract, slpipageContract)), IntegerEntry(keyPriceDecimals(), priceDecimals)]
380380 else throw("Strict value is not equal to itself.")
381381 }
382382
383383
384384
385385 @Callable(i)
386386 func constructorV2 (mathcherPub58Str) = {
387387 let checkCaller = mustManager(i)
388388 if ((checkCaller == checkCaller))
389389 then {
390390 let mathcerPub = addressFromPublicKey(fromBase58String(mathcherPub58Str))
391391 if ((mathcerPub == mathcerPub))
392392 then [StringEntry(keyMatcherPub(), mathcherPub58Str)]
393393 else throw("Strict value is not equal to itself.")
394394 }
395395 else throw("Strict value is not equal to itself.")
396396 }
397397
398398
399399
400400 @Callable(i)
401401 func constructorV3 (daoContract,marketingContract,gwxRewardsContract,birdsContract) = {
402402 let checkCaller = mustManager(i)
403403 if ((checkCaller == checkCaller))
404404 then {
405405 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
406406 [StringEntry(keyFactoryConfig(), dataFactoryCfgV3(factoryCfg[1], factoryCfg[2], factoryCfg[3], factoryCfg[4], factoryCfg[5], factoryCfg[6], factoryCfg[7], daoContract, marketingContract, gwxRewardsContract, birdsContract))]
407407 }
408408 else throw("Strict value is not equal to itself.")
409409 }
410410
411411
412412
413413 @Callable(i)
414414 func constructorV4 (legacyFactoryContract,legacyPools) = {
415415 let checkCaller = mustManager(i)
416416 if ((checkCaller == checkCaller))
417417 then [StringEntry(keyLegacyFactoryContract(), legacyFactoryContract), StringEntry(keyLegacyPools(), makeString(legacyPools, SEP))]
418418 else throw("Strict value is not equal to itself.")
419419 }
420420
421421
422422
423423 @Callable(i)
424424 func constructorV5 (assetsStoreContract) = {
425425 let checkCaller = mustManager(i)
426426 if ((checkCaller == checkCaller))
427427 then [StringEntry(keyAssetsStoreContract(), assetsStoreContract)]
428428 else throw("Strict value is not equal to itself.")
429429 }
430430
431431
432432
433433 @Callable(i)
434434 func constructorV6 (votingEmissionContract,priceAssets) = {
435435 let cheks = [mustManager(i), if ((addressFromString(votingEmissionContract) != unit))
436436 then true
437437 else "invalid voting emission contract address"]
438438 if ((cheks == cheks))
439439 then [StringEntry(keyVotingEmissionContract(), votingEmissionContract), StringEntry(keyPriceAssets(), makeString(priceAssets, SEP))]
440440 else throw("Strict value is not equal to itself.")
441441 }
442442
443443
444444
445445 @Callable(i)
446446 func setManager (pendingManagerPublicKey) = {
447447 let checkCaller = mustManager(i)
448448 if ((checkCaller == checkCaller))
449449 then {
450450 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
451451 if ((checkManagerPublicKey == checkManagerPublicKey))
452452 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
453453 else throw("Strict value is not equal to itself.")
454454 }
455455 else throw("Strict value is not equal to itself.")
456456 }
457457
458458
459459
460460 @Callable(i)
461461 func confirmManager () = {
462462 let pm = pendingManagerPublicKeyOrUnit()
463463 let hasPM = if (isDefined(pm))
464464 then true
465465 else throw("No pending manager")
466466 if ((hasPM == hasPM))
467467 then {
468468 let checkPM = if ((i.callerPublicKey == value(pm)))
469469 then true
470470 else throw("You are not pending manager")
471471 if ((checkPM == checkPM))
472472 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
473473 else throw("Strict value is not equal to itself.")
474474 }
475475 else throw("Strict value is not equal to itself.")
476476 }
477477
478478
479479
480480 @Callable(i)
481481 func setAdmins (adminPubKeys) = {
482482 let checkCaller = mustManager(i)
483483 if ((checkCaller == checkCaller))
484484 then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
485485 else throw("Strict value is not equal to itself.")
486486 }
487487
488488
489489
490490 @Callable(i)
491491 func activateNewPool (poolAddress,amountAssetStr,priceAssetStr,lpAssetName,lpAssetDescr,poolWeight,poolType,logo) = {
492492 let checkCaller = mustAdmin(i)
493493 if ((checkCaller == checkCaller))
494494 then if (isDefined(getString(keyMappingPoolContractAddressToPoolAssets(poolAddress))))
495495 then throw((("Pool address " + poolAddress) + " already registered."))
496496 else {
497497 let internalAmountAssetData = getInternalAssetIdOrCreate(amountAssetStr, 1)
498498 let internalAmountAssetId = internalAmountAssetData._1
499499 let internalPriceAssetData = getInternalAssetIdOrCreate(priceAssetStr, if (internalAmountAssetData._3)
500500 then 2
501501 else 1)
502502 let internalPriceAssetId = internalPriceAssetData._1
503503 let poolAccountScriptHash = valueOrErrorMessage(scriptHash(addressFromStringValue(poolAddress)), ("No script has been found on pool account " + poolAddress))
504504 let ethalonPoolAccountScriptHash = getBinaryValue(keyPoolScriptHash())
505505 let poolExists = poolExistsInternal(amountAssetStr, priceAssetStr)
506506 if (poolExists)
507507 then throw((((("Pool " + amountAssetStr) + "/") + priceAssetStr) + " has already been activated."))
508508 else {
509509 let poolConfigValue = value(getString(this, keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId))))
510510 let amountAssetsDecimals = if ((amountAssetStr == "WAVES"))
511511 then decimalsMultPrice
512512 else pow(10, 0, value(assetInfo(fromBase58String(amountAssetStr))).decimals, 0, 0, DOWN)
513513 let priceAssetsDecimals = if ((priceAssetStr == "WAVES"))
514514 then decimalsMultPrice
515515 else pow(10, 0, value(assetInfo(fromBase58String(priceAssetStr))).decimals, 0, 0, DOWN)
516516 let lpAssetIssueAction = Issue(lpAssetName, lpAssetDescr, 1, 8, true)
517517 let lpAssetId = calculateAssetId(lpAssetIssueAction)
518518 let lpAssetIdStr = toBase58String(lpAssetId)
519519 let poolActivateInvokeResult = invoke(addressFromStringValue(poolAddress), "activate", [amountAssetStr, priceAssetStr], nil)
520520 if ((poolActivateInvokeResult == poolActivateInvokeResult))
521521 then if ((poolActivateInvokeResult != "success"))
522522 then throw("Pool initialisation error happened.")
523523 else {
524524 let assetsStoreContract = addressFromStringValue(getStringOrFail(keyAssetsStoreContract()))
525525 let createOrUpdateLpAssetInv = invoke(assetsStoreContract, "createOrUpdate", [lpAssetIdStr, lpAssetName, false], nil)
526526 if ((createOrUpdateLpAssetInv == createOrUpdateLpAssetInv))
527527 then {
528528 let addPoolsLpLabelInv = invoke(assetsStoreContract, "addLabel", [lpAssetIdStr, labelPoolsLp], nil)
529529 if ((addPoolsLpLabelInv == addPoolsLpLabelInv))
530530 then {
531531 let setLogoInv = invoke(assetsStoreContract, "setLogo", [lpAssetIdStr, logo], nil)
532532 if ((setLogoInv == setLogoInv))
533533 then {
534534 let addAssetsLinkInv = invoke(assetsStoreContract, "addAssetsLink", [amountAssetStr, priceAssetStr, lpAssetIdStr], nil)
535535 if ((addAssetsLinkInv == addAssetsLinkInv))
536536 then {
537537 let increaseAssetPoolsNumberInv = invoke(assetsStoreContract, "increaseAssetPoolsNumber", [amountAssetStr], nil)
538538 if ((increaseAssetPoolsNumberInv == increaseAssetPoolsNumberInv))
539539 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)
540540 else throw("Strict value is not equal to itself.")
541541 }
542542 else throw("Strict value is not equal to itself.")
543543 }
544544 else throw("Strict value is not equal to itself.")
545545 }
546546 else throw("Strict value is not equal to itself.")
547547 }
548548 else throw("Strict value is not equal to itself.")
549549 }
550550 else throw("Strict value is not equal to itself.")
551551 }
552552 }
553553 else throw("Strict value is not equal to itself.")
554554 }
555555
556556
557557
558558 @Callable(i)
559559 func managePool (poolAddress,newStatus) = {
560560 let checkCaller = mustManager(i)
561561 if ((checkCaller == checkCaller))
562562 then {
563563 let poolConfig = getPoolConfig(poolAddress)
564564 let poolStatus = poolConfig[idxPoolStatus]
565565 let lpAssetIdStr = poolConfig[idxPoolLPAssetId]
566566 let amountAssetStr = poolConfig[idxAmtAssetId]
567567 let priceAssetStr = poolConfig[idxPriceAssetId]
568568 let amountAssetsDecimals = parseIntValue(poolConfig[idxAmtAssetDcm])
569569 let priceAssetsDecimals = parseIntValue(poolConfig[idxPriceAssetDcm])
570570 let internalAmountAssetId = parseIntValue(poolConfig[idxIAmtAssetId])
571571 let internalPriceAssetId = parseIntValue(poolConfig[idxIPriceAssetId])
572572 let lpAssetDcm = parseIntValue(poolConfig[idxLPAssetDcm])
573573 let poolType = poolConfig[idxPoolType]
574574 [StringEntry(keyPoolConfig(toString(internalAmountAssetId), toString(internalPriceAssetId)), dataPoolCfg(poolAddress, toString(newStatus), lpAssetIdStr, amountAssetStr, priceAssetStr, amountAssetsDecimals, priceAssetsDecimals, internalAmountAssetId, internalPriceAssetId, lpAssetDcm, poolType))]
575575 }
576576 else throw("Strict value is not equal to itself.")
577577 }
578578
579579
580580
581581 @Callable(i)
582582 func emit (amountToEmit) = {
583583 let caller = i.caller
584584 let originCaller = i.originCaller
585585 let lpAssetRequested = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
586586 let lpAsset = fromBase58String(lpAssetRequested)
587587 let legacyPools = split(valueOrElse(getString(keyLegacyPools()), EMPTY), SEP)
588588 let legacyFactoryContract = addressFromStringValue(valueOrErrorMessage(getString(keyLegacyFactoryContract()), "Legacy factory contract does not exists."))
589589 if ((0 >= amountToEmit))
590590 then nil
591591 else if (containsElement(legacyPools, toString(caller)))
592592 then $Tuple2(nil, legacyFactoryContract)
593593 else $Tuple2([Reissue(lpAsset, amountToEmit, true), ScriptTransfer(i.caller, amountToEmit, lpAsset)], "success")
594594 }
595595
596596
597597
598598 @Callable(i)
599599 func burn (amountToBurn) = {
600600 let caller = i.caller
601601 let originCaller = i.originCaller
602602 let payment = value(i.payments[0])
603603 let paymentAmount = value(payment.amount)
604604 let inAmountAssetId = toBase58String(value(payment.assetId))
605605 let lpAssetRequestedForBurning = valueOrErrorMessage(getString(keyMappingPoolContractToLPAsset(toString(caller))), "Invalid LP address called me.")
606606 if ((inAmountAssetId != lpAssetRequestedForBurning))
607607 then throw("Invalid asset passed.")
608608 else if ((amountToBurn != paymentAmount))
609609 then throw("Invalid amount passed.")
610610 else {
611611 let lpAsset = fromBase58String(lpAssetRequestedForBurning)
612612 $Tuple2([Burn(lpAsset, amountToBurn)], "success")
613613 }
614614 }
615615
616616
617617
618618 @Callable(i)
619619 func modifyWeight (lpAssetId,share) = {
620620 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionContract()), "")))
621621 then true
622622 else mustManager(i)
623623 if ((checkCaller == checkCaller))
624624 then {
625625 let poolContractAddress = getStringOrFail(keyMappingPoolLPAssetToPoolContractAddress(lpAssetId))
626626 let poolWeightKey = keyPoolToWeight(poolContractAddress)
627627 let gwxWeightKey = keyPoolToWeight(GWXvirtualPOOL)
628628 let gwxWeight = valueOrElse(getInteger(gwxWeightKey), 0)
629629 let poolWeight = valueOrElse(getInteger(poolWeightKey), 0)
630630 let poolWeightNew = share
631631 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
632632 let stakingContract = getStakingAddressOrFail(factoryCfg)
633633 let onModifyWeightInv = invoke(stakingContract, "onModifyWeight", [lpAssetId, poolContractAddress], nil)
634634 if ((onModifyWeightInv == onModifyWeightInv))
635635 then {
636636 let gwxVirtualPoolActions = if ((gwxWeight == 0))
637637 then nil
638638 else [IntegerEntry(gwxWeightKey, 0)]
639639 let poolWeightHistoryKey = keyPoolToWeightHistory(poolContractAddress, 0)
640640 let poolWeightHistoryOrUnit = getInteger(poolWeightHistoryKey)
641641 let poolWeightHistoryActions = if ((poolWeightHistoryOrUnit == unit))
642642 then nil
643643 else [DeleteEntry(poolWeightHistoryKey)]
644644 (([IntegerEntry(poolWeightKey, poolWeightNew)] ++ gwxVirtualPoolActions) ++ poolWeightHistoryActions)
645645 }
646646 else throw("Strict value is not equal to itself.")
647647 }
648648 else throw("Strict value is not equal to itself.")
649649 }
650650
651651
652652
653653 @Callable(i)
654654 func modifyWeights (btcPoolAddress,ethPoolAddress,ethBtcPoolAddress,usdcUsdtPoolAddress) = {
655655 let checkCaller = mustManager(i)
656656 if ((checkCaller == checkCaller))
657657 then {
658658 let ethBtcWeightNew = ((5 * POOLWEIGHTMULT) / 100)
659659 let usdcUsdtWeightNew = ((5 * POOLWEIGHTMULT) / 100)
660660 let weightDecrement = ((5 * POOLWEIGHTMULT) / 100)
661661 let factoryCfg = split(getStringOrFail(keyFactoryConfig()), SEP)
662662 let stakingDapp = getStakingAddressOrFail(factoryCfg)
663663 let gwxRewardDapp = getGwxRewardAddressOrFail(factoryCfg)
664664 let btcWeightKEY = keyPoolToWeight(btcPoolAddress)
665665 let ethWeightKEY = keyPoolToWeight(ethPoolAddress)
666666 let ethBtcWeightKEY = keyPoolToWeight(ethBtcPoolAddress)
667667 let usdcUsdtWeightKEY = keyPoolToWeight(usdcUsdtPoolAddress)
668668 let btcWeight = getIntOrFail(btcWeightKEY)
669669 let ethWeight = getIntOrFail(ethWeightKEY)
670670 let btcWeightNew = (btcWeight - weightDecrement)
671671 let ethWeightNew = (ethWeight - weightDecrement)
672672 if ((0 >= btcWeightNew))
673673 then throw(("invalid btcWeightNew: " + toString(btcWeightNew)))
674674 else if ((0 >= ethWeightNew))
675675 then throw(("invalid ethWeightNew: " + toString(ethWeightNew)))
676676 else {
677677 let btcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(btcPoolAddress))
678678 let ethLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethPoolAddress))
679679 let ethBtcLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(ethBtcPoolAddress))
680680 let usdcUsdtLpAssetIdStr = getStringOrFail(keyMappingPoolContractToLPAsset(usdcUsdtPoolAddress))
681681 let onModifyWeightBtc = invoke(stakingDapp, "onModifyWeight", [btcLpAssetIdStr, btcPoolAddress], nil)
682682 if ((onModifyWeightBtc == onModifyWeightBtc))
683683 then {
684684 let onModifyWeightEth = invoke(stakingDapp, "onModifyWeight", [ethLpAssetIdStr, ethPoolAddress], nil)
685685 if ((onModifyWeightEth == onModifyWeightEth))
686686 then {
687687 let onModifyWeightEthBtc = invoke(stakingDapp, "onModifyWeight", [ethBtcLpAssetIdStr, ethBtcPoolAddress], nil)
688688 if ((onModifyWeightEthBtc == onModifyWeightEthBtc))
689689 then {
690690 let onModifyWeightUsdcUsdt = invoke(stakingDapp, "onModifyWeight", [usdcUsdtLpAssetIdStr, usdcUsdtPoolAddress], nil)
691691 if ((onModifyWeightUsdcUsdt == onModifyWeightUsdcUsdt))
692692 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)]
693693 else throw("Strict value is not equal to itself.")
694694 }
695695 else throw("Strict value is not equal to itself.")
696696 }
697697 else throw("Strict value is not equal to itself.")
698698 }
699699 else throw("Strict value is not equal to itself.")
700700 }
701701 }
702702 else throw("Strict value is not equal to itself.")
703703 }
704704
705705
706706
707707 @Callable(i)
708708 func checkWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
709709 let haveLabel = match getBoolean(keyWxEmission(amountAssetId, priceAssetId)) {
710710 case b: Boolean =>
711711 b
712712 case _ =>
713713 false
714714 }
715715 $Tuple2(nil, haveLabel)
716716 }
717717
718718
719719
720720 @Callable(i)
721721 func setWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
722722 let checkCaller = mustAdmin(i)
723723 if ((checkCaller == checkCaller))
724724 then $Tuple2([BooleanEntry(keyWxEmission(amountAssetId, priceAssetId), true)], unit)
725725 else throw("Strict value is not equal to itself.")
726726 }
727727
728728
729729
730730 @Callable(i)
731731 func deleteWxEmissionPoolLabel (amountAssetId,priceAssetId) = {
732732 let checkCaller = if (mustThis(i))
733733 then true
734734 else mustAdmin(i)
735735 if ((checkCaller == checkCaller))
736736 then $Tuple2([DeleteEntry(keyWxEmission(amountAssetId, priceAssetId))], unit)
737737 else throw("Strict value is not equal to itself.")
738738 }
739739
740740
741741
742742 @Callable(i)
743743 func onVerificationLoss (assetId) = {
744744 let checkCaller = if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyAssetsStoreContract()), "")))
745745 then true
746746 else mustManager(i)
747747 if ((checkCaller == checkCaller))
748748 then {
749749 let priceAssets = getPriceAssets()
750750 let checkPriceAssetsSize = if ((size(priceAssets) > 0))
751751 then true
752752 else throw("invalid price assets")
753753 if ((checkPriceAssetsSize == checkPriceAssetsSize))
754754 then {
755755 func cb (acc,priceAsset) = {
756756 let r = invoke(this, "deleteWxEmissionPoolLabel", [assetId, priceAsset], nil)
757757 if ((r == r))
758758 then unit
759759 else throw("Strict value is not equal to itself.")
760760 }
761761
762762 let actions = {
763763 let $l = priceAssets
764764 let $s = size($l)
765765 let $acc0 = unit
766766 func $f0_1 ($a,$i) = if (($i >= $s))
767767 then $a
768768 else cb($a, $l[$i])
769769
770770 func $f0_2 ($a,$i) = if (($i >= $s))
771771 then $a
772772 else throw("List size exceeds 1")
773773
774774 $f0_2($f0_1($acc0, 0), 1)
775775 }
776776 if ((actions == actions))
777777 then $Tuple2(nil, unit)
778778 else throw("Strict value is not equal to itself.")
779779 }
780780 else throw("Strict value is not equal to itself.")
781781 }
782782 else throw("Strict value is not equal to itself.")
783783 }
784784
785785
786786
787787 @Callable(i)
788788 func isPoolOneTokenOperationsDisabledREADONLY (poolAddress) = {
789789 let poolConfig = getPoolConfig(poolAddress)
790790 let assetsInternal = $Tuple2(parseIntValue(poolConfig[idxIAmtAssetId]), parseIntValue(poolConfig[idxIPriceAssetId]))
791791 let poolOneTokenOperationsDisabled = valueOrElse(getBoolean(keyPoolOneTokenOperationsDisabled(assetsInternal)), false)
792792 let allPoolsOneTokenOperationsDisabled = valueOrElse(getBoolean(keyAllPoolsOneTokenOperationsDisabled()), false)
793793 $Tuple2(nil, if (allPoolsOneTokenOperationsDisabled)
794794 then true
795795 else poolOneTokenOperationsDisabled)
796796 }
797797
798798
799799
800800 @Callable(i)
801801 func getInFeeREADONLY (poolAddress) = {
802802 let fee = intOrDefaultOrFallback(keyInFee(poolAddress), keyInFeeDefault(), 0)
803803 $Tuple2(nil, fee)
804804 }
805805
806806
807807
808808 @Callable(i)
809809 func getOutFeeREADONLY (poolAddress) = {
810810 let fee = intOrDefaultOrFallback(keyOutFee(poolAddress), keyOutFeeDefault(), fraction(10, MULT8, 10000))
811811 $Tuple2(nil, fee)
812812 }
813813
814814
815815
816816 @Callable(i)
817817 func getPoolStatusREADONLY (poolAddress) = {
818818 let poolAssets = split(getStringOrFail(keyMappingPoolContractAddressToPoolAssets(poolAddress)), SEP)
819819 let amountAssetInternal = poolAssets[1]
820820 let priceAssetInternal = poolAssets[2]
821821 let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
822822 $Tuple2(nil, parseIntValue(cfg[idxPoolStatus]))
823823 }
824824
825825
826826
827827 @Callable(i)
828-func getPoolConfigByLpAssetId (lpAssetIdStr) = {
829- let poolAssets = split(getStringOrFail(keyMappingLpAssetToPoolAssets(lpAssetIdStr)), SEP)
830- let amountAssetInternal = poolAssets[1]
831- let priceAssetInternal = poolAssets[2]
832- let cfg = split(getStringOrFail(keyPoolConfig(amountAssetInternal, priceAssetInternal)), SEP)
833- $Tuple2(nil, cfg)
834- }
835-
836-
837-
838-@Callable(i)
839828 func poolExistsREADONLY (amountAssetId,priceAssetId) = $Tuple2(nil, poolExistsInternal(amountAssetId, priceAssetId))
840829
841830
842831 @Verifier(tx)
843832 func verify () = {
844833 let targetPublicKey = match managerPublicKeyOrUnit() {
845834 case pk: ByteVector =>
846835 pk
847836 case _: Unit =>
848837 tx.senderPublicKey
849838 case _ =>
850839 throw("Match error")
851840 }
852841 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
853842 }
854843

github/deemru/w8io/3ef1775 
101.79 ms