tx · 8R6ghfzMwqwoycsQsUynYpKyeTvgsUUPo3s6TRzZwnhf

3MqXV381CXzs2JjPZh9VbL47gNz9aBNxdEt:  -0.01400000 Waves

2022.03.23 14:26 [1976507] smart account 3MqXV381CXzs2JjPZh9VbL47gNz9aBNxdEt > SELF 0.00000000 Waves

{ "type": 13, "id": "8R6ghfzMwqwoycsQsUynYpKyeTvgsUUPo3s6TRzZwnhf", "fee": 1400000, "feeAssetId": null, "timestamp": 1648034809313, "version": 2, "chainId": 84, "sender": "3MqXV381CXzs2JjPZh9VbL47gNz9aBNxdEt", "senderPublicKey": "DgYTTVMZQ9h4qHVivhHDAGGurMVQqMoyxJgEeiFzgbGV", "proofs": [ "3ouVMC5LgydgTfsJpHUhoJfe37jimYwUvFE5YsF3oV87BB9Vubb5BQxLTZH4jJNvikXcykwYaU45HodRKZbmX7mF", "2157bGn9mVJ11X78y6Hvi9owcuJsa47VhoDnAX4cqyytESxcNYgfF51t3RjmNjGAcRNg78ePyTZ38t9HnMMvCoaK" ], "script": "base64:AAIFAAAAAAAAACEIAhIAEgASBAoCAQESABIECgIBARIAEgASABIFCgMEAQgAAABSAAAAAAd2ZXJzaW9uAgAAAAUyLjAuMAAAAAAIa1ZlcnNpb24CAAAAB3ZlcnNpb24AAAAAB2tBY3RpdmUCAAAABmFjdGl2ZQAAAAAJa0Fzc2V0SWRBAgAAAApBX2Fzc2V0X2lkAAAAAAlrQXNzZXRJZEICAAAACkJfYXNzZXRfaWQAAAAACWtCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAlrQmFsYW5jZUICAAAAD0JfYXNzZXRfYmFsYW5jZQAAAAANa1NoYXJlQXNzZXRJZAIAAAAOc2hhcmVfYXNzZXRfaWQAAAAAEWtTaGFyZUFzc2V0U3VwcGx5AgAAABJzaGFyZV9hc3NldF9zdXBwbHkAAAAABGtGZWUCAAAACmNvbW1pc3Npb24AAAAAEmtGZWVTY2FsZURlbGltaXRlcgIAAAAaY29tbWlzc2lvbl9zY2FsZV9kZWxpbWl0ZXIAAAAACmtJbnZhcmlhbnQCAAAACWludmFyaWFudAAAAAAGa0NhdXNlAgAAAA5zaHV0ZG93bl9jYXVzZQAAAAASa2V5VVNETk5TQlRBZGRyZXNzAgAAABhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MAAAAADmtleUVVUk5BZGRyZXNzAgAAABRzdGFraW5nX2V1cm5fYWRkcmVzcwAAAAAPa2V5QWRtaW5QdWJLZXkxAgAAAAthZG1pbl9wdWJfMQAAAAAPa2V5QWRtaW5QdWJLZXkyAgAAAAthZG1pbl9wdWJfMgAAAAAPa2V5QWRtaW5QdWJLZXkzAgAAAAthZG1pbl9wdWJfMwAAAAAUVVNETlRvV2F2ZXNFeGNoYW5nZXIJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVS8ryzsOdh8IBeszy751tH1xSIv8ZigJPIAAAAABm9yYWNsZQkBAAAAB0FkZHJlc3MAAAABAQAAABoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAEAAAALZ2V0QWRtaW5QdWIAAAABAAAAC2tleUFkbWluUHViBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABm9yYWNsZQUAAAALa2V5QWRtaW5QdWIDCQAAAQAAAAIFAAAAByRtYXRj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QQIAAAACLCAJAAGkAAAAAQkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEICAAAAASAFAAAACmFzc2V0TmFtZUIBAAAAGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwAAAAIAAAAFc3Rha2UAAAAHYXNzZXRJZAMFAAAABXN0YWtlAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAARVU0ROCQAFFAAAAAICAAAADGxvY2tOZXV0cmlubwUAAAAWc3Rha2luZ1VTRE5OU0JUQWRkcmVzcwkABRQAAAACAgAAAAxzdGFydFN0YWtpbmcFAAAAEnN0YWtpbmdFVVJOQWRkcmVzcwMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAEVVNETgkABRQAAAACAgAAAA51bmxvY2tOZXV0cmlubwUAAAAWc3Rha2luZ1VTRE5OU0JUQWRkcmVzcwkABRQAAAACAgAAAAtzdG9wU3Rha2luZwUAAAASc3Rha2luZ0VVUk5BZGRyZXNzAQAAABFjYWxjU3Rha2luZ1BhcmFtcwAAAAMAAAAFc3Rha2UAAAAGYW1vdW50AAAAB2Fzc2V0SWQDBQAAAAVzdGFrZQQAAAALJHQwOTg1Mjk5MTgJAQAAABhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMAAAACBQAAAAVzdGFrZQUAAAAHYXNzZXRJZAQAAAAEY2FsbAgFAAAACyR0MDk4NTI5OTE4AAAAAl8xBAAAAAtzdGFraW5nQWRkcggFAAAACyR0MDk4NTI5OTE4AAAAAl8yCQAFFgAAAAQFAAAABGNhbGwFAAAAC3N0YWtpbmdBZGRyBQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAAB2Fzc2V0SWQFAAAABmFtb3VudAUAAAADbmlsBAAAAA0kdDAxMDAwNDEwMDcwCQEAAAAYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAAAAAgUAAAAFc3Rha2UFAAAAB2Fzc2V0SWQEAAAABGNhbGwIBQAAAA0kdDAxMDAwNDEwMDcwAAAAAl8xBAAAAAtzdGFraW5nQWRkcggFAAAADSR0MDEwMDA0MTAwNzAAAAACXzIJAAUWAAAABAUAAAAEY2FsbAUAAAALc3Rha2luZ0FkZHIJAARM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AAAIYmFsYW5jZUIEAAAADSR0MDEzMDc5MTMxNTYJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQQQAAAAOcG10U3RyQXNzZXRJZEEIBQAAAA0kdDAxMzA3OTEzMTU2AAAAAl8xBAAAAA1wbXRBc3NldE5hbWVBCAUAAAANJHQwMTMwNzkxMzE1NgAAAAJfMgQAAAAMcG10RGVjaW1hbHNBCAUAAAANJHQwMTMwNzkxMzE1NgAAAAJfMwQAAAANJHQwMTMxNjExMzI3OAkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRCBAAAAA5wbXRTdHJBc3NldElkQggFAAAADSR0MDEzMTYxMTMyNzgAAAACXzEEAAAADXBtdEFzc2V0TmFtZUIIBQAAAA0kdDAxMzE2MTEzMjc4AAAAAl8yBAAAAAxwbXREZWNpbWFsc0IIBQAAAA0kdDAxMzE2MTEzMjc4AAAAAl8zBAAAAA0kdDAxMzI4MzEzNzg3AwkAAGYAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5CBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5BBAAAAANwbXQJAQAAAAhmcmFjdGlvbgAAAAQFAAAACGJhbGFuY2VCBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5BBQAAAAZzY2FsZTgFAAAAB0NFSUxJTkcJAAUXAAAABQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BQAAAANwbXQJAABlAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50BQAAAANwbXQFAAAAC3BtdEFzc2V0SWRCBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5BBAAAAANwbXQJAQAAAAhmcmFjdGlvbgAAAAQFAAAACGJhbGFuY2VBBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5CBQAAAAZzY2FsZTgFAAAAB0NFSUxJTkcJAAUXAAAABQUAAAADcG10CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAZhbW91bnQJAABlAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAA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AAAMc2hhcmVBc3NldElkBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BQAAAAxzaGFyZUFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZjaGFuZ2UFAAAADWNoYW5nZUFzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFXJlcGxlbmlzaFdpdGhPbmVUb2tlbgAAAAIAAAATdmlydHVhbFN3YXBUb2tlblBheQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAAIaXNBY3RpdmUAAAAABAAAAA0kdDAxNTQzNjE1NTExCQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMTU0MzYxNTUxMQAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDE1NDM2MTU1MTEAAAACXzIEAAAADSR0MDE1NTE2MTU1ODkJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAApwbXRBc3NldElkBAAAAA1wbXRTdHJBc3NldElkCAUAAAANJHQwMTU1MTYxNTU4OQAAAAJfMQQAAAAMcG10QXNzZXROYW1lCAUAAAANJHQwMTU1MTYxNTU4OQAAAAJfMgQAAAALcG10RGVjaW1hbHMIBQAAAA0kdDAxNTUxNjE1NTg5AAAAAl8zBAAAAA9wbXRNaW5UaHJlc2hvbGQAAAAAAABMS0AEAAAAHXRocmVzaG9sZFZhbHVlRm9yTWluVG9sZXJhbmNlAAAAAAAC+vCABAAAAAl0b2xlcmFuY2UDCQAAZgAAAAIFAAAAHXRocmVzaG9sZFZhbHVlRm9yTWluVG9sZXJhbmNlBQAAAAlwbXRBbW91bnQAAAAAAAABhqAAAAAAAAAAAAEEAAAAHHNsaXBwYWdlVmFsdWVNaW5Gb3JSZXBsZW5pc2gJAABlAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4BQAAAAl0b2xlcmFuY2UAAAAAAACYloAEAAAAHHNsaXBwYWdlVmFsdWVNYXhGb3JSZXBsZW5pc2gJAABkAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4BQAAAAl0b2xlcmFuY2UAAAAAAACYloAEAAAAF3NsaXBwYWdlVmFsdWVNaW5Gb3JTd2FwCQAAZQAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAAAAAAAAAAAAQAAAAAAAJiWgAMJAABmAAAAAgUAAAAPcG10TWluVGhyZXNob2xkBQAAAAlwbXRBbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA9QYXltZW50IGFtb3VudCAJAAGkAAAAAQUAAAAJcG10QW1vdW50AgAAACcgZG9lcyBub3QgZXhjZWVkIHRoZSBtaW5pbXVtIGFtb3VudCBvZiAJAAGkAAAAAQUAAAAPcG10TWluVGhyZXNob2xkAgAAAAcgdG9rZW5zAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkBAAAAD3Rocm93T25lUGF5bWVudAAAAAADCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAAAwMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQgcJAQAAAAt0aHJvd0Fzc2V0cwAAAAAEAAAADSR0MDE2NTI3MTcyOTIDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQAFGQAAAAcJAABlAAAAAgUAAAAJcG10QW1vdW50BQAAABN2aXJ0dWFsU3dhcFRva2VuUGF5BQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAABN2aXJ0dWFsU3dhcFRva2VuUGF5CQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIJAAUZAAAABwUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAAIYmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAQAAAARdmlydHVhbFJlcGxlbmlzaEEIBQAAAA0kdDAxNjUyNzE3MjkyAAAAAl8xBAAAABF2aXJ0dWFsUmVwbGVuaXNoQggFAAAADSR0MDE2NTI3MTcyOTIAAAACXzIEAAAAEWJhbGFuY2VBZnRlclN3YXBBCAUAAAANJHQwMTY1MjcxNzI5MgAAAAJfMwQAAAARYmFsYW5jZUFmdGVyU3dhcEIIBQAAAA0kdDAxNjUyNzE3MjkyAAAAAl80BAAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCAUAAAANJHQwMTY1MjcxNzI5MgAAAAJfNQQAAAALbmV3QmFsYW5jZUEIBQAAAA0kdDAxNjUyNzE3MjkyAAAAAl82BAAAAAtuZXdCYWxhbmNlQggFAAAADSR0MDE2NTI3MTcyOTIAAAACXzcEAAAAD25ld0JhbGFuY2VFbnRyeQMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEFAAAAC25ld0JhbGFuY2VBCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgQAAAAMaW52YXJpYW50TmV3CQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAAEWJhbGFuY2VBZnRlclN3YXBBBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQgQAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8JAABrAAAAAwUAAAAGc2NhbGU4BQAAAAlpbnZhcmlhbnQFAAAADGludmFyaWFudE5ldwQAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAkAAGkAAAACCQAAawAAAAMJAABoAAAAAgUAAAAGc2NhbGU4BQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBBBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQgkAAGsAAAADBQAAAAZzY2FsZTgFAAAAEXZpcnR1YWxSZXBsZW5pc2hBBQAAABF2aXJ0dWFsUmVwbGVuaXNoQgQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgUAAAANZEFwcFRocmVzaG9sZAkAAGgAAAACAAAAAAAAAAACBQAAABNkQXBwVGhyZXNob2xkU2NhbGUyAwMJAABnAAAAAgUAAAAXc2xpcHBhZ2VWYWx1ZU1pbkZvclN3YXAFAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvBgkAAGYAAAACBQAAAAlpbnZhcmlhbnQFAAAADGludmFyaWFudE5ldwkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAADpJbmNvcnJlY3QgdmlydHVhbFN3YXBUb2tlblBheSBvciB2aXJ0dWFsU3dhcFRva2VuR2V0IHZhbHVlAgAAABogaW52YXJpYW50RXN0aW1hdGVkUmF0aW86IAkAAaQAAAABBQAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwIAAAAPIGludmFyaWFudE5ldzogCQABpAAAAAEFAAAADGludmFyaWFudE5ldwIAAAAMIGludmFyaWFudDogCQABpAAAAAEFAAAACWludmFyaWFudAMDCQAAZgAAAAIFAAAAHHNsaXBwYWdlVmFsdWVNaW5Gb3JSZXBsZW5pc2gFAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gGCQAAZgAAAAIFAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gFAAAAHHNsaXBwYWdlVmFsdWVNYXhGb3JSZXBsZW5pc2gJAAACAAAAAQIAAABsU3dhcCB3aXRoIHZpcnR1YWxTd2FwVG9rZW5QYXkgYW5kIHZpcnR1YWxTd2FwVG9rZW5HZXQgaXMgcG9zc2libGUsIGJ1dCByYXRpbyBhZnRlciB2aXJ0dWFsIHN3YXAgaXMgaW5jb3JyZWN0AwMJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VCCQEAAAAOdGhyb3dUaHJlc2hvbGQAAAADBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIEAAAABnN0YWtlMQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAA1wbXRTdHJBc3NldElkCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBgkABEwAAAACBQAAAAlwbXRBbW91bnQJAARMAAAAAgUAAAANcG10U3RyQXNzZXRJZAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMQUAAAAGc3Rha2UxBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAAawAAAAMFAAAAEXZpcnR1YWxSZXBsZW5pc2hBBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBBBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5CCQAAawAAAAMFAAAAEXZpcnR1YWxSZXBsZW5pc2hCBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAZzY2FsZTgJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAxzaGFyZUFzc2V0SWQFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQFAAAADHNoYXJlQXNzZXRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABkAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAETAAAAAIFAAAAD25ld0JhbGFuY2VFbnRyeQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAh3aXRoZHJhdwAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAhpc0FjdGl2ZQAAAAAEAAAADSR0MDE5NzIxMTk3OTYJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxOTcyMTE5Nzk2AAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTk3MjExOTc5NgAAAAJfMgQAAAAMYW1vdW50VG9QYXlBCQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUEFAAAAEHNoYXJlQXNzZXRTdXBwbHkEAAAADGFtb3VudFRvUGF5QgkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VCBQAAABBzaGFyZUFzc2V0U3VwcGx5BAAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADGFtb3VudFRvUGF5QQkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAMYW1vdW50VG9QYXlCAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkBAAAAD3Rocm93T25lUGF5bWVudAAAAAADCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAxzaGFyZUFzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAACRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAJAAJYAAAAAQUAAAAMc2hhcmVBc3NldElkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAQAAAAGc3Rha2UxAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAAC3N0ckFzc2V0SWRBCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBwkABEwAAAACBQAAAAxhbW91bnRUb1BheUEJAARMAAAAAgUAAAALc3RyQXNzZXRJZEEFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTEFAAAABnN0YWtlMQQAAAAGc3Rha2UyAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAAC3N0ckFzc2V0SWRCCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBwkABEwAAAACBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgUAAAALc3RyQXNzZXRJZEIFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTIFAAAABnN0YWtlMgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAMYW1vdW50VG9QYXlCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQkAAGUAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACmtJbnZhcmlhbnQFAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAARMAAAAAgkBAAAABEJ1cm4AAAACBQAAAAxzaGFyZUFzc2V0SWQFAAAACXBtdEFtb3VudAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADGFtb3VudFRvUGF5QQUAAAAIYXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUIFAAAACGFzc2V0SWRCBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAhleGNoYW5nZQAAAAIAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAQAAAANJHQwMjEyNTkyMTMzNAkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDIxMjU5MjEzMzQAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAyMTI1OTIxMzM0AAAAAl8yAwkAAGcAAAACAAAAAAAAAAAABQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACAgAAACtFc3RpbWF0ZWQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQABpAAAAAEFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQMJAABmAAAAAgUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAA7TWluaW1hbCBhbW91bnQgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIGVzdGltYXRlZC4gRXN0aW1hdGVkOiAJAAGkAAAAAQUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlAgAAAAsuIE1pbmltYWw6IAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQEAAAAPdGhyb3dPbmVQYXltZW50AAAAAAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAMJAABmAAAAAgAAAAAAAJiWgAUAAAAJcG10QW1vdW50CQAAAgAAAAECAAAAME9ubHkgc3dhcCBvZiAxMC4wMDAwMDAgb3IgbW9yZSB0b2tlbnMgaXMgYWxsb3dlZAMDCQAAZgAAAAIFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1pbgkAAGsAAAADBQAAAAZzY2FsZTgFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAJcG10QW1vdW50BgkAAGYAAAACCQAAawAAAAMFAAAABnNjYWxlOAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1heAkAAAIAAAABAgAAABxJbmNvcnJlY3QgYXJncyBhbmQgcG10IHJhdGlvBAAAAAtzZW5kQXNzZXRJZAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEFAAAACGFzc2V0SWRCBQAAAAhhc3NldElkQQQAAAAGYW1vdW50CQEAAAATY2FsY3VsYXRlU2VuZEFtb3VudAAAAAQFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQEAAAAEGdvdmVybmFuY2VSZXdhcmQJAABrAAAAAwUAAAAGYW1vdW50BQAAAA1mZWVHb3Zlcm5hbmNlBQAAAAlmZWVTY2FsZTYEAAAADmFtb3VudE1pbnVzRmVlCQAAawAAAAMFAAAABmFtb3VudAkAAGUAAAACBQAAAAlmZWVTY2FsZTYFAAAAA2ZlZQUAAAAJZmVlU2NhbGU2BAAAAA0kdDAyMjY4MjIyOTQ0AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkABRQAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAOYW1vdW50TWludXNGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAAUUAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDIyNjgyMjI5NDQAAAACXzEEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMjI2ODIyMjk0NAAAAAJfMgQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgUAAAANZEFwcFRocmVzaG9sZAkAAGgAAAACAAAAAAAAAAACBQAAABNkQXBwVGhyZXNob2xkU2NhbGUyAwMJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VCCQEAAAAOdGhyb3dUaHJlc2hvbGQAAAADBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIEAAAADSR0MDIzMjQyMjMzMTUJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAApwbXRBc3NldElkBAAAAA1wbXRTdHJBc3NldElkCAUAAAANJHQwMjMyNDIyMzMxNQAAAAJfMQQAAAAMcG10QXNzZXROYW1lCAUAAAANJHQwMjMyNDIyMzMxNQAAAAJfMgQAAAALcG10RGVjaW1hbHMIBQAAAA0kdDAyMzI0MjIzMzE1AAAAAl8zBAAAAA0kdDAyMzMyODIzNDA1CQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAALc2VuZEFzc2V0SWQEAAAADnNlbmRTdHJBc3NldElkCAUAAAANJHQwMjMzMjgyMzQwNQAAAAJfMQQAAAANc2VuZEFzc2V0TmFtZQgFAAAADSR0MDIzMzI4MjM0MDUAAAACXzIEAAAADHNlbmREZWNpbWFscwgFAAAADSR0MDIzMzI4MjM0MDUAAAACXzMEAAAABnN0YWtlMQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAA1wbXRTdHJBc3NldElkCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBgkABEwAAAACBQAAAAlwbXRBbW91bnQJAARMAAAAAgUAAAANcG10U3RyQXNzZXRJZAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMQUAAAAGc3Rha2UxBAAAAAZzdGFrZTIDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAAOc2VuZFN0ckFzc2V0SWQJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIHCQAETAAAAAIJAABkAAAAAgUAAAAOYW1vdW50TWludXNGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAARMAAAAAgUAAAAOc2VuZFN0ckFzc2V0SWQFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTIFAAAABnN0YWtlMgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA5hbW91bnRNaW51c0ZlZQUAAAALc2VuZEFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAANd2FsbGV0QWRkcmVzcwUAAAAQZ292ZXJuYW5jZVJld2FyZAUAAAALc2VuZEFzc2V0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TAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAADWFtb3VudEVucm9sbEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAANYW1vdW50RW5yb2xsQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACAgAAAAxsYXN0X2luY29tZV8FAAAAC3N0ckFzc2V0SWRBBQAAAA1hbW91bnRFbnJvbGxBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAICAAAADGxhc3RfaW5jb21lXwUAAAALc3RyQXNzZXRJZEIFAAAADWFtb3VudEVucm9sbEIFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADHN0YWtlVW5zdGFrZQAAAAMAAAAFc3Rha2UAAAAGYW1vdW50AAAADWFzc2V0SWRTdHJpbmcDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAtT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGludm9rZSB0aGlzIGZ1bmN0aW9uBAAAAA0kdDAyNjIxNzI2MzIwCQEAAAARY2FsY1N0YWtpbmdQYXJhbXMAAAADBQAAAAVzdGFrZQUAAAAGYW1vdW50CQACWQAAAAEFAAAADWFzc2V0SWRTdHJpbmcEAAAABGNhbGwIBQAAAA0kdDAyNjIxNzI2MzIwAAAAAl8xBAAAAARhZGRyCAUAAAANJHQwMjYyMTcyNjMyMAAAAAJfMgQAAAAGcGFyYW1zCAUAAAANJHQwMjYyMTcyNjMyMAAAAAJfMwQAAAAIcGF5bWVudHMIBQAAAA0kdDAyNjIxNzI2MzIwAAAAAl80BAAAAANpbnYJAAP8AAAABAUAAAAEYWRkcgUAAAAEY2FsbAUAAAAGcGFyYW1zBQAAAAhwYXltZW50cwMJAAAAAAAAAgUAAAADaW52BQAAAANpbnYFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAABNtdWx0aVNpZ25lZEJ5QWRtaW5zBAAAABJhZG1pblB1YktleTFTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAMYWRtaW5QdWJLZXkxAAAAAAAAAAABAAAAAAAAAAAABAAAABJhZG1pblB1YktleTJTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQUAAAAMYWRtaW5QdWJLZXkyAAAAAAAAAAABAAAAAAAAAAAABAAAABJhZG1pblB1YktleTNTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgUAAAAMYWRtaW5QdWJLZXkzAAAAAAAAAAABAAAAAAAAAAAACQAAZwAAAAIJAABkAAAAAgkAAGQAAAACBQAAABJhZG1pblB1YktleTFTaWduZWQFAAAAEmFkbWluUHViS2V5MlNpZ25lZAUAAAASYWRtaW5QdWJLZXkzU2lnbmVkAAAAAAAAAAACBAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EAAAAA2ludgUAAAAHJG1hdGNoMAQAAAATY2FsbFRha2VJbnRvQWNjb3VudAMJAAAAAAAAAggFAAAAA2ludgAAAARkQXBwBQAAAAR0aGlzCQAAAAAAAAIIBQAAAANpbnYAAAAIZnVuY3Rpb24CAAAAGXRha2VJbnRvQWNjb3VudEV4dHJhRnVuZHMHBAAAAA1zaWduZWRCeUFkbWluAwMDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAMYWRtaW5QdWJLZXkxBgkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAADGFkbWluUHViS2V5MgYJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAAxhZG1pblB1YktleTMGCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAKYWRtU3Rha2luZwMDBQAAABNjYWxsVGFrZUludG9BY2NvdW50BQAAAA1zaWduZWRCeUFkbWluBwYFAAAAE211bHRpU2lnbmVkQnlBZG1pbnMFAAAAE211bHRpU2lnbmVkQnlBZG1pbnOFfhhT", "height": 1976507, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9KabKfu18g5u9fdnxLwmaVoUSPpRgfhEi8h1MSfWUmWA Next: C7tb52V9rThThBmfYDVEQkcCTMr3C6FxXwYsL9seU54y Diff:
OldNewDifferences
226226 else if ((tokenId == assetIdB))
227227 then invariantCalc((balanceA - amountToSendEstimated), y)
228228 else throw("Wrong asset in payment")
229- let amountToSendBest = if ((invariant > invEstimated))
229+ if ((invariant > invEstimated))
230230 then if ((worstAllowedNewInvariantRatio >= fraction(scale8, invariant, invEstimated)))
231- then throw("Bad estimation provided 1")
231+ then throw("The requested price is too not profitable for user")
232232 else {
233233 let a = {
234234 let $l = [25, 200, 500]
245245 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
246246 }
247247 if ((0 > a._1))
248- then amountToSendMin
249- else a
248+ then amountToSendMin._1
249+ else a._1
250250 }
251251 else {
252252 let a = {
267267 then $Tuple2(amountToSendEstimated, invEstimated)
268268 else a
269269 if ((worstAllowedNewInvariantRatio >= fraction(scale8, invariant, tupleSendBetter._2)))
270- then throw("Bad estimation provided 2")
271- else tupleSendBetter
270+ then throw("The requested price is too not profitable for user")
271+ else tupleSendBetter._1
272272 }
273- amountToSendBest
274273 }
275274 }
276275
326325
327326 func calcStakingParams (stake,amount,assetId) = if (stake)
328327 then {
329- let $t097119777 = calcStakingFuncAndAddres(stake, assetId)
330- let call = $t097119777._1
331- let stakingAddr = $t097119777._2
328+ let $t098529918 = calcStakingFuncAndAddres(stake, assetId)
329+ let call = $t098529918._1
330+ let stakingAddr = $t098529918._2
332331 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
333332 }
334333 else {
335- let $t098639929 = calcStakingFuncAndAddres(stake, assetId)
336- let call = $t098639929._1
337- let stakingAddr = $t098639929._2
334+ let $t01000410070 = calcStakingFuncAndAddres(stake, assetId)
335+ let call = $t01000410070._1
336+ let stakingAddr = $t01000410070._2
338337 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
339338 }
340339
341340
342341 @Callable(i)
343342 func init () = {
344- let $t01003410111 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
345- let pmtAmountA = $t01003410111._1
346- let pmtAssetIdA = $t01003410111._2
347- let $t01011610193 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
348- let pmtAmountB = $t01011610193._1
349- let pmtAssetIdB = $t01011610193._2
350- let $t01019810275 = getAssetInfo(pmtAssetIdA)
351- let pmtStrAssetIdA = $t01019810275._1
352- let pmtAssetNameA = $t01019810275._2
353- let pmtDecimalsA = $t01019810275._3
354- let $t01028010357 = getAssetInfo(pmtAssetIdB)
355- let pmtStrAssetIdB = $t01028010357._1
356- let pmtAssetNameB = $t01028010357._2
357- let pmtDecimalsB = $t01028010357._3
343+ let $t01017510252 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
344+ let pmtAmountA = $t01017510252._1
345+ let pmtAssetIdA = $t01017510252._2
346+ let $t01025710334 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
347+ let pmtAmountB = $t01025710334._1
348+ let pmtAssetIdB = $t01025710334._2
349+ let $t01033910416 = getAssetInfo(pmtAssetIdA)
350+ let pmtStrAssetIdA = $t01033910416._1
351+ let pmtAssetNameA = $t01033910416._2
352+ let pmtDecimalsA = $t01033910416._3
353+ let $t01042110498 = getAssetInfo(pmtAssetIdB)
354+ let pmtStrAssetIdB = $t01042110498._1
355+ let pmtAssetNameB = $t01042110498._2
356+ let pmtDecimalsB = $t01042110498._3
358357 if (isDefined(getBoolean(this, kActive)))
359358 then throwIsActive()
360359 else if ((pmtAssetIdA == pmtAssetIdB))
391390 let pmtAssetIdB = i.payments[1].assetId
392391 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
393392 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
394- let $t01293813015 = getAssetInfo(pmtAssetIdA)
395- let pmtStrAssetIdA = $t01293813015._1
396- let pmtAssetNameA = $t01293813015._2
397- let pmtDecimalsA = $t01293813015._3
398- let $t01302013137 = getAssetInfo(pmtAssetIdB)
399- let pmtStrAssetIdB = $t01302013137._1
400- let pmtAssetNameB = $t01302013137._2
401- let pmtDecimalsB = $t01302013137._3
402- let $t01314213646 = if ((ratioShareTokensInB > ratioShareTokensInA))
393+ let $t01307913156 = getAssetInfo(pmtAssetIdA)
394+ let pmtStrAssetIdA = $t01307913156._1
395+ let pmtAssetNameA = $t01307913156._2
396+ let pmtDecimalsA = $t01307913156._3
397+ let $t01316113278 = getAssetInfo(pmtAssetIdB)
398+ let pmtStrAssetIdB = $t01316113278._1
399+ let pmtAssetNameB = $t01316113278._2
400+ let pmtDecimalsB = $t01316113278._3
401+ let $t01328313787 = if ((ratioShareTokensInB > ratioShareTokensInA))
403402 then {
404403 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
405404 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
406405 }
407406 else {
408- let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
407+ let pmt = fraction(balanceA, ratioShareTokensInB, scale8, CEILING)
409408 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
410409 }
411- let pmtAmountA = $t01314213646._1
412- let pmtAmountB = $t01314213646._2
413- let change = $t01314213646._3
414- let changeAssetId = $t01314213646._4
415- let shareTokenRatio = $t01314213646._5
410+ let pmtAmountA = $t01328313787._1
411+ let pmtAmountB = $t01328313787._2
412+ let change = $t01328313787._3
413+ let changeAssetId = $t01328313787._4
414+ let shareTokenRatio = $t01328313787._5
416415 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
417416 if ((size(i.payments) != 2))
418417 then throw("Two attached assets expected")
447446
448447 @Callable(i)
449448 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
450- let $t01529515370 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
451- let pmtAmount = $t01529515370._1
452- let pmtAssetId = $t01529515370._2
453- let $t01537515448 = getAssetInfo(pmtAssetId)
454- let pmtStrAssetId = $t01537515448._1
455- let pmtAssetName = $t01537515448._2
456- let pmtDecimals = $t01537515448._3
449+ let $t01543615511 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
450+ let pmtAmount = $t01543615511._1
451+ let pmtAssetId = $t01543615511._2
452+ let $t01551615589 = getAssetInfo(pmtAssetId)
453+ let pmtStrAssetId = $t01551615589._1
454+ let pmtAssetName = $t01551615589._2
455+ let pmtDecimals = $t01551615589._3
457456 let pmtMinThreshold = 5000000
458457 let thresholdValueForMinTolerance = 50000000
459458 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
473472 else false)
474473 then throwAssets()
475474 else {
476- let $t01638617151 = if ((pmtAssetId == assetIdA))
475+ let $t01652717292 = if ((pmtAssetId == assetIdA))
477476 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
478477 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
479- let virtualReplenishA = $t01638617151._1
480- let virtualReplenishB = $t01638617151._2
481- let balanceAfterSwapA = $t01638617151._3
482- let balanceAfterSwapB = $t01638617151._4
483- let invariantCalculated = $t01638617151._5
484- let newBalanceA = $t01638617151._6
485- let newBalanceB = $t01638617151._7
478+ let virtualReplenishA = $t01652717292._1
479+ let virtualReplenishB = $t01652717292._2
480+ let balanceAfterSwapA = $t01652717292._3
481+ let balanceAfterSwapB = $t01652717292._4
482+ let invariantCalculated = $t01652717292._5
483+ let newBalanceA = $t01652717292._6
484+ let newBalanceB = $t01652717292._7
486485 let newBalanceEntry = if ((pmtAssetId == assetIdA))
487486 then IntegerEntry(kBalanceA, newBalanceA)
488487 else IntegerEntry(kBalanceB, newBalanceB)
493492 if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
494493 then true
495494 else (invariant > invariantNew))
496- then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
495+ then throw((((((("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value" + " invariantEstimatedRatio: ") + toString(invariantEstimatedRatio)) + " invariantNew: ") + toString(invariantNew)) + " invariant: ") + toString(invariant)))
497496 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
498497 then true
499498 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
522521
523522 @Callable(i)
524523 func withdraw () = valueOrElse(isActive(), {
525- let $t01940119544 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
526- let pmtAmount = $t01940119544._1
527- let pmtAssetId = $t01940119544._2
524+ let $t01972119796 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
525+ let pmtAmount = $t01972119796._1
526+ let pmtAssetId = $t01972119796._2
528527 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
529528 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
530529 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
555554
556555 @Callable(i)
557556 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
558- let $t02100721082 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559- let pmtAmount = $t02100721082._1
560- let pmtAssetId = $t02100721082._2
557+ let $t02125921334 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
558+ let pmtAmount = $t02125921334._1
559+ let pmtAssetId = $t02125921334._2
561560 if ((0 >= estimatedAmountToReceive))
562561 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
563562 else if ((minAmountToReceive > estimatedAmountToReceive))
580579 let sendAssetId = if ((pmtAssetId == assetIdA))
581580 then assetIdB
582581 else assetIdA
583- let $t02217322292 = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
584- let amount = $t02217322292._1
585- let amountInvarian = $t02217322292._2
582+ let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
586583 let governanceReward = fraction(amount, feeGovernance, feeScale6)
587584 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
588- let $t02244822710 = if ((pmtAssetId == assetIdA))
585+ let $t02268222944 = if ((pmtAssetId == assetIdA))
589586 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
590587 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
591- let newBalanceA = $t02244822710._1
592- let newBalanceB = $t02244822710._2
588+ let newBalanceA = $t02268222944._1
589+ let newBalanceB = $t02268222944._2
593590 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
594591 if (if ((dAppThresholdAmount > newBalanceA))
595592 then true
596593 else (dAppThresholdAmount > newBalanceB))
597594 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
598595 else {
599- let $t02300823081 = getAssetInfo(pmtAssetId)
600- let pmtStrAssetId = $t02300823081._1
601- let pmtAssetName = $t02300823081._2
602- let pmtDecimals = $t02300823081._3
603- let $t02309423171 = getAssetInfo(sendAssetId)
604- let sendStrAssetId = $t02309423171._1
605- let sendAssetName = $t02309423171._2
606- let sendDecimals = $t02309423171._3
596+ let $t02324223315 = getAssetInfo(pmtAssetId)
597+ let pmtStrAssetId = $t02324223315._1
598+ let pmtAssetName = $t02324223315._2
599+ let pmtDecimals = $t02324223315._3
600+ let $t02332823405 = getAssetInfo(sendAssetId)
601+ let sendStrAssetId = $t02332823405._1
602+ let sendAssetName = $t02332823405._2
603+ let sendDecimals = $t02332823405._3
607604 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
608605 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
609606 else 0
613610 then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
614611 else 0
615612 if ((stake2 == stake2))
616- then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, amountInvarian), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(walletAddress, governanceReward, sendAssetId)]
613+ then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(walletAddress, governanceReward, sendAssetId)]
617614 else throw("Strict value is not equal to itself.")
618615 }
619616 else throw("Strict value is not equal to itself.")
676673
677674
678675 @Callable(i)
679-func writeBigIntInvariant () = valueOrElse(isAdminCall(i), {
680- let invariantNew = invariantCalc(balanceA, balanceB)
681-[IntegerEntry(kInvariant, invariantNew)]
682- })
683-
684-
685-
686-@Callable(i)
687676 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
688677 then throw("Only contract itself can invoke this function")
689678 else {
690- let $t02613626239 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
691- let call = $t02613626239._1
692- let addr = $t02613626239._2
693- let params = $t02613626239._3
694- let payments = $t02613626239._4
679+ let $t02621726320 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
680+ let call = $t02621726320._1
681+ let addr = $t02621726320._2
682+ let params = $t02621726320._3
683+ let payments = $t02621726320._4
695684 let inv = invoke(addr, call, params, payments)
696685 if ((inv == inv))
697686 then nil
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "2.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kShareAssetId = "share_asset_id"
1919
2020 let kShareAssetSupply = "share_asset_supply"
2121
2222 let kFee = "commission"
2323
2424 let kFeeScaleDelimiter = "commission_scale_delimiter"
2525
2626 let kInvariant = "invariant"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
3131
3232 let keyEURNAddress = "staking_eurn_address"
3333
3434 let keyAdminPubKey1 = "admin_pub_1"
3535
3636 let keyAdminPubKey2 = "admin_pub_2"
3737
3838 let keyAdminPubKey3 = "admin_pub_3"
3939
4040 let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
4141
4242 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
4343
4444 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
4545 case string: String =>
4646 fromBase58String(string)
4747 case nothing =>
4848 throw("Admin public key is empty")
4949 }
5050
5151
5252 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
5353
5454 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
5555
5656 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
5757
5858 let admStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5959
6060 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
6161
6262 let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
6363
6464 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
6565
6666 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
6767
6868 let stakingAssets = [toBase58String(USDN), toBase58String(EURN)]
6969
7070 let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
7171
7272 let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no usdn staking address")))
7373
7474 let active = getBooleanValue(this, kActive)
7575
7676 let strAssetIdA = getStringValue(this, kAssetIdA)
7777
7878 let strAssetIdB = getStringValue(this, kAssetIdB)
7979
8080 let assetIdA = if ((strAssetIdA == "WAVES"))
8181 then unit
8282 else fromBase58String(strAssetIdA)
8383
8484 let assetIdB = if ((strAssetIdB == "WAVES"))
8585 then unit
8686 else fromBase58String(strAssetIdB)
8787
8888 let assetNameA = match assetIdA {
8989 case id: ByteVector =>
9090 value(assetInfo(id)).name
9191 case waves: Unit =>
9292 "WAVES"
9393 case _ =>
9494 throw("Match error")
9595 }
9696
9797 let assetNameB = match assetIdB {
9898 case id: ByteVector =>
9999 value(assetInfo(id)).name
100100 case waves: Unit =>
101101 "WAVES"
102102 case _ =>
103103 throw("Match error")
104104 }
105105
106106 let balanceA = getIntegerValue(this, kBalanceA)
107107
108108 let balanceB = getIntegerValue(this, kBalanceB)
109109
110110 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
111111
112112 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
113113
114114 let invariant = getIntegerValue(this, kInvariant)
115115
116116 let fee = 500
117117
118118 let feeGovernance = 200
119119
120120 let feeScale6 = 1000000
121121
122122 let scale3 = 1000
123123
124124 let scale8 = 100000000
125125
126126 let scale16 = 10000000000000000
127127
128128 let slippageScale3 = 1000
129129
130130 let digits8 = 8
131131
132132 let dAppThreshold = 50
133133
134134 let dAppThresholdScale2 = 100
135135
136136 let exchangeRatioLimitMin = 90000000
137137
138138 let exchangeRatioLimitMax = 110000000
139139
140140 let alpha = 50
141141
142142 let alphaDigits = 2
143143
144144 let beta = 4600000000000000
145145
146146 func accountBalance (assetId) = match assetId {
147147 case id: ByteVector =>
148148 assetBalance(this, id)
149149 case waves: Unit =>
150150 wavesBalance(this).available
151151 case _ =>
152152 throw("Match error")
153153 }
154154
155155
156156 func stakedAmount (assetId) = {
157157 let stakedAmountCalculated = match assetId {
158158 case aId: ByteVector =>
159159 if ((aId == USDN))
160160 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
161161 else if ((aId == EURN))
162162 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
163163 else 0
164164 case _: Unit =>
165165 0
166166 case _ =>
167167 throw("Match error")
168168 }
169169 match stakedAmountCalculated {
170170 case i: Int =>
171171 i
172172 case _ =>
173173 0
174174 }
175175 }
176176
177177
178178 let stakedAmountA = stakedAmount(assetIdA)
179179
180180 let stakedAmountB = stakedAmount(assetIdB)
181181
182182 let availableBalanceA = (balanceA - stakedAmountA)
183183
184184 let availableBalanceB = (balanceB - stakedAmountB)
185185
186186 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
187187
188188 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
189189
190190 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
191191 then (accountBalanceWithStakedB >= balanceB)
192192 else false
193193
194194 func skewness (x,y) = ((fraction(scale16, x, y) + fraction(scale16, y, x)) / 2)
195195
196196
197197 func invariantCalc (x,y) = {
198198 let sk = skewness(x, y)
199199 (fraction((x + y), scale16, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(toInt(pow(fraction(toBigInt(x), toBigInt(y), toBigInt(scale8)), 0, toBigInt(5), 1, (digits8 / 2), DOWN)), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
200200 }
201201
202202
203203 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
204204 let worstAllowedNewInvariantRatio = (scale8 - ((scale8 * 1) / 10000000))
205205 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
206206 let x = (balanceA + tokenReceiveAmount)
207207 let y = (balanceB + tokenReceiveAmount)
208208 func getStepAmount (acc,step) = if ((acc._1 == -1))
209209 then {
210210 let amountToSend = (amountToSendEstimated - (((step * deltaBetweenMaxAndMinSendValue) / 3) / scale3))
211211 let stepInvariant = if ((tokenId == assetIdA))
212212 then invariantCalc(x, (balanceB - amountToSend))
213213 else invariantCalc((balanceA - amountToSend), y)
214214 if ((stepInvariant > invariant))
215215 then $Tuple2(amountToSend, stepInvariant)
216216 else $Tuple2(-1, 0)
217217 }
218218 else acc
219219
220220 let amountToSendMin = getStepAmount($Tuple2(-1, 0), 3000)
221221 if ((0 > amountToSendMin._1))
222222 then throw("Price is worse than minReceived")
223223 else {
224224 let invEstimated = if ((tokenId == assetIdA))
225225 then invariantCalc(x, (balanceB - amountToSendEstimated))
226226 else if ((tokenId == assetIdB))
227227 then invariantCalc((balanceA - amountToSendEstimated), y)
228228 else throw("Wrong asset in payment")
229- let amountToSendBest = if ((invariant > invEstimated))
229+ if ((invariant > invEstimated))
230230 then if ((worstAllowedNewInvariantRatio >= fraction(scale8, invariant, invEstimated)))
231- then throw("Bad estimation provided 1")
231+ then throw("The requested price is too not profitable for user")
232232 else {
233233 let a = {
234234 let $l = [25, 200, 500]
235235 let $s = size($l)
236236 let $acc0 = $Tuple2(-1, 0)
237237 func $f0_1 ($a,$i) = if (($i >= $s))
238238 then $a
239239 else getStepAmount($a, $l[$i])
240240
241241 func $f0_2 ($a,$i) = if (($i >= $s))
242242 then $a
243243 else throw("List size exceeds 3")
244244
245245 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
246246 }
247247 if ((0 > a._1))
248- then amountToSendMin
249- else a
248+ then amountToSendMin._1
249+ else a._1
250250 }
251251 else {
252252 let a = {
253253 let $l = [-500, -200, -25]
254254 let $s = size($l)
255255 let $acc0 = $Tuple2(-1, 0)
256256 func $f0_1 ($a,$i) = if (($i >= $s))
257257 then $a
258258 else getStepAmount($a, $l[$i])
259259
260260 func $f0_2 ($a,$i) = if (($i >= $s))
261261 then $a
262262 else throw("List size exceeds 3")
263263
264264 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
265265 }
266266 let tupleSendBetter = if ((0 > a._1))
267267 then $Tuple2(amountToSendEstimated, invEstimated)
268268 else a
269269 if ((worstAllowedNewInvariantRatio >= fraction(scale8, invariant, tupleSendBetter._2)))
270- then throw("Bad estimation provided 2")
271- else tupleSendBetter
270+ then throw("The requested price is too not profitable for user")
271+ else tupleSendBetter._1
272272 }
273- amountToSendBest
274273 }
275274 }
276275
277276
278277 func getAssetInfo (assetId) = match assetId {
279278 case id: ByteVector =>
280279 let stringId = toBase58String(id)
281280 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
282281 $Tuple3(stringId, info.name, info.decimals)
283282 case waves: Unit =>
284283 $Tuple3("WAVES", "WAVES", 8)
285284 case _ =>
286285 throw("Match error")
287286 }
288287
289288
290289 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
291290
292291
293292 func throwIsActive () = throw("DApp is already active")
294293
295294
296295 func isActive () = if (active)
297296 then unit
298297 else throw("DApp is inactive at this moment")
299298
300299
301300 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
302301 then unit
303302 else throw("Only admin can call this function")
304303
305304
306305 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
307306
308307
309308 func throwOnePayment () = throw("One attached payment expected")
310309
311310
312311 func throwThreshold (threshold,amountA,amountB) = throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(threshold)) + ": ") + toString(amountA)) + " ") + assetNameA) + ", ") + toString(amountB)) + " ") + assetNameB))
313312
314313
315314 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
316315
317316
318317 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
319318 then if ((assetId == USDN))
320319 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
321320 else $Tuple2("startStaking", stakingEURNAddress)
322321 else if ((assetId == USDN))
323322 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
324323 else $Tuple2("stopStaking", stakingEURNAddress)
325324
326325
327326 func calcStakingParams (stake,amount,assetId) = if (stake)
328327 then {
329- let $t097119777 = calcStakingFuncAndAddres(stake, assetId)
330- let call = $t097119777._1
331- let stakingAddr = $t097119777._2
328+ let $t098529918 = calcStakingFuncAndAddres(stake, assetId)
329+ let call = $t098529918._1
330+ let stakingAddr = $t098529918._2
332331 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
333332 }
334333 else {
335- let $t098639929 = calcStakingFuncAndAddres(stake, assetId)
336- let call = $t098639929._1
337- let stakingAddr = $t098639929._2
334+ let $t01000410070 = calcStakingFuncAndAddres(stake, assetId)
335+ let call = $t01000410070._1
336+ let stakingAddr = $t01000410070._2
338337 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
339338 }
340339
341340
342341 @Callable(i)
343342 func init () = {
344- let $t01003410111 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
345- let pmtAmountA = $t01003410111._1
346- let pmtAssetIdA = $t01003410111._2
347- let $t01011610193 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
348- let pmtAmountB = $t01011610193._1
349- let pmtAssetIdB = $t01011610193._2
350- let $t01019810275 = getAssetInfo(pmtAssetIdA)
351- let pmtStrAssetIdA = $t01019810275._1
352- let pmtAssetNameA = $t01019810275._2
353- let pmtDecimalsA = $t01019810275._3
354- let $t01028010357 = getAssetInfo(pmtAssetIdB)
355- let pmtStrAssetIdB = $t01028010357._1
356- let pmtAssetNameB = $t01028010357._2
357- let pmtDecimalsB = $t01028010357._3
343+ let $t01017510252 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
344+ let pmtAmountA = $t01017510252._1
345+ let pmtAssetIdA = $t01017510252._2
346+ let $t01025710334 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
347+ let pmtAmountB = $t01025710334._1
348+ let pmtAssetIdB = $t01025710334._2
349+ let $t01033910416 = getAssetInfo(pmtAssetIdA)
350+ let pmtStrAssetIdA = $t01033910416._1
351+ let pmtAssetNameA = $t01033910416._2
352+ let pmtDecimalsA = $t01033910416._3
353+ let $t01042110498 = getAssetInfo(pmtAssetIdB)
354+ let pmtStrAssetIdB = $t01042110498._1
355+ let pmtAssetNameB = $t01042110498._2
356+ let pmtDecimalsB = $t01042110498._3
358357 if (isDefined(getBoolean(this, kActive)))
359358 then throwIsActive()
360359 else if ((pmtAssetIdA == pmtAssetIdB))
361360 then throw("Assets must be different")
362361 else {
363362 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
364363 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
365364 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
366365 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
367366 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
368367 let shareIssueId = calculateAssetId(shareIssue)
369368 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
370369 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
371370 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
372371 else 0
373372 if ((stake1 == stake1))
374373 then {
375374 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
376375 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
377376 else 0
378377 if ((stake2 == stake2))
379378 then [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, fee), IntegerEntry(kFeeScaleDelimiter, feeScale6), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
380379 else throw("Strict value is not equal to itself.")
381380 }
382381 else throw("Strict value is not equal to itself.")
383382 }
384383 }
385384
386385
387386
388387 @Callable(i)
389388 func replenishWithTwoTokens () = valueOrElse(isActive(), {
390389 let pmtAssetIdA = i.payments[0].assetId
391390 let pmtAssetIdB = i.payments[1].assetId
392391 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
393392 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
394- let $t01293813015 = getAssetInfo(pmtAssetIdA)
395- let pmtStrAssetIdA = $t01293813015._1
396- let pmtAssetNameA = $t01293813015._2
397- let pmtDecimalsA = $t01293813015._3
398- let $t01302013137 = getAssetInfo(pmtAssetIdB)
399- let pmtStrAssetIdB = $t01302013137._1
400- let pmtAssetNameB = $t01302013137._2
401- let pmtDecimalsB = $t01302013137._3
402- let $t01314213646 = if ((ratioShareTokensInB > ratioShareTokensInA))
393+ let $t01307913156 = getAssetInfo(pmtAssetIdA)
394+ let pmtStrAssetIdA = $t01307913156._1
395+ let pmtAssetNameA = $t01307913156._2
396+ let pmtDecimalsA = $t01307913156._3
397+ let $t01316113278 = getAssetInfo(pmtAssetIdB)
398+ let pmtStrAssetIdB = $t01316113278._1
399+ let pmtAssetNameB = $t01316113278._2
400+ let pmtDecimalsB = $t01316113278._3
401+ let $t01328313787 = if ((ratioShareTokensInB > ratioShareTokensInA))
403402 then {
404403 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
405404 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
406405 }
407406 else {
408- let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
407+ let pmt = fraction(balanceA, ratioShareTokensInB, scale8, CEILING)
409408 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
410409 }
411- let pmtAmountA = $t01314213646._1
412- let pmtAmountB = $t01314213646._2
413- let change = $t01314213646._3
414- let changeAssetId = $t01314213646._4
415- let shareTokenRatio = $t01314213646._5
410+ let pmtAmountA = $t01328313787._1
411+ let pmtAmountB = $t01328313787._2
412+ let change = $t01328313787._3
413+ let changeAssetId = $t01328313787._4
414+ let shareTokenRatio = $t01328313787._5
416415 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
417416 if ((size(i.payments) != 2))
418417 then throw("Two attached assets expected")
419418 else if (if ((pmtAssetIdA != assetIdA))
420419 then true
421420 else (pmtAssetIdB != assetIdB))
422421 then throwAssets()
423422 else if ((shareTokenToPayAmount == 0))
424423 then throw("Too small amount to replenish")
425424 else if ((0 > change))
426425 then throw("Change < 0")
427426 else if (!(hasEnoughBalance))
428427 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
429428 else {
430429 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
431430 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
432431 else 0
433432 if ((stake1 == stake1))
434433 then {
435434 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
436435 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
437436 else 0
438437 if ((stake2 == stake2))
439438 then [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), ScriptTransfer(i.caller, change, changeAssetId)]
440439 else throw("Strict value is not equal to itself.")
441440 }
442441 else throw("Strict value is not equal to itself.")
443442 }
444443 })
445444
446445
447446
448447 @Callable(i)
449448 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
450- let $t01529515370 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
451- let pmtAmount = $t01529515370._1
452- let pmtAssetId = $t01529515370._2
453- let $t01537515448 = getAssetInfo(pmtAssetId)
454- let pmtStrAssetId = $t01537515448._1
455- let pmtAssetName = $t01537515448._2
456- let pmtDecimals = $t01537515448._3
449+ let $t01543615511 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
450+ let pmtAmount = $t01543615511._1
451+ let pmtAssetId = $t01543615511._2
452+ let $t01551615589 = getAssetInfo(pmtAssetId)
453+ let pmtStrAssetId = $t01551615589._1
454+ let pmtAssetName = $t01551615589._2
455+ let pmtDecimals = $t01551615589._3
457456 let pmtMinThreshold = 5000000
458457 let thresholdValueForMinTolerance = 50000000
459458 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
460459 then 100000
461460 else 1
462461 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
463462 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
464463 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
465464 if ((pmtMinThreshold > pmtAmount))
466465 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
467466 else if ((size(i.payments) != 1))
468467 then throwOnePayment()
469468 else if (!(hasEnoughBalance))
470469 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
471470 else if (if ((pmtAssetId != assetIdA))
472471 then (pmtAssetId != assetIdB)
473472 else false)
474473 then throwAssets()
475474 else {
476- let $t01638617151 = if ((pmtAssetId == assetIdA))
475+ let $t01652717292 = if ((pmtAssetId == assetIdA))
477476 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
478477 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
479- let virtualReplenishA = $t01638617151._1
480- let virtualReplenishB = $t01638617151._2
481- let balanceAfterSwapA = $t01638617151._3
482- let balanceAfterSwapB = $t01638617151._4
483- let invariantCalculated = $t01638617151._5
484- let newBalanceA = $t01638617151._6
485- let newBalanceB = $t01638617151._7
478+ let virtualReplenishA = $t01652717292._1
479+ let virtualReplenishB = $t01652717292._2
480+ let balanceAfterSwapA = $t01652717292._3
481+ let balanceAfterSwapB = $t01652717292._4
482+ let invariantCalculated = $t01652717292._5
483+ let newBalanceA = $t01652717292._6
484+ let newBalanceB = $t01652717292._7
486485 let newBalanceEntry = if ((pmtAssetId == assetIdA))
487486 then IntegerEntry(kBalanceA, newBalanceA)
488487 else IntegerEntry(kBalanceB, newBalanceB)
489488 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
490489 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
491490 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
492491 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
493492 if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
494493 then true
495494 else (invariant > invariantNew))
496- then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
495+ then throw((((((("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value" + " invariantEstimatedRatio: ") + toString(invariantEstimatedRatio)) + " invariantNew: ") + toString(invariantNew)) + " invariant: ") + toString(invariant)))
497496 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
498497 then true
499498 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
500499 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
501500 else if (if ((dAppThresholdAmount > newBalanceA))
502501 then true
503502 else (dAppThresholdAmount > newBalanceB))
504503 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
505504 else {
506505 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
507506 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
508507 else 0
509508 if ((stake1 == stake1))
510509 then {
511510 let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
512511 let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
513512 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
514513 [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
515514 }
516515 else throw("Strict value is not equal to itself.")
517516 }
518517 }
519518 })
520519
521520
522521
523522 @Callable(i)
524523 func withdraw () = valueOrElse(isActive(), {
525- let $t01940119544 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
526- let pmtAmount = $t01940119544._1
527- let pmtAssetId = $t01940119544._2
524+ let $t01972119796 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
525+ let pmtAmount = $t01972119796._1
526+ let pmtAssetId = $t01972119796._2
528527 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
529528 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
530529 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
531530 if ((size(i.payments) != 1))
532531 then throwOnePayment()
533532 else if ((pmtAssetId != shareAssetId))
534533 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
535534 else if (!(hasEnoughBalance))
536535 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
537536 else {
538537 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
539538 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
540539 else 0
541540 if ((stake1 == stake1))
542541 then {
543542 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
544543 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
545544 else 0
546545 if ((stake2 == stake2))
547546 then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
548547 else throw("Strict value is not equal to itself.")
549548 }
550549 else throw("Strict value is not equal to itself.")
551550 }
552551 })
553552
554553
555554
556555 @Callable(i)
557556 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
558- let $t02100721082 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559- let pmtAmount = $t02100721082._1
560- let pmtAssetId = $t02100721082._2
557+ let $t02125921334 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
558+ let pmtAmount = $t02125921334._1
559+ let pmtAssetId = $t02125921334._2
561560 if ((0 >= estimatedAmountToReceive))
562561 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
563562 else if ((minAmountToReceive > estimatedAmountToReceive))
564563 then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
565564 else if ((size(i.payments) != 1))
566565 then throwOnePayment()
567566 else if (!(hasEnoughBalance))
568567 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
569568 else if (if ((pmtAssetId != assetIdA))
570569 then (pmtAssetId != assetIdB)
571570 else false)
572571 then throwAssets()
573572 else if ((10000000 > pmtAmount))
574573 then throw("Only swap of 10.000000 or more tokens is allowed")
575574 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
576575 then true
577576 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
578577 then throw("Incorrect args and pmt ratio")
579578 else {
580579 let sendAssetId = if ((pmtAssetId == assetIdA))
581580 then assetIdB
582581 else assetIdA
583- let $t02217322292 = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
584- let amount = $t02217322292._1
585- let amountInvarian = $t02217322292._2
582+ let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
586583 let governanceReward = fraction(amount, feeGovernance, feeScale6)
587584 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
588- let $t02244822710 = if ((pmtAssetId == assetIdA))
585+ let $t02268222944 = if ((pmtAssetId == assetIdA))
589586 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
590587 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
591- let newBalanceA = $t02244822710._1
592- let newBalanceB = $t02244822710._2
588+ let newBalanceA = $t02268222944._1
589+ let newBalanceB = $t02268222944._2
593590 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
594591 if (if ((dAppThresholdAmount > newBalanceA))
595592 then true
596593 else (dAppThresholdAmount > newBalanceB))
597594 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
598595 else {
599- let $t02300823081 = getAssetInfo(pmtAssetId)
600- let pmtStrAssetId = $t02300823081._1
601- let pmtAssetName = $t02300823081._2
602- let pmtDecimals = $t02300823081._3
603- let $t02309423171 = getAssetInfo(sendAssetId)
604- let sendStrAssetId = $t02309423171._1
605- let sendAssetName = $t02309423171._2
606- let sendDecimals = $t02309423171._3
596+ let $t02324223315 = getAssetInfo(pmtAssetId)
597+ let pmtStrAssetId = $t02324223315._1
598+ let pmtAssetName = $t02324223315._2
599+ let pmtDecimals = $t02324223315._3
600+ let $t02332823405 = getAssetInfo(sendAssetId)
601+ let sendStrAssetId = $t02332823405._1
602+ let sendAssetName = $t02332823405._2
603+ let sendDecimals = $t02332823405._3
607604 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
608605 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
609606 else 0
610607 if ((stake1 == stake1))
611608 then {
612609 let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
613610 then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
614611 else 0
615612 if ((stake2 == stake2))
616- then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, amountInvarian), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(walletAddress, governanceReward, sendAssetId)]
613+ then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(walletAddress, governanceReward, sendAssetId)]
617614 else throw("Strict value is not equal to itself.")
618615 }
619616 else throw("Strict value is not equal to itself.")
620617 }
621618 }
622619 })
623620
624621
625622
626623 @Callable(i)
627624 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
628625 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
629626 else suspend("Paused by admin"))
630627
631628
632629
633630 @Callable(i)
634631 func activate () = valueOrElse(isAdminCall(i), if (active)
635632 then throwIsActive()
636633 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
637634
638635
639636
640637 @Callable(i)
641638 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
642639 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
643640 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
644641 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
645642 if ((i.caller != walletAddress))
646643 then throw("Only the wallet can call this function")
647644 else if (if ((0 > amountEnrollA))
648645 then true
649646 else (0 > amountEnrollB))
650647 then suspend("Enroll amount negative")
651648 else if (if ((amountEnrollA == 0))
652649 then (amountEnrollB == 0)
653650 else false)
654651 then throw("No money to take")
655652 else {
656653 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
657654 then (amountEnrollA > 0)
658655 else false)
659656 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
660657 else 0
661658 if ((stake1 == stake1))
662659 then {
663660 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
664661 then (amountEnrollB > 0)
665662 else false)
666663 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
667664 else 0
668665 if ((stake2 == stake2))
669666 then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
670667 else throw("Strict value is not equal to itself.")
671668 }
672669 else throw("Strict value is not equal to itself.")
673670 }
674671 })
675672
676673
677674
678675 @Callable(i)
679-func writeBigIntInvariant () = valueOrElse(isAdminCall(i), {
680- let invariantNew = invariantCalc(balanceA, balanceB)
681-[IntegerEntry(kInvariant, invariantNew)]
682- })
683-
684-
685-
686-@Callable(i)
687676 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
688677 then throw("Only contract itself can invoke this function")
689678 else {
690- let $t02613626239 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
691- let call = $t02613626239._1
692- let addr = $t02613626239._2
693- let params = $t02613626239._3
694- let payments = $t02613626239._4
679+ let $t02621726320 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
680+ let call = $t02621726320._1
681+ let addr = $t02621726320._2
682+ let params = $t02621726320._3
683+ let payments = $t02621726320._4
695684 let inv = invoke(addr, call, params, payments)
696685 if ((inv == inv))
697686 then nil
698687 else throw("Strict value is not equal to itself.")
699688 }
700689
701690
702691 @Verifier(tx)
703692 func verify () = {
704693 let multiSignedByAdmins = {
705694 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
706695 then 1
707696 else 0
708697 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
709698 then 1
710699 else 0
711700 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
712701 then 1
713702 else 0
714703 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
715704 }
716705 match tx {
717706 case inv: InvokeScriptTransaction =>
718707 let callTakeIntoAccount = if ((inv.dApp == this))
719708 then (inv.function == "takeIntoAccountExtraFunds")
720709 else false
721710 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
722711 then true
723712 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
724713 then true
725714 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
726715 then true
727716 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
728717 if (if (callTakeIntoAccount)
729718 then signedByAdmin
730719 else false)
731720 then true
732721 else multiSignedByAdmins
733722 case _ =>
734723 multiSignedByAdmins
735724 }
736725 }
737726

github/deemru/w8io/169f3d6 
123.90 ms