tx · 8cJ4EYMU8BZc9HUWjUXJ2GKL3c6sqRRmDBggDAVhCdDZ

3N7BEKCGKtgSAqfywYKRDwQMB9yGBP9SuSe:  -0.01400000 Waves

2022.03.25 10:34 [1979168] smart account 3N7BEKCGKtgSAqfywYKRDwQMB9yGBP9SuSe > SELF 0.00000000 Waves

{ "type": 13, "id": "8cJ4EYMU8BZc9HUWjUXJ2GKL3c6sqRRmDBggDAVhCdDZ", "fee": 1400000, "feeAssetId": null, "timestamp": 1648193679790, "version": 2, "chainId": 84, "sender": "3N7BEKCGKtgSAqfywYKRDwQMB9yGBP9SuSe", "senderPublicKey": "5h6eNMEnAmx4CY8P35do6SfACsuGxcHMc1BPELwFvyFe", "proofs": [ "3rJ6xqvVQ46SAVoHvxcHzKU8RYwNpUtyFVpzTBEErHcfazjmSypzAamp19NGyaTcnjqqRTuNbDD41HphbENLhpAP", "3N1RvfCLrn2oisNHjyaEXVBwRRUJosH3frcCgqj4Fqt8sb8JbJN3fyBjgaeAKPQcP7dZ1ZUtej7t1vVwD89V9cs7" ], "script": "base64:AAIFAAAAAAAAACMIAhIAEgASBAoCAQESABIECgIBARIAEgASABIAEgUKAwQBCAAAAFIAAAAAB3ZlcnNpb24CAAAABTIuMC4wAAAAAAhrVmVyc2lvbgIAAAAHdmVyc2lvbgAAAAAHa0FjdGl2ZQIAAAAGYWN0aXZlAAAAAAlrQXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAACWtBc3NldElkQgIAAAAKQl9hc3NldF9pZAAAAAAJa0JhbGFuY2VBAgAAAA9BX2Fzc2V0X2JhbGFuY2UAAAAACWtCYWxhbmNlQgIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAA1rU2hhcmVBc3NldElkAgAAAA5zaGFyZV9hc3NldF9pZAAAAAARa1NoYXJlQXNzZXRTdXBwbHkCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAAEa0ZlZQIAAAAKY29tbWlzc2lvbgAAAAASa0ZlZVNjYWxlRGVsaW1pdGVyAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAAKa0ludmFyaWFudAIAAAAJaW52YXJpYW50AAAAAAZrQ2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAABJrZXlVU0ROTlNCVEFkZHJlc3MCAAAAGHN0YWtpbmdfdXNkbm5zYnRfYWRkcmVzcwAAAAAOa2V5RVVSTkFkZHJlc3MCAAAAFHN0YWtpbmdfZXVybl9hZGRyZXNzAAAAAA9rZXlBZG1pblB1YktleTECAAAAC2FkbWluX3B1Yl8xAAAAAA9rZXlBZG1pblB1YktleTICAAAAC2FkbWluX3B1Yl8yAAAAAA9rZXlBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAABRVU0ROVG9XYXZlc0V4Y2hhbmdlcgkBAAAAB0FkZHJlc3MAAAABAQAAABoBVLyvLOw52HwgF6zPLvnW0fXFIi/xmKAk8gAAAAAGb3JhY2xlCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU6UWqHpAvOq7xug7mLpqSXxqYhOHzYrMIAQAAAAtnZXRBZG1pblB1YgAAAAEAAAALa2V5QWRtaW5QdWIEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAGb3JhY2xlBQAAAAtrZXlBZG1pblB1YgMJAAABAAAAAgUAAAAHJG1h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bWVBAgAAAAIsIAkAAaQAAAABCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQgIAAAABIAUAAAAKYXNzZXROYW1lQgEAAAAYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAAAAAgAAAAVzdGFrZQAAAAdhc3NldElkAwUAAAAFc3Rha2UDCQAAAAAAAAIFAAAAB2Fzc2V0SWQFAAAABFVTRE4JAAUUAAAAAgIAAAAMbG9ja05ldXRyaW5vBQAAABZzdGFraW5nVVNETk5TQlRBZGRyZXNzCQAFFAAAAAICAAAADHN0YXJ0U3Rha2luZwUAAAASc3Rha2luZ0VVUk5BZGRyZXNzAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAARVU0ROCQAFFAAAAAICAAAADnVubG9ja05ldXRyaW5vBQAAABZzdGFraW5nVVNETk5TQlRBZGRyZXNzCQAFFAAAAAICAAAAC3N0b3BTdGFraW5nBQAAABJzdGFraW5nRVVSTkFkZHJlc3MBAAAAEWNhbGNTdGFraW5nUGFyYW1zAAAAAwAAAAVzdGFrZQAAAAZhbW91bnQAAAAHYXNzZXRJZAMFAAAABXN0YWtlBAAAAAskdDA5ODUyOTkxOAkBAAAAGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwAAAAIFAAAABXN0YWtlBQAAAAdhc3NldElkBAAAAARjYWxsCAUAAAALJHQwOTg1Mjk5MTgAAAACXzEEAAAAC3N0YWtpbmdBZGRyCAUAAAALJHQwOTg1Mjk5MTgAAAACXzIJAAUWAAAABAUAAAAEY2FsbAUAAAALc3Rha2luZ0FkZHIFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAHYXNzZXRJZAUAAAAGYW1vdW50BQAAAANuaWwEAAAADSR0MDEwMDA0MTAwNzAJAQAAABhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMAAAACBQAAAAVzdGFrZQUAAAAHYXNzZXRJZAQAAAAEY2FsbAgFAAAADSR0MDEwMDA0MTAwNzAAAAACXzEEAAAAC3N0YWtpbmdBZGRyCAUAAAANJHQwMTAwMDQxMDA3MAAAAAJfMgkABRYAAAAEBQAAAARjYWxsBQAAAAtzdGFraW5nQWRkcgkA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BQAAAAhiYWxhbmNlQgQAAAANJHQwMTMwNzkxMzE1NgkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRBBAAAAA5wbXRTdHJBc3NldElkQQgFAAAADSR0MDEzMDc5MTMxNTYAAAACXzEEAAAADXBtdEFzc2V0TmFtZUEIBQAAAA0kdDAxMzA3OTEzMTU2AAAAAl8yBAAAAAxwbXREZWNpbWFsc0EIBQAAAA0kdDAxMzA3OTEzMTU2AAAAAl8zBAAAAA0kdDAxMzE2MTEzMjc4CQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAALcG10QXNzZXRJZEIEAAAADnBtdFN0ckFzc2V0SWRCCAUAAAANJHQwMTMxNjExMzI3OAAAAAJfMQQAAAANcG10QXNzZXROYW1lQggFAAAADSR0MDEzMTYxMTMyNzgAAAACXzIEAAAADHBtdERlY2ltYWxzQggFAAAADSR0MDEzMTYxMTMyNzgAAAACXzMEAAAADSR0MDEzMjgzMTM3ODcDCQAAZgAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEEAAAAA3BtdAkBAAAACGZyYWN0aW9uAAAABAUAAAAIYmFsYW5jZUIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEFAAAABnNjYWxlOAUAAAAHQ0VJTElORwkABRcAAAAFCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQFAAAAA3BtdAkAAGUAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAZhbW91bnQFAAAAA3BtdAUAAAALcG10QXNzZXRJZEIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEEAAAAA3BtdAkBAAAACGZyYWN0aW9uAAAABAUAAAAIYmFsYW5jZUEFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIFAAAABnNjYWxlOAUAAAAHQ0VJTElORwkABRcAAAAFBQAAAANwbXQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAABmFtb3VudAkAAGUAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAA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BQAAAAxzaGFyZUFzc2V0SWQFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQFAAAADHNoYXJlQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAABmNoYW5nZQUAAAANY2hhbmdlQXNzZXRJZAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAVcmVwbGVuaXNoV2l0aE9uZVRva2VuAAAAAgAAABN2aXJ0dWFsU3dhcFRva2VuUGF5AAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAhpc0FjdGl2ZQAAAAAEAAAADSR0MDE1NDM2MTU1MTEJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxNTQzNjE1NTExAAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTU0MzYxNTUxMQAAAAJfMgQAAAANJHQwMTU1MTYxNTU4OQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAACnBtdEFzc2V0SWQEAAAADXBtdFN0ckFzc2V0SWQIBQAAAA0kdDAxNTUxNjE1NTg5AAAAAl8xBAAAAAxwbXRBc3NldE5hbWUIBQAAAA0kdDAxNTUxNjE1NTg5AAAAAl8yBAAAAAtwbXREZWNpbWFscwgFAAAADSR0MDE1NTE2MTU1ODkAAAACXzMEAAAAD3BtdE1pblRocmVzaG9sZAAAAAAAAExLQAQAAAAddGhyZXNob2xkVmFsdWVGb3JNaW5Ub2xlcmFuY2UAAAAAAAL68IAEAAAACXRvbGVyYW5jZQMJAABmAAAAAgUAAAAddGhyZXNob2xkVmFsdWVGb3JNaW5Ub2xlcmFuY2UFAAAACXBtdEFtb3VudAAAAAAAAAGGoAAAAAAAAAAAAQQAAAAcc2xpcHBhZ2VWYWx1ZU1pbkZvclJlcGxlbmlzaAkAAGUAAAACBQAAAAZzY2FsZTgJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTgFAAAACXRvbGVyYW5jZQAAAAAAAJiWgAQAAAAcc2xpcHBhZ2VWYWx1ZU1heEZvclJlcGxlbmlzaAkAAGQAAAACBQAAAAZzY2FsZTgJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTgFAAAACXRvbGVyYW5jZQAAAAAAAJiWgAQAAAAXc2xpcHBhZ2VWYWx1ZU1pbkZvclN3YXAJAABlAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4AAAAAAAAAAABAAAAAAAAmJaAAwkAAGYAAAACBQAAAA9wbXRNaW5UaHJlc2hvbGQFAAAACXBtdEFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD1BheW1lbnQgYW1vdW50IAkAAaQAAAABBQAAAAlwbXRBbW91bnQCAAAAJyBkb2VzIG5vdCBleGNlZWQgdGhlIG1pbmltdW0gYW1vdW50IG9mIAkAAaQAAAABBQAAAA9wbXRNaW5UaHJlc2hvbGQCAAAAByB0b2tlbnMDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQEAAAAPdGhyb3dPbmVQYXltZW50AAAAAAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAQAAAANJHQwMTY1MjcxNzI5MgMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAAUZAAAABwkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgkABRkAAAAHBQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQAAZQAAAAIFAAAACXBtdEFtb3VudAUAAAATdmlydHVhbFN3YXBUb2tlblBheQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAATdmlydHVhbFN3YXBUb2tlblBheQkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAhiYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAABF2aXJ0dWFsUmVwbGVuaXNoQQgFAAAADSR0MDE2NTI3MTcyOTIAAAACXzEEAAAAEXZpcnR1YWxSZXBsZW5pc2hCCAUAAAANJHQwMTY1MjcxNzI5MgAAAAJfMgQAAAARYmFsYW5jZUFmdGVyU3dhcEEIBQAAAA0kdDAxNjUyNzE3MjkyAAAAAl8zBAAAABFiYWxhbmNlQWZ0ZXJTd2FwQggFAAAADSR0MDE2NTI3MTcyOTIAAAACXzQEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQIBQAAAA0kdDAxNjUyNzE3MjkyAAAAAl81BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDE2NTI3MTcyOTIAAAACXzYEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMTY1MjcxNzI5MgAAAAJfNwQAAAAPbmV3QmFsYW5jZUVudHJ5AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIFAAAAC25ld0JhbGFuY2VCBAAAAAxpbnZhcmlhbnROZXcJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAARYmFsYW5jZUFmdGVyU3dhcEEFAAAAEWJhbGFuY2VBZnRlclN3YXBCBAAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwkAAGsAAAADBQAAAAZzY2FsZTgFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3BAAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoCQAAaQAAAAIJAABrAAAAAwkAAGgAAAACBQAAAAZzY2FsZTgFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEEFAAAAEWJhbGFuY2VBZnRlclN3YXBCCQAAawAAAAMFAAAABnNjYWxlOAUAAAARdmlydHVhbFJlcGxlbmlzaEEFAAAAEXZpcnR1YWxSZXBsZW5pc2hCBAAAABNkQXBwVGhyZXNob2xkQW1vdW50CQAAawAAAAMJAABkAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBQAAAA1kQXBwVGhyZXNob2xkCQAAaAAAAAIAAAAAAAAAAAIFAAAAE2RBcHBUaHJlc2hvbGRTY2FsZTIDAwkAAGcAAAACBQAAABdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcAUAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8GCQAAZgAAAAIFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAOkluY29ycmVjdCB2aXJ0dWFsU3dhcFRva2VuUGF5IG9yIHZpcnR1YWxTd2FwVG9rZW5HZXQgdmFsdWUCAAAAGiBpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbzogCQABpAAAAAEFAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvAgAAAA8gaW52YXJpYW50TmV3OiAJAAGkAAAAAQUAAAAMaW52YXJpYW50TmV3AgAAAAwgaW52YXJpYW50OiAJAAGkAAAAAQUAAAAJaW52YXJpYW50AwMJAABmAAAAAgUAAAAcc2xpcHBhZ2VWYWx1ZU1pbkZvclJlcGxlbmlzaAUAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAYJAABmAAAAAgUAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAUAAAAcc2xpcHBhZ2VWYWx1ZU1heEZvclJlcGxlbmlzaAkAAAIAAAABAgAAAGxTd2FwIHdpdGggdmlydHVhbFN3YXBUb2tlblBheSBhbmQgdmlydHVhbFN3YXBUb2tlbkdldCBpcyBwb3NzaWJsZSwgYnV0IHJhdGlvIGFmdGVyIHZpcnR1YWwgc3dhcCBpcyBpbmNvcnJlY3QDAwkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQYJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUIJAQAAAA50aHJvd1RocmVzaG9sZAAAAAMFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgQAAAAGc3Rha2UxAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADXBtdFN0ckFzc2V0SWQJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAACXBtdEFtb3VudAkABEwAAAACBQAAAA1wbXRTdHJBc3NldElkBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAGc3Rha2UxBQAAAAZzdGFrZTEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwUAAAARdmlydHVhbFJlcGxlbmlzaEEFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAARdmlydHVhbFJlcGxlbmlzaEIFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEIEAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAAGsAAAADCQABlwAAAAEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5CBQAAAANuaWwFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAABnNjYWxlOAkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUAAAAMc2hhcmVBc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQkAAGQAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAARMAAAAAgUAAAAPbmV3QmFsYW5jZUVudHJ5CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACHdpdGhkcmF3AAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAQAAAANJHQwMTk3MjExOTc5NgkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDE5NzIxMTk3OTYAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxOTcyMTE5Nzk2AAAAAl8yBAAAAAxhbW91bnRUb1BheUEJAABrAAAAAwUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQQUAAAAQc2hhcmVBc3NldFN1cHBseQQAAAAMYW1vdW50VG9QYXlCCQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIFAAAAEHNoYXJlQXNzZXRTdXBwbHkEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAAMYW1vdW50VG9QYXlBCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAxhbW91bnRUb1BheUIDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQEAAAAPdGhyb3dPbmVQYXltZW50AAAAAAMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAADHNoYXJlQXNzZXRJZAkAAAIAAAABCQABLAAAAAICAAAAJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAkAAlgAAAABBQAAAAxzaGFyZUFzc2V0SWQDCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAABAAAAAZzdGFrZTEDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAALc3RyQXNzZXRJZEEJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIHCQAETAAAAAIFAAAADGFtb3VudFRvUGF5QQkABEwAAAACBQAAAAtzdHJBc3NldElkQQUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAA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c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEIHCQEAAAALdGhyb3dBc3NldHMAAAAAAwkAAGYAAAACAAAAAAAAmJaABQAAAAlwbXRBbW91bnQJAAACAAAAAQIAAAAwT25seSBzd2FwIG9mIDEwLjAwMDAwMCBvciBtb3JlIHRva2VucyBpcyBhbGxvd2VkAwMJAABmAAAAAgUAAAAVZXhjaGFuZ2VSYXRpb0xpbWl0TWluCQAAawAAAAMFAAAABnNjYWxlOAUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQGCQAAZgAAAAIJAABrAAAAAwUAAAAGc2NhbGU4BQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUFAAAACXBtdEFtb3VudAUAAAAVZXhjaGFuZ2VSYXRpb0xpbWl0TWF4CQAAAgAAAAECAAAAHEluY29ycmVjdCBhcmdzIGFuZCBwbXQgcmF0aW8EAAAAC3NlbmRBc3NldElkAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQUAAAAIYXNzZXRJZEIFAAAACGFzc2V0SWRBBAAAAAZhbW91bnQJAQAAABNjYWxjdWxhdGVTZW5kQW1vdW50AAAABAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAABJtaW5BbW91bnRUb1JlY2VpdmUFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAQAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGsAAAADBQAAAAZhbW91bnQFAAAADWZlZUdvdmVybmFuY2UFAAAACWZlZVNjYWxlNgQAAAAOYW1vdW50TWludXNGZWUJAABrAAAAAwUAAAAGYW1vdW50CQAAZQAAAAIFAAAACWZlZVNjYWxlNgUAAAADZmVlBQAAAAlmZWVTY2FsZTYEAAAADSR0MDIyNjgyMjI5NDQDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQAFFAAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkABRQAAAACCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADmFtb3VudE1pbnVzRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQEAAAAC25ld0JhbGFuY2VBCAUAAAANJHQwMjI2ODIyMjk0NAAAAAJfMQQAAAALbmV3QmFsYW5jZUIIBQAAAA0kdDAyMjY4MjIyOTQ0AAAAAl8yBAAAABNkQXBwVGhyZXNob2xkQW1vdW50CQAAawAAAAMJAABkAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBQAAAA1kQXBwVGhyZXNob2xkCQAAaAAAAAIAAAAAAAAAAAIFAAAAE2RBcHBUaHJlc2hvbGRTY2FsZTIDAwkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQYJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUIJAQAAAA50aHJvd1RocmVzaG9sZAAAAAMFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgQAAAANJHQwMjMyNDIyMzMxNQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAACnBtdEFzc2V0SWQEAAAADXBtdFN0ckFzc2V0SWQIBQAAAA0kdDAyMzI0MjIzMzE1AAAAAl8xBAAAAAxwbXRBc3NldE5hbWUIBQAAAA0kdDAyMzI0MjIzMzE1AAAAAl8yBAAAAAtwbXREZWNpbWFscwgFAAAADSR0MDIzMjQyMjMzMTUAAAACXzMEAAAADSR0MDIzMzI4MjM0MDUJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtzZW5kQXNzZXRJZAQAAAAOc2VuZFN0ckFzc2V0SWQIBQAAAA0kdDAyMzMyODIzNDA1AAAAAl8xBAAAAA1zZW5kQXNzZXROYW1lCAUAAAANJHQwMjMzMjgyMzQwNQAAAAJfMgQAAAAMc2VuZERlY2ltYWxzCAUAAAANJHQwMjMzMjgyMzQwNQAAAAJfMwQAAAAGc3Rha2UxAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADXBtdFN0ckFzc2V0SWQJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAACXBtdEFtb3VudAkABEwAAAACBQAAAA1wbXRTdHJBc3NldElkBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAGc3Rha2UxBQAAAAZzdGFrZTEEAAAABnN0YWtlMgMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAA5zZW5kU3RyQXNzZXRJZAkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgcJAARMAAAAAgkAAGQAAAACBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkABEwAAAACBQAAAA5zZW5kU3RyQXNzZXRJZAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMgUAAAAGc3Rha2UyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEFAAAAC25ld0JhbGFuY2VBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIFAAAAC25ld0JhbGFuY2VCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50CQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADmFtb3VudE1pbnVzRmVlBQAAAAtzZW5kQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA13YWxsZXRBZGRyZXNzBQAAABBnb3Zlcm5hbmNlUmV3YXJkBQAAAAtzZW5kQXNzZXRJZAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAIc2h1dGRvd24AAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAALaXNBZG1pbkNhbGwAAAABBQAAAAFpAwkBAAAAASEAAAABBQAAAAZhY3RpdmUJAAACAAAAAQkAASwAAAACAgAAACJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAABmtDYXVzZQIAAAAadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQAAAAdzdXNwZW5kAAAAAQIAAAAPUGF1c2VkIGJ5IGFkbWluAAAAAWkBAAAACGFjdGl2YXRlAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAC2lzQWRtaW5DYWxsAAAAAQUAAAABaQMFAAAABmFjdGl2ZQkBAAAADXRocm93SXNBY3RpdmUAAAAACQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAdrQWN0aXZlBgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAAZrQ2F1c2UFAAAAA25pbAAAAAFpAQAAABl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAQAAAANYW1vdW50RW5yb2xsQQkAAGUAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBBQAAAAhiYWxhbmNlQQQAAAANYW1vdW50RW5yb2xsQgkAAGUAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCBQAAAAhiYWxhbmNlQgQAAAAMaW52YXJpYW50TmV3CQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAADWFtb3VudEVucm9sbEEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudEVucm9sbEIDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAADXdhbGxldEFkZHJlc3MJAAACAAAAAQIAAAAmT25seSB0aGUgd2FsbGV0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DAwkAAGYAAAACAAAAAAAAAAAABQAAAA1hbW91bnRFbnJvbGxBBgkAAGYAAAACAAAAAAAAAAAABQAAAA1hbW91bnRFbnJvbGxCCQEAAAAHc3VzcGVuZAAAAAECAAAAFkVucm9sbCBhbW91bnQgbmVnYXRpdmUDAwkAAAAAAAACBQAAAA1hbW91bnRFbnJvbGxBAAAAAAAAAAAACQAAAAAAAAIFAAAADWFtb3VudEVucm9sbEIAAAAAAAAAAAAHCQAAAgAAAAECAAAAEE5vIG1vbmV5IHRvIHRha2UEAAAABnN0YWtlMQMDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAALc3RyQXNzZXRJZEEJAABmAAAAAgUAAAANYW1vdW50RW5yb2xsQQAAAAAAAAAAAAcJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAADWFtb3VudEVucm9sbEEJAARMAAAAAgUAAAALc3RyQXNzZXRJZEEFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTEFAAAABnN0YWtlMQQAAAAGc3Rha2UyAwMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAAtzdHJBc3NldElkQgkAAGYAAAACBQAAAA1hbW91bnRFbnJvbGxCAAAAAAAAAAAABwkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAANYW1vdW50RW5yb2xsQgkABEwAAAACBQAAAAtzdHJBc3NldElkQgUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMgUAAAAGc3Rha2UyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50RW5yb2xsQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAA1hbW91bnRFbnJvbGxCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAICAAAADGxhc3RfaW5jb21lXwUAAAALc3RyQXNzZXRJZEEFAAAADWFtb3VudEVucm9sbEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAMbGFzdF9pbmNvbWVfBQAAAAtzdHJBc3NldElkQgUAAAANYW1vdW50RW5yb2xsQgUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAUd3JpdGVCaWdJbnRJbnZhcmlhbnQAAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAALaXNBZG1pbkNhbGwAAAABBQAAAAFpBAAAAAxpbnZhcmlhbnROZXcJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAAIYmFsYW5jZUEFAAAACGJhbGFuY2VCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcFAAAAA25pbAAAAAFpAQAAAAxzdGFrZVVuc3Rha2UAAAADAAAABXN0YWtlAAAABmFtb3VudAAAAA1hc3NldElkU3RyaW5nAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAALU9ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBpbnZva2UgdGhpcyBmdW5jdGlvbgQAAAANJHQwMjYzOTQyNjQ5NwkBAAAAEWNhbGNTdGFraW5nUGFyYW1zAAAAAwUAAAAFc3Rha2UFAAAABmFtb3VudAkAAlkAAAABBQAAAA1hc3NldElkU3RyaW5nBAAAAARjYWxsCAUAAAANJHQwMjYzOTQyNjQ5NwAAAAJfMQQAAAAEYWRkcggFAAAADSR0MDI2Mzk0MjY0OTcAAAACXzIEAAAABnBhcmFtcwgFAAAADSR0MDI2Mzk0MjY0OTcAAAACXzMEAAAACHBheW1lbnRzCAUAAAANJHQwMjYzOTQyNjQ5NwAAAAJfNAQAAAADaW52CQAD/AAAAAQFAAAABGFkZHIFAAAABGNhbGwFAAAABnBhcmFtcwUAAAAIcGF5bWVudHMDCQAAAAAAAAIFAAAAA2ludgUAAAADaW52BQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAATbXVsdGlTaWduZWRCeUFkbWlucwQAAAASYWRtaW5QdWJLZXkxU2lnbmVkAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAADGFkbWluUHViS2V5MQAAAAAAAAAAAQAAAAAAAAAAAAQAAAASYWRtaW5QdWJLZXkyU2lnbmVkAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAEFAAAADGFkbWluUHViS2V5MgAAAAAAAAAAAQAAAAAAAAAAAAQAAAASYWRtaW5QdWJLZXkzU2lnbmVkAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAIFAAAADGFkbWluUHViS2V5MwAAAAAAAAAAAQAAAAAAAAAAAAkAAGcAAAACCQAAZAAAAAIJAABkAAAAAgUAAAASYWRtaW5QdWJLZXkxU2lnbmVkBQAAABJhZG1pblB1YktleTJTaWduZWQFAAAAEmFkbWluUHViS2V5M1NpZ25lZAAAAAAAAAAAAgQAAAAHJG1hdGNoMAUAAAACdHgDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBAAAAANpbnYFAAAAByRtYXRjaDAEAAAAE2NhbGxUYWtlSW50b0FjY291bnQDCQAAAAAAAAIIBQAAAANpbnYAAAAEZEFwcAUAAAAEdGhpcwkAAAAAAAACCAUAAAADaW52AAAACGZ1bmN0aW9uAgAAABl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzBwQAAAANc2lnbmVkQnlBZG1pbgMDAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAADGFkbWluUHViS2V5MQYJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAAxhZG1pblB1YktleTIGCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAMYWRtaW5QdWJLZXkzBgkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAACmFkbVN0YWtpbmcDAwUAAAATY2FsbFRha2VJbnRvQWNjb3VudAUAAAANc2lnbmVkQnlBZG1pbgcGBQAAABNtdWx0aVNpZ25lZEJ5QWRtaW5zBQAAABNtdWx0aVNpZ25lZEJ5QWRtaW5zRctgIw==", "height": 1979168, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5yHdxw2eD3cVJ9kxJnGPabQ1vQLeFrNqmJJEwbp6BzUW Next: none 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.")
687684 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
688685 then throw("Only contract itself can invoke this function")
689686 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
687+ let $t02639426497 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
688+ let call = $t02639426497._1
689+ let addr = $t02639426497._2
690+ let params = $t02639426497._3
691+ let payments = $t02639426497._4
695692 let inv = invoke(addr, call, params, payments)
696693 if ((inv == inv))
697694 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)
679676 func writeBigIntInvariant () = valueOrElse(isAdminCall(i), {
680677 let invariantNew = invariantCalc(balanceA, balanceB)
681678 [IntegerEntry(kInvariant, invariantNew)]
682679 })
683680
684681
685682
686683 @Callable(i)
687684 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
688685 then throw("Only contract itself can invoke this function")
689686 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
687+ let $t02639426497 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
688+ let call = $t02639426497._1
689+ let addr = $t02639426497._2
690+ let params = $t02639426497._3
691+ let payments = $t02639426497._4
695692 let inv = invoke(addr, call, params, payments)
696693 if ((inv == inv))
697694 then nil
698695 else throw("Strict value is not equal to itself.")
699696 }
700697
701698
702699 @Verifier(tx)
703700 func verify () = {
704701 let multiSignedByAdmins = {
705702 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
706703 then 1
707704 else 0
708705 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
709706 then 1
710707 else 0
711708 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
712709 then 1
713710 else 0
714711 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
715712 }
716713 match tx {
717714 case inv: InvokeScriptTransaction =>
718715 let callTakeIntoAccount = if ((inv.dApp == this))
719716 then (inv.function == "takeIntoAccountExtraFunds")
720717 else false
721718 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
722719 then true
723720 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
724721 then true
725722 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
726723 then true
727724 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
728725 if (if (callTakeIntoAccount)
729726 then signedByAdmin
730727 else false)
731728 then true
732729 else multiSignedByAdmins
733730 case _ =>
734731 multiSignedByAdmins
735732 }
736733 }
737734

github/deemru/w8io/873ac7e 
120.18 ms