tx · Biym8zuzwoGkgTG3NSyvWBURez2MKi48SYZM57ztUDi1

3MqDf9VgoL9eqrCPx8F74Au6xBpvdTm9UP8:  -0.01700000 Waves

2022.09.05 12:23 [2215635] smart account 3MqDf9VgoL9eqrCPx8F74Au6xBpvdTm9UP8 > SELF 0.00000000 Waves

{ "type": 13, "id": "Biym8zuzwoGkgTG3NSyvWBURez2MKi48SYZM57ztUDi1", "fee": 1700000, "feeAssetId": null, "timestamp": 1662369759932, "version": 2, "chainId": 84, "sender": "3MqDf9VgoL9eqrCPx8F74Au6xBpvdTm9UP8", "senderPublicKey": "4ja2PX5eqM576zv9KGzu5Qe7M92Z3jbuSmkLPdGjK4ue", "proofs": [ "2oqgfaCjYcPgKAqPNLMhe8AuCxQq3UgUjkCHCdn4ehLdvk1QEXyB8UE2u28SeHDjVfXrhidfb2vNtXKSE42BWkeE", "GzMPAjM1ib3TVtw4GofE99bb7Yt1TZb6KAWzdfvg8bnoB2UaFD6eVjunPfWxrwp2gDjabJ2Gv9yUP9XsKSJdgk1" ], "script": "base64:AAIFAAAAAAAAABAIAhIICgYYGBERGAESABIAAAAAJgAAAAAHa0FjdGl2ZQIAAAAGYWN0aXZlAAAAAAZrQ2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAA1rUG9vbEluT3JhY2xlAgAAAAVwb29sXwAAAAAOa1VzZXJTd29wSW5Hb3YCAAAADF9TV09QX2Ftb3VudAAAAAAKa0Rpc2NvdW50cwIAAAAJZGlzY291bnRzAAAAAA9rRGlzY291bnRWYWx1ZXMCAAAAD2Rpc2NvdW50X3ZhbHVlcwAAAAALa1JvdXRpbmdGZWUCAAAAC3JvdXRpbmdfZmVlAAAAAA1rQWRtaW5QdWJLZXkxAgAAAAthZG1pbl9wdWJfMQAAAAANa0FkbWluUHViS2V5MgIAAAALYWRtaW5fcHViXzIAAAAADWtBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAABBrTW9uZXlCb3hBZGRyZXNzAgAAABFtb25leV9ib3hfYWRkcmVzcwAAAAALa0dvdkFkZHJlc3MCAAAAEmdvdmVybmFuY2VfYWRkcmVzcwAAAAAEa0ZlZQIAAAAKY29tbWlzc2lvbgAAAAASa011bHR5QXNzZXRCYWxhbmNlAgAAAAhfYmFsYW5jZQAAAAAHZGlnaXRzOAAAAAAAAAAACAAAAAAGc2NhbGU4AAAAAAAF9eEAAAAAAAdzY2FsZTE2AAAjhvJvwQAAAAAAAAVhbHBoYQAAAAAAAAAAMgAAAAALYWxwaGFEaWdpdHMAAAAAAAAAAAIAAAAABGJldGEAABBXrPX3gAAAAAAABm9yYWNsZQkBAAAAB0FkZHJlc3MAAAABAQAAABoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABm9yYWNsZQUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAABnN0cmluZwUAAAAHJG1hdGNoMAkAAlkAAAABBQAAAAZzdHJpbmcEAAAAB25vdGhpbmcFAAAAByRtYXRjaDAJAAACAAAAAQkAASwAAAACBQAAAANrZXkCAAAACGlzIGVtcHR5AAAAAAxhZG1pblB1YktleTEJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAANa0FkbWluUHViS2V5MQAAAAAMYWRtaW5QdWJLZXkyCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADWtBZG1pblB1YktleTIAAAAADGFkbWluUHViS2V5MwkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAAA1rQWRtaW5QdWJLZXkzAAAAAA9tb25leUJveEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAABBrTW9uZXlCb3hBZGRyZXNzAAAAAApnb3ZBZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAALa0dvdkFkZHJlc3MAAAAABmFjdGl2ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAAR0aGlzBQAAAAdrQWN0aXZlBgAAAAAKcm91dGluZ0ZlZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQUAAAALa1JvdXRpbmdGZWUCAAAAFHJvdXRpbmdfZmVlIGlzIGVtcHR5AAAAAAlmZWVTY2FsZTYAAAAAAAAPQkABAAAACGlzQWN0aXZlAAAAAAMFAAAABmFjdGl2ZQUAAAAEdW5pdAkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQAAAAtpc0FkbWluQ2FsbAAAAAEAAAABaQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIFAAAADGFkbWluUHViS2V5MQkABEwAAAACBQAAAAxhZG1pblB1YktleTIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkzBQAAAANuaWwIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAEdW5pdAkAAAIAAAABAgAAACFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BAAAADXRocm93SXNBY3RpdmUAAAAACQAAAgAAAAECAAAAFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUBAAAAB3N1c3BlbmQAAAABAAAABWNhdXNlCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAdrQWN0aXZlBwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAZrQ2F1c2UFAAAABWNhdXNlBQAAAANuaWwBAAAACHNrZXduZXNzAAAAAgAAAAF4AAAAAXkJAABpAAAAAgkAAGQAAAACCQAAawAAAAMFAAAAB3NjYWxlMTYFAAAAAXgFAAAAAXkJAABrAAAAAwUAAAAHc2NhbGUxNgUAAAABeQUAAAABeAAAAAAAAAAAAgEAAAANaW52YXJpYW50Q2FsYwAAAAIAAAABeAAAAAF5BAAAAAJzawkBAAAACHNrZXduZXNzAAAAAgUAAAABeAUAAAABeQkAAGQAAAACCQAAawAAAAMJAABkAAAAAgUAAAABeAUAAAABeQUAAAAHc2NhbGUxNgkAAGwAAAAGBQAAAAJzawUAAAAHZGlnaXRzOAUAAAAFYWxwaGEFAAAAC2FscGhhRGlnaXRzBQAAAAdkaWdpdHM4BQAAAAdDRUlMSU5HCQAAaAAAAAIAAAAAAAAAAAIJAABrAAAAAwkAAaAAAAABCQAAdgAAAAYJAAE8AAAAAwkAATYAAAABBQAAAAF4CQABNgAAAAEFAAAAAXkJAAE2AAAAAQUAAAAGc2NhbGU4AAAAAAAAAAAACQABNgAAAAEAAAAAAAAAAAUAAAAAAAAAAAEJAABpAAAAAgUAAAAHZGlnaXRzOAAAAAAAAAAAAgUAAAAERE9XTgkAAGwAAAAGCQAAZQAAAAIFAAAAAnNrBQAAAARiZXRhBQAAAAdkaWdpdHM4BQAAAAVhbHBoYQUAAAALYWxwaGFEaWdpdHMFAAAAB2RpZ2l0czgFAAAABERPV04FAAAABnNjYWxlOAEAAAAUY2FsY3VsYXRlRmVlRGlzY291bnQAAAABAAAACHVzZXJBZGRyBAAAAApzd29wQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAACmdvdkFkZHJlc3MJAAEsAAAAAgkABCUAAAABBQAAAAh1c2VyQWRkcgUAAAAOa1VzZXJTd29wSW5Hb3YAAAAAAAAAAAAEAAAADmRpc2NvdW50VmFsdWVzCQAEtQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABm9yYWNsZQUAAAAPa0Rpc2NvdW50VmFsdWVzAgAAAAEsBAAAAAlkaXNjb3VudHMJAAS1AAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAGb3JhY2xlBQAAAAprRGlzY291bnRzAgAAAAEsAwMJAABnAAAAAgUAAAAKc3dvcEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADmRpc2NvdW50VmFsdWVzAAAAAAAAAAAACQAAZgAAAAIJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA5kaXNjb3VudFZhbHVlcwAAAAAAAAAAAQUAAAAKc3dvcEFtb3VudAcJAABlAAAAAgUAAAAJZmVlU2NhbGU2CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAJZGlzY291bnRzAAAAAAAAAAAAAwMJAABnAAAAAgUAAAAKc3dvcEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADmRpc2NvdW50VmFsdWVzAAAAAAAAAAABCQAAZgAAAAIJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA5kaXNjb3VudFZhbHVlcwAAAAAAAAAAAgUAAAAKc3dvcEFtb3VudAcJAABlAAAAAgUAAAAJZmVlU2NhbGU2CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAJZGlzY291bnRzAAAAAAAAAAABAwMJAABnAAAAAgUAAAAKc3dvcEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADmRpc2NvdW50VmFsdWVzAAAAAAAAAAACCQAAZgAAAAIJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA5kaXNjb3VudFZhbHVlcwAAAAAAAAAAAwUAAAAKc3dvcEFtb3VudAcJAABlAAAAAgUAAAAJZmVlU2NhbGU2CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAJZGlzY291bnRzAAAAAAAAAAACAwMJAABnAAAAAgUAAAAKc3dvcEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADmRpc2NvdW50VmFsdWVzAAAAAAAAAAADCQAAZgAAAAIJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA5kaXNjb3VudFZhbHVlcwAAAAAAAAAABAUAAAAKc3dvcEFtb3VudAcJAABlAAAAAgUAAAAJZmVlU2NhbGU2CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAJZGlzY291bnRzAAAAAAAAAAADAwkAAGcAAAACBQAAAApzd29wQW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAOZGlzY291bnRWYWx1ZXMAAAAAAAAAAAQJAABlAAAAAgUAAAAJZmVlU2NhbGU2CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAJZGlzY291bnRzAAAAAAAAAAAEBQAAAAlmZWVTY2FsZTYBAAAAEGNoZWNrUG9zc2liaWxpdHkAAAAIAAAABmNhbGxlcgAAAAlwbXRBbW91bnQAAAASbWluQW1vdW50VG9SZWNlaXZlAAAACmV4Y2hhbmdlcnMAAAAOZXhjaGFuZ2Vyc1R5cGUAAAARcm91dGluZ0Fzc2V0c0tleXMAAAAFYXJnczEAAAAFYXJnczIEAAAAC2ZlZURpc2NvdW50CQEAAAAUY2FsY3VsYXRlRmVlRGlzY291bnQAAAABBQAAAAZjYWxsZXIEAAAAFGdldEZyb20xVHJhZGVXaXRoRmVlAwkAAAAAAAACCQABkQAAAAIFAAAADmV4Y2hhbmdlcnNUeXBlAAAAAAAAAAAAAgAAAA5jdXJ2ZU11bHR5RmxhdAQAAAADaW52CgAAAAABQAkAA/wAAAAECQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmV4Y2hhbmdlcnMAAAAAAAAAAAACAAAABWdldER5CQAETAAAAAIJAAGRAAAAAgUAAAARcm91dGluZ0Fzc2V0c0tleXMAAAAAAAAAAAAJAARMAAAAAgkAAZEAAAACBQAAABFyb3V0aW5nQXNzZXRzS2V5cwAAAAAAAAAAAQkABEwAAAACBQAAAAlwbXRBbW91bnQFAAAAA25pbAUAAAADbmlsAwkAAAEAAAACBQAAAAFAAgAAAANJbnQFAAAAAUAJAAACAAAAAQIAAAAYQ291bGRuJ3QgY2FzdCBBbnkgdG8gSW50AwkAAAAAAAACBQAAAANpbnYFAAAAA2ludgoAAAAAAUAFAAAAA2ludgMJAAABAAAAAgUAAAABQAIAAAADSW50BQAAAAFACQAAAgAAAAECAAAAGENvdWxkbid0IGNhc3QgSW50IHRvIEludAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAAAADWRBcHAxVG9rZW5QYXkJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAKZXhjaGFuZ2VycwAAAAAAAAAAAAkAAZEAAAACBQAAABFyb3V0aW5nQXNzZXRzS2V5cwAAAAAAAAAAAAQAAAANZEFwcDFUb2tlbkdldAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAApleGNoYW5nZXJzAAAAAAAAAAAACQABkQAAAAIFAAAAEXJvdXRpbmdBc3NldHNLZXlzAAAAAAAAAAABAwkAAAAAAAACCQABkQAAAAIFAAAADmV4Y2hhbmdlcnNUeXBlAAAAAAAAAAAAAgAAAARjcG1tBAAAAANmZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAKZXhjaGFuZ2VycwAAAAAAAAAAAAUAAAAEa0ZlZQQAAAAXZ2V0RnJvbTFUcmFkZVdpdGhvdXRGZWUJAABrAAAAAwUAAAANZEFwcDFUb2tlbkdldAUAAAAJcG10QW1vdW50CQAAZAAAAAIFAAAACXBtdEFtb3VudAUAAAANZEFwcDFUb2tlblBheQkAAGsAAAADBQAAABdnZXRGcm9tMVRyYWRlV2l0aG91dEZlZQkAAGUAAAACBQAAAAlmZWVTY2FsZTYJAABrAAAAAwUAAAADZmVlBQAAAAtmZWVEaXNjb3VudAUAAAAJZmVlU2NhbGU2BQAAAAlmZWVTY2FsZTYDCQAAAAAAAAIJAAGRAAAAAgUAAAAOZXhjaGFuZ2Vyc1R5cGUAAAAAAAAAAAACAAAABGZsYXQEAAAACWludmFyaWFudAkBAAAADWludmFyaWFudENhbGMAAAACBQAAAA1kQXBwMVRva2VuUGF5BQAAAA1kQXBwMVRva2VuR2V0BAAAABNtaW5BbW91bnRUb1JlY2VpdmUxCQABkQAAAAIFAAAABWFyZ3MyAAAAAAAAAAAABAAAAAxpbnZhcmlhbnROZXcJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGQAAAACBQAAAA1kQXBwMVRva2VuUGF5BQAAAAlwbXRBbW91bnQJAABlAAAAAgUAAAANZEFwcDFUb2tlbkdldAUAAAATbWluQW1vdW50VG9SZWNlaXZlMQMJAABnAAAAAgUAAAAMaW52YXJpYW50TmV3BQAAAAlpbnZhcmlhbnQFAAAAE21pbkFtb3VudFRvUmVjZWl2ZTEJAAACAAAAAQIAAAAnRmxhdCBjb250cmFjdDogaW52YXJpYW50TmV3IDwgaW52YXJpYW50CQAAAgAAAAECAAAAF0luY29ycmVjdCBleGNoYW5nZSB0eXBlBAAAABRnZXRGcm9tMlRyYWRlV2l0aEZlZQMJAAAAAAAAAgkAAZEAAAACBQAAAA5leGNoYW5nZXJzVHlwZQAAAAAAAAAAAAIAAAAOY3VydmVNdWx0eUZsYXQEAAAAA2ludgoAAAAAAUAJAAP8AAAABAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAApleGNoYW5nZXJzAAAAAAAAAAAAAgAAAAVnZXREeQkABEwAAAACCQABkQAAAAIFAAAAEXJvdXRpbmdBc3NldHNLZXlzAAAAAAAAAAACCQAETAAAAAIJAAGRAAAAAgUAAAARcm91dGluZ0Fzc2V0c0tleXMAAAAAAAAAAAMJAARMAAAAAgUAAAAUZ2V0RnJvbTFUcmFkZVdpdGhGZWUFAAAAA25pbAUAAAADbmlsAwkAAAEAAAACBQAAAAFAAgAAAANJbnQFAAAAAUAJAAACAAAAAQIAAAAYQ291bGRuJ3QgY2FzdCBBbnkgdG8gSW50AwkAAAAAAAACBQAAAANpbnYFAAAAA2ludgUAAAADaW52CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQAAAANZEFwcDJUb2tlblBheQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAApleGNoYW5nZXJzAAAAAAAAAAABCQABkQAAAAIFAAAAEXJvdXRpbmdBc3NldHNLZXlzAAAAAAAAAAACBAAAAA1kQXBwMlRva2VuR2V0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmV4Y2hhbmdlcnMAAAAAAAAAAAEJAAGRAAAAAgUAAAARcm91dGluZ0Fzc2V0c0tleXMAAAAAAAAAAAMDCQAAAAAAAAIJAAGRAAAAAgUAAAAOZXhjaGFuZ2Vyc1R5cGUAAAAAAAAAAAECAAAABGNwbW0EAAAAF2dldEZyb20yVHJhZGVXaXRob3V0RmVlCQAAawAAAAMFAAAADWRBcHAyVG9rZW5HZXQFAAAAFGdldEZyb20xVHJhZGVXaXRoRmVlCQAAZAAAAAIFAAAAFGdldEZyb20xVHJhZGVXaXRoRmVlBQAAAA1kQXBwMlRva2VuUGF5BAAAAANmZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAKZXhjaGFuZ2VycwAAAAAAAAAAAAUAAAAEa0ZlZQkAAGsAAAADBQAAABdnZXRGcm9tMlRyYWRlV2l0aG91dEZlZQkAAGUAAAACBQAAAAlmZWVTY2FsZTYJAABrAAAAAwUAAAADZmVlBQAAAAtmZWVEaXNjb3VudAUAAAAJZmVlU2NhbGU2BQAAAAlmZWVTY2FsZTYDCQAAAAAAAAIJAAGRAAAAAgUAAAAOZXhjaGFuZ2Vyc1R5cGUAAAAAAAAAAAECAAAABGZsYXQEAAAACWludmFyaWFudAkBAAAADWludmFyaWFudENhbGMAAAACBQAAAA1kQXBwMlRva2VuUGF5BQAAAA1kQXBwMlRva2VuR2V0BAAAABNtaW5BbW91bnRUb1JlY2VpdmUyCQABkQAAAAIFAAAABWFyZ3MyAAAAAAAAAAABBAAAAAxpbnZhcmlhbnROZXcJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGQAAAACBQAAAA1kQXBwMlRva2VuUGF5BQAAABRnZXRGcm9tMVRyYWRlV2l0aEZlZQkAAGUAAAACBQAAAA1kQXBwMlRva2VuR2V0BQAAABNtaW5BbW91bnRUb1JlY2VpdmUyAwkAAGcAAAACBQAAAAxpbnZhcmlhbnROZXcFAAAACWludmFyaWFudAUAAAATbWluQW1vdW50VG9SZWNlaXZlMgkAAAIAAAABAgAAACdGbGF0IGNvbnRyYWN0OiBpbnZhcmlhbnROZXcgPCBpbnZhcmlhbnQJAAACAAAAAQIAAAAXSW5jb3JyZWN0IGV4Y2hhbmdlIHR5cGUJAABnAAAAAgUAAAAUZ2V0RnJvbTJUcmFkZVdpdGhGZWUFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQAAAAMAAAABaQEAAAAMcm91dGluZ1RyYWRlAAAABgAAAApleGNoYW5nZXJzAAAADmV4Y2hhbmdlcnNUeXBlAAAABWFyZ3MxAAAABWFyZ3MyAAAAEXJvdXRpbmdBc3NldHNLZXlzAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAQAAAALJHQwNzM5Nzc0NzEJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAAskdDA3Mzk3NzQ3MQAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAACyR0MDczOTc3NDcxAAAAAl8yAwkBAAAAASEAAAABCQEAAAAQY2hlY2tQb3NzaWJpbGl0eQAAAAgIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAABJtaW5BbW91bnRUb1JlY2VpdmUFAAAACmV4Y2hhbmdlcnMFAAAADmV4Y2hhbmdlcnNUeXBlBQAAABFyb3V0aW5nQXNzZXRzS2V5cwUAAAAFYXJnczEFAAAABWFyZ3MyCQAAAgAAAAECAAAAJkNoZWNrIHRyYW5zYWN0aW9uIHBvc3NpYmlsdHk6IGRlY2xpbmVkAwMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAGb3JhY2xlCQABLAAAAAIFAAAADWtQb29sSW5PcmFjbGUJAAGRAAAAAgUAAAAKZXhjaGFuZ2VycwAAAAAAAAAAAAYJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAGb3JhY2xlCQABLAAAAAIFAAAADWtQb29sSW5PcmFjbGUJAAGRAAAAAgUAAAAKZXhjaGFuZ2VycwAAAAAAAAAAAQkAAAIAAAABAgAAABVQb29sIGlzIG5vdCBpbiBvcmFjbGUEAAAAC3JvdXRpbmdTaXplCQABkAAAAAEFAAAACmV4Y2hhbmdlcnMKAQAAAAxleGNoYW5nZUZvbGQAAAACAAAAC2FjY3VtdWxhdGVkAAAACWV4Y2hhbmdlcgQAAAALJHQwNzk4NTgwNTAFAAAAC2FjY3VtdWxhdGVkBAAAAA9leGNoYW5nZUNvdW50ZXIIBQAAAAskdDA3OTg1ODA1MAAAAAJfMQQAAAAOYW1vdW50c1dpdGhGZWUIBQAAAAskdDA3OTg1ODA1MAAAAAJfMgQAAAAMYXNzZXRzSWRTZW5kCAUAAAALJHQwNzk4NTgwNTAAAAACXzMEAAAACyR0MDgwNjM4MjYxAwkAAAAAAAACBQAAAA9leGNoYW5nZUNvdW50ZXIAAAAAAAAAAAAJAAUUAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAJcG10QW1vdW50CQAFFAAAAAIFAAAADGFzc2V0c0lkU2VuZAUAAAAOYW1vdW50c1dpdGhGZWUEAAAADnBtdEFzc2V0SWRSb3V0CAUAAAALJHQwODA2MzgyNjEAAAACXzEEAAAADXBtdEFtb3VudFJvdXQIBQAAAAskdDA4MDYzODI2MQAAAAJfMgMJAAAAAAAAAgMJAABnAAAAAgUAAAAPZXhjaGFuZ2VDb3VudGVyAAAAAAAAAAAACQAAZgAAAAIFAAAAC3JvdXRpbmdTaXplBQAAAA9leGNoYW5nZUNvdW50ZXIHBgQAAAAQZXhjaGFuZ2VyQWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAJZXhjaGFuZ2VyAwkAAAAAAAACCQABkQAAAAIFAAAADmV4Y2hhbmdlcnNUeXBlBQAAAA9leGNoYW5nZUNvdW50ZXICAAAABGNwbW0EAAAAA2ludgoAAAAAAUAJAAP8AAAABAUAAAAQZXhjaGFuZ2VyQWRkcmVzcwIAAAAMY2FsbEZ1bmN0aW9uCQAETAAAAAICAAAACGV4Y2hhbmdlCQAETAAAAAIJAARMAAAAAgkAAaQAAAABCQABkQAAAAIFAAAABWFyZ3MxBQAAAA9leGNoYW5nZUNvdW50ZXIFAAAAA25pbAUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAA5wbXRBc3NldElkUm91dAUAAAANcG10QW1vdW50Um91dAUAAAADbmlsAwkAAAEAAAACBQAAAAFAAgAAAAlMaXN0W0FueV0FAAAAAUAJAAACAAAAAQIAAAAeQ291bGRuJ3QgY2FzdCBBbnkgdG8gTGlzdFtBbnldAwkAAAAAAAACBQAAAANpbnYFAAAAA2ludgkABRUAAAADCQAAZAAAAAIFAAAAD2V4Y2hhbmdlQ291bnRlcgAAAAAAAAAAAQkAAZEAAAACBQAAAANpbnYAAAAAAAAAAAAJAAGRAAAAAgUAAAADaW52AAAAAAAAAAABCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAAAAAAAAgkAAZEAAAACBQAAAA5leGNoYW5nZXJzVHlwZQUAAAAPZXhjaGFuZ2VDb3VudGVyAgAAAARmbGF0BAAAAANpbnYJAAP8AAAABAUAAAAQZXhjaGFuZ2VyQWRkcmVzcwIAAAAIZXhjaGFuZ2UJAARMAAAAAgkAAZEAAAACBQAAAAVhcmdzMQUAAAAPZXhjaGFuZ2VDb3VudGVyCQAETAAAAAIJAAGRAAAAAgUAAAAFYXJnczIFAAAAD2V4Y2hhbmdlQ291bnRlcgUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAA5wbXRBc3NldElkUm91dAUAAAANcG10QW1vdW50Um91dAUAAAADbmlsAwkAAAAAAAACBQAAAANpbnYFAAAAA2ludgQAAAAHJG1hdGNoMAUAAAADaW52AwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAALKEludCwgVW5pdCkGCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAEShJbnQsIEJ5dGVWZWN0b3IpBAAAAANpbnYFAAAAByRtYXRjaDAEAAAACyR0MDkxMjY5MTY0BQAAAANpbnYEAAAADWFtb3VudFdpdGhGZWUIBQAAAAskdDA5MTI2OTE2NAAAAAJfMQQAAAALYXNzZXRJZFNlbmQIBQAAAAskdDA5MTI2OTE2NAAAAAJfMgkABRUAAAADCQAAZAAAAAIFAAAAD2V4Y2hhbmdlQ291bnRlcgAAAAAAAAAAAQUAAAANYW1vdW50V2l0aEZlZQUAAAALYXNzZXRJZFNlbmQJAAACAAAAAQIAAABASW5jb3JyZWN0IGludm9rZSByZXN1bHQ6IGV4cGVjdGVkIGFtb3VudFdpdGhGZWUgYW5kIGFzc2V0c0lkU2VuZAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAAAAAAIJAAGRAAAAAgUAAAAOZXhjaGFuZ2Vyc1R5cGUFAAAAD2V4Y2hhbmdlQ291bnRlcgIAAAAOY3VydmVNdWx0eUZsYXQEAAAAA2ludgoAAAAAAUAJAAP8AAAABAUAAAAQZXhjaGFuZ2VyQWRkcmVzcwIAAAAIZXhjaGFuZ2UJAARMAAAAAgkAAZEAAAACBQAAAAVhcmdzMQUAAAAPZXhjaGFuZ2VDb3VudGVyCQAETAAAAAIJAAGRAAAAAgUAAAAFYXJnczIFAAAAD2V4Y2hhbmdlQ291bnRlcgUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAA5wbXRBc3NldElkUm91dAUAAAANcG10QW1vdW50Um91dAUAAAADbmlsAwkAAAEAAAACBQAAAAFAAgAAAAlMaXN0W0FueV0FAAAAAUAJAAACAAAAAQIAAAAeQ291bGRuJ3QgY2FzdCBBbnkgdG8gTGlzdFtBbnldAwkAAAAAAAACBQAAAANpbnYFAAAAA2ludgkABRUAAAADCQAAZAAAAAIFAAAAD2V4Y2hhbmdlQ291bnRlcgAAAAAAAAAAAQkAAZEAAAACBQAAAANpbnYAAAAAAAAAAAAJAAGRAAAAAgUAAAADaW52AAAAAAAAAAABCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAABdJbmNvcnJlY3QgZXhjaGFuZ2UgdHlwZQUAAAALYWNjdW11bGF0ZWQEAAAACyR0MDk4NjA5OTY2CgAAAAACJGwFAAAACmV4Y2hhbmdlcnMKAAAAAAIkcwkAAZAAAAABBQAAAAIkbAoAAAAABSRhY2MwCQAFFQAAAAMAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAoBAAAABSRmMF8xAAAAAgAAAAIkYQAAAAIkaQMJAABnAAAAAgUAAAACJGkFAAAAAiRzBQAAAAIkYQkBAAAADGV4Y2hhbmdlRm9sZAAAAAIFAAAAAiRhCQABkQAAAAIFAAAAAiRsBQAAAAIkaQoBAAAABSRmMF8yAAAAAgAAAAIkYQAAAAIkaQMJAABnAAAAAgUAAAACJGkFAAAAAiRzBQAAAAIkYQkAAAIAAAABAgAAABNMaXN0IHNpemUgZXhjZWVkcyAzCQEAAAAFJGYwXzIAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACBQAAAAUkYWNjMAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAwQAAAAPZXhjaGFuZ2VDb3VudGVyCAUAAAALJHQwOTg2MDk5NjYAAAACXzEEAAAAEGFtb3VudFdpdGhvdXRGZWUIBQAAAAskdDA5ODYwOTk2NgAAAAJfMgQAAAALYXNzZXRJZFNlbmQIBQAAAAskdDA5ODYwOTk2NgAAAAJfMwQAAAANYW1vdW50V2l0aEZlZQkAAGsAAAADBQAAABBhbW91bnRXaXRob3V0RmVlCQAAZQAAAAIFAAAACWZlZVNjYWxlNgUAAAAKcm91dGluZ0ZlZQUAAAAJZmVlU2NhbGU2AwMJAAAAAAAAAgUAAAAPZXhjaGFuZ2VDb3VudGVyBQAAAAtyb3V0aW5nU2l6ZQkAAGcAAAACBQAAAA1hbW91bnRXaXRoRmVlBQAAABJtaW5BbW91bnRUb1JlY2VpdmUHCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAANYW1vdW50V2l0aEZlZQUAAAALYXNzZXRJZFNlbmQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAPbW9uZXlCb3hBZGRyZXNzCQAAZQAAAAIFAAAAEGFtb3VudFdpdGhvdXRGZWUFAAAADWFtb3VudFdpdGhGZWUFAAAAC2Fzc2V0SWRTZW5kBQAAAANuaWwJAAACAAAAAQIAAAA+cm91dGluZyAhPSByb3V0aW5nU2l6ZSBvciBhbW91bnRUb1JlY2lldmUgPCBtaW5BbW91bnRUb1JlY2VpdmUAAAABaQEAAAAIc2h1dGRvd24AAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAALaXNBZG1pbkNhbGwAAAABBQAAAAFpAwkBAAAAASEAAAABBQAAAAZhY3RpdmUJAAACAAAAAQkAASwAAAACAgAAACJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAABmtDYXVzZQIAAAAadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQAAAAdzdXNwZW5kAAAAAQIAAAAPUGF1c2VkIGJ5IGFkbWluAAAAAWkBAAAACGFjdGl2YXRlAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAC2lzQWRtaW5DYWxsAAAAAQUAAAABaQMFAAAABmFjdGl2ZQkBAAAADXRocm93SXNBY3RpdmUAAAAACQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAdrQWN0aXZlBgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAAZrQ2F1c2UFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAE211bHRpU2lnbmVkQnlBZG1pbnMEAAAAEmFkbWluUHViS2V5MVNpZ25lZAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAAxhZG1pblB1YktleTEAAAAAAAAAAAEAAAAAAAAAAAAEAAAAEmFkbWluUHViS2V5MlNpZ25lZAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAABBQAAAAxhZG1pblB1YktleTIAAAAAAAAAAAEAAAAAAAAAAAAEAAAAEmFkbWluUHViS2V5M1NpZ25lZAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAACBQAAAAxhZG1pblB1YktleTMAAAAAAAAAAAEAAAAAAAAAAAAJAABnAAAAAgkAAGQAAAACCQAAZAAAAAIFAAAAEmFkbWluUHViS2V5MVNpZ25lZAUAAAASYWRtaW5QdWJLZXkyU2lnbmVkBQAAABJhZG1pblB1YktleTNTaWduZWQAAAAAAAAAAAIEAAAAByRtYXRjaDAFAAAAAnR4BQAAABNtdWx0aVNpZ25lZEJ5QWRtaW5zXqrUUw==", "height": 2215635, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3RmRwRySRNKjzx8kLkRPiDrmVe3woY2LPiJPRsnkcGFH Next: 6q2hmAeZiscKrQkZybYsLj78M5wmEsbJPao2Qnv4qcmT Diff:
OldNewDifferences
2626 let kGovAddress = "governance_address"
2727
2828 let kFee = "commission"
29+
30+let kMultyAssetBalance = "_balance"
2931
3032 let digits8 = 8
3133
117119
118120
119121 func checkPossibility (caller,pmtAmount,minAmountToReceive,exchangers,exchangersType,routingAssetsKeys,args1,args2) = {
120- let dApp1TokenPay = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[0])
121- let dApp1TokenGet = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[1])
122- let dApp2TokenPay = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[2])
123- let dApp2TokenGet = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[3])
124122 let feeDiscount = calculateFeeDiscount(caller)
125- let getFrom1TradeWithFee = if ((exchangersType[0] == "cpmm"))
123+ let getFrom1TradeWithFee = if ((exchangersType[0] == "curveMultyFlat"))
126124 then {
127- let fee = getIntegerValue(addressFromStringValue(exchangers[0]), kFee)
128- let getFrom1TradeWithoutFee = fraction(dApp1TokenGet, pmtAmount, (pmtAmount + dApp1TokenPay))
129- fraction(getFrom1TradeWithoutFee, (feeScale6 - fraction(fee, feeDiscount, feeScale6)), feeScale6)
125+ let inv = {
126+ let @ = invoke(addressFromStringValue(exchangers[0]), "getDy", [routingAssetsKeys[0], routingAssetsKeys[1], pmtAmount], nil)
127+ if ($isInstanceOf(@, "Int"))
128+ then @
129+ else throw("Couldn't cast Any to Int")
130+ }
131+ if ((inv == inv))
132+ then {
133+ let @ = inv
134+ if ($isInstanceOf(@, "Int"))
135+ then @
136+ else throw("Couldn't cast Int to Int")
137+ }
138+ else throw("Strict value is not equal to itself.")
130139 }
131- else if ((exchangersType[0] == "flat"))
132- then {
133- let invariant = invariantCalc(dApp1TokenPay, dApp1TokenGet)
134- let minAmountToReceive1 = args2[0]
135- let invariantNew = invariantCalc((dApp1TokenPay + pmtAmount), (dApp1TokenGet - minAmountToReceive1))
136- if ((invariantNew >= invariant))
137- then minAmountToReceive1
138- else throw("Flat contract: invariantNew < invariant")
140+ else {
141+ let dApp1TokenPay = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[0])
142+ let dApp1TokenGet = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[1])
143+ if ((exchangersType[0] == "cpmm"))
144+ then {
145+ let fee = getIntegerValue(addressFromStringValue(exchangers[0]), kFee)
146+ let getFrom1TradeWithoutFee = fraction(dApp1TokenGet, pmtAmount, (pmtAmount + dApp1TokenPay))
147+ fraction(getFrom1TradeWithoutFee, (feeScale6 - fraction(fee, feeDiscount, feeScale6)), feeScale6)
148+ }
149+ else if ((exchangersType[0] == "flat"))
150+ then {
151+ let invariant = invariantCalc(dApp1TokenPay, dApp1TokenGet)
152+ let minAmountToReceive1 = args2[0]
153+ let invariantNew = invariantCalc((dApp1TokenPay + pmtAmount), (dApp1TokenGet - minAmountToReceive1))
154+ if ((invariantNew >= invariant))
155+ then minAmountToReceive1
156+ else throw("Flat contract: invariantNew < invariant")
157+ }
158+ else throw("Incorrect exchange type")
159+ }
160+ let getFrom2TradeWithFee = if ((exchangersType[0] == "curveMultyFlat"))
161+ then {
162+ let inv = {
163+ let @ = invoke(addressFromStringValue(exchangers[0]), "getDy", [routingAssetsKeys[2], routingAssetsKeys[3], getFrom1TradeWithFee], nil)
164+ if ($isInstanceOf(@, "Int"))
165+ then @
166+ else throw("Couldn't cast Any to Int")
139167 }
140- else throw("Incorrect exchange type")
141- let getFrom2TradeWithFee = if ((exchangersType[1] == "cpmm"))
142- then {
143- let getFrom2TradeWithoutFee = fraction(dApp2TokenGet, getFrom1TradeWithFee, (getFrom1TradeWithFee + dApp2TokenPay))
144- let fee = getIntegerValue(addressFromStringValue(exchangers[0]), kFee)
145- fraction(getFrom2TradeWithoutFee, (feeScale6 - fraction(fee, feeDiscount, feeScale6)), feeScale6)
168+ if ((inv == inv))
169+ then inv
170+ else throw("Strict value is not equal to itself.")
146171 }
147- else if ((exchangersType[1] == "flat"))
148- then {
149- let invariant = invariantCalc(dApp2TokenPay, dApp2TokenGet)
150- let minAmountToReceive2 = args2[1]
151- let invariantNew = invariantCalc((dApp2TokenPay + getFrom1TradeWithFee), (dApp2TokenGet - minAmountToReceive2))
152- if ((invariantNew >= invariant))
153- then minAmountToReceive2
154- else throw("Flat contract: invariantNew < invariant")
155- }
156- else throw("Incorrect exchange type")
172+ else {
173+ let dApp2TokenPay = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[2])
174+ let dApp2TokenGet = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[3])
175+ if ((exchangersType[1] == "cpmm"))
176+ then {
177+ let getFrom2TradeWithoutFee = fraction(dApp2TokenGet, getFrom1TradeWithFee, (getFrom1TradeWithFee + dApp2TokenPay))
178+ let fee = getIntegerValue(addressFromStringValue(exchangers[0]), kFee)
179+ fraction(getFrom2TradeWithoutFee, (feeScale6 - fraction(fee, feeDiscount, feeScale6)), feeScale6)
180+ }
181+ else if ((exchangersType[1] == "flat"))
182+ then {
183+ let invariant = invariantCalc(dApp2TokenPay, dApp2TokenGet)
184+ let minAmountToReceive2 = args2[1]
185+ let invariantNew = invariantCalc((dApp2TokenPay + getFrom1TradeWithFee), (dApp2TokenGet - minAmountToReceive2))
186+ if ((invariantNew >= invariant))
187+ then minAmountToReceive2
188+ else throw("Flat contract: invariantNew < invariant")
189+ }
190+ else throw("Incorrect exchange type")
191+ }
157192 (getFrom2TradeWithFee >= minAmountToReceive)
158193 }
159194
160195
161196 @Callable(i)
162197 func routingTrade (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = valueOrElse(isActive(), {
163- let $t067036777 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
164- let pmtAmount = $t067036777._1
165- let pmtAssetId = $t067036777._2
198+ let $t073977471 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
199+ let pmtAmount = $t073977471._1
200+ let pmtAssetId = $t073977471._2
166201 if (!(checkPossibility(i.caller, pmtAmount, minAmountToReceive, exchangers, exchangersType, routingAssetsKeys, args1, args2)))
167202 then throw("Check transaction possibilty: declined")
168203 else if (if (!(isDefined(getString(oracle, (kPoolInOracle + exchangers[0])))))
172207 else {
173208 let routingSize = size(exchangers)
174209 func exchangeFold (accumulated,exchanger) = {
175- let $t072917356 = accumulated
176- let exchangeCounter = $t072917356._1
177- let amountsWithFee = $t072917356._2
178- let assetsIdSend = $t072917356._3
179- let $t073697567 = if ((exchangeCounter == 0))
210+ let $t079858050 = accumulated
211+ let exchangeCounter = $t079858050._1
212+ let amountsWithFee = $t079858050._2
213+ let assetsIdSend = $t079858050._3
214+ let $t080638261 = if ((exchangeCounter == 0))
180215 then $Tuple2(pmtAssetId, pmtAmount)
181216 else $Tuple2(assetsIdSend, amountsWithFee)
182- let pmtAssetIdRout = $t073697567._1
183- let pmtAmountRout = $t073697567._2
217+ let pmtAssetIdRout = $t080638261._1
218+ let pmtAmountRout = $t080638261._2
184219 if (((if ((exchangeCounter >= 0))
185220 then (routingSize > exchangeCounter)
186221 else false) == true))
204239 if ((inv == inv))
205240 then match inv {
206241 case inv: (Int, Unit)|(Int, ByteVector) =>
207- let $t084328470 = inv
208- let amountWithFee = $t084328470._1
209- let assetIdSend = $t084328470._2
242+ let $t091269164 = inv
243+ let amountWithFee = $t091269164._1
244+ let assetIdSend = $t091269164._2
210245 $Tuple3((exchangeCounter + 1), amountWithFee, assetIdSend)
211246 case _ =>
212247 throw("Incorrect invoke result: expected amountWithFee and assetsIdSend")
213248 }
214249 else throw("Strict value is not equal to itself.")
215250 }
216- else throw("Incorrect exchange type")
251+ else if ((exchangersType[exchangeCounter] == "curveMultyFlat"))
252+ then {
253+ let inv = {
254+ let @ = invoke(exchangerAddress, "exchange", [args1[exchangeCounter], args2[exchangeCounter]], [AttachedPayment(pmtAssetIdRout, pmtAmountRout)])
255+ if ($isInstanceOf(@, "List[Any]"))
256+ then @
257+ else throw("Couldn't cast Any to List[Any]")
258+ }
259+ if ((inv == inv))
260+ then $Tuple3((exchangeCounter + 1), inv[0], inv[1])
261+ else throw("Strict value is not equal to itself.")
262+ }
263+ else throw("Incorrect exchange type")
217264 }
218265 else accumulated
219266 }
220267
221- let $t088418947 = {
268+ let $t098609966 = {
222269 let $l = exchangers
223270 let $s = size($l)
224271 let $acc0 = $Tuple3(0, 0, base58'')
232279
233280 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
234281 }
235- let exchangeCounter = $t088418947._1
236- let amountWithoutFee = $t088418947._2
237- let assetIdSend = $t088418947._3
282+ let exchangeCounter = $t098609966._1
283+ let amountWithoutFee = $t098609966._2
284+ let assetIdSend = $t098609966._3
238285 let amountWithFee = fraction(amountWithoutFee, (feeScale6 - routingFee), feeScale6)
239286 if (if ((exchangeCounter == routingSize))
240287 then (amountWithFee >= minAmountToReceive)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let kActive = "active"
55
66 let kCause = "shutdown_cause"
77
88 let kPoolInOracle = "pool_"
99
1010 let kUserSwopInGov = "_SWOP_amount"
1111
1212 let kDiscounts = "discounts"
1313
1414 let kDiscountValues = "discount_values"
1515
1616 let kRoutingFee = "routing_fee"
1717
1818 let kAdminPubKey1 = "admin_pub_1"
1919
2020 let kAdminPubKey2 = "admin_pub_2"
2121
2222 let kAdminPubKey3 = "admin_pub_3"
2323
2424 let kMoneyBoxAddress = "money_box_address"
2525
2626 let kGovAddress = "governance_address"
2727
2828 let kFee = "commission"
29+
30+let kMultyAssetBalance = "_balance"
2931
3032 let digits8 = 8
3133
3234 let scale8 = 100000000
3335
3436 let scale16 = 10000000000000000
3537
3638 let alpha = 50
3739
3840 let alphaDigits = 2
3941
4042 let beta = 4600000000000000
4143
4244 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
4345
4446 func getBase58FromOracle (key) = match getString(oracle, key) {
4547 case string: String =>
4648 fromBase58String(string)
4749 case nothing =>
4850 throw((key + "is empty"))
4951 }
5052
5153
5254 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
5355
5456 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
5557
5658 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
5759
5860 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
5961
6062 let govAddress = Address(getBase58FromOracle(kGovAddress))
6163
6264 let active = valueOrElse(getBoolean(this, kActive), true)
6365
6466 let routingFee = valueOrErrorMessage(getInteger(oracle, kRoutingFee), "routing_fee is empty")
6567
6668 let feeScale6 = 1000000
6769
6870 func isActive () = if (active)
6971 then unit
7072 else throw("DApp is inactive at this moment")
7173
7274
7375 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
7476 then unit
7577 else throw("Only admin can call this function")
7678
7779
7880 func throwIsActive () = throw("DApp is already active")
7981
8082
8183 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
8284
8385
8486 func skewness (x,y) = ((fraction(scale16, x, y) + fraction(scale16, y, x)) / 2)
8587
8688
8789 func invariantCalc (x,y) = {
8890 let sk = skewness(x, y)
8991 (fraction((x + y), scale16, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(toInt(pow(fraction(toBigInt(x), toBigInt(y), toBigInt(scale8)), 0, toBigInt(5), 1, (digits8 / 2), DOWN)), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
9092 }
9193
9294
9395 func calculateFeeDiscount (userAddr) = {
9496 let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
9597 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
9698 let discounts = split(getStringValue(oracle, kDiscounts), ",")
9799 if (if ((swopAmount >= parseIntValue(discountValues[0])))
98100 then (parseIntValue(discountValues[1]) > swopAmount)
99101 else false)
100102 then (feeScale6 - parseIntValue(discounts[0]))
101103 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
102104 then (parseIntValue(discountValues[2]) > swopAmount)
103105 else false)
104106 then (feeScale6 - parseIntValue(discounts[1]))
105107 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
106108 then (parseIntValue(discountValues[3]) > swopAmount)
107109 else false)
108110 then (feeScale6 - parseIntValue(discounts[2]))
109111 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
110112 then (parseIntValue(discountValues[4]) > swopAmount)
111113 else false)
112114 then (feeScale6 - parseIntValue(discounts[3]))
113115 else if ((swopAmount >= parseIntValue(discountValues[4])))
114116 then (feeScale6 - parseIntValue(discounts[4]))
115117 else feeScale6
116118 }
117119
118120
119121 func checkPossibility (caller,pmtAmount,minAmountToReceive,exchangers,exchangersType,routingAssetsKeys,args1,args2) = {
120- let dApp1TokenPay = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[0])
121- let dApp1TokenGet = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[1])
122- let dApp2TokenPay = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[2])
123- let dApp2TokenGet = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[3])
124122 let feeDiscount = calculateFeeDiscount(caller)
125- let getFrom1TradeWithFee = if ((exchangersType[0] == "cpmm"))
123+ let getFrom1TradeWithFee = if ((exchangersType[0] == "curveMultyFlat"))
126124 then {
127- let fee = getIntegerValue(addressFromStringValue(exchangers[0]), kFee)
128- let getFrom1TradeWithoutFee = fraction(dApp1TokenGet, pmtAmount, (pmtAmount + dApp1TokenPay))
129- fraction(getFrom1TradeWithoutFee, (feeScale6 - fraction(fee, feeDiscount, feeScale6)), feeScale6)
125+ let inv = {
126+ let @ = invoke(addressFromStringValue(exchangers[0]), "getDy", [routingAssetsKeys[0], routingAssetsKeys[1], pmtAmount], nil)
127+ if ($isInstanceOf(@, "Int"))
128+ then @
129+ else throw("Couldn't cast Any to Int")
130+ }
131+ if ((inv == inv))
132+ then {
133+ let @ = inv
134+ if ($isInstanceOf(@, "Int"))
135+ then @
136+ else throw("Couldn't cast Int to Int")
137+ }
138+ else throw("Strict value is not equal to itself.")
130139 }
131- else if ((exchangersType[0] == "flat"))
132- then {
133- let invariant = invariantCalc(dApp1TokenPay, dApp1TokenGet)
134- let minAmountToReceive1 = args2[0]
135- let invariantNew = invariantCalc((dApp1TokenPay + pmtAmount), (dApp1TokenGet - minAmountToReceive1))
136- if ((invariantNew >= invariant))
137- then minAmountToReceive1
138- else throw("Flat contract: invariantNew < invariant")
140+ else {
141+ let dApp1TokenPay = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[0])
142+ let dApp1TokenGet = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[1])
143+ if ((exchangersType[0] == "cpmm"))
144+ then {
145+ let fee = getIntegerValue(addressFromStringValue(exchangers[0]), kFee)
146+ let getFrom1TradeWithoutFee = fraction(dApp1TokenGet, pmtAmount, (pmtAmount + dApp1TokenPay))
147+ fraction(getFrom1TradeWithoutFee, (feeScale6 - fraction(fee, feeDiscount, feeScale6)), feeScale6)
148+ }
149+ else if ((exchangersType[0] == "flat"))
150+ then {
151+ let invariant = invariantCalc(dApp1TokenPay, dApp1TokenGet)
152+ let minAmountToReceive1 = args2[0]
153+ let invariantNew = invariantCalc((dApp1TokenPay + pmtAmount), (dApp1TokenGet - minAmountToReceive1))
154+ if ((invariantNew >= invariant))
155+ then minAmountToReceive1
156+ else throw("Flat contract: invariantNew < invariant")
157+ }
158+ else throw("Incorrect exchange type")
159+ }
160+ let getFrom2TradeWithFee = if ((exchangersType[0] == "curveMultyFlat"))
161+ then {
162+ let inv = {
163+ let @ = invoke(addressFromStringValue(exchangers[0]), "getDy", [routingAssetsKeys[2], routingAssetsKeys[3], getFrom1TradeWithFee], nil)
164+ if ($isInstanceOf(@, "Int"))
165+ then @
166+ else throw("Couldn't cast Any to Int")
139167 }
140- else throw("Incorrect exchange type")
141- let getFrom2TradeWithFee = if ((exchangersType[1] == "cpmm"))
142- then {
143- let getFrom2TradeWithoutFee = fraction(dApp2TokenGet, getFrom1TradeWithFee, (getFrom1TradeWithFee + dApp2TokenPay))
144- let fee = getIntegerValue(addressFromStringValue(exchangers[0]), kFee)
145- fraction(getFrom2TradeWithoutFee, (feeScale6 - fraction(fee, feeDiscount, feeScale6)), feeScale6)
168+ if ((inv == inv))
169+ then inv
170+ else throw("Strict value is not equal to itself.")
146171 }
147- else if ((exchangersType[1] == "flat"))
148- then {
149- let invariant = invariantCalc(dApp2TokenPay, dApp2TokenGet)
150- let minAmountToReceive2 = args2[1]
151- let invariantNew = invariantCalc((dApp2TokenPay + getFrom1TradeWithFee), (dApp2TokenGet - minAmountToReceive2))
152- if ((invariantNew >= invariant))
153- then minAmountToReceive2
154- else throw("Flat contract: invariantNew < invariant")
155- }
156- else throw("Incorrect exchange type")
172+ else {
173+ let dApp2TokenPay = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[2])
174+ let dApp2TokenGet = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[3])
175+ if ((exchangersType[1] == "cpmm"))
176+ then {
177+ let getFrom2TradeWithoutFee = fraction(dApp2TokenGet, getFrom1TradeWithFee, (getFrom1TradeWithFee + dApp2TokenPay))
178+ let fee = getIntegerValue(addressFromStringValue(exchangers[0]), kFee)
179+ fraction(getFrom2TradeWithoutFee, (feeScale6 - fraction(fee, feeDiscount, feeScale6)), feeScale6)
180+ }
181+ else if ((exchangersType[1] == "flat"))
182+ then {
183+ let invariant = invariantCalc(dApp2TokenPay, dApp2TokenGet)
184+ let minAmountToReceive2 = args2[1]
185+ let invariantNew = invariantCalc((dApp2TokenPay + getFrom1TradeWithFee), (dApp2TokenGet - minAmountToReceive2))
186+ if ((invariantNew >= invariant))
187+ then minAmountToReceive2
188+ else throw("Flat contract: invariantNew < invariant")
189+ }
190+ else throw("Incorrect exchange type")
191+ }
157192 (getFrom2TradeWithFee >= minAmountToReceive)
158193 }
159194
160195
161196 @Callable(i)
162197 func routingTrade (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = valueOrElse(isActive(), {
163- let $t067036777 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
164- let pmtAmount = $t067036777._1
165- let pmtAssetId = $t067036777._2
198+ let $t073977471 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
199+ let pmtAmount = $t073977471._1
200+ let pmtAssetId = $t073977471._2
166201 if (!(checkPossibility(i.caller, pmtAmount, minAmountToReceive, exchangers, exchangersType, routingAssetsKeys, args1, args2)))
167202 then throw("Check transaction possibilty: declined")
168203 else if (if (!(isDefined(getString(oracle, (kPoolInOracle + exchangers[0])))))
169204 then true
170205 else !(isDefined(getString(oracle, (kPoolInOracle + exchangers[1])))))
171206 then throw("Pool is not in oracle")
172207 else {
173208 let routingSize = size(exchangers)
174209 func exchangeFold (accumulated,exchanger) = {
175- let $t072917356 = accumulated
176- let exchangeCounter = $t072917356._1
177- let amountsWithFee = $t072917356._2
178- let assetsIdSend = $t072917356._3
179- let $t073697567 = if ((exchangeCounter == 0))
210+ let $t079858050 = accumulated
211+ let exchangeCounter = $t079858050._1
212+ let amountsWithFee = $t079858050._2
213+ let assetsIdSend = $t079858050._3
214+ let $t080638261 = if ((exchangeCounter == 0))
180215 then $Tuple2(pmtAssetId, pmtAmount)
181216 else $Tuple2(assetsIdSend, amountsWithFee)
182- let pmtAssetIdRout = $t073697567._1
183- let pmtAmountRout = $t073697567._2
217+ let pmtAssetIdRout = $t080638261._1
218+ let pmtAmountRout = $t080638261._2
184219 if (((if ((exchangeCounter >= 0))
185220 then (routingSize > exchangeCounter)
186221 else false) == true))
187222 then {
188223 let exchangerAddress = addressFromStringValue(exchanger)
189224 if ((exchangersType[exchangeCounter] == "cpmm"))
190225 then {
191226 let inv = {
192227 let @ = invoke(exchangerAddress, "callFunction", ["exchange", [toString(args1[exchangeCounter])]], [AttachedPayment(pmtAssetIdRout, pmtAmountRout)])
193228 if ($isInstanceOf(@, "List[Any]"))
194229 then @
195230 else throw("Couldn't cast Any to List[Any]")
196231 }
197232 if ((inv == inv))
198233 then $Tuple3((exchangeCounter + 1), inv[0], inv[1])
199234 else throw("Strict value is not equal to itself.")
200235 }
201236 else if ((exchangersType[exchangeCounter] == "flat"))
202237 then {
203238 let inv = invoke(exchangerAddress, "exchange", [args1[exchangeCounter], args2[exchangeCounter]], [AttachedPayment(pmtAssetIdRout, pmtAmountRout)])
204239 if ((inv == inv))
205240 then match inv {
206241 case inv: (Int, Unit)|(Int, ByteVector) =>
207- let $t084328470 = inv
208- let amountWithFee = $t084328470._1
209- let assetIdSend = $t084328470._2
242+ let $t091269164 = inv
243+ let amountWithFee = $t091269164._1
244+ let assetIdSend = $t091269164._2
210245 $Tuple3((exchangeCounter + 1), amountWithFee, assetIdSend)
211246 case _ =>
212247 throw("Incorrect invoke result: expected amountWithFee and assetsIdSend")
213248 }
214249 else throw("Strict value is not equal to itself.")
215250 }
216- else throw("Incorrect exchange type")
251+ else if ((exchangersType[exchangeCounter] == "curveMultyFlat"))
252+ then {
253+ let inv = {
254+ let @ = invoke(exchangerAddress, "exchange", [args1[exchangeCounter], args2[exchangeCounter]], [AttachedPayment(pmtAssetIdRout, pmtAmountRout)])
255+ if ($isInstanceOf(@, "List[Any]"))
256+ then @
257+ else throw("Couldn't cast Any to List[Any]")
258+ }
259+ if ((inv == inv))
260+ then $Tuple3((exchangeCounter + 1), inv[0], inv[1])
261+ else throw("Strict value is not equal to itself.")
262+ }
263+ else throw("Incorrect exchange type")
217264 }
218265 else accumulated
219266 }
220267
221- let $t088418947 = {
268+ let $t098609966 = {
222269 let $l = exchangers
223270 let $s = size($l)
224271 let $acc0 = $Tuple3(0, 0, base58'')
225272 func $f0_1 ($a,$i) = if (($i >= $s))
226273 then $a
227274 else exchangeFold($a, $l[$i])
228275
229276 func $f0_2 ($a,$i) = if (($i >= $s))
230277 then $a
231278 else throw("List size exceeds 3")
232279
233280 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
234281 }
235- let exchangeCounter = $t088418947._1
236- let amountWithoutFee = $t088418947._2
237- let assetIdSend = $t088418947._3
282+ let exchangeCounter = $t098609966._1
283+ let amountWithoutFee = $t098609966._2
284+ let assetIdSend = $t098609966._3
238285 let amountWithFee = fraction(amountWithoutFee, (feeScale6 - routingFee), feeScale6)
239286 if (if ((exchangeCounter == routingSize))
240287 then (amountWithFee >= minAmountToReceive)
241288 else false)
242289 then [ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, (amountWithoutFee - amountWithFee), assetIdSend)]
243290 else throw("routing != routingSize or amountToRecieve < minAmountToReceive")
244291 }
245292 })
246293
247294
248295
249296 @Callable(i)
250297 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
251298 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
252299 else suspend("Paused by admin"))
253300
254301
255302
256303 @Callable(i)
257304 func activate () = valueOrElse(isAdminCall(i), if (active)
258305 then throwIsActive()
259306 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
260307
261308
262309 @Verifier(tx)
263310 func verify () = {
264311 let multiSignedByAdmins = {
265312 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
266313 then 1
267314 else 0
268315 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
269316 then 1
270317 else 0
271318 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
272319 then 1
273320 else 0
274321 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
275322 }
276323 match tx {
277324 case _ =>
278325 multiSignedByAdmins
279326 }
280327 }
281328

github/deemru/w8io/169f3d6 
58.01 ms