2022.01.25 16:22 [2959527] smart account 3PDrYPF6izza2sXWffzTPF7e2Fcir2CMpki > SELF 0.00000000 Waves

{ "type": 13, "id": "E1tnxPB63n1DKW6g676r5JpALeHJzLeSTbP7YzrRkh1K", "fee": 1400000, "feeAssetId": null, "timestamp": 1643116947037, "version": 2, "chainId": 87, "sender": "3PDrYPF6izza2sXWffzTPF7e2Fcir2CMpki", "senderPublicKey": "BHGZUnraSaYR29gbS4KuRhjkKjKbD22KfX6vjJdcMQd3", "proofs": [ "52AvxAsRLBGcRzntLq4s1JuwzZsnfbbYkYpPvpZ144v331CZJAjE37rcUgQ79RDZgffqtvdVQ3Jfq2326XZXVNuA" ], "script": "base64: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R2V0SW50ZWdlcgAAAAECAAAAEmdsb2JhbF9pbmRleFN0YWtlZAQAAAAVdG9rZW5CYWxhbmNlTGFzdENoZWNrBQAAABZ0b2tlbkVhcm5pbmdzTGFzdENoZWNrBAAAABNjdXJyZW50QmFsYW5jZURlbHRhCQAAZQAAAAIJAQAAAA9nZXRUb2tlbkJhbGFuY2UAAAABBQAAAAdhc3NldElkBQAAAAhhQmFsYW5jZQQAAAAUY3VycmVudFRva2VuRWFybmluZ3MDCQAAZgAAAAIFAAAAE2N1cnJlbnRCYWxhbmNlRGVsdGEFAAAAFXRva2VuQmFsYW5jZUxhc3RDaGVjawUAAAATY3VycmVudEJhbGFuY2VEZWx0YQUAAAAVdG9rZW5CYWxhbmNlTGFzdENoZWNrBAAAAAtuZXdFYXJuaW5ncwkAAGUAAAACBQAAABRjdXJyZW50VG9rZW5FYXJuaW5ncwUAAAAVdG9rZW5CYWxhbmNlTGFzdENoZWNrBAAAAAtuZXdJbnRlcmVzdAMJAAAAAAAAAgUAAAALdG90YWxTdGFrZWQAAAAAAAAAAAAAAAAAAAAAAAAJAABrAAAAAwUAAAALbmV3RWFybmluZ3MFAAAABlNjYWxlOAUAAAALdG90YWxTdGFrZWQEAAAAEWxhc3RDaGVja0ludGVyZXN0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABFnbG9iYWxfbGFzdENoZWNrXwUAAAAKYXNzZXRJZFN0cgIAAAAJX2ludGVyZXN0CQAAZAAAAAIFAAAAEWxhc3RDaGVja0ludGVyZXN0BQAAAAtuZXdJbnRlcmVzdAEAAAALY2xhaW1SZXN1bHQAAAABAAAAB2FkZHJlc3MEAAAACmFkZHJlc3NTdHIJAAQlAAAAAQUAAAAHYWRkcmVzcwQAAAAMcHV6emxlQW1vdW50CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgUAAAAKYWRkcmVzc1N0cgIAAAAMX2luZGV4U3Rha2VkCgEAAAAHaGFuZGxlcgAAAAIAAAAFYWNjdW0AAAAHYXNzZXRJZAQAAAAKYXNzZXRJZFN0cgkBAAAADmdldEFzc2V0U3RyaW5nAAAAAQUAAAAHYXNzZXRJZAQAAAAIYUJhbGFuY2UJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAICAAAAB2dsb2JhbF8JAQAAAA5nZXRBc3NldFN0cmluZwAAAAEFAAAAB2Fzc2V0SWQCAAAACF9iYWxhbmNlBAAAABZ0b2tlbkVhcm5pbmdzTGFzdENoZWNrCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABFnbG9iYWxfbGFzdENoZWNrXwUAAAAKYXNzZXRJZFN0cgIAAAAJX2Vhcm5pbmdzBAAAABRjdXJyZW50VG9rZW5JbnRlcmVzdAkBAAAAHWNhbGN1bGF0ZUN1cnJlbnRBc3NldEludGVyZXN0AAAABAUAAAAHYXNzZXRJZAUAAAAKYXNzZXRJZFN0cgUAAAAIYUJhbGFuY2UFAAAAFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sEAAAAFGN1cnJlbnRUb2tlbkVhcm5pbmdzCQABlgAAAAEJAARMAAAAAgUAAAAWdG9rZW5FYXJuaW5nc0xhc3RDaGVjawkABEwAAAACCQAAZQAAAAIJAQAAAA9nZXRUb2tlbkJhbGFuY2UAAAABBQAAAAdhc3NldElkBQAAAAhhQmFsYW5jZQUAAAADbmlsBAAAAAxyZXdhcmRBbW91bnQJAABrAAAAAwUAAAAMcHV6emxlQW1vdW50CQAAZQAAAAIFAAAAFGN1cnJlbnRUb2tlbkludGVyZXN0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAACmFkZHJlc3NTdHICAAAAC19sYXN0Q2hlY2tfBQAAAAphc3NldElkU3RyAgAAAAlfaW50ZXJlc3QFAAAABlNjYWxlOAQAAAAIdHJhbnNmZXIDCQAAAAAAAAIFAAAADHJld2FyZEFtb3VudAAAAAAAAAAAAAUAAAADbmlsCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB2FkZHJlc3MFAAAADHJld2FyZEFtb3VudAUAAAAHYXNzZXRJZAUAAAADbmlsCQAFFAAAAAIJAAROAAAAAgkABE4AAAACCAUAAAAFYWNjdW0AAAACXzEFAAAACHRyYW5zZmVyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAAC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b29sVG9rZW5zQW1vdW50AAAAAQgFAAAAAWkAAAAIcGF5bWVudHMEAAAADnBvb2xUb2tlbklzc3VlCQAEQwAAAAcCAAAAB1B1enpsZTUCAAAAFlB1enpsZSBTd2FwIFBvb2wgVG9rZW4FAAAAEWluaXRpYWxQb29sVG9rZW5zBQAAABFQb29sVG9rZW5EZWNpbWFscwYFAAAABHVuaXQAAAAAAAAAAAAEAAAAC3Bvb2xUb2tlbklkCQAEOAAAAAEFAAAADnBvb2xUb2tlbklzc3VlCQAETgAAAAIJAQAAAAtwcmVwYXJlTGlzdAAAAAAJAARMAAAAAgUAAAAOcG9vbFRva2VuSXNzdWUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50BQAAABFpbml0aWFsUG9vbFRva2VucwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAQZ2xvYmFsX3dhc0luaXRlZAAAAAAAAAAAAQkABEwAAAACCQEAAAALQmluYXJ5RW50cnkAAAACAgAAABNnbG9iYWxfcG9vbFRva2VuX2lkBQAAAAtwb29sVG9rZW5JZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEWluaXRpYWxQb29sVG9rZW5zBQAAAAtwb29sVG9rZW5JZAUAAAADbmlsAAAAAWkBAAAADWdlbmVyYXRlSW5kZXgAAAABAAAACm5lZWRDaGFuZ2UDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzBQAAAAFUCQAAAgAAAAEJAAEsAAAAAgIAAAA7eW91IG5lZWQgdG8gYXR0YWNoIGFsbCBwb29sIHRva2Vucy4gYW1vdW50IG9mIHBvb2wgdG9rZW5zOiAJAAGkAAAAAQUAAAABVAMJAQAAAAEhAAAAAQkBAAAAE2NoZWNrVG9rZW5zVmFsaWRpdHkAAAABCAUAAAABaQAAAAhwYXltZW50cwkAAAIAAAABAgAAABV3cm9uZyBhc3NldHMgYXR0YWNoZWQEAAAAB1BJc3N1ZWQJAQAAAA1nZXRNaW5QSXNzdWVkAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMEAAAAB3JlaXNzdWUJAQAAAAdSZWlzc3VlAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNTcpAAAAAQIAAAATZ2xvYmFsX3Bvb2xUb2tlbl9pZAUAAAAHUElzc3VlZAYEAAAABnJlc3VsdAkBAAAAE2hhbmRsZVBvb2xUb2tlbnNBZGQAAAAEBQAAAAdQSXNzdWVkCAUAAAABaQAAAAhwYXltZW50cwgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyBQAAAApuZWVkQ2hhbmdlCQAFFAAAAAIJAAROAAAAAgUAAAAGcmVzdWx0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAHUElzc3VlZAkBAAAADHRyeUdldEJpbmFyeQAAAAECAAAAE2dsb2JhbF9wb29sVG9rZW5faWQJAARMAAAAAgUAAAAHcmVpc3N1ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAUAAAAHUElzc3VlZAUAAAADbmlsBQAAAAdQSXNzdWVkAAAAAWkBAAAACnN0YWtlSW5kZXgAAAAABAAAAAphZGRyZXNzU3RyCQAEJQAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcgQAAAADcG10CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAwkBAAAAAiE9AAAAAgkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkCQEAAAAMdHJ5R2V0QmluYXJ5AAAAAQIAAAATZ2xvYmFsX3Bvb2xUb2tlbl9pZAkAAAIAAAABAgAAABR3cm9uZyBhc3NldCBhdHRhY2hlZAkBAAAAEGluZGV4U3Rha2VSZXN1bHQAAAACBQAAAAphZGRyZXNzU3RyCAUAAAADcG10AAAABmFtb3VudAAAAAFpAQAAAAx1bnN0YWtlSW5kZXgAAAABAAAADHB1enpsZUFtb3VudAQAAAAKYWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIEAAAAD3B1enpsZUF2YWlsYWJsZQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIFAAAACmFkZHJlc3NTdHICAAAADF9pbmRleFN0YWtlZAMJAABmAAAAAgUAAAAMcHV6emxlQW1vdW50BQAAAA9wdXp6bGVBdmFpbGFibGUJAAACAAAAAQIAAAAleW91IGRvbid0IGhhdmUgaW5kZXggdG9rZW5zIGF2YWlsYWJsZQkABE4AAAACCQEAAAALY2xhaW1SZXN1bHQAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAKYWRkcmVzc1N0cgIAAAAMX2luZGV4U3Rha2VkCQAAZQAAAAIFAAAAD3B1enpsZUF2YWlsYWJsZQUAAAAMcHV6emxlQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABJnbG9iYWxfaW5kZXhTdGFrZWQJAABlAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABJnbG9iYWxfaW5kZXhTdGFrZWQFAAAADHB1enpsZUFtb3VudAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADHB1enpsZUFtb3VudAkBAAAAEUBleHRyTmF0aXZlKDEwNTcpAAAAAQIAAAATZ2xvYmFsX3Bvb2xUb2tlbl9pZAUAAAADbmlsAAAAAWkBAAAAEWNsYWltSW5kZXhSZXdhcmRzAAAAAAkBAAAAC2NsYWltUmVzdWx0AAAAAQgFAAAAAWkAAAAGY2FsbGVyAAAAAWkBAAAAC3JlZGVlbUluZGV4AAAAAQAAAAxzZW5kVG9PcmlnaW4EAAAAA3BtdAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAMJAQAAAAIhPQAAAAIIBQAAAANwbXQAAAAHYXNzZXRJZAkBAAAADHRyeUdldEJpbmFyeQAAAAECAAAAE2dsb2JhbF9wb29sVG9rZW5faWQJAAACAAAAAQIAAAAecGxlYXNlIGF0dGFjaCBwb29sIHNoYXJlIHRva2VuBAAAAAlQUmVkZWVtZWQIBQAAAANwbXQAAAAGYW1vdW50BAAA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dWxhdGVVc2RuVmFsdWUAAAADBQAAAAdBc3NldEluBQAAAAhBbW91bnRJbgUAAAAOQXNzZXRJbkJhbGFuY2UFAAAAA25pbAUAAAARdXNkbkJhbGFuY2VDaGFuZ2UFAAAADmNsZWFuQW1vdW50T3V0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAUUAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAAB2dsb2JhbF8FAAAACGFzc2V0T3V0AgAAAAhfYmFsYW5jZQUAAAANbmV3QmFsYW5jZU91dAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAAB2dsb2JhbF8JAQAAAA5nZXRBc3NldFN0cmluZwAAAAEFAAAAB0Fzc2V0SW4CAAAACF9iYWxhbmNlBQAAAAxuZXdCYWxhbmNlSW4JAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA5jbGVhbkFtb3VudE91dAUAAAAIQXNzZXRPdXQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAADWdsb2JhbF92b2x1bWUJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAAA1nbG9iYWxfdm9sdW1lCQEAAAASY2FsY3VsYXRlVXNkblZhbHVlAAAAAwUAAAAHQXNzZXRJbgUAAAAIQW1vdW50SW4FAAAADkFzc2V0SW5CYWxhbmNlBQAAAANuaWwFAAAADmNsZWFuQW1vdW50T3V0AAAAAWkBAAAAEHN3YXBXaXRoUmVmZXJyYWwAAAADAAAACGFzc2V0T3V0AAAAB21pbmltdW0AAAAGcmVmS2V5BAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACEFtb3VudEluCQEAAAAFdmFsdWUAAAABCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQEAAAAB0Fzc2V0SW4IBQAAAANwbXQAAAAHYXNzZXRJZAQAAAAIQXNzZXRPdXQJAQAAAA1nZXRBc3NldEJ5dGVzAAAAAQUAAAAIYXNzZXRPdXQEAAAAD3JlZmVycmFsQWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABAQAAABoBV/UeNEq8uzpARwJdHenVP/z5u/N/pHDYRAQAAAAJcHV6emxlRmVlCQAAAAAAAAIIBQAAAAFpAAAABmNhbGxlcggFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyBAAAAA5Bc3NldEluQmFsYW5jZQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAHZ2xvYmFsXwkBAAAADmdldEFzc2V0U3RyaW5nAAAAAQUAAAAHQXNzZXRJbgIAAAAIX2JhbGFuY2UEAAAAD0Fzc2V0T3V0QmFsYW5jZQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAHZ2xvYmFsXwUAAAAIYXNzZXRPdXQCAAAACF9iYWxhbmNlBAAAAAlBbW91bnRPdXQJAQAAABJjYWxjdWxhdGVPdXRBbW91bnQAAAAFBQAAAAhBbW91bnRJbgUAAAAHQXNzZXRJbgUAAAAIQXNzZXRPdXQFAAAADkFzc2V0SW5CYWxhbmNlBQAAAA9Bc3NldE91dEJhbGFuY2UEAAAACWZlZUFtb3VudAkAAGsAAAADBQAAAAlBbW91bnRPdXQFAAAAA0ZlZQUAAAAIRmVlU2NhbGUEAAAAEXByb3RvY29sRmVlQW1vdW50CQAAawAAAAMFAAAACWZlZUFtb3VudAAAAAAAAAAAKAAAAAAAAAAAZAQAAAAOY2xlYW5BbW91bnRPdXQJAABlAAAAAgUAAAAJQW1vdW50T3V0BQAAAAlmZWVBbW91bnQDCQAAZgAAAAIFAAAAB21pbmltdW0FAAAADmNsZWFuQW1vdW50T3V0CQAAAgAAAAEJAAEsAAAAAgIAAAArYW1vdW50IHRvIHJlY2lldmUgaXMgbG93ZXIgdGhhbiBnaXZlbiBvbmU6IAkAAaQAAAABBQAAAA5jbGVhbkFtb3VudE91dAMJAABmAAAAAgAAAAAAAAAnEAUAAAAIQW1vdW50SW4JAAACAAAAAQIAAAAcc3VtIHRvIGV4Y2hhbmdlIGlzIHRvbyBzbWFsbAMJAABmAAAAAgAAAAAAAAAAAAkAAGUAAAACBQAAAA9Bc3NldE91dEJhbGFuY2UFAAAACUFtb3VudE91dAkAAAIAAAABAgAAABtjb250cmFjdCBpcyBvdXQgb2YgcmVzZXJ2ZXMEAAAADG5ld0JhbGFuY2VJbgkAAGQAAAACBQAAAA5Bc3NldEluQmFsYW5jZQUAAAAIQW1vdW50SW4EAAAADW5ld0JhbGFuY2VPdXQJAABlAAAAAgUAAAAPQXNzZXRPdXRCYWxhbmNlBQAAAAlBbW91bnRPdXQDBQAAAAlwdXp6bGVGZWUEAAAADmNhc2hiYWNrQW1vdW50BQAAABFwcm90b2NvbEZlZUFtb3VudAQAAAALdXNkbkFzc2V0SWQBAAAAILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRBAAAAAt1c2RuQmFsYW5jZQMJAAAAAAAAAgUAAAAHQXNzZXRJbgUAAAALdXNkbkFzc2V0SWQFAAAADG5ld0JhbGFuY2VJbgMJAAAAAAAAAgUAAAAIQXNzZXRPdXQFAAAAC3VzZG5Bc3NldElkBQAAAA1uZXdCYWxhbmNlT3V0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAdnbG9iYWxfCQEAAAAOZ2V0QXNzZXRTdHJpbmcAAAABBQAAAAt1c2RuQXNzZXRJZAIAAAAIX2JhbGFuY2UEAAAAEnVzZG5DYXNoYmFja0Ftb3VudAMJAAAAAAAAAgUAAAAIQXNzZXRPdXQFAAAAC3VzZG5Bc3NldElkBQAAAA5jYXNoYmFja0Ftb3VudAkBAAAAEmNhbGN1bGF0ZU91dEFtb3VudAAAAAUFAAAADmNhc2hiYWNrQW1vdW50BQAAAAhBc3NldE91dAUAAAALdXNkbkFzc2V0SWQFAAAADW5ld0JhbGFuY2VPdXQFAAAAC3VzZG5CYWxhbmNlBAAAABF1c2RuQmFsYW5jZUNoYW5nZQMJAQAAAAIhPQAAAAIFAAAACEFzc2V0T3V0BQAAAAt1c2RuQXNzZXRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAAB2dsb2JhbF8JAAJYAAAAAQUAAAALdXNkbkFzc2V0SWQCAAAACF9iYWxhbmNlCQAAZQAAAAIFAAAAC3VzZG5CYWxhbmNlBQAAABJ1c2RuQ2FzaGJhY2tBbW91bnQFAAAAA25pbAUAAAADbmlsBAAAAApwdXp6bGVQb29sCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFXkcbqKep5Zw/ZhO8ydpSzwHVC5DWDwdNYBAAAAA1wdXp6bGVBc3NldElkAQAAACDxGv4l/vaZOPRpKsTf4RLWR7LGyg66Nwmvd20fjqLlYwQAAAAUcHV6emxlQ2FzaGJhY2tBbW91bnQEAAAAByRtYXRjaDAJAAP9AAAABAUAAAAKcHV6emxlUG9vbAIAAAAEc3dhcAkABEwAAAACCQACWAAAAAEFAAAADXB1enpsZUFzc2V0SWQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAAt1c2RuQXNzZXRJZAkAAGkAAAACBQAAABJ1c2RuQ2FzaGJhY2tBbW91bnQAAAAAAAAAAAQFAAAAA25pbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAF4BQAAAAckbWF0Y2gwBQAAAAF4AAAAAAAAAAAAAwkAAAAAAAACBQAAABRwdXp6bGVDYXNoYmFja0Ftb3VudAUAAAAUcHV6emxlQ2FzaGJhY2tBbW91bnQEAAAADHN0YWtpbmdUb3BVcAkAA/0AAAAECQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFXlGiM+e6iuaqf1vWOvKmPZxqcBvQWKYm7AgAAAAt0b3BVcFJld2FyZAUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAAt1c2RuQXNzZXRJZAkAAGkAAAACBQAAABJ1c2RuQ2FzaGJhY2tBbW91bnQAAAAAAAAAAAIFAAAAA25pbAMJAAAAAAAAAgUAAAAMc3Rha2luZ1RvcFVwBQAAAAxzdGFraW5nVG9wVXAJAAUUAAAAAgkABE4AAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAHZ2xvYmFsXwUAAAAIYXNzZXRPdXQCAAAACF9iYWxhbmNlCQAAZAAAAAIFAAAADW5ld0JhbGFuY2VPdXQFAAAADmNhc2hiYWNrQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAHZ2xvYmFsXwkBAAAADmdldEFzc2V0U3RyaW5nAAAAAQUAAAAHQXNzZXRJbgIAAAAIX2JhbGFuY2UFAAAADG5ld0JhbGFuY2VJbgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADmNsZWFuQW1vdW50T3V0BQAAAAhBc3NldE91dAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFHB1enpsZUNhc2hiYWNrQW1vdW50BQAAAA1wdXp6bGVBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAD3JlZmVycmFsQWRkcmVzcwkAAGkAAAACBQAAABJ1c2RuQ2FzaGJhY2tBbW91bnQAAAAAAAAAAAQFAAAAC3VzZG5Bc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAA1nbG9iYWxfdm9sdW1lCQAAZAAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAANZ2xvYmFsX3ZvbHVtZQkBAAAAEmNhbGN1bGF0ZVVzZG5WYWx1ZQAAAAMFAAAAB0Fzc2V0SW4FAAAACEFtb3VudEluBQAAAA5Bc3NldEluQmFsYW5jZQUAAAADbmlsBQAAABF1c2RuQmFsYW5jZUNoYW5nZQUAAAAOY2xlYW5BbW91bnRPdXQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAHZ2xvYmFsXwUAAAAIYXNzZXRPdXQCAAAACF9iYWxhbmNlBQAAAA1uZXdCYWxhbmNlT3V0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAHZ2xvYmFsXwkBAAAADmdldEFzc2V0U3RyaW5nAAAAAQUAAAAHQXNzZXRJbgIAAAAIX2JhbGFuY2UFAAAADG5ld0JhbGFuY2VJbgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADmNsZWFuQW1vdW50T3V0BQAAAAhBc3NldE91dAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAANZ2xvYmFsX3ZvbHVtZQkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAADWdsb2JhbF92b2x1bWUJAQAAABJjYWxjdWxhdGVVc2RuVmFsdWUAAAADBQAAAAdBc3NldEluBQAAAAhBbW91bnRJbgUAAAAOQXNzZXRJbkJhbGFuY2UFAAAAA25pbAUAAAAOY2xlYW5BbW91bnRPdXQAAAAAZursEw==", "height": 2959527, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DrE58bmcSyGoMTk64azU9YGYqT8eHV8ST4nwvWNMkpMC Next: SZZ5CKzyxPcCTTDDDFv9ArS6DUhJoVde5wbEDhCokVZ Diff:
OldNewDifferences
445445
446446
447447 @Callable(i)
448-func unstakeIndex (puzzleAmount) = throw("stop")
448+func unstakeIndex (puzzleAmount) = {
449+ let addressStr = toString(i.originCaller)
450+ let puzzleAvailable = tryGetInteger((addressStr + "_indexStaked"))
451+ if ((puzzleAmount > puzzleAvailable))
452+ then throw("you don't have index tokens available")
453+ else (claimResult(i.originCaller) ++ [IntegerEntry((addressStr + "_indexStaked"), (puzzleAvailable - puzzleAmount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") - puzzleAmount)), ScriptTransfer(i.caller, puzzleAmount, getBinaryValue("global_poolToken_id"))])
454+ }
449455
450456
451457
452458 @Callable(i)
453-func claimIndexRewards () = throw("stop")
459+func claimIndexRewards () = claimResult(i.caller)
454460
455461
456462
457463 @Callable(i)
458-func redeemIndex (sendToOrigin) = throw("LP is closed yet")
464+func redeemIndex (sendToOrigin) = {
465+ let pmt = i.payments[0]
466+ if ((pmt.assetId != tryGetBinary("global_poolToken_id")))
467+ then throw("please attach pool share token")
468+ else {
469+ let PRedeemed = pmt.amount
470+ let result = handlePoolTokensRedeem(PRedeemed, if (sendToOrigin)
471+ then i.originCaller
472+ else i.caller)
473+ (result ++ [Burn(tryGetBinary("global_poolToken_id"), PRedeemed), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") - PRedeemed))])
474+ }
475+ }
459476
460477
461478
462479 @Callable(i)
463-func swap (assetOut,minimum) = throw("stop")
480+func swap (assetOut,minimum) = {
481+ let pmt = value(i.payments[0])
482+ let AmountIn = value(i.payments[0].amount)
483+ let AssetIn = pmt.assetId
484+ let AssetOut = getAssetBytes(assetOut)
485+ let puzzleFee = (i.caller == i.originCaller)
486+ let AssetInBalance = tryGetInteger((("global_" + getAssetString(AssetIn)) + "_balance"))
487+ let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
488+ let AmountOut = calculateOutAmount(AmountIn, AssetIn, AssetOut, AssetInBalance, AssetOutBalance)
489+ let feeAmount = fraction(AmountOut, Fee, FeeScale)
490+ let protocolFeeAmount = fraction(feeAmount, 40, 100)
491+ let cleanAmountOut = (AmountOut - feeAmount)
492+ if ((minimum > cleanAmountOut))
493+ then throw(("amount to recieve is lower than given one: " + toString(cleanAmountOut)))
494+ else if ((10000 > AmountIn))
495+ then throw("sum to exchange is too small")
496+ else if ((0 > (AssetOutBalance - AmountOut)))
497+ then throw("contract is out of reserves")
498+ else {
499+ let newBalanceIn = (AssetInBalance + AmountIn)
500+ let newBalanceOut = (AssetOutBalance - AmountOut)
501+ if (puzzleFee)
502+ then {
503+ let cashbackAmount = protocolFeeAmount
504+ let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
505+ let usdnBalance = if ((AssetIn == usdnAssetId))
506+ then newBalanceIn
507+ else if ((AssetOut == usdnAssetId))
508+ then newBalanceOut
509+ else tryGetInteger((("global_" + getAssetString(usdnAssetId)) + "_balance"))
510+ let usdnCashbackAmount = if ((AssetOut == usdnAssetId))
511+ then cashbackAmount
512+ else calculateOutAmount(cashbackAmount, AssetOut, usdnAssetId, newBalanceOut, usdnBalance)
513+ let usdnBalanceChange = if ((AssetOut != usdnAssetId))
514+ then [IntegerEntry((("global_" + toBase58String(usdnAssetId)) + "_balance"), (usdnBalance - usdnCashbackAmount))]
515+ else nil
516+ let puzzlePool = Address(base58'3PFDgzu1UtswAkCMxqqQjbTeHaX4cMab8Kh')
517+ let puzzleAssetId = base58'HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS'
518+ let puzzleCashbackAmount = match reentrantInvoke(puzzlePool, "swap", [toBase58String(puzzleAssetId), 0], [AttachedPayment(usdnAssetId, (usdnCashbackAmount / 2))]) {
519+ case x: Int =>
520+ x
521+ case _ =>
522+ 0
523+ }
524+ if ((puzzleCashbackAmount == puzzleCashbackAmount))
525+ then {
526+ let stakingTopUp = reentrantInvoke(Address(base58'3PFTbywqxtFfukX3HyT881g4iW5K4QL3FAS'), "topUpReward", nil, [AttachedPayment(usdnAssetId, (usdnCashbackAmount / 2))])
527+ if ((stakingTopUp == stakingTopUp))
528+ then $Tuple2(([IntegerEntry((("global_" + assetOut) + "_balance"), (newBalanceOut + cashbackAmount)), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), ScriptTransfer(i.caller, puzzleCashbackAmount, puzzleAssetId), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))] ++ usdnBalanceChange), cleanAmountOut)
529+ else throw("Strict value is not equal to itself.")
530+ }
531+ else throw("Strict value is not equal to itself.")
532+ }
533+ else $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), newBalanceOut), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))], cleanAmountOut)
534+ }
535+ }
464536
465537
466538
467539 @Callable(i)
468-func swapWithReferral (assetOut,minimum,refKey) = throw("stop")
540+func swapWithReferral (assetOut,minimum,refKey) = {
541+ let pmt = value(i.payments[0])
542+ let AmountIn = value(i.payments[0].amount)
543+ let AssetIn = pmt.assetId
544+ let AssetOut = getAssetBytes(assetOut)
545+ let referralAddress = Address(base58'3PQGxTse5eWufds6GA41UnbUNqLcCEnVJL3')
546+ let puzzleFee = (i.caller == i.originCaller)
547+ let AssetInBalance = tryGetInteger((("global_" + getAssetString(AssetIn)) + "_balance"))
548+ let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
549+ let AmountOut = calculateOutAmount(AmountIn, AssetIn, AssetOut, AssetInBalance, AssetOutBalance)
550+ let feeAmount = fraction(AmountOut, Fee, FeeScale)
551+ let protocolFeeAmount = fraction(feeAmount, 40, 100)
552+ let cleanAmountOut = (AmountOut - feeAmount)
553+ if ((minimum > cleanAmountOut))
554+ then throw(("amount to recieve is lower than given one: " + toString(cleanAmountOut)))
555+ else if ((10000 > AmountIn))
556+ then throw("sum to exchange is too small")
557+ else if ((0 > (AssetOutBalance - AmountOut)))
558+ then throw("contract is out of reserves")
559+ else {
560+ let newBalanceIn = (AssetInBalance + AmountIn)
561+ let newBalanceOut = (AssetOutBalance - AmountOut)
562+ if (puzzleFee)
563+ then {
564+ let cashbackAmount = protocolFeeAmount
565+ let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
566+ let usdnBalance = if ((AssetIn == usdnAssetId))
567+ then newBalanceIn
568+ else if ((AssetOut == usdnAssetId))
569+ then newBalanceOut
570+ else tryGetInteger((("global_" + getAssetString(usdnAssetId)) + "_balance"))
571+ let usdnCashbackAmount = if ((AssetOut == usdnAssetId))
572+ then cashbackAmount
573+ else calculateOutAmount(cashbackAmount, AssetOut, usdnAssetId, newBalanceOut, usdnBalance)
574+ let usdnBalanceChange = if ((AssetOut != usdnAssetId))
575+ then [IntegerEntry((("global_" + toBase58String(usdnAssetId)) + "_balance"), (usdnBalance - usdnCashbackAmount))]
576+ else nil
577+ let puzzlePool = Address(base58'3PFDgzu1UtswAkCMxqqQjbTeHaX4cMab8Kh')
578+ let puzzleAssetId = base58'HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS'
579+ let puzzleCashbackAmount = match reentrantInvoke(puzzlePool, "swap", [toBase58String(puzzleAssetId), 0], [AttachedPayment(usdnAssetId, (usdnCashbackAmount / 4))]) {
580+ case x: Int =>
581+ x
582+ case _ =>
583+ 0
584+ }
585+ if ((puzzleCashbackAmount == puzzleCashbackAmount))
586+ then {
587+ let stakingTopUp = reentrantInvoke(Address(base58'3PFTbywqxtFfukX3HyT881g4iW5K4QL3FAS'), "topUpReward", nil, [AttachedPayment(usdnAssetId, (usdnCashbackAmount / 2))])
588+ if ((stakingTopUp == stakingTopUp))
589+ then $Tuple2(([IntegerEntry((("global_" + assetOut) + "_balance"), (newBalanceOut + cashbackAmount)), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), ScriptTransfer(i.caller, puzzleCashbackAmount, puzzleAssetId), ScriptTransfer(referralAddress, (usdnCashbackAmount / 4), usdnAssetId), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))] ++ usdnBalanceChange), cleanAmountOut)
590+ else throw("Strict value is not equal to itself.")
591+ }
592+ else throw("Strict value is not equal to itself.")
593+ }
594+ else $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), newBalanceOut), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))], cleanAmountOut)
595+ }
596+ }
469597
470598
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let T = 10
55
66 let assetIds = [unit, base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS', base58'Ehie5xYpeN8op1Cctc6aGUrqx8jq3jtf1DSjXDbfm7aT', base58'DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p', base58'6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g', base58'7LMV3s1J4dKpMQZqge5sKYoFkZRLojnnU49aerqos4yg', base58'9sQutD5HnRvjM1uui5cVC4w9xkMPAfYEV8ymug3Mon2Y', base58'HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS', base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p']
77
88 let AssetsWeights = [20, 10, 5, 5, 5, 5, 5, 20, 10, 15]
99
1010 let AssetsWeightsDecimals = 2
1111
1212 let PoolTokenDecimals = 8
1313
1414 let Decimals = [8, 8, 8, 8, 6, 8, 8, 8, 6, 6]
1515
1616 let Scales = [100000000, 100000000, 100000000, 100000000, 1000000, 100000000, 100000000, 100000000, 1000000, 1000000]
1717
1818 let Fee = 200
1919
2020 let Scale = 10000
2121
2222 let Scale8 = 100000000
2323
2424 let FeeScale = 10000
2525
2626 let feeAggregator = Address(base58'3PES7MMthaKJx9WMXnNCY3cwTGG9nD9YT8f')
2727
2828 func getAssetString (assetId) = match assetId {
2929 case b: ByteVector =>
3030 toBase58String(b)
3131 case _ =>
3232 "WAVES"
3333 }
3434
3535
3636 func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
3737 then unit
3838 else fromBase58String(assetIdStr)
3939
4040
4141 let earnedAssets = assetIds
4242
4343 func tryGetInteger (key) = match getInteger(this, key) {
4444 case b: Int =>
4545 b
4646 case _ =>
4747 0
4848 }
4949
5050
5151 func tryGetBinary (key) = match getBinary(this, key) {
5252 case b: ByteVector =>
5353 b
5454 case _ =>
5555 base58''
5656 }
5757
5858
5959 func getCurrentTokenBalance (tokenType) = {
6060 let tokenId = getAssetString(assetIds[tokenType])
6161 tryGetInteger((("global_" + tokenId) + "_balance"))
6262 }
6363
6464
6565 func calculatePIssued (amount,tokenId) = {
6666 let Psupply = tryGetInteger("global_poolToken_amount")
6767 let Balance = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
6868 fraction(amount, Psupply, Balance, DOWN)
6969 }
7070
7171
7272 func getMinPIssued (payments) = {
7373 func handler (accum,current) = {
7474 let PIssued = calculatePIssued(current.amount, current.assetId)
7575 if (if ((accum == 0))
7676 then true
7777 else (accum > PIssued))
7878 then PIssued
7979 else accum
8080 }
8181
8282 let minPIssed = {
8383 let $l = payments
8484 let $s = size($l)
8585 let $acc0 = 0
8686 func $f0_1 ($a,$i) = if (($i >= $s))
8787 then $a
8888 else handler($a, $l[$i])
8989
9090 func $f0_2 ($a,$i) = if (($i >= $s))
9191 then $a
9292 else throw("List size exceeds 10")
9393
9494 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
9595 }
9696 minPIssed
9797 }
9898
9999
100100 func calculateUsdnValue (assetId,amount,aBalance) = {
101101 let usdnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
102102 let usdnWeight = AssetsWeights[value(indexOf(assetIds, usdnId))]
103103 let assetWeight = AssetsWeights[value(indexOf(assetIds, assetId))]
104104 let usdnBalance = tryGetInteger((("global_" + getAssetString(usdnId)) + "_balance"))
105105 fraction(amount, (usdnBalance / usdnWeight), (aBalance / assetWeight))
106106 }
107107
108108
109109 func checkTokensValidity (payments) = {
110110 func handler1 (accum,payment) = (accum ++ [payment.assetId])
111111
112112 let ids = {
113113 let $l = payments
114114 let $s = size($l)
115115 let $acc0 = nil
116116 func $f0_1 ($a,$i) = if (($i >= $s))
117117 then $a
118118 else handler1($a, $l[$i])
119119
120120 func $f0_2 ($a,$i) = if (($i >= $s))
121121 then $a
122122 else throw("List size exceeds 10")
123123
124124 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
125125 }
126126 if ((ids == ids))
127127 then {
128128 func handler2 (accum,assetId) = if ((indexOf(ids, assetId) != unit))
129129 then (accum + 1)
130130 else throw(("asset not attached: " + getAssetString(assetId)))
131131
132132 let checks = {
133133 let $l = assetIds
134134 let $s = size($l)
135135 let $acc0 = 0
136136 func $f1_1 ($a,$i) = if (($i >= $s))
137137 then $a
138138 else handler2($a, $l[$i])
139139
140140 func $f1_2 ($a,$i) = if (($i >= $s))
141141 then $a
142142 else throw("List size exceeds 10")
143143
144144 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
145145 }
146146 if ((checks == checks))
147147 then true
148148 else throw("Strict value is not equal to itself.")
149149 }
150150 else throw("Strict value is not equal to itself.")
151151 }
152152
153153
154154 func handlePoolTokensAdd (PIssued,payments,userAddress,needChange) = {
155155 func getTokenPaymentAmount (tokenId) = {
156156 func handler (accum,payment) = if ((payment.assetId == tokenId))
157157 then payment.amount
158158 else accum
159159
160160 let $l = payments
161161 let $s = size($l)
162162 let $acc0 = 0
163163 func $f0_1 ($a,$i) = if (($i >= $s))
164164 then $a
165165 else handler($a, $l[$i])
166166
167167 func $f0_2 ($a,$i) = if (($i >= $s))
168168 then $a
169169 else throw("List size exceeds 10")
170170
171171 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
172172 }
173173
174174 func handleTokenChange (accum,tokenId) = {
175175 let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
176176 let PSupply = tryGetInteger("global_poolToken_amount")
177177 let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
178178 let Dk = fraction((fraction((PSupply + PIssued), tokenDecimals, PSupply, DOWN) - tokenDecimals), Bk, tokenDecimals, DOWN)
179179 let paymentAmount = getTokenPaymentAmount(tokenId)
180180 let toReturn = ((if ((paymentAmount != 0))
181181 then paymentAmount
182182 else 0) - Dk)
183183 let t = if (needChange)
184184 then [ScriptTransfer(userAddress, toReturn, tokenId)]
185185 else nil
186186 ((accum ++ t) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
187187 }
188188
189189 let $l = assetIds
190190 let $s = size($l)
191191 let $acc0 = nil
192192 func $f0_1 ($a,$i) = if (($i >= $s))
193193 then $a
194194 else handleTokenChange($a, $l[$i])
195195
196196 func $f0_2 ($a,$i) = if (($i >= $s))
197197 then $a
198198 else throw("List size exceeds 10")
199199
200200 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
201201 }
202202
203203
204204 func handlePoolTokensRedeem (PRedeemed,userAddress) = {
205205 func handleTokenRedeem (accum,tokenId) = {
206206 let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
207207 let PSupply = tryGetInteger("global_poolToken_amount")
208208 let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
209209 let amount = fraction((tokenDecimals - fraction((PSupply - PRedeemed), tokenDecimals, PSupply, DOWN)), Bk, tokenDecimals, DOWN)
210210 (accum ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk - amount))])
211211 }
212212
213213 func handleTokenRedeem2 (accum,tokenId) = {
214214 let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
215215 let PSupply = tryGetInteger("global_poolToken_amount")
216216 let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
217217 let amount = fraction((tokenDecimals - fraction((PSupply - PRedeemed), tokenDecimals, PSupply, DOWN)), Bk, tokenDecimals, DOWN)
218218 (accum ++ [ScriptTransfer(userAddress, amount, tokenId)])
219219 }
220220
221221 ({
222222 let $l = assetIds
223223 let $s = size($l)
224224 let $acc0 = nil
225225 func $f0_1 ($a,$i) = if (($i >= $s))
226226 then $a
227227 else handleTokenRedeem($a, $l[$i])
228228
229229 func $f0_2 ($a,$i) = if (($i >= $s))
230230 then $a
231231 else throw("List size exceeds 10")
232232
233233 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
234234 } ++ {
235235 let $l = assetIds
236236 let $s = size($l)
237237 let $acc0 = nil
238238 func $f1_1 ($a,$i) = if (($i >= $s))
239239 then $a
240240 else handleTokenRedeem2($a, $l[$i])
241241
242242 func $f1_2 ($a,$i) = if (($i >= $s))
243243 then $a
244244 else throw("List size exceeds 10")
245245
246246 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
247247 })
248248 }
249249
250250
251251 func calculateOutAmount (AmountIn,assetIn,assetOut,BalanceIn,BalanceOut) = {
252252 let IndexIn = value(indexOf(assetIds, assetIn))
253253 let IndexOut = value(indexOf(assetIds, assetOut))
254254 if ((IndexIn == IndexOut))
255255 then throw("inalid tokens pair")
256256 else fraction(BalanceOut, (Scales[IndexOut] - pow(fraction(BalanceIn, Scales[IndexIn], (BalanceIn + AmountIn)), Decimals[IndexIn], fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut]), 4, Decimals[IndexOut], CEILING)), Scales[IndexOut], DOWN)
257257 }
258258
259259
260260 func getTokenBalance (assetId) = match assetId {
261261 case t: ByteVector =>
262262 assetBalance(this, t)
263263 case _ =>
264264 wavesBalance(this).available
265265 }
266266
267267
268268 func calculateCurrentAssetInterest (assetId,assetIdStr,aBalance,tokenEarningsLastCheck) = {
269269 let totalStaked = tryGetInteger("global_indexStaked")
270270 let tokenBalanceLastCheck = tokenEarningsLastCheck
271271 let currentBalanceDelta = (getTokenBalance(assetId) - aBalance)
272272 let currentTokenEarnings = if ((currentBalanceDelta > tokenBalanceLastCheck))
273273 then currentBalanceDelta
274274 else tokenBalanceLastCheck
275275 let newEarnings = (currentTokenEarnings - tokenBalanceLastCheck)
276276 let newInterest = if ((totalStaked == 0))
277277 then 0
278278 else fraction(newEarnings, Scale8, totalStaked)
279279 let lastCheckInterest = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_interest"))
280280 (lastCheckInterest + newInterest)
281281 }
282282
283283
284284 func claimResult (address) = {
285285 let addressStr = toString(address)
286286 let puzzleAmount = tryGetInteger((addressStr + "_indexStaked"))
287287 func handler (accum,assetId) = {
288288 let assetIdStr = getAssetString(assetId)
289289 let aBalance = tryGetInteger((("global_" + getAssetString(assetId)) + "_balance"))
290290 let tokenEarningsLastCheck = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_earnings"))
291291 let currentTokenInterest = calculateCurrentAssetInterest(assetId, assetIdStr, aBalance, tokenEarningsLastCheck)
292292 let currentTokenEarnings = max([tokenEarningsLastCheck, (getTokenBalance(assetId) - aBalance)])
293293 let rewardAmount = fraction(puzzleAmount, (currentTokenInterest - tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"))), Scale8)
294294 let transfer = if ((rewardAmount == 0))
295295 then nil
296296 else [ScriptTransfer(address, rewardAmount, assetId)]
297297 $Tuple2(((accum._1 ++ transfer) ++ [IntegerEntry((("global_lastCheck_" + assetIdStr) + "_earnings"), (currentTokenEarnings - rewardAmount)), IntegerEntry((("global_lastCheck_" + assetIdStr) + "_interest"), currentTokenInterest), IntegerEntry((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"), currentTokenInterest)]), (accum._2 + calculateUsdnValue(assetId, rewardAmount, aBalance)))
298298 }
299299
300300 let accum = {
301301 let $l = earnedAssets
302302 let $s = size($l)
303303 let $acc0 = $Tuple2(nil, 0)
304304 func $f0_1 ($a,$i) = if (($i >= $s))
305305 then $a
306306 else handler($a, $l[$i])
307307
308308 func $f0_2 ($a,$i) = if (($i >= $s))
309309 then $a
310310 else throw("List size exceeds 10")
311311
312312 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
313313 }
314314 (accum._1 ++ [IntegerEntry((addressStr + "_claimedRewardValue"), (tryGetInteger((addressStr + "_claimedRewardValue")) + accum._2)), IntegerEntry((addressStr + "_lastClaim"), lastBlock.timestamp)])
315315 }
316316
317317
318318 func indexStakeResult (addressStr,amount) = {
319319 let li = claimResult(addressFromStringValue(addressStr))
320320 (li ++ [IntegerEntry((addressStr + "_indexStaked"), (tryGetInteger((addressStr + "_indexStaked")) + amount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") + amount))])
321321 }
322322
323323
324324 @Callable(i)
325325 func preInit () = {
326326 func handler (accum,assetNum) = if ((assetNum >= T))
327327 then accum
328328 else (accum ++ [IntegerEntry((("static_" + getAssetString(assetIds[assetNum])) + "_scale"), Scales[assetNum]), IntegerEntry((("static_" + getAssetString(assetIds[assetNum])) + "_weight"), AssetsWeights[assetNum])])
329329
330330 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
331331 let $s = size($l)
332332 let $acc0 = nil
333333 func $f0_1 ($a,$i) = if (($i >= $s))
334334 then $a
335335 else handler($a, $l[$i])
336336
337337 func $f0_2 ($a,$i) = if (($i >= $s))
338338 then $a
339339 else throw("List size exceeds 10")
340340
341341 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
342342 }
343343
344344
345345
346346 @Callable(i)
347347 func deInit () = if ((i.caller != this))
348348 then throw("admin only")
349349 else [IntegerEntry("global_wasInited", 0)]
350350
351351
352352
353353 @Callable(i)
354354 func init () = {
355355 func prepareList () = {
356356 func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + getAssetString(n.assetId)) + "_balance"), n.amount)])
357357
358358 let $l = i.payments
359359 let $s = size($l)
360360 let $acc0 = nil
361361 func $f0_1 ($a,$i) = if (($i >= $s))
362362 then $a
363363 else handler($a, $l[$i])
364364
365365 func $f0_2 ($a,$i) = if (($i >= $s))
366366 then $a
367367 else throw("List size exceeds 10")
368368
369369 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
370370 }
371371
372372 func calculatePoolTokensAmount (payments) = {
373373 func handler (accum,pmt) = {
374374 let assetId = pmt.assetId
375375 func handler2 (accum,n) = if ((n == assetId))
376376 then value(indexOf(assetIds, n))
377377 else accum
378378
379379 let Token = {
380380 let $l = assetIds
381381 let $s = size($l)
382382 let $acc0 = 1
383383 func $f0_1 ($a,$i) = if (($i >= $s))
384384 then $a
385385 else handler2($a, $l[$i])
386386
387387 func $f0_2 ($a,$i) = if (($i >= $s))
388388 then $a
389389 else throw("List size exceeds 10")
390390
391391 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
392392 }
393393 (accum * pow(pmt.amount, Decimals[Token], AssetsWeights[Token], AssetsWeightsDecimals, 1, FLOOR))
394394 }
395395
396396 let $l = payments
397397 let $s = size($l)
398398 let $acc0 = 1
399399 func $f0_1 ($a,$i) = if (($i >= $s))
400400 then $a
401401 else handler($a, $l[$i])
402402
403403 func $f0_2 ($a,$i) = if (($i >= $s))
404404 then $a
405405 else throw("List size exceeds 10")
406406
407407 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
408408 }
409409
410410 if ((tryGetInteger("global_wasInited") > 0))
411411 then throw("pool already inited")
412412 else {
413413 let initialPoolTokens = calculatePoolTokensAmount(i.payments)
414414 let poolTokenIssue = Issue("Puzzle5", "Puzzle Swap Pool Token", initialPoolTokens, PoolTokenDecimals, true, unit, 0)
415415 let poolTokenId = calculateAssetId(poolTokenIssue)
416416 (prepareList() ++ [poolTokenIssue, IntegerEntry("global_poolToken_amount", initialPoolTokens), IntegerEntry("global_wasInited", 1), BinaryEntry("global_poolToken_id", poolTokenId), ScriptTransfer(i.caller, initialPoolTokens, poolTokenId)])
417417 }
418418 }
419419
420420
421421
422422 @Callable(i)
423423 func generateIndex (needChange) = if ((size(i.payments) != T))
424424 then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
425425 else if (!(checkTokensValidity(i.payments)))
426426 then throw("wrong assets attached")
427427 else {
428428 let PIssued = getMinPIssued(i.payments)
429429 let reissue = Reissue(getBinaryValue("global_poolToken_id"), PIssued, true)
430430 let result = handlePoolTokensAdd(PIssued, i.payments, i.originCaller, needChange)
431431 $Tuple2((result ++ [ScriptTransfer(i.caller, PIssued, tryGetBinary("global_poolToken_id")), reissue, IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))]), PIssued)
432432 }
433433
434434
435435
436436 @Callable(i)
437437 func stakeIndex () = {
438438 let addressStr = toString(i.originCaller)
439439 let pmt = i.payments[0]
440440 if ((value(pmt.assetId) != tryGetBinary("global_poolToken_id")))
441441 then throw("wrong asset attached")
442442 else indexStakeResult(addressStr, pmt.amount)
443443 }
444444
445445
446446
447447 @Callable(i)
448-func unstakeIndex (puzzleAmount) = throw("stop")
448+func unstakeIndex (puzzleAmount) = {
449+ let addressStr = toString(i.originCaller)
450+ let puzzleAvailable = tryGetInteger((addressStr + "_indexStaked"))
451+ if ((puzzleAmount > puzzleAvailable))
452+ then throw("you don't have index tokens available")
453+ else (claimResult(i.originCaller) ++ [IntegerEntry((addressStr + "_indexStaked"), (puzzleAvailable - puzzleAmount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") - puzzleAmount)), ScriptTransfer(i.caller, puzzleAmount, getBinaryValue("global_poolToken_id"))])
454+ }
449455
450456
451457
452458 @Callable(i)
453-func claimIndexRewards () = throw("stop")
459+func claimIndexRewards () = claimResult(i.caller)
454460
455461
456462
457463 @Callable(i)
458-func redeemIndex (sendToOrigin) = throw("LP is closed yet")
464+func redeemIndex (sendToOrigin) = {
465+ let pmt = i.payments[0]
466+ if ((pmt.assetId != tryGetBinary("global_poolToken_id")))
467+ then throw("please attach pool share token")
468+ else {
469+ let PRedeemed = pmt.amount
470+ let result = handlePoolTokensRedeem(PRedeemed, if (sendToOrigin)
471+ then i.originCaller
472+ else i.caller)
473+ (result ++ [Burn(tryGetBinary("global_poolToken_id"), PRedeemed), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") - PRedeemed))])
474+ }
475+ }
459476
460477
461478
462479 @Callable(i)
463-func swap (assetOut,minimum) = throw("stop")
480+func swap (assetOut,minimum) = {
481+ let pmt = value(i.payments[0])
482+ let AmountIn = value(i.payments[0].amount)
483+ let AssetIn = pmt.assetId
484+ let AssetOut = getAssetBytes(assetOut)
485+ let puzzleFee = (i.caller == i.originCaller)
486+ let AssetInBalance = tryGetInteger((("global_" + getAssetString(AssetIn)) + "_balance"))
487+ let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
488+ let AmountOut = calculateOutAmount(AmountIn, AssetIn, AssetOut, AssetInBalance, AssetOutBalance)
489+ let feeAmount = fraction(AmountOut, Fee, FeeScale)
490+ let protocolFeeAmount = fraction(feeAmount, 40, 100)
491+ let cleanAmountOut = (AmountOut - feeAmount)
492+ if ((minimum > cleanAmountOut))
493+ then throw(("amount to recieve is lower than given one: " + toString(cleanAmountOut)))
494+ else if ((10000 > AmountIn))
495+ then throw("sum to exchange is too small")
496+ else if ((0 > (AssetOutBalance - AmountOut)))
497+ then throw("contract is out of reserves")
498+ else {
499+ let newBalanceIn = (AssetInBalance + AmountIn)
500+ let newBalanceOut = (AssetOutBalance - AmountOut)
501+ if (puzzleFee)
502+ then {
503+ let cashbackAmount = protocolFeeAmount
504+ let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
505+ let usdnBalance = if ((AssetIn == usdnAssetId))
506+ then newBalanceIn
507+ else if ((AssetOut == usdnAssetId))
508+ then newBalanceOut
509+ else tryGetInteger((("global_" + getAssetString(usdnAssetId)) + "_balance"))
510+ let usdnCashbackAmount = if ((AssetOut == usdnAssetId))
511+ then cashbackAmount
512+ else calculateOutAmount(cashbackAmount, AssetOut, usdnAssetId, newBalanceOut, usdnBalance)
513+ let usdnBalanceChange = if ((AssetOut != usdnAssetId))
514+ then [IntegerEntry((("global_" + toBase58String(usdnAssetId)) + "_balance"), (usdnBalance - usdnCashbackAmount))]
515+ else nil
516+ let puzzlePool = Address(base58'3PFDgzu1UtswAkCMxqqQjbTeHaX4cMab8Kh')
517+ let puzzleAssetId = base58'HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS'
518+ let puzzleCashbackAmount = match reentrantInvoke(puzzlePool, "swap", [toBase58String(puzzleAssetId), 0], [AttachedPayment(usdnAssetId, (usdnCashbackAmount / 2))]) {
519+ case x: Int =>
520+ x
521+ case _ =>
522+ 0
523+ }
524+ if ((puzzleCashbackAmount == puzzleCashbackAmount))
525+ then {
526+ let stakingTopUp = reentrantInvoke(Address(base58'3PFTbywqxtFfukX3HyT881g4iW5K4QL3FAS'), "topUpReward", nil, [AttachedPayment(usdnAssetId, (usdnCashbackAmount / 2))])
527+ if ((stakingTopUp == stakingTopUp))
528+ then $Tuple2(([IntegerEntry((("global_" + assetOut) + "_balance"), (newBalanceOut + cashbackAmount)), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), ScriptTransfer(i.caller, puzzleCashbackAmount, puzzleAssetId), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))] ++ usdnBalanceChange), cleanAmountOut)
529+ else throw("Strict value is not equal to itself.")
530+ }
531+ else throw("Strict value is not equal to itself.")
532+ }
533+ else $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), newBalanceOut), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))], cleanAmountOut)
534+ }
535+ }
464536
465537
466538
467539 @Callable(i)
468-func swapWithReferral (assetOut,minimum,refKey) = throw("stop")
540+func swapWithReferral (assetOut,minimum,refKey) = {
541+ let pmt = value(i.payments[0])
542+ let AmountIn = value(i.payments[0].amount)
543+ let AssetIn = pmt.assetId
544+ let AssetOut = getAssetBytes(assetOut)
545+ let referralAddress = Address(base58'3PQGxTse5eWufds6GA41UnbUNqLcCEnVJL3')
546+ let puzzleFee = (i.caller == i.originCaller)
547+ let AssetInBalance = tryGetInteger((("global_" + getAssetString(AssetIn)) + "_balance"))
548+ let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
549+ let AmountOut = calculateOutAmount(AmountIn, AssetIn, AssetOut, AssetInBalance, AssetOutBalance)
550+ let feeAmount = fraction(AmountOut, Fee, FeeScale)
551+ let protocolFeeAmount = fraction(feeAmount, 40, 100)
552+ let cleanAmountOut = (AmountOut - feeAmount)
553+ if ((minimum > cleanAmountOut))
554+ then throw(("amount to recieve is lower than given one: " + toString(cleanAmountOut)))
555+ else if ((10000 > AmountIn))
556+ then throw("sum to exchange is too small")
557+ else if ((0 > (AssetOutBalance - AmountOut)))
558+ then throw("contract is out of reserves")
559+ else {
560+ let newBalanceIn = (AssetInBalance + AmountIn)
561+ let newBalanceOut = (AssetOutBalance - AmountOut)
562+ if (puzzleFee)
563+ then {
564+ let cashbackAmount = protocolFeeAmount
565+ let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
566+ let usdnBalance = if ((AssetIn == usdnAssetId))
567+ then newBalanceIn
568+ else if ((AssetOut == usdnAssetId))
569+ then newBalanceOut
570+ else tryGetInteger((("global_" + getAssetString(usdnAssetId)) + "_balance"))
571+ let usdnCashbackAmount = if ((AssetOut == usdnAssetId))
572+ then cashbackAmount
573+ else calculateOutAmount(cashbackAmount, AssetOut, usdnAssetId, newBalanceOut, usdnBalance)
574+ let usdnBalanceChange = if ((AssetOut != usdnAssetId))
575+ then [IntegerEntry((("global_" + toBase58String(usdnAssetId)) + "_balance"), (usdnBalance - usdnCashbackAmount))]
576+ else nil
577+ let puzzlePool = Address(base58'3PFDgzu1UtswAkCMxqqQjbTeHaX4cMab8Kh')
578+ let puzzleAssetId = base58'HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS'
579+ let puzzleCashbackAmount = match reentrantInvoke(puzzlePool, "swap", [toBase58String(puzzleAssetId), 0], [AttachedPayment(usdnAssetId, (usdnCashbackAmount / 4))]) {
580+ case x: Int =>
581+ x
582+ case _ =>
583+ 0
584+ }
585+ if ((puzzleCashbackAmount == puzzleCashbackAmount))
586+ then {
587+ let stakingTopUp = reentrantInvoke(Address(base58'3PFTbywqxtFfukX3HyT881g4iW5K4QL3FAS'), "topUpReward", nil, [AttachedPayment(usdnAssetId, (usdnCashbackAmount / 2))])
588+ if ((stakingTopUp == stakingTopUp))
589+ then $Tuple2(([IntegerEntry((("global_" + assetOut) + "_balance"), (newBalanceOut + cashbackAmount)), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), ScriptTransfer(i.caller, puzzleCashbackAmount, puzzleAssetId), ScriptTransfer(referralAddress, (usdnCashbackAmount / 4), usdnAssetId), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))] ++ usdnBalanceChange), cleanAmountOut)
590+ else throw("Strict value is not equal to itself.")
591+ }
592+ else throw("Strict value is not equal to itself.")
593+ }
594+ else $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), newBalanceOut), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))], cleanAmountOut)
595+ }
596+ }
469597
470598

github/deemru/w8io/786bc32 
74.40 ms