tx · 4qVtjFAoFbpgeKFeHNZZeKB2kcRCfraZauffNcgmRUzF

3NCKcx8q29dg7aH2z9PcySzoLqzqazdXrVP:  -0.01400000 Waves

2021.07.09 14:17 [1606004] smart account 3NCKcx8q29dg7aH2z9PcySzoLqzqazdXrVP > SELF 0.00000000 Waves

{ "type": 13, "id": "4qVtjFAoFbpgeKFeHNZZeKB2kcRCfraZauffNcgmRUzF", "fee": 1400000, "feeAssetId": null, "timestamp": 1625829437648, "version": 2, "chainId": 84, "sender": "3NCKcx8q29dg7aH2z9PcySzoLqzqazdXrVP", "senderPublicKey": "E4ibyK7ZaBBWkvezNq5YNqL5qB828H3gTK5toMo2jrk5", "proofs": [ "3ABZ6Tcjpii7PuAUiLh9N2bs8GDHbzyNX8h6L4v6URLTFd7qMbG89SrTbLM5uUjQ79WmCmvyzpC8zjDyjWTQbe5n", "2eFLX6CTSS496Di1V57NWzcT3Xc7pPgvs6mmsxN6iyG4PkwwuVzb4eR9iFFVpwXX5wTMjcbotEqakZA6WYjjMsKg" ], "script": "base64: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BQAAABJ0b2tlblJlY2VpdmVBbW91bnQEAAAAAXkJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAAEnRva2VuUmVjZWl2ZUFtb3VudAQAAAAMaW52YXJpYW50TmV3AwkAAAAAAAACBQAAAAd0b2tlbklkBQAAAAhhc3NldElkQQkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAF4CQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQDCQAAAAAAAAIFAAAAB3Rva2VuSWQFAAAACGFzc2V0SWRCCQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAUAAAABeQkAAAIAAAABAgAAABZXcm9uZyBhc3NldCBpbiBwYXltZW50BAAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwkAAGsAAAADBQAAAAZzY2FsZTgFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3CgEAAAANZ2V0U3RlcEFtb3VudAAAAAIAAAADYWNjAAAABHN0ZXADCQAAAAAAAAIFAAAAA2FjYwD//////////wQAAAAMYW1vdW50VG9TZW5kCQAAZQAAAAIFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAkAAGkAAAACCQAAaAAAAAIFAAAABHN0ZXAFAAAAHmRlbHRhQmV0d2Vlbk1heEFuZE1pblNlbmRWYWx1ZQAAAAAAAAAABQQAAAANc3RlcEludmFyaWFudAMJAAAAAAAAAgUAAAAHdG9rZW5JZAUAAAAIYXNzZXRJZEEJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAABeAkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAMYW1vdW50VG9TZW5kCQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADGFtb3VudFRvU2VuZAUAAAABeQMJAABmAAAAAgUAAAANc3RlcEludmFyaWFudAUAAAAJaW52YXJpYW50BQAAAAxhbW91bnRUb1NlbmQA//////////8FAAAAA2FjYwQAAAAKc3RlcEFtb3VudAQAAAANJGxpc3Q1NzMyNTc3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BCUAAAABBQAAAAR0aGlzBAAAAA1zaGFyZURlY2ltYWxzCQAAaQAAAAIJAABkAAAAAgUAAAAMcG10RGVjaW1hbHNBBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAIEAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkAAGsAAAADCQAAbAAAAAYFAAAACnBtdEFtb3VudEEFAAAADHBtdERlY2ltYWxzQQAAAAAAAAAABQAAAAAAAAAAAQUAAAAMcG10RGVjaW1hbHNBBQAAAAhIQUxGRE9XTgkAAGwAAAAGBQAAAApwbXRBbW91bnRCBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQgUAAAAISEFMRkRPV04JAABsAAAABgAAAAAAAAAACgAAAAAAAAAAAAUAAAANc2hhcmVEZWNpbWFscwAAAAAAAAAAAAAAAAAAAAAAAAUAAAAISEFMRkRPV04EAAAACnNoYXJlSXNzdWUJAARCAAAABQUAAAAJc2hhcmVOYW1lBQAAABBzaGFyZURlc2NyaXB0aW9uBQAAABJzaGFyZUluaXRpYWxTdXBwbHkFAAAADXNoYXJlRGVjaW1hbHMGBAAAAAxzaGFyZUlzc3VlSWQJAAQ4AAAAAQUAAAAKc2hhcmVJc3N1ZQQAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkBAAAADWludmFyaWFudENhbGMAAAACBQAAAApwbXRBbW91bnRBBQAAAApwbXRBbW91bnRCCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACGtWZXJzaW9uBQAAAAd2ZXJzaW9uCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAdrQWN0aXZlBgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAlrQXNzZXRJZEEFAAAADnBtdFN0ckFzc2V0SWRBCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACWtBc3NldElkQgUAAAAOcG10U3RyQXNzZXRJZEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCBQAAAApwbXRBbW91bnRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAARrRmVlBQAAAANmZWUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEmtGZWVTY2FsZURlbGltaXRlcgUAAAAJZmVlU2NhbGU2CQAETAAAAAIFAAAACnNoYXJlSXNzdWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAANa1NoYXJlQXNzZXRJZAkAAlgAAAABBQAAAAxzaGFyZUlzc3VlSWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEWtTaGFyZUFzc2V0U3VwcGx5BQAAABJzaGFyZUluaXRpYWxTdXBwbHkJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABJzaGFyZUluaXRpYWxTdXBwbHkFAAAADHNoYXJlSXNzdWVJZAUAAAADbmlsAAAAAWkBAAAAFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMAAAABAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAAtwbXRBc3NldElkQQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAALcG10QXNzZXRJZEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAAB2Fzc2V0SWQEAAAACnBtdEFtb3VudEEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQQQAAAAKcG10QW1vdW50QgkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAZhbW91bnQFAAAAC3BtdEFzc2V0SWRCBAAAAAp0b2tlblJhdGlvCQAAawAAAAMJAABrAAAAAwUAAAAGc2NhbGU4BQAAAAhiYWxhbmNlQQUAAAAKcG10QW1vdW50QQUAAAAGc2NhbGUzCQAAawAAAAMFAAAABnNjYWxlOAUAAAAIYmFsYW5jZUIFAAAACnBtdEFtb3VudEIEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwUAAAAGc2NhbGU4BQAAAApwbXRBbW91bnRBBQAAAAhiYWxhbmNlQQQAAAATcmF0aW9TaGFyZVRva2Vuc0luQgkAAGsAAAADBQAAAAZzY2FsZTgFAAAACnBtdEFtb3VudEIFAAAACGJhbGFuY2VCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAZzY2FsZTgEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAKcG10QW1vdW50QQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAQAAAA90aHJvd0lzSW5hY3RpdmUAAAAAAwMJAABmAAAAAgAAAAAAAAAAAAUAAAARc2xpcHBhZ2VUb2xlcmFuY2UGCQAAZgAAAAIFAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAAAAAAAAKCQAAAgAAAAECAAAAIFNsaXBwYWdlIHRvbGVyYW5jZSBtdXN0IGJlIDw9IDElAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAgkAAAIAAAABAgAAABxUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAQAAAAIhPQAAAAIFAAAAC3BtdEFzc2V0SWRBBQAAAAhhc3NldElkQQYJAQAAAAIhPQAAAAIFAAAAC3BtdEFzc2V0SWRCBQAAAAhhc3NldElkQgkBAAAAC3Rocm93QXNzZXRzAAAAAAMDCQAAZgAAAAIJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTMJAABlAAAAAgUAAAAOc2xpcHBhZ2VTY2FsZTMFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAAA5zbGlwcGFnZVNjYWxlMwUAAAAKdG9rZW5SYXRpbwYJAABmAAAAAgUAAAAKdG9rZW5SYXRpbwkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlMwkAAGQAAAACBQAAAA5zbGlwcGFnZVNjYWxlMwUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAADnNsaXBwYWdlU2NhbGUzCQAAAgAAAAECAAAAPUluY29ycmVjdCBhc3NldHMgYW1vdW50OiBhbW91bnRzIG11c3QgaGF2ZSB0aGUgY29udHJhY3QgcmF0aW8DCQAAAAAAAAIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAAAAAAAAAAAAAkAAAIAAAABAgAAAB1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QQUAAAALcG10QXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRCBQAAAAtwbXRBc3NldElkQgUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABkAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BQAAAAxzaGFyZUFzc2V0SWQFAAAAA25pbAAAAAFpAQAAABVyZXBsZW5pc2hXaXRoT25lVG9rZW4AAAACAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkAAAATdmlydHVhbFN3YXBUb2tlbkdldAQAAAANJHQwMTMxMzExMzIwNgkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDEzMTMxMTMyMDYAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxMzEzMTEzMjA2AAAAAl8yBAAAAAlpbnZhcmlhbnQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAAIYmFsYW5jZUEFAAAACGJhbGFuY2VCBAAAAA9wbXRNaW5UaHJlc2hvbGQAAAAAAABMS0AEAAAAHXRocmVzaG9sZFZhbHVlRm9yTWluVG9sZXJhbmNlAAAAAAAC+vCABAAAAAl0b2xlcmFuY2UDCQAAZgAAAAIFAAAAHXRocmVzaG9sZFZhbHVlRm9yTWluVG9sZXJhbmNlBQAAAAlwbXRBbW91bnQAAAAAAAABhqAAAAAAAAAAAAEEAAAAHHNsaXBwYWdlVmFsdWVNaW5Gb3JSZXBsZW5pc2gJAABlAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4BQAAAAl0b2xlcmFuY2UAAAAAAACYloAEAAAAHHNsaXBwYWdlVmFsdWVNYXhGb3JSZXBsZW5pc2gJAABkAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4BQAAAAl0b2xlcmFuY2UAAAAAAACYloAEAAAAF3NsaXBwYWdlVmFsdWVNaW5Gb3JTd2FwCQAAZQAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAAAAAAAAAAAAQAAAAAAAJiWgAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAQAAAA90aHJvd0lzSW5hY3RpdmUAAAAAAwkAAGYAAAACBQAAAA9wbXRNaW5UaHJlc2hvbGQFAAAACXBtdEFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD1BheW1lbnQgYW1vdW50IAkAAaQAAAABBQAAAAlwbXRBbW91bnQCAAAAJyBkb2VzIG5vdCBleGNlZWQgdGhlIG1pbmltdW0gYW1vdW50IG9mIAkAAaQAAAABBQAAAA9wbXRNaW5UaHJlc2hvbGQCAAAAByB0b2tlbnMDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEIHCQEAAAALdGhyb3dBc3NldHMAAAAABAAAAA0kdDAxNDI3MzE0ODc5AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkABRgAAAAGCQAAZQAAAAIFAAAACXBtdEFtb3VudAUAAAATdmlydHVhbFN3YXBUb2tlblBheQUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAATdmlydHVhbFN3YXBUb2tlblBheQkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgkABRgAAAAGBQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQAAZQAAAAIFAAAACXBtdEFtb3VudAUAAAATdmlydHVhbFN3YXBUb2tlblBheQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAATdmlydHVhbFN3YXBUb2tlblBheQUAAAAIYmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAQAAAARdmlydHVhbFJlcGxlbmlzaEEIBQAAAA0kdDAxNDI3MzE0ODc5AAAAAl8xBAAAABF2aXJ0dWFsUmVwbGVuaXNoQggFAAAADSR0MDE0MjczMTQ4NzkAAAACXzIEAAAAEWJhbGFuY2VBZnRlclN3YXBBCAUAAAANJHQwMTQyNzMxNDg3OQAAAAJfMwQAAAARYmFsYW5jZUFmdGVyU3dhcEIIBQAAAA0kdDAxNDI3MzE0ODc5AAAAAl80BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDE0MjczMTQ4NzkAAAACXzUEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMTQyNzMxNDg3OQAAAAJfNgQAAAAMaW52YXJpYW50TmV3CQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAAEWJhbGFuY2VBZnRlclN3YXBBBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQgQAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8JAABrAAAAAwUAAAAGc2NhbGU4BQAAAAlpbnZhcmlhbnQFAAAADGludmFyaWFudE5ldwQAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAkAAGkAAAACCQAAawAAAAMJAABoAAAAAgUAAAAGc2NhbGU4BQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBBBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQgkAAGsAAAADBQAAAAZzY2FsZTgFAAAAEXZpcnR1YWxSZXBsZW5pc2hBBQAAABF2aXJ0dWFsUmVwbGVuaXNoQgQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgUAAAANZEFwcFRocmVzaG9sZAkAAGgAAAACAAAAAAAAAAACBQAAABNkQXBwVGhyZXNob2xkU2NhbGUyAwMJAABnAAAAAgUAAAAXc2xpcHBhZ2VWYWx1ZU1pbkZvclN3YXAFAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvBgkAAGYAAAACBQAAAAlpbnZhcmlhbnQFAAAADGludmFyaWFudE5ldwkAAAIAAAABAgAAADpJbmNvcnJlY3QgdmlydHVhbFN3YXBUb2tlblBheSBvciB2aXJ0dWFsU3dhcFRva2VuR2V0IHZhbHVlAwMJAABmAAAAAgUAAAAcc2xpcHBhZ2VWYWx1ZU1pbkZvclJlcGxlbmlzaAUAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAYJAABmAAAAAgUAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAUAAAAcc2xpcHBhZ2VWYWx1ZU1heEZvclJlcGxlbmlzaAkAAAIAAAABAgAAAGxTd2FwIHdpdGggdmlydHVhbFN3YXBUb2tlblBheSBhbmQgdmlydHVhbFN3YXBUb2tlbkdldCBpcyBwb3NzaWJsZSwgYnV0IHJhdGlvIGFmdGVyIHZpcnR1YWwgc3dhcCBpcyBpbmNvcnJlY3QDAwkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQYJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUIJAQAAAA50aHJvd1RocmVzaG9sZAAAAAMFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgQAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkAAGsAAAADCQEAAAAQZGVkdWN0U3Rha2luZ0ZlZQAAAAIFAAAAEXZpcnR1YWxSZXBsZW5pc2hBBQAAAAhhc3NldElkQQUAAAAGc2NhbGU4BQAAABFiYWxhbmNlQWZ0ZXJTd2FwQQQAAAATcmF0aW9TaGFyZVRva2Vuc0luQgkAAGsAAAADCQEAAAAQZGVkdWN0U3Rha2luZ0ZlZQAAAAIFAAAAEXZpcnR1YWxSZXBsZW5pc2hCBQAAAAhhc3NldElkQgUAAAAGc2NhbGU4BQAAABFiYWxhbmNlQWZ0ZXJTd2FwQgQAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAAawAAAAMJAAGXAAAAAQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIFAAAAA25pbAUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAGc2NhbGU4BAAAAB1zaGFyZVRva2VuVG9QYXlBbW91bnRBZnRlckZlZQkAAGsAAAADBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABlAAAAAgUAAAAJZmVlU2NhbGU2CQAAaQAAAAIFAAAAA2ZlZQAAAAAAAAAAAgUAAAAJZmVlU2NhbGU2BAAAABpzaGFyZVRva2VuR292ZXJuYW5jZVJld2FyZAkAAGsAAAADBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABpAAAAAgUAAAANZmVlR292ZXJuYW5jZQAAAAAAAAAAAgUAAAAJZmVlU2NhbGU2BAAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5BCQAAawAAAAMFAAAAGnNoYXJlVG9rZW5Hb3Zlcm5hbmNlUmV3YXJkBQAAAAhiYWxhbmNlQQUAAAAQc2hhcmVBc3NldFN1cHBseQQAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQgkAAGsAAAADBQAAABpzaGFyZVRva2VuR292ZXJuYW5jZVJld2FyZAUAAAAIYmFsYW5jZUIFAAAAEHNoYXJlQXNzZXRTdXBwbHkEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGUAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQQkAAGUAAAACBQAAAAtuZXdCYWxhbmNlQgUAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQgkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAdc2hhcmVUb2tlblRvUGF5QW1vdW50QWZ0ZXJGZWUGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAdc2hhcmVUb2tlblRvUGF5QW1vdW50QWZ0ZXJGZWUFAAAADHNoYXJlQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAdnb3ZBZGRyBQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5BBQAAAAhhc3NldElkQQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAdnb3ZBZGRyBQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5CBQAAAAhhc3NldElkQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBCQEAAAAQZGVkdWN0U3Rha2luZ0ZlZQAAAAIJAABlAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkEFAAAACGFzc2V0SWRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAgkAAGUAAAACBQAAAAtuZXdCYWxhbmNlQgUAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQgUAAAAIYXNzZXRJZEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEWtTaGFyZUFzc2V0U3VwcGx5CQAAZAAAAAIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAAHXNoYXJlVG9rZW5Ub1BheUFtb3VudEFmdGVyRmVlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkBQAAAANuaWwAAAABaQEAAAAId2l0aGRyYXcAAAAABAAAAA0kdDAxNzg4MTE4MDI0CQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMTc4ODExODAyNAAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDE3ODgxMTgwMjQAAAACXzIEAAAADGFtb3VudFRvUGF5QQkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAACCQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUEFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAACGFzc2V0SWRBBAAAAAxhbW91bnRUb1BheUIJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAgkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VCBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAhhc3NldElkQgQAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkBAAAADWludmFyaWFudENhbGMAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADGFtb3VudFRvUGF5QgMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAQAAAA90aHJvd0lzSW5hY3RpdmUAAAAAAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAADHNoYXJlQXNzZXRJZAkAAAIAAAABCQABLAAAAAICAAAAJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAkAAlgAAAABBQAAAAxzaGFyZUFzc2V0SWQDCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAAAwMJAABmAAAAAgUAAAAMYW1vdW50VG9QYXlBBQAAABFhdmFpbGFibGVCYWxhbmNlQQYJAABmAAAAAgUAAAAMYW1vdW50VG9QYXlCBQAAABFhdmFpbGFibGVCYWxhbmNlQgkBAAAAInRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZXMAAAACBQAAAAxhbW91bnRUb1BheUEFAAAADGFtb3VudFRvUGF5QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAMYW1vdW50VG9QYXlCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQkAAGUAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACmtJbnZhcmlhbnQFAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAARMAAAAAgkBAAAABEJ1cm4AAAACBQAAAAxzaGFyZUFzc2V0SWQFAAAACXBtdEFtb3VudAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADGFtb3VudFRvUGF5QQUAAAAIYXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUIFAAAACGFzc2V0SWRCBQAAAANuaWwAAAABaQEAAAAIZXhjaGFuZ2UAAAACAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQAAABJtaW5BbW91bnRUb1JlY2VpdmUEAAAADSR0MDE5MzgyMTk0NTcJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxOTM4MjE5NDU3AAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTkzODIxOTQ1NwAAAAJfMgMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAQAAAA90aHJvd0lzSW5hY3RpdmUAAAAAAwkAAGcAAAACAAAAAAAAAAAABQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACAgAAACtFc3RpbWF0ZWQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQABpAAAAAEFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQMJAABmAAAAAgUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAA7TWluaW1hbCBhbW91bnQgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIGVzdGltYXRlZC4gRXN0aW1hdGVkOiAJAAGkAAAAAQUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlAgAAAAsuIE1pbmltYWw6IAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEIHCQEAAAALdGhyb3dBc3NldHMAAAAAAwkAAGYAAAACAAAAAAAAmJaABQAAAAlwbXRBbW91bnQJAAACAAAAAQIAAAAwT25seSBzd2FwIG9mIDEwLjAwMDAwMCBvciBtb3JlIHRva2VucyBpcyBhbGxvd2VkAwMJAABmAAAAAgUAAAAVZXhjaGFuZ2VSYXRpb0xpbWl0TWluCQAAawAAAAMFAAAABnNjYWxlOAUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQGCQAAZgAAAAIJAABrAAAAAwUAAAAGc2NhbGU4BQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUFAAAACXBtdEFtb3VudAUAAAAVZXhjaGFuZ2VSYXRpb0xpbWl0TWF4CQAAAgAAAAECAAAAHEluY29ycmVjdCBhcmdzIGFuZCBwbXQgcmF0aW8EAAAAC3NlbmRBc3NldElkAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQUAAAAIYXNzZXRJZEIFAAAACGFzc2V0SWRBBAAAAAZhbW91bnQJAQAAABNjYWxjdWxhdGVTZW5kQW1vdW50AAAABAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAABJtaW5BbW91bnRUb1JlY2VpdmUFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAQAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGsAAAADBQAAAAZhbW91bnQFAAAADWZlZUdvdmVybmFuY2UFAAAACWZlZVNjYWxlNgQAAAAOYW1vdW50TWludXNGZWUJAABrAAAAAwUAAAAGYW1vdW50CQAAZQAAAAIFAAAACWZlZVNjYWxlNgUAAAADZmVlBQAAAAlmZWVTY2FsZTYEAAAADSR0MDIwODgzMjExNDYDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQAFFAAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkABRQAAAACCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADmFtb3VudE1pbnVzRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQEAAAAC25ld0JhbGFuY2VBCAUAAAANJHQwMjA4ODMyMTE0NgAAAAJfMQQAAAALbmV3QmFsYW5jZUIIBQAAAA0kdDAyMDg4MzIxMTQ2AAAAAl8yBAAAABNkQXBwVGhyZXNob2xkQW1vdW50CQAAawAAAAMJAABkAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBQAAAA1kQXBwVGhyZXNob2xkCQAAaAAAAAIAAAAAAAAAAAIFAAAAE2RBcHBUaHJlc2hvbGRTY2FsZTIDAwkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQYJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUIJAQAAAA50aHJvd1RocmVzaG9sZAAAAAMFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgMDAwkAAAAAAAACBQAAAAhhc3NldElkQQUAAAAEVVNETgkAAAAAAAACBQAAAAtzZW5kQXNzZXRJZAUAAAAIYXNzZXRJZEEHCQAAZwAAAAIFAAAAEHN0YWtlZEFtb3VudFVTRE4FAAAAC25ld0JhbGFuY2VBBwkBAAAAIXRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZQAAAAMFAAAADmFtb3VudE1pbnVzRmVlBQAAABFhdmFpbGFibGVCYWxhbmNlQQUAAAAKYXNzZXROYW1lQQMDAwkAAAAAAAACBQAAAAhhc3NldElkQgUAAAAEVVNETgkAAAAAAAACBQAAAAtzZW5kQXNzZXRJZAUAAAAIYXNzZXRJZEIHCQAAZwAAAAIFAAAAEHN0YWtlZEFtb3VudFVTRE4FAAAAC25ld0JhbGFuY2VCBwkBAAAAIXRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZQAAAAMFAAAADmFtb3VudE1pbnVzRmVlBQAAABFhdmFpbGFibGVCYWxhbmNlQgUAAAAKYXNzZXROYW1lQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA5hbW91bnRNaW51c0ZlZQUAAAALc2VuZEFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAHZ292QWRkcgUAAAAQZ292ZXJuYW5jZVJld2FyZAUAAAALc2VuZEFzc2V0SWQFAAAAA25pbAAAAAFpAQAAAAhzaHV0ZG93bgAAAAADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAEJAAEsAAAAAgIAAAAiREFwcCBpcyBhbHJlYWR5IHN1c3BlbmRlZC4gQ2F1c2U6IAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAZrQ2F1c2UCAAAAGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAARhZG0xCQAETAAAAAIFAAAABGFkbTIJAARMAAAAAgUAAAAEYWRtMwkABEwAAAACBQAAAAxhZG1TdGFydFN0b3AFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQEAAAAOdGhyb3dPbmx5QWRtaW4AAAAACQEAAAAHc3VzcGVuZAAAAAECAAAAD1BhdXNlZCBieSBhZG1pbgAAAAFpAQAAAAhhY3RpdmF0ZQAAAAADBQAAAAhpc0FjdGl2ZQkBAAAADXRocm93SXNBY3RpdmUAAAAAAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAARhZG0xCQAETAAAAAIFAAAABGFkbTIJAARMAAAAAgUAAAAEYWRtMwkABEwAAAACBQAAAAxhZG1TdGFydFN0b3AFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQEAAAAOdGhyb3dPbmx5QWRtaW4AAAAACQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAdrQWN0aXZlBgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAAZrQ2F1c2UFAAAAA25pbAAAAAFpAQAAABl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzAAAAAQAAAAthbW91bnRMZWF2ZQQAAAAMdW5jb3VudGFibGVBCQAAZQAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFAAAACGJhbGFuY2VBBAAAAAx1bmNvdW50YWJsZUIJAABlAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgUAAAAIYmFsYW5jZUIEAAAADWFtb3VudEVucm9sbEEJAABlAAAAAgUAAAAMdW5jb3VudGFibGVBAwkAAAAAAAACBQAAAAhhc3NldElkQQUAAAAEdW5pdAUAAAALYW1vdW50TGVhdmUAAAAAAAAAAAAEAAAADWFtb3VudEVucm9sbEIJAABlAAAAAgUAAAAMdW5jb3VudGFibGVCAwkAAAAAAAACBQAAAAhhc3NldElkQgUAAAAEdW5pdAUAAAALYW1vdW50TGVhdmUAAAAAAAAAAAAEAAAADGludmFyaWFudE5ldwkBAAAADWludmFyaWFudENhbGMAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAA1hbW91bnRFbnJvbGxBCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAA1hbW91bnRFbnJvbGxCAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkBAAAAD3Rocm93SXNJbmFjdGl2ZQAAAAADCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAQAAAA50aHJvd09ubHlBZG1pbgAAAAADCQAAZgAAAAIAAAAAAAAAAAAFAAAAC2Ftb3VudExlYXZlCQAAAgAAAAEJAAEsAAAAAgIAAAAzQXJndW1lbnQgJ2Ftb3VudExlYXZlJyBjYW5ub3QgYmUgbmVnYXRpdmUuIEFjdHVhbDogCQAB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", "height": 1606004, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 59ZC9u1knRKuRymW7U8cMEXsQQG9yVtRSPYexSTRqXUk Next: 4oxtWRjAnnQyUjtAXmEjHYgcv4jQ4DryRuPAoHzzpvFF Diff:
OldNewDifferences
8787
8888 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
8989
90-let invariant = getIntegerValue(this, kInvariant)
91-
9290 let fee = 500
9391
9492 let feeGovernance = 200
170168 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
171169 let slippageValue = (scale8 - ((scale8 * 1) / 10000000))
172170 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
171+ let invariant = invariantCalc(balanceA, balanceB)
173172 let x = (balanceA + tokenReceiveAmount)
174173 let y = (balanceB + tokenReceiveAmount)
175174 let invariantNew = if ((tokenId == assetIdA))
191190 else acc
192191
193192 let stepAmount = {
194- let $list57265769 = [1, 2, 3, 4, 5]
195- let $size57265769 = size($list57265769)
196- let $acc057265769 = -1
197- if (($size57265769 == 0))
198- then $acc057265769
193+ let $list57325775 = [1, 2, 3, 4, 5]
194+ let $size57325775 = size($list57325775)
195+ let $acc057325775 = -1
196+ if (($size57325775 == 0))
197+ then $acc057325775
199198 else {
200- let $acc157265769 = getStepAmount($acc057265769, $list57265769[0])
201- if (($size57265769 == 1))
202- then $acc157265769
199+ let $acc157325775 = getStepAmount($acc057325775, $list57325775[0])
200+ if (($size57325775 == 1))
201+ then $acc157325775
203202 else {
204- let $acc257265769 = getStepAmount($acc157265769, $list57265769[1])
205- if (($size57265769 == 2))
206- then $acc257265769
203+ let $acc257325775 = getStepAmount($acc157325775, $list57325775[1])
204+ if (($size57325775 == 2))
205+ then $acc257325775
207206 else {
208- let $acc357265769 = getStepAmount($acc257265769, $list57265769[2])
209- if (($size57265769 == 3))
210- then $acc357265769
207+ let $acc357325775 = getStepAmount($acc257325775, $list57325775[2])
208+ if (($size57325775 == 3))
209+ then $acc357325775
211210 else {
212- let $acc457265769 = getStepAmount($acc357265769, $list57265769[3])
213- if (($size57265769 == 4))
214- then $acc457265769
211+ let $acc457325775 = getStepAmount($acc357325775, $list57325775[3])
212+ if (($size57325775 == 4))
213+ then $acc457325775
215214 else {
216- let $acc557265769 = getStepAmount($acc457265769, $list57265769[4])
217- if (($size57265769 == 5))
218- then $acc557265769
215+ let $acc557325775 = getStepAmount($acc457325775, $list57325775[4])
216+ if (($size57325775 == 5))
217+ then $acc557325775
219218 else {
220- let $acc657265769 = getStepAmount($acc557265769, $list57265769[5])
219+ let $acc657325775 = getStepAmount($acc557325775, $list57325775[5])
221220 throw("List size exceed 5")
222221 }
223222 }
287286
288287 @Callable(i)
289288 func init () = {
290- let $t084478524 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
291- let pmtAmountA = $t084478524._1
292- let pmtAssetIdA = $t084478524._2
293- let $t085298606 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
294- let pmtAmountB = $t085298606._1
295- let pmtAssetIdB = $t085298606._2
296- let $t086118688 = getAssetInfo(pmtAssetIdA)
297- let pmtStrAssetIdA = $t086118688._1
298- let pmtAssetNameA = $t086118688._2
299- let pmtDecimalsA = $t086118688._3
300- let $t086938770 = getAssetInfo(pmtAssetIdB)
301- let pmtStrAssetIdB = $t086938770._1
302- let pmtAssetNameB = $t086938770._2
303- let pmtDecimalsB = $t086938770._3
289+ let $t084538530 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
290+ let pmtAmountA = $t084538530._1
291+ let pmtAssetIdA = $t084538530._2
292+ let $t085358612 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
293+ let pmtAmountB = $t085358612._1
294+ let pmtAssetIdB = $t085358612._2
295+ let $t086178694 = getAssetInfo(pmtAssetIdA)
296+ let pmtStrAssetIdA = $t086178694._1
297+ let pmtAssetNameA = $t086178694._2
298+ let pmtDecimalsA = $t086178694._3
299+ let $t086998776 = getAssetInfo(pmtAssetIdB)
300+ let pmtStrAssetIdB = $t086998776._1
301+ let pmtAssetNameB = $t086998776._2
302+ let pmtDecimalsB = $t086998776._3
304303 if (isDefined(getBoolean(this, kActive)))
305304 then throwIsActive()
306305 else if ((pmtAssetIdA == pmtAssetIdB))
357356
358357 @Callable(i)
359358 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
360- let $t01312513200 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
361- let pmtAmount = $t01312513200._1
362- let pmtAssetId = $t01312513200._2
359+ let $t01313113206 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
360+ let pmtAmount = $t01313113206._1
361+ let pmtAssetId = $t01313113206._2
362+ let invariant = invariantCalc(balanceA, balanceB)
363363 let pmtMinThreshold = 5000000
364364 let thresholdValueForMinTolerance = 50000000
365365 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
381381 else false)
382382 then throwAssets()
383383 else {
384- let $t01421214818 = if ((pmtAssetId == assetIdA))
384+ let $t01427314879 = if ((pmtAssetId == assetIdA))
385385 then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
386386 else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
387- let virtualReplenishA = $t01421214818._1
388- let virtualReplenishB = $t01421214818._2
389- let balanceAfterSwapA = $t01421214818._3
390- let balanceAfterSwapB = $t01421214818._4
391- let newBalanceA = $t01421214818._5
392- let newBalanceB = $t01421214818._6
387+ let virtualReplenishA = $t01427314879._1
388+ let virtualReplenishB = $t01427314879._2
389+ let balanceAfterSwapA = $t01427314879._3
390+ let balanceAfterSwapB = $t01427314879._4
391+ let newBalanceA = $t01427314879._5
392+ let newBalanceB = $t01427314879._6
393393 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
394394 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
395395 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
424424
425425 @Callable(i)
426426 func withdraw () = {
427- let $t01782017963 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
428- let pmtAmount = $t01782017963._1
429- let pmtAssetId = $t01782017963._2
427+ let $t01788118024 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
428+ let pmtAmount = $t01788118024._1
429+ let pmtAssetId = $t01788118024._2
430430 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA)
431431 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB)
432432 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
449449
450450 @Callable(i)
451451 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
452- let $t01932119396 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
453- let pmtAmount = $t01932119396._1
454- let pmtAssetId = $t01932119396._2
452+ let $t01938219457 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
453+ let pmtAmount = $t01938219457._1
454+ let pmtAssetId = $t01938219457._2
455455 if (!(isActive))
456456 then throwIsInactive()
457457 else if ((0 >= estimatedAmountToReceive))
479479 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
480480 let governanceReward = fraction(amount, feeGovernance, feeScale6)
481481 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
482- let $t02082221085 = if ((pmtAssetId == assetIdA))
482+ let $t02088321146 = if ((pmtAssetId == assetIdA))
483483 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
484484 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
485- let newBalanceA = $t02082221085._1
486- let newBalanceB = $t02082221085._2
485+ let newBalanceA = $t02088321146._1
486+ let newBalanceB = $t02088321146._2
487487 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
488488 if (if ((dAppThresholdAmount > newBalanceA))
489489 then true
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
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 adm1 = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
3131
3232 let adm2 = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
3333
3434 let adm3 = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
3535
3636 let admStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
3737
3838 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
3939
4040 let govAddr = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
4141
4242 let stakingAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
4343
4444 let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
4545
4646 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
4747
4848 let stakingFeeInUSDN = 270000
4949
5050 let isActive = getBooleanValue(this, kActive)
5151
5252 let strAssetIdA = getStringValue(this, kAssetIdA)
5353
5454 let strAssetIdB = getStringValue(this, kAssetIdB)
5555
5656 let assetIdA = if ((strAssetIdA == "WAVES"))
5757 then unit
5858 else fromBase58String(strAssetIdA)
5959
6060 let assetIdB = if ((strAssetIdB == "WAVES"))
6161 then unit
6262 else fromBase58String(strAssetIdB)
6363
6464 let assetNameA = match assetIdA {
6565 case id: ByteVector =>
6666 value(assetInfo(id)).name
6767 case waves: Unit =>
6868 "WAVES"
6969 case _ =>
7070 throw("Match error")
7171 }
7272
7373 let assetNameB = match assetIdB {
7474 case id: ByteVector =>
7575 value(assetInfo(id)).name
7676 case waves: Unit =>
7777 "WAVES"
7878 case _ =>
7979 throw("Match error")
8080 }
8181
8282 let balanceA = getIntegerValue(this, kBalanceA)
8383
8484 let balanceB = getIntegerValue(this, kBalanceB)
8585
8686 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
8787
8888 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
8989
90-let invariant = getIntegerValue(this, kInvariant)
91-
9290 let fee = 500
9391
9492 let feeGovernance = 200
9593
9694 let feeScale6 = 1000000
9795
9896 let scale3 = 1000
9997
10098 let scale8 = 100000000
10199
102100 let scale12 = 1000000000000
103101
104102 let slippageScale3 = 1000
105103
106104 let digits8 = 8
107105
108106 let dAppThreshold = 50
109107
110108 let dAppThresholdScale2 = 100
111109
112110 let exchangeRatioLimitMin = 90000000
113111
114112 let exchangeRatioLimitMax = 110000000
115113
116114 let alpha = 50
117115
118116 let alphaDigits = 2
119117
120118 let beta = 46000000
121119
122120 func accountBalance (assetId) = match assetId {
123121 case id: ByteVector =>
124122 assetBalance(this, id)
125123 case waves: Unit =>
126124 wavesBalance(this).available
127125 case _ =>
128126 throw("Match error")
129127 }
130128
131129
132130 let stakedAmountUSDN = match getInteger(stakingAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))) {
133131 case staked: Int =>
134132 staked
135133 case nothing: Unit =>
136134 0
137135 case _ =>
138136 throw("Match error")
139137 }
140138
141139 let availableBalanceA = (balanceA - (if ((assetIdA == USDN))
142140 then stakedAmountUSDN
143141 else 0))
144142
145143 let availableBalanceB = (balanceB - (if ((assetIdB == USDN))
146144 then stakedAmountUSDN
147145 else 0))
148146
149147 let accountBalanceWithStakedA = (accountBalance(assetIdA) + (if ((assetIdA == USDN))
150148 then stakedAmountUSDN
151149 else 0))
152150
153151 let accountBalanceWithStakedB = (accountBalance(assetIdB) + (if ((assetIdB == USDN))
154152 then stakedAmountUSDN
155153 else 0))
156154
157155 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
158156 then (accountBalanceWithStakedB >= balanceB)
159157 else false
160158
161159 func skewness (x,y) = (((fraction(scale12, x, y) + fraction(scale12, y, x)) / 2) / 10000)
162160
163161
164162 func invariantCalc (x,y) = {
165163 let sk = skewness(x, y)
166164 (fraction((x + y), scale8, pow(sk, digits8, alpha, alphaDigits, digits8, UP)) + (2 * fraction(pow(fraction(x, y, scale8), 0, 5, 1, (digits8 / 2), DOWN), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
167165 }
168166
169167
170168 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
171169 let slippageValue = (scale8 - ((scale8 * 1) / 10000000))
172170 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
171+ let invariant = invariantCalc(balanceA, balanceB)
173172 let x = (balanceA + tokenReceiveAmount)
174173 let y = (balanceB + tokenReceiveAmount)
175174 let invariantNew = if ((tokenId == assetIdA))
176175 then invariantCalc(x, (balanceB - amountToSendEstimated))
177176 else if ((tokenId == assetIdB))
178177 then invariantCalc((balanceA - amountToSendEstimated), y)
179178 else throw("Wrong asset in payment")
180179 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
181180 func getStepAmount (acc,step) = if ((acc == -1))
182181 then {
183182 let amountToSend = (amountToSendEstimated - ((step * deltaBetweenMaxAndMinSendValue) / 5))
184183 let stepInvariant = if ((tokenId == assetIdA))
185184 then invariantCalc(x, (balanceB - amountToSend))
186185 else invariantCalc((balanceA - amountToSend), y)
187186 if ((stepInvariant > invariant))
188187 then amountToSend
189188 else -1
190189 }
191190 else acc
192191
193192 let stepAmount = {
194- let $list57265769 = [1, 2, 3, 4, 5]
195- let $size57265769 = size($list57265769)
196- let $acc057265769 = -1
197- if (($size57265769 == 0))
198- then $acc057265769
193+ let $list57325775 = [1, 2, 3, 4, 5]
194+ let $size57325775 = size($list57325775)
195+ let $acc057325775 = -1
196+ if (($size57325775 == 0))
197+ then $acc057325775
199198 else {
200- let $acc157265769 = getStepAmount($acc057265769, $list57265769[0])
201- if (($size57265769 == 1))
202- then $acc157265769
199+ let $acc157325775 = getStepAmount($acc057325775, $list57325775[0])
200+ if (($size57325775 == 1))
201+ then $acc157325775
203202 else {
204- let $acc257265769 = getStepAmount($acc157265769, $list57265769[1])
205- if (($size57265769 == 2))
206- then $acc257265769
203+ let $acc257325775 = getStepAmount($acc157325775, $list57325775[1])
204+ if (($size57325775 == 2))
205+ then $acc257325775
207206 else {
208- let $acc357265769 = getStepAmount($acc257265769, $list57265769[2])
209- if (($size57265769 == 3))
210- then $acc357265769
207+ let $acc357325775 = getStepAmount($acc257325775, $list57325775[2])
208+ if (($size57325775 == 3))
209+ then $acc357325775
211210 else {
212- let $acc457265769 = getStepAmount($acc357265769, $list57265769[3])
213- if (($size57265769 == 4))
214- then $acc457265769
211+ let $acc457325775 = getStepAmount($acc357325775, $list57325775[3])
212+ if (($size57325775 == 4))
213+ then $acc457325775
215214 else {
216- let $acc557265769 = getStepAmount($acc457265769, $list57265769[4])
217- if (($size57265769 == 5))
218- then $acc557265769
215+ let $acc557325775 = getStepAmount($acc457325775, $list57325775[4])
216+ if (($size57325775 == 5))
217+ then $acc557325775
219218 else {
220- let $acc657265769 = getStepAmount($acc557265769, $list57265769[5])
219+ let $acc657325775 = getStepAmount($acc557325775, $list57325775[5])
221220 throw("List size exceed 5")
222221 }
223222 }
224223 }
225224 }
226225 }
227226 }
228227 }
229228 if ((0 > stepAmount))
230229 then throw("something went wrong while working with amountToSend")
231230 else if (if ((invariantEstimatedRatio > slippageValue))
232231 then (invariantNew > invariant)
233232 else false)
234233 then amountToSendEstimated
235234 else stepAmount
236235 }
237236
238237
239238 func getAssetInfo (assetId) = match assetId {
240239 case id: ByteVector =>
241240 let stringId = toBase58String(id)
242241 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
243242 $Tuple3(stringId, info.name, info.decimals)
244243 case waves: Unit =>
245244 $Tuple3("WAVES", "WAVES", 8)
246245 case _ =>
247246 throw("Match error")
248247 }
249248
250249
251250 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
252251
253252
254253 func deductStakingFee (amount,assetId) = if ((assetId == USDN))
255254 then {
256255 let result = (amount - stakingFeeInUSDN)
257256 if ((0 >= result))
258257 then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakingFeeInUSDN)) + " USD-N"))
259258 else result
260259 }
261260 else amount
262261
263262
264263 func throwIsActive () = throw("DApp is already active")
265264
266265
267266 func throwIsInactive () = throw("DApp is inactive at this moment")
268267
269268
270269 func throwOnlyAdmin () = throw("Only admin can call this function")
271270
272271
273272 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
274273
275274
276275 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))
277276
278277
279278 func throwInsufficientAvailableBalance (amount,available,assetName) = throw((((((((("Insufficient DApp balance to pay " + toString(amount)) + " ") + assetName) + " due to staking. Available: ") + toString(available)) + " ") + assetName) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
280279
281280
282281 func throwInsufficientAvailableBalances (amountA,amountB) = throw((((((((((((((((("Insufficient DApp balance to pay " + toString(amountA)) + " ") + assetNameA) + " and ") + toString(amountB)) + " ") + assetNameB) + " due to staking. Available: ") + toString(availableBalanceA)) + " ") + assetNameA) + " and ") + toString(availableBalanceB)) + " ") + assetNameB) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
283282
284283
285284 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
286285
287286
288287 @Callable(i)
289288 func init () = {
290- let $t084478524 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
291- let pmtAmountA = $t084478524._1
292- let pmtAssetIdA = $t084478524._2
293- let $t085298606 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
294- let pmtAmountB = $t085298606._1
295- let pmtAssetIdB = $t085298606._2
296- let $t086118688 = getAssetInfo(pmtAssetIdA)
297- let pmtStrAssetIdA = $t086118688._1
298- let pmtAssetNameA = $t086118688._2
299- let pmtDecimalsA = $t086118688._3
300- let $t086938770 = getAssetInfo(pmtAssetIdB)
301- let pmtStrAssetIdB = $t086938770._1
302- let pmtAssetNameB = $t086938770._2
303- let pmtDecimalsB = $t086938770._3
289+ let $t084538530 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
290+ let pmtAmountA = $t084538530._1
291+ let pmtAssetIdA = $t084538530._2
292+ let $t085358612 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
293+ let pmtAmountB = $t085358612._1
294+ let pmtAssetIdB = $t085358612._2
295+ let $t086178694 = getAssetInfo(pmtAssetIdA)
296+ let pmtStrAssetIdA = $t086178694._1
297+ let pmtAssetNameA = $t086178694._2
298+ let pmtDecimalsA = $t086178694._3
299+ let $t086998776 = getAssetInfo(pmtAssetIdB)
300+ let pmtStrAssetIdB = $t086998776._1
301+ let pmtAssetNameB = $t086998776._2
302+ let pmtDecimalsB = $t086998776._3
304303 if (isDefined(getBoolean(this, kActive)))
305304 then throwIsActive()
306305 else if ((pmtAssetIdA == pmtAssetIdB))
307306 then throw("Assets must be different")
308307 else {
309308 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
310309 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
311310 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
312311 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, HALFDOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, HALFDOWN), pow(10, 0, shareDecimals, 0, 0, HALFDOWN))
313312 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
314313 let shareIssueId = calculateAssetId(shareIssue)
315314 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
316315 [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)]
317316 }
318317 }
319318
320319
321320
322321 @Callable(i)
323322 func replenishWithTwoTokens (slippageTolerance) = {
324323 let pmtAssetIdA = i.payments[0].assetId
325324 let pmtAssetIdB = i.payments[1].assetId
326325 let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA)
327326 let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB)
328327 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
329328 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
330329 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
331330 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
332331 let invariantCalculated = invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))
333332 if (!(isActive))
334333 then throwIsInactive()
335334 else if (if ((0 > slippageTolerance))
336335 then true
337336 else (slippageTolerance > 10))
338337 then throw("Slippage tolerance must be <= 1%")
339338 else if ((size(i.payments) != 2))
340339 then throw("Two attached assets expected")
341340 else if (if ((pmtAssetIdA != assetIdA))
342341 then true
343342 else (pmtAssetIdB != assetIdB))
344343 then throwAssets()
345344 else if (if ((((scale3 * (slippageScale3 - slippageTolerance)) / slippageScale3) > tokenRatio))
346345 then true
347346 else (tokenRatio > ((scale3 * (slippageScale3 + slippageTolerance)) / slippageScale3)))
348347 then throw("Incorrect assets amount: amounts must have the contract ratio")
349348 else if ((shareTokenToPayAmount == 0))
350349 then throw("Too small amount to replenish")
351350 else if (!(hasEnoughBalance))
352351 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
353352 else [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalculated), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
354353 }
355354
356355
357356
358357 @Callable(i)
359358 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
360- let $t01312513200 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
361- let pmtAmount = $t01312513200._1
362- let pmtAssetId = $t01312513200._2
359+ let $t01313113206 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
360+ let pmtAmount = $t01313113206._1
361+ let pmtAssetId = $t01313113206._2
362+ let invariant = invariantCalc(balanceA, balanceB)
363363 let pmtMinThreshold = 5000000
364364 let thresholdValueForMinTolerance = 50000000
365365 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
366366 then 100000
367367 else 1
368368 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
369369 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
370370 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
371371 if (!(isActive))
372372 then throwIsInactive()
373373 else if ((pmtMinThreshold > pmtAmount))
374374 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
375375 else if ((size(i.payments) != 1))
376376 then throw("One attached payment expected")
377377 else if (!(hasEnoughBalance))
378378 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
379379 else if (if ((pmtAssetId != assetIdA))
380380 then (pmtAssetId != assetIdB)
381381 else false)
382382 then throwAssets()
383383 else {
384- let $t01421214818 = if ((pmtAssetId == assetIdA))
384+ let $t01427314879 = if ((pmtAssetId == assetIdA))
385385 then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
386386 else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
387- let virtualReplenishA = $t01421214818._1
388- let virtualReplenishB = $t01421214818._2
389- let balanceAfterSwapA = $t01421214818._3
390- let balanceAfterSwapB = $t01421214818._4
391- let newBalanceA = $t01421214818._5
392- let newBalanceB = $t01421214818._6
387+ let virtualReplenishA = $t01427314879._1
388+ let virtualReplenishB = $t01427314879._2
389+ let balanceAfterSwapA = $t01427314879._3
390+ let balanceAfterSwapB = $t01427314879._4
391+ let newBalanceA = $t01427314879._5
392+ let newBalanceB = $t01427314879._6
393393 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
394394 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
395395 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
396396 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
397397 if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
398398 then true
399399 else (invariant > invariantNew))
400400 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
401401 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
402402 then true
403403 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
404404 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
405405 else if (if ((dAppThresholdAmount > newBalanceA))
406406 then true
407407 else (dAppThresholdAmount > newBalanceB))
408408 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
409409 else {
410410 let ratioShareTokensInA = fraction(deductStakingFee(virtualReplenishA, assetIdA), scale8, balanceAfterSwapA)
411411 let ratioShareTokensInB = fraction(deductStakingFee(virtualReplenishB, assetIdB), scale8, balanceAfterSwapB)
412412 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
413413 let shareTokenToPayAmountAfterFee = fraction(shareTokenToPayAmount, (feeScale6 - (fee / 2)), feeScale6)
414414 let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
415415 let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
416416 let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
417417 let invariantCalculated = invariantCalc((newBalanceA - governanceRewardTokenA), (newBalanceB - governanceRewardTokenB))
418418 [Reissue(shareAssetId, shareTokenToPayAmountAfterFee, true), ScriptTransfer(i.caller, shareTokenToPayAmountAfterFee, shareAssetId), ScriptTransfer(govAddr, governanceRewardTokenA, assetIdA), ScriptTransfer(govAddr, governanceRewardTokenB, assetIdB), IntegerEntry(kBalanceA, deductStakingFee((newBalanceA - governanceRewardTokenA), assetIdA)), IntegerEntry(kBalanceB, deductStakingFee((newBalanceB - governanceRewardTokenB), assetIdB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmountAfterFee)), IntegerEntry(kInvariant, invariantCalculated)]
419419 }
420420 }
421421 }
422422
423423
424424
425425 @Callable(i)
426426 func withdraw () = {
427- let $t01782017963 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
428- let pmtAmount = $t01782017963._1
429- let pmtAssetId = $t01782017963._2
427+ let $t01788118024 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
428+ let pmtAmount = $t01788118024._1
429+ let pmtAssetId = $t01788118024._2
430430 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA)
431431 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB)
432432 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
433433 if (!(isActive))
434434 then throwIsInactive()
435435 else if ((size(i.payments) != 1))
436436 then throw("One attached payment expected")
437437 else if ((pmtAssetId != shareAssetId))
438438 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
439439 else if (!(hasEnoughBalance))
440440 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
441441 else if (if ((amountToPayA > availableBalanceA))
442442 then true
443443 else (amountToPayB > availableBalanceB))
444444 then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
445445 else [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)]
446446 }
447447
448448
449449
450450 @Callable(i)
451451 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
452- let $t01932119396 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
453- let pmtAmount = $t01932119396._1
454- let pmtAssetId = $t01932119396._2
452+ let $t01938219457 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
453+ let pmtAmount = $t01938219457._1
454+ let pmtAssetId = $t01938219457._2
455455 if (!(isActive))
456456 then throwIsInactive()
457457 else if ((0 >= estimatedAmountToReceive))
458458 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
459459 else if ((minAmountToReceive > estimatedAmountToReceive))
460460 then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
461461 else if ((size(i.payments) != 1))
462462 then throw("One attached payment expected")
463463 else if (!(hasEnoughBalance))
464464 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
465465 else if (if ((pmtAssetId != assetIdA))
466466 then (pmtAssetId != assetIdB)
467467 else false)
468468 then throwAssets()
469469 else if ((10000000 > pmtAmount))
470470 then throw("Only swap of 10.000000 or more tokens is allowed")
471471 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
472472 then true
473473 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
474474 then throw("Incorrect args and pmt ratio")
475475 else {
476476 let sendAssetId = if ((pmtAssetId == assetIdA))
477477 then assetIdB
478478 else assetIdA
479479 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
480480 let governanceReward = fraction(amount, feeGovernance, feeScale6)
481481 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
482- let $t02082221085 = if ((pmtAssetId == assetIdA))
482+ let $t02088321146 = if ((pmtAssetId == assetIdA))
483483 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
484484 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
485- let newBalanceA = $t02082221085._1
486- let newBalanceB = $t02082221085._2
485+ let newBalanceA = $t02088321146._1
486+ let newBalanceB = $t02088321146._2
487487 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
488488 if (if ((dAppThresholdAmount > newBalanceA))
489489 then true
490490 else (dAppThresholdAmount > newBalanceB))
491491 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
492492 else if (if (if ((assetIdA == USDN))
493493 then (sendAssetId == assetIdA)
494494 else false)
495495 then (stakedAmountUSDN >= newBalanceA)
496496 else false)
497497 then throwInsufficientAvailableBalance(amountMinusFee, availableBalanceA, assetNameA)
498498 else if (if (if ((assetIdB == USDN))
499499 then (sendAssetId == assetIdB)
500500 else false)
501501 then (stakedAmountUSDN >= newBalanceB)
502502 else false)
503503 then throwInsufficientAvailableBalance(amountMinusFee, availableBalanceB, assetNameB)
504504 else [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
505505 }
506506 }
507507
508508
509509
510510 @Callable(i)
511511 func shutdown () = if (!(isActive))
512512 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
513513 else if (!(containsElement([adm1, adm2, adm3, admStartStop], i.callerPublicKey)))
514514 then throwOnlyAdmin()
515515 else suspend("Paused by admin")
516516
517517
518518
519519 @Callable(i)
520520 func activate () = if (isActive)
521521 then throwIsActive()
522522 else if (!(containsElement([adm1, adm2, adm3, admStartStop], i.callerPublicKey)))
523523 then throwOnlyAdmin()
524524 else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
525525
526526
527527
528528 @Callable(i)
529529 func takeIntoAccountExtraFunds (amountLeave) = {
530530 let uncountableA = (accountBalanceWithStakedA - balanceA)
531531 let uncountableB = (accountBalanceWithStakedB - balanceB)
532532 let amountEnrollA = (uncountableA - (if ((assetIdA == unit))
533533 then amountLeave
534534 else 0))
535535 let amountEnrollB = (uncountableB - (if ((assetIdB == unit))
536536 then amountLeave
537537 else 0))
538538 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
539539 if (!(isActive))
540540 then throwIsInactive()
541541 else if ((i.caller != this))
542542 then throwOnlyAdmin()
543543 else if ((0 > amountLeave))
544544 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
545545 else if (if ((0 > uncountableA))
546546 then true
547547 else (0 > uncountableB))
548548 then suspend("Enroll amount negative")
549549 else if (if ((0 > amountEnrollA))
550550 then true
551551 else (0 > amountEnrollB))
552552 then throw("Too large amountLeave")
553553 else [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
554554 }
555555
556556
557557 @Verifier(tx)
558558 func verify () = match tx {
559559 case invoke: InvokeScriptTransaction =>
560560 let callTakeIntoAccount = if ((invoke.dApp == this))
561561 then (invoke.function == "takeIntoAccountExtraFunds")
562562 else false
563563 let callStaking = if ((invoke.dApp == stakingAddress))
564564 then if (if (if ((invoke.function == "lockNeutrino"))
565565 then (size(invoke.payments) == 1)
566566 else false)
567567 then (invoke.payments[0].assetId == USDN)
568568 else false)
569569 then true
570570 else if ((invoke.function == "unlockNeutrino"))
571571 then (size(invoke.payments) == 0)
572572 else false
573573 else false
574574 let exchangeToWaves = if (if (if ((invoke.dApp == USDNToWavesExchanger))
575575 then (invoke.function == "exchange")
576576 else false)
577577 then (assetIdA == USDN)
578578 else false)
579579 then true
580580 else if ((assetIdB == USDN))
581581 then (invoke.payments[0].assetId == USDN)
582582 else false
583583 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adm1))
584584 then true
585585 else sigVerify(tx.bodyBytes, tx.proofs[0], adm2))
586586 then true
587587 else sigVerify(tx.bodyBytes, tx.proofs[0], adm3))
588588 then true
589589 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
590590 if (if (if (callTakeIntoAccount)
591591 then true
592592 else callStaking)
593593 then true
594594 else exchangeToWaves)
595595 then signedByAdmin
596596 else false
597597 case _ =>
598598 let adm1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adm1))
599599 then 1
600600 else 0
601601 let adm2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adm2))
602602 then 1
603603 else 0
604604 let adm3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adm3))
605605 then 1
606606 else 0
607607 (((adm1Signed + adm2Signed) + adm3Signed) >= 2)
608608 }
609609

github/deemru/w8io/873ac7e 
109.15 ms