tx · 2nyzACnqpWzh8eoMYDb2sNWuAqWzAuGWXbKajWwPSeAo

3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw:  -0.01800000 Waves

2022.08.26 13:46 [3266811] smart account 3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw > SELF 0.00000000 Waves

{ "type": 13, "id": "2nyzACnqpWzh8eoMYDb2sNWuAqWzAuGWXbKajWwPSeAo", "fee": 1800000, "feeAssetId": null, "timestamp": 1661510800229, "version": 2, "chainId": 87, "sender": "3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw", "senderPublicKey": "4MfTwwE7yP4BFGaifQrcc9Nwb5BA9t92WKhVb6Ton65k", "proofs": [ "2LBZu7HPrrwH2E4jsrSpipha77oMRsmRcRU2n5n7rRfoC3iCVuvp5k8iTM6AuGgrhbJEgTBqcA7UViNzs4rrdQQA" ], "script": "base64:AAIFAAAAAAAAAEMIAhIHCgUYGBEBARIICgYYGBEBAQgSCAoGGBgRERgBEgkKBxgYEREYAQgSBAoCCAESBQoDCAEIEgMKARgSBQoDCAgBAAAAGQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADENhbid0IHJlYWQgJwUAAAADa2V5AgAAAA0nIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAB2FkZHJlc3MBAAAAEWdldEludGVnZXJPclRocm93AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMQ2FuJ3QgcmVhZCAnBQAAAANrZXkCAAAADScgYXQgYWRkcmVzcyAJAAQlAAAAAQUAAAAHYWRkcmVzcwEAAAATcGFyc2VBZGRyZXNzT3JUaHJvdwAAAAEAAAAMbWF5YmVBZGRyZXNzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAAMbWF5YmVBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAaQ2FuJ3QgcGFyc2UgYWRkcmVzcyBmcm9tICcFAAAADG1heWJlQWRkcmVzcwIAAAABJwEAAAAPcGFyc2VJbnRPclRocm93AAAAAQAAAAhtYXliZUludAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEtgAAAAEFAAAACG1heWJlSW50CQABLAAAAAIJAAEsAAAAAgIAAAAaQ2FuJ3QgcGFyc2UgaW50ZWdlciBmcm9tICcFAAAACG1heWJlSW50AgAAAAEnAQAAAApnZXRBc3NldElkAAAAAQAAAAVhc3NldAMJAAAAAAAAAgUAAAAFYXNzZXQCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAABWFzc2V0AAAAAAljb2xsZWN0b3IJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAljb2xsZWN0b3IAAAAAB2ZlZVJhdGUJAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAACGZlZS1yYXRlAAAAAAZvcmFjbGUJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAZvcmFjbGUAAAAADXN3b3BmaVJvdXRpbmcJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAA5zd29wZmktcm91dGluZwAAAAANcHV6emxlUm91dGluZwkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAADnB1enpsZS1yb3V0aW5nAAAAAAVwb29scwkABLUAAAACCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABm9yYWNsZQIAAAAFcG9vbHMCAAAAASwAAAAAC3BlcmNlbnRSYXRlCQEAAAARZ2V0SW50ZWdlck9yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAxwZXJjZW50LXJhdGUAAAAABnJlZktleQIAAAAGa2VlcGVyAAAAABRwdXp6bGVSZXdhcmRBc3NldFN0cgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAABNwdXp6bGUtcmV3YXJkLXRva2VuAAAAABNwdXp6bGVSZXdhcmRBc3NldElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAAFHB1enpsZVJld2FyZEFzc2V0U3RyAAAAAAZwUG9vbHMJAAS1AAAAAgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAdwLXBvb2xzAgAAAAEsAQAAAA9hc3NldElkVG9TdHJpbmcAAAABAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAABWFzc2V0BQAAAAckbWF0Y2gwCQACWAAAAAEFAAAABWFzc2V0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAV3YXZlcwUAAAAHJG1hdGNoMAIAAAAFV0FWRVMJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAACmdldEJhbGFuY2UAAAABAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAABWFzc2V0BQAAAAckbWF0Y2gwCQAD8AAAAAIFAAAABHRoaXMFAAAABWFzc2V0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAV3YXZlcwUAAAAHJG1hdGNoMAgJAAPvAAAAAQUAAAAEdGhpcwAAAAlhdmFpbGFibGUJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAAE2dldEJhbGFuY2VCeUFkZHJlc3MAAAACAAAAB2FkZHJlc3MAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAAFYXNzZXQFAAAAByRtYXRjaDAJAAPwAAAAAgUAAAAHYWRkcmVzcwUAAAAFYXNzZXQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwCAkAA+8AAAABBQAAAAdhZGRyZXNzAAAACWF2YWlsYWJsZQkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAJZGVkdWN0RmVlAAAAAQAAAAZhbW91bnQEAAAAA2ZlZQkAAGsAAAADBQAAAAZhbW91bnQAAAAAAAAAAAEFAAAAB2ZlZVJhdGUJAAUUAAAAAgkAAGUAAAACBQAAAAZhbW91bnQFAAAAA2ZlZQUAAAADZmVlAQAAAA9nZXRSZWZlcnJlckRhdGEAAAABAAAADHJlZmVycmVyTmFtZQQAAAAKcmVmQWRkcmVzcwkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAICAAAACXJlZmVycmVyLQUAAAAMcmVmZXJyZXJOYW1lAgAAAAgtYWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAE3JlZmVycmVyIHdpdGggbmFtZSAFAAAADHJlZmVycmVyTmFtZQIAAAAKIG5vdCBmb3VuZAQAAAAKcmVmUGVyY2VudAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgIAAAAJcmVmZXJyZXItBQAAAAxyZWZlcnJlck5hbWUCAAAACC1wZXJjZW50BQAAAAtwZXJjZW50UmF0ZQMDCQAAZgAAAAIAAAAAAAAAAAAFAAAACnJlZlBlcmNlbnQGCQAAZgAAAAIFAAAACnJlZlBlcmNlbnQAAAAAAAAAAGQJAAACAAAAAQIAAAAWSW5jb3JyZWN0IHBlcmNlbnQgcmF0ZQkABRQAAAACBQAAAApyZWZBZGRyZXNzBQAAAApyZWZQZXJjZW50AQAAAAZkb1N3YXAAAAAFAAAABHBvb2wAAAAHcGF5bWVudAAAAA1hc3NldFJlY2VpdmVkAAAAEmVzdEFtb3VudFRvUmVjZWl2ZQAAABFzbGlwcGFnZVRvbGVyYW5jZQQAAAALcG9vbEFkZHJlc3MJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQUAAAAEcG9vbAQAAAAMdmVyc2lvbk1ham9yCQEAAAAPcGFyc2VJbnRPclRocm93AAAAAQkAAZEAAAACCQAEtQAAAAIJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAALcG9vbEFkZHJlc3MCAAAAB3ZlcnNpb24CAAAAAS4AAAAAAAAAAAAEAAAAD2Fzc2V0UmVjZWl2ZWRJZAkBAAAACmdldEFzc2V0SWQAAAABBQAAAA1hc3NldFJlY2VpdmVkAwkAAGYAAAACAAAAAAAAAAAABQAAABJlc3RBbW91bnRUb1JlY2VpdmUJAAACAAAAAQIAAAAjZXN0QW1vdW50VG9SZWNlaXZlIG11c3QgYmUgcG9zaXRpdmUDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAFcG9vbHMFAAAABHBvb2wEAAAACnBvb2xBc3NldEEJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAALcG9vbEFkZHJlc3MCAAAACkFfYXNzZXRfaWQEAAAACnBvb2xBc3NldEIJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAALcG9vbEFkZHJlc3MCAAAACkJfYXNzZXRfaWQEAAAADHBvb2xBc3NldElkQQkBAAAACmdldEFzc2V0SWQAAAABBQAAAApwb29sQXNzZXRBBAAAAAxwb29sQXNzZXRJZEIJAQAAAApnZXRBc3NldElkAAAAAQUAAAAKcG9vbEFzc2V0QgQAAAALJHQwMzI4NzM2MzEDAwkAAAAAAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAAxwb29sQXNzZXRJZEEJAAAAAAAAAgUAAAAPYXNzZXRSZWNlaXZlZElkBQAAAAxwb29sQXNzZXRJZEIHCQAFFAAAAAIFAAAADHBvb2xBc3NldElkQQUAAAAMcG9vbEFzc2V0SWRCAwMJAAAAAAAAAgUAAAAPYXNzZXRSZWNlaXZlZElkBQAAAAxwb29sQXNzZXRJZEEJAAAAAAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAAMcG9vbEFzc2V0SWRCBwkABRQAAAACBQAAAAxwb29sQXNzZXRJZEIFAAAADHBvb2xBc3NldElkQQkAAAIAAAABAgAAABdVbnN1cHBvcnRlZCBhc3NldHMgcGFpcgQAAAAHYXNzZXRJbggFAAAACyR0MDMyODczNjMxAAAAAl8xBAAAAAhhc3NldE91dAgFAAAACyR0MDMyODczNjMxAAAAAl8yBAAAAARhcmdzAwkAAAAAAAACBQAAAAx2ZXJzaW9uTWFqb3IAAAAAAAAAAAEJAARMAAAAAgAAAAAAAAAAAQUAAAADbmlsAwkAAAAAAAACBQAAAAx2ZXJzaW9uTWFqb3IAAAAAAAAAAAIDCQAAZwAAAAIAAAAAAAAAAAAFAAAAEmVzdEFtb3VudFRvUmVjZWl2ZQkAAAIAAAABAgAAACNlc3RBbW91bnRUb1JlY2VpdmUgbXVzdCBiZSBwb3NpdGl2ZQMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBgkAAGYAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQAAAAAAAAAD6AkAAAIAAAABAgAAAEZTbGlwcGFnZSB0b2xlcmFuY2Ug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AgAAAAFfAAAAAAAAAAAAAgAAAAlfYXNzZXRfaWQEAAAACmFzc2V0RmluYWwJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAA1sYXN0RXhjaGFuZ2VyBQAAAA5sYXN0QXNzZXRJZEtleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAWQ2FuJ3QgcmVhZCBwYXJhbWV0ZXIgJwUAAAAObGFzdEFzc2V0SWRLZXkCAAAAECcgZm9yIGV4Y2hhbmdlciAJAAQlAAAAAQUAAAANbGFzdEV4Y2hhbmdlcgQAAAAMYXNzZXRGaW5hbElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAACmFzc2V0RmluYWwEAAAADWJhbGFuY2VCZWZvcmUJAQAAAApnZXRCYWxhbmNlAAAAAQUAAAAMYXNzZXRGaW5hbElkAwkAAAAAAAACBQAAAA1iYWxhbmNlQmVmb3JlBQAAAA1iYWxhbmNlQmVmb3JlBAAAAAZyZXN1bHQJAAP8AAAABAUAAAANc3dvcGZpUm91dGluZwIAAAAMcm91dGluZ1RyYWRlCQAETAAAAAIFAAAACmV4Y2hhbmdlcnMJAARMAAAAAgUAAAAOZXhjaGFuZ2Vyc1R5cGUJAARMAAAAAgUAAAAFYXJnczEJAARMAAAAAgUAAAAFYXJnczIJAARMAAAAAgUAAAARcm91dGluZ0Fzc2V0c0tleXMJAARMAAAAAgUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAANuaWwJAARMAAAAAgUAAAADcG10BQAAAANuaWwDCQAAAAAAAAIFAAAABnJlc3VsdAUAAAAGcmVzdWx0BAAAAAxiYWxhbmNlQWZ0ZXIJAQAAAApnZXRCYWxhbmNlAAAAAQUAAAAMYXNzZXRGaW5hbElkAwkAAAAAAAACBQAAAAxiYWxhbmNlQWZ0ZXIFAAAADGJhbGFuY2VBZnRlcgQAAAAFZGVsdGEJAABlAAAAAgUAAAAMYmFsYW5jZUFmdGVyBQAAAA1iYWxhbmNlQmVmb3JlBAAAAAskdDA3OTgyODAyNwkBAAAACWRlZHVjdEZlZQAAAAEFAAAABWRlbHRhBAAAAA5yZXN1bHRBZnRlckZlZQgFAAAACyR0MDc5ODI4MDI3AAAAAl8xBAAAAANmZWUIBQAA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b2xlcmFuY2UAAAALbWluUmVjZWl2ZWQJAQAAAAh3cmFwU3dhcAAAAAYFAAAAA2ludgUAAAAJYWRkcmVzc2VzBQAAAA9hc3NldHNUb1JlY2VpdmUFAAAAC2VzdFJlY2VpdmVkBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAALbWluUmVjZWl2ZWQAAAADaW52AQAAABBzd2FwV2l0aFJlZmVycmVyAAAABgAAAAlhZGRyZXNzZXMAAAAPYXNzZXRzVG9SZWNlaXZlAAAAC2VzdFJlY2VpdmVkAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAC21pblJlY2VpdmVkAAAADHJlZmVycmVyTmFtZQMJAAAAAAAAAgkAATEAAAABBQAAAAxyZWZlcnJlck5hbWUAAAAAAAAAAAAJAAACAAAAAQIAAAAVUmVmZXJyZXIgbmFtZSBpbnZhbGlkBAAAAAphc3NldEZpbmFsCQABkQAAAAIFAAAAD2Fzc2V0c1RvUmVjZWl2ZQkAAGUAAAACCQABkAAAAAEFAAAAD2Fzc2V0c1RvUmVjZWl2ZQAAAAAAAAAAAQQAAAAHYXNzZXRJZAkBAAAACmdldEFzc2V0SWQAAAABBQAAAAphc3NldEZpbmFsBAAAAAskdDA5NjkxOTc2MQkBAAAAD2dldFJlZmVycmVyRGF0YQAAAAEFAAAADHJlZmVycmVyTmFtZQQAAAAPcmVmZXJyZXJBZGRyZXNzCAUAAAALJHQwOTY5MTk3NjEAAAACXzEEAAAAD3JlZmVycmVyUGVyY2VudAgFAAAACyR0MDk2OTE5NzYxAAAAAl8yBAAAAAZyZXN1bHQJAQAAAAh3cmFwU3dhcAAAAAYFAAAAA2ludgUAAAAJYWRkcmVzc2VzBQAAAA9hc3NldHNUb1JlY2VpdmUFAAAAC2VzdFJlY2VpdmVkBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAALbWluUmVjZWl2ZWQDCQAAAAAAAAIFAAAABnJlc3VsdAUAAAAGcmVzdWx0BAAAAAxjb2xsZWN0b3JGZWUICQABkQAAAAIFAAAABnJlc3VsdAAAAAAAAAAAAQAAAAZhbW91bnQEAAAADnJlZmVycmVyUmV3YXJkCQAAawAAAAMFAAAADGNvbGxlY3RvckZlZQUAAAAPcmVmZXJyZXJQZXJjZW50AAAAAAAAAABkCQAETAAAAAIJAAGRAAAAAgUAAAAGcmVzdWx0AAAAAAAAAAAACQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAACWNvbGxlY3RvcgkAAGUAAAACBQAAAAxjb2xsZWN0b3JGZWUFAAAADnJlZmVycmVyUmV3YXJkBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAD3JlZmVycmVyQWRkcmVzcwUAAAAOcmVmZXJyZXJSZXdhcmQFAAAAB2Fzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAADaW52AQAAAApzd29wZmlTd2FwAAAABgAAAApleGNoYW5nZXJzAAAADmV4Y2hhbmdlcnNUeXBlAAAABWFyZ3MxAAAABWFyZ3MyAAAAEXJvdXRpbmdBc3NldHNLZXlzAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQkBAAAADndyYXBTd29wZmlTd2FwAAAABwUAAAADaW52BQAAAApleGNoYW5nZXJzBQAAAA5leGNoYW5nZXJzVHlwZQUAAAAFYXJnczEFAAAABWFyZ3MyBQAAABFyb3V0aW5nQXNzZXRzS2V5cwUAAAASbWluQW1vdW50VG9SZWNlaXZlAAAAA2ludgEAAAAWc3dvcGZpU3dhcFdpdGhSZWZlcnJlcgAAAAcAAAAKZXhjaGFuZ2VycwAAAA5leGNoYW5nZXJzVHlwZQAAAAVhcmdzMQAAAAVhcmdzMgAAABFyb3V0aW5nQXNzZXRzS2V5cwAAABJtaW5BbW91bnRUb1JlY2VpdmUAAAAMcmVmZXJyZXJOYW1lAwkAAAAAAAACCQABMQAAAAEFAAAADHJlZmVycmVyTmFtZQAAAAAAAAAAAAkAAAIAAAABAgAAABVSZWZlcnJlciBuYW1lIGludmFsaWQEAAAADWxhc3RFeGNoYW5nZXIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAACmV4Y2hhbmdlcnMJAABlAAAAAgkAAZAAAAABBQAAAApleGNoYW5nZXJzAAAAAAAAAAABAgAAAClDYW4ndCBwYXJzZSBsYXN0IGV4Y2hhbmdlciBzd29wZmkgYWRkcmVzcwQAAAAObGFzdEFzc2V0SWRLZXkJAAEsAAAAAgkAAZEAAAACCQAEtQAAAAIJAAGRAAAAAgUAAAARcm91dGluZ0Fzc2V0c0tleXMJAABlAAAAAgkAAZAAAAABBQAAABFyb3V0aW5nQXNzZXRzS2V5cwAAAAAAAAAAAQIAAAABXwAAAAAAAAAAAAIAAAAJX2Fzc2V0X2lkBAAAAAphc3NldEZpbmFsCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANbGFzdEV4Y2hhbmdlcgUAAAAObGFzdEFzc2V0SWRLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAFkNhbid0IHJlYWQgcGFyYW1ldGVyICcFAAAADmxhc3RBc3NldElkS2V5AgAAABAnIGZvciBleGNoYW5nZXIgCQAEJQAAAAEFAAAADWxhc3RFeGNoYW5nZXIEAAAAB2Fzc2V0SWQJAQAAAApnZXRBc3NldElkAAAAAQUAAAAKYXNzZXRGaW5hbAQAAAANJHQwMTEyNjUxMTMzNQkBAAAAD2dldFJlZmVycmVyRGF0YQAAAAEFAAAADHJlZmVycmVyTmFtZQQAAAAPcmVmZXJyZXJBZGRyZXNzCAUAAAANJHQwMTEyNjUxMTMzNQAAAAJfMQQAAAAPcmVmZXJyZXJQZXJjZW50CAUAAAANJHQwMTEyNjUxMTMzNQAAAAJfMgQAAAAGcmVzdWx0CQEAAAAOd3JhcFN3b3BmaVN3YXAAAAAHBQAAAANpbnYFAAAACmV4Y2hhbmdlcnMFAAAADmV4Y2hhbmdlcnNUeXBlBQAAAAVhcmdzMQUAAAAFYXJnczIFAAAAEXJvdXRpbmdBc3NldHNLZXlzBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQAAAAAAAAIFAAAABnJlc3VsdAUAAAAGcmVzdWx0BAAAAAxjb2xsZWN0b3JGZWUICQABkQAAAAIFAAAABnJlc3VsdAAAAAAAAAAAAQAAAAZhbW91bnQEAAAADnJlZmVycmVyUmV3YXJkCQAAawAAAAMFAAAADGNvbGxlY3RvckZlZQUAAAAPcmVmZXJyZXJQZXJjZW50AAAAAAAAAABkCQAETAAAAAIJAAGRAAAAAgUAAAAGcmVzdWx0AAAAAAAAAAAACQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAACWNvbGxlY3RvcgkAAGUAAAACBQAAAAxjb2xsZWN0b3JGZWUFAAAADnJlZmVycmVyUmV3YXJkBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAD3JlZmVycmVyQWRkcmVzcwUAAAAOcmVmZXJyZXJSZXdhcmQFAAAAB2Fzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAADaW52AQAAAApwdXp6bGVTd2FwAAAAAgAAAAlyb3V0ZXNTdHIAAAAMbWluVG9SZWNlaXZlCQEAAAAOd3JhcFB1enpsZVN3YXAAAAADBQAAAANpbnYFAAAACXJvdXRlc1N0cgUAAAAMbWluVG9SZWNlaXZlAAAAA2ludgEAAAAWcHV6emxlU3dhcFdpdGhSZWZlcnJlcgAAAAMAAAAJcm91dGVzU3RyAAAADG1pblRvUmVjZWl2ZQAAAAxyZWZlcnJlck5hbWUDCQAAAAAAAAIJAAExAAAAAQUAAAAJcm91dGVzU3RyAAAAAAAAAAAACQAAAgAAAAECAAAAD0ludmFsaWQgcm91dGluZwMJAABnAAAAAgAAAAAAAAAAAAUAAAAMbWluVG9SZWNlaXZlCQAAAgAAAAECAAAAGFN1bSB0byByZWNlaXZlIGlzIHRvIGxvdwMJAAAAAAAAAgkAATEAAAABBQAAAAxyZWZlcnJlck5hbWUAAAAAAAAAAAAJAAACAAAAAQIAAAAYUmVmZXJyZXIgbmFtZSBpcyBpbnZhbGlkBAAAAAxhc3NldElkRmluYWwJAAGRAAAAAgkABLUAAAACBQAAAAlyb3V0ZXNTdHICAAAAASwJAABlAAAAAgkAAZAAAAABCQAEtQAAAAIFAAAACXJvdXRlc1N0cgIAAAABLAAAAAAAAAAAAQQAAAAHYXNzZXRJZAkBAAAACmdldEFzc2V0SWQAAAABBQAAAAxhc3NldElkRmluYWwEAAAADSR0MDEyMzU2MTI0MjYJAQAAAA9nZXRSZWZlcnJlckRhdGEAAAABBQAAAAxyZWZlcnJlck5hbWUEAAAAD3JlZmVycmVyQWRkcmVzcwgFAAAADSR0MDEyMzU2MTI0MjYAAAACXzEEAAAAD3JlZmVycmVyUGVyY2VudAgFAAAADSR0MDEyMzU2MTI0MjYAAAACXzIEAAAADWJhbGFuY2VCZWZvcmUJAQAAABNnZXRCYWxhbmNlQnlBZGRyZXNzAAAAAgUAAAAJY29sbGVjdG9yBQAAABNwdXp6bGVSZXdhcmRBc3NldElkAwkAAAAAAAACBQAAAA1iYWxhbmNlQmVmb3JlBQAAAA1iYWxhbmNlQmVmb3JlBAAAAAZyZXN1bHQJAQAAAA53cmFwUHV6emxlU3dhcAAAAAMFAAAAA2ludgUAAAAJcm91dGVzU3RyBQAAAAxtaW5Ub1JlY2VpdmUDCQAAAAAAAAIFAAAABnJlc3VsdAUAAAAGcmVzdWx0BAAAAAxiYWxhbmNlQWZ0ZXIJAQAAABNnZXRCYWxhbmNlQnlBZGRyZXNzAAAAAgUAAAAJY29sbGVjdG9yBQAAABNwdXp6bGVSZXdhcmRBc3NldElkAwkAAAAAAAACBQAAAAxiYWxhbmNlQWZ0ZXIFAAAADGJhbGFuY2VBZnRlcgQAAAAFZGVsdGEJAABlAAAAAgUAAAAMYmFsYW5jZUFmdGVyBQAAAA1iYWxhbmNlQmVmb3JlAwkAAAAAAAACBQAAAAVkZWx0YQUAAAAFZGVsdGEEAAAABnJld2FyZAkAAGsAAAADBQAAAAVkZWx0YQUAAAAPcmVmZXJyZXJQZXJjZW50AAAAAAAAAABkBAAAAANyZXMJAAP8AAAABAUAAAAJY29sbGVjdG9yAgAAABNjbGFpbVJlZmVycmVyUmV3YXJkCQAETAAAAAIFAAAABnJld2FyZAkABEwAAAACBQAAABRwdXp6bGVSZXdhcmRBc3NldFN0cgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAA3JlcwUAAAADcmVzCQAETQAAAAIFAAAABnJlc3VsdAkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAPcmVmZXJyZXJBZGRyZXNzBQAAAAZyZXdhcmQFAAAAE3B1enpsZVJld2FyZEFzc2V0SWQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2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", "height": 3266811, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4gDfvLrBMCvU1PsJaV5X14hd2zpfk58bWuF432s4TpTx Next: EHZAuKWwWG4sxwvPWJ9ncH1wAHrsx7YK6b2mrFnyyY1B Diff:
OldNewDifferences
1313 func parseIntOrThrow (maybeInt) = valueOrErrorMessage(parseInt(maybeInt), (("Can't parse integer from '" + maybeInt) + "'"))
1414
1515
16+func getAssetId (asset) = if ((asset == "WAVES"))
17+ then unit
18+ else fromBase58String(asset)
19+
20+
1621 let collector = parseAddressOrThrow(getStringOrThrow(this, "collector"))
1722
1823 let feeRate = getIntegerOrThrow(this, "fee-rate")
2126
2227 let swopfiRouting = parseAddressOrThrow(getStringOrThrow(this, "swopfi-routing"))
2328
29+let puzzleRouting = parseAddressOrThrow(getStringOrThrow(this, "puzzle-routing"))
30+
2431 let pools = split(getStringOrThrow(oracle, "pools"), ",")
2532
33+let percentRate = getIntegerOrThrow(this, "percent-rate")
34+
35+let refKey = "keeper"
36+
37+let puzzleRewardAssetStr = getStringOrThrow(this, "puzzle-reward-token")
38+
39+let puzzleRewardAssetId = getAssetId(puzzleRewardAssetStr)
40+
2641 let pPools = split(getStringOrThrow(this, "p-pools"), ",")
27-
28-func getAssetId (asset) = if ((asset == "WAVES"))
29- then unit
30- else fromBase58String(asset)
31-
3242
3343 func assetIdToString (assetId) = match assetId {
3444 case asset: ByteVector =>
5060 }
5161
5262
63+func getBalanceByAddress (address,assetId) = match assetId {
64+ case asset: ByteVector =>
65+ assetBalance(address, asset)
66+ case waves: Unit =>
67+ wavesBalance(address).available
68+ case _ =>
69+ throw("Match error")
70+}
71+
72+
5373 func deductFee (amount) = {
5474 let fee = fraction(amount, 1, feeRate)
5575 $Tuple2((amount - fee), fee)
76+ }
77+
78+
79+func getReferrerData (referrerName) = {
80+ let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found")))
81+ let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate)
82+ if (if ((0 > refPercent))
83+ then true
84+ else (refPercent > 100))
85+ then throw("Incorrect percent rate")
86+ else $Tuple2(refAddress, refPercent)
5687 }
5788
5889
6899 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
69100 let poolAssetIdA = getAssetId(poolAssetA)
70101 let poolAssetIdB = getAssetId(poolAssetB)
71- let $t023282672 = if (if ((payment.assetId == poolAssetIdA))
102+ let $t032873631 = if (if ((payment.assetId == poolAssetIdA))
72103 then (assetReceivedId == poolAssetIdB)
73104 else false)
74105 then $Tuple2(poolAssetIdA, poolAssetIdB)
77108 else false)
78109 then $Tuple2(poolAssetIdB, poolAssetIdA)
79110 else throw("Unsupported assets pair")
80- let assetIn = $t023282672._1
81- let assetOut = $t023282672._2
111+ let assetIn = $t032873631._1
112+ let assetOut = $t032873631._2
82113 let args = if ((versionMajor == 1))
83114 then [1]
84115 else if ((versionMajor == 2))
135166 }
136167
137168
138-@Callable(inv)
139-func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
169+func wrapSwap (inv,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
140170 let pmt = if ((size(inv.payments) > 0))
141171 then inv.payments[0]
142172 else throw("Payment required")
172202 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
173203 }
174204 else throw("Path cannot be empty")
175- let $t053225374 = deductFee(final.amount)
176- let resultAfterFee = $t053225374._1
177- let fee = $t053225374._2
205+ let $t062886340 = deductFee(final.amount)
206+ let resultAfterFee = $t062886340._1
207+ let fee = $t062886340._2
178208 if ((0 >= final.amount))
179209 then throw((("Swap result " + toString(final.amount)) + " must be positive"))
180210 else if ((minReceived > resultAfterFee))
183213 }
184214
185215
186-
187-@Callable(inv)
188-func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = {
216+func wrapSwopfiSwap (inv,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = {
189217 let pmt = if ((size(inv.payments) > 0))
190218 then inv.payments[0]
191219 else throw("Payment required")
203231 if ((balanceAfter == balanceAfter))
204232 then {
205233 let delta = (balanceAfter - balanceBefore)
206- let $t070107055 = deductFee(delta)
207- let resultAfterFee = $t070107055._1
208- let fee = $t070107055._2
234+ let $t079828027 = deductFee(delta)
235+ let resultAfterFee = $t079828027._1
236+ let fee = $t079828027._2
209237 if ((0 >= delta))
210238 then throw((("Swap result " + toString(delta)) + " must be positive"))
211239 else if ((minAmountToReceive > resultAfterFee))
218246 }
219247 else throw("Strict value is not equal to itself.")
220248 }
249+
250+
251+func wrapPuzzleSwap (inv,routesStr,minToReceive) = {
252+ let pmt = if ((size(inv.payments) > 0))
253+ then inv.payments[0]
254+ else throw("Payment required")
255+ let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
256+ let assetId = getAssetId(assetIdFinal)
257+ let balanceBefore = getBalance(assetId)
258+ if ((balanceBefore == balanceBefore))
259+ then {
260+ let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, refKey], [pmt])
261+ if ((result == result))
262+ then {
263+ let balanceAfter = getBalance(assetId)
264+ if ((balanceAfter == balanceAfter))
265+ then {
266+ let deltaProxy = (balanceAfter - balanceBefore)
267+ if ((deltaProxy == deltaProxy))
268+ then [ScriptTransfer(inv.caller, deltaProxy, assetId)]
269+ else throw("Strict value is not equal to itself.")
270+ }
271+ else throw("Strict value is not equal to itself.")
272+ }
273+ else throw("Strict value is not equal to itself.")
274+ }
275+ else throw("Strict value is not equal to itself.")
276+ }
277+
278+
279+@Callable(inv)
280+func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
281+
282+
283+
284+@Callable(inv)
285+func swapWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,referrerName) = if ((size(referrerName) == 0))
286+ then throw("Referrer name invalid")
287+ else {
288+ let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
289+ let assetId = getAssetId(assetFinal)
290+ let $t096919761 = getReferrerData(referrerName)
291+ let referrerAddress = $t096919761._1
292+ let referrerPercent = $t096919761._2
293+ let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
294+ if ((result == result))
295+ then {
296+ let collectorFee = result[1].amount
297+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
298+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
299+ }
300+ else throw("Strict value is not equal to itself.")
301+ }
302+
303+
304+
305+@Callable(inv)
306+func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
307+
308+
309+
310+@Callable(inv)
311+func swopfiSwapWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,referrerName) = if ((size(referrerName) == 0))
312+ then throw("Referrer name invalid")
313+ else {
314+ let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
315+ let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
316+ let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
317+ let assetId = getAssetId(assetFinal)
318+ let $t01126511335 = getReferrerData(referrerName)
319+ let referrerAddress = $t01126511335._1
320+ let referrerPercent = $t01126511335._2
321+ let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
322+ if ((result == result))
323+ then {
324+ let collectorFee = result[1].amount
325+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
326+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
327+ }
328+ else throw("Strict value is not equal to itself.")
329+ }
330+
331+
332+
333+@Callable(inv)
334+func puzzleSwap (routesStr,minToReceive) = wrapPuzzleSwap(inv, routesStr, minToReceive)
335+
336+
337+
338+@Callable(inv)
339+func puzzleSwapWithReferrer (routesStr,minToReceive,referrerName) = if ((size(routesStr) == 0))
340+ then throw("Invalid routing")
341+ else if ((0 >= minToReceive))
342+ then throw("Sum to receive is to low")
343+ else if ((size(referrerName) == 0))
344+ then throw("Referrer name is invalid")
345+ else {
346+ let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
347+ let assetId = getAssetId(assetIdFinal)
348+ let $t01235612426 = getReferrerData(referrerName)
349+ let referrerAddress = $t01235612426._1
350+ let referrerPercent = $t01235612426._2
351+ let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
352+ if ((balanceBefore == balanceBefore))
353+ then {
354+ let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
355+ if ((result == result))
356+ then {
357+ let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
358+ if ((balanceAfter == balanceAfter))
359+ then {
360+ let delta = (balanceAfter - balanceBefore)
361+ if ((delta == delta))
362+ then {
363+ let reward = fraction(delta, referrerPercent, 100)
364+ let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
365+ if ((res == res))
366+ then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
367+ else throw("Strict value is not equal to itself.")
368+ }
369+ else throw("Strict value is not equal to itself.")
370+ }
371+ else throw("Strict value is not equal to itself.")
372+ }
373+ else throw("Strict value is not equal to itself.")
374+ }
375+ else throw("Strict value is not equal to itself.")
376+ }
221377
222378
223379
246402 }
247403
248404
405+
406+@Callable(inv)
407+func addReferer (referrerName,refererAddress,percent) = {
408+ let address = parseAddressOrThrow(refererAddress)
409+ if (if ((0 > percent))
410+ then true
411+ else (percent > 100))
412+ then throw("Incorrect percent rate")
413+ else if ((size(referrerName) == 0))
414+ then throw("Referrer name invalid")
415+ else if (!(containsElement([this, collector], inv.caller)))
416+ then throw("only self calls or by collector are allowed")
417+ else [StringEntry((("referrer-" + referrerName) + "-address"), refererAddress), IntegerEntry((("referrer-" + referrerName) + "-percent"), percent)]
418+ }
419+
420+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringOrThrow (address,key) = valueOrErrorMessage(getString(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
55
66
77 func getIntegerOrThrow (address,key) = valueOrErrorMessage(getInteger(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
88
99
1010 func parseAddressOrThrow (maybeAddress) = valueOrErrorMessage(addressFromString(maybeAddress), (("Can't parse address from '" + maybeAddress) + "'"))
1111
1212
1313 func parseIntOrThrow (maybeInt) = valueOrErrorMessage(parseInt(maybeInt), (("Can't parse integer from '" + maybeInt) + "'"))
1414
1515
16+func getAssetId (asset) = if ((asset == "WAVES"))
17+ then unit
18+ else fromBase58String(asset)
19+
20+
1621 let collector = parseAddressOrThrow(getStringOrThrow(this, "collector"))
1722
1823 let feeRate = getIntegerOrThrow(this, "fee-rate")
1924
2025 let oracle = parseAddressOrThrow(getStringOrThrow(this, "oracle"))
2126
2227 let swopfiRouting = parseAddressOrThrow(getStringOrThrow(this, "swopfi-routing"))
2328
29+let puzzleRouting = parseAddressOrThrow(getStringOrThrow(this, "puzzle-routing"))
30+
2431 let pools = split(getStringOrThrow(oracle, "pools"), ",")
2532
33+let percentRate = getIntegerOrThrow(this, "percent-rate")
34+
35+let refKey = "keeper"
36+
37+let puzzleRewardAssetStr = getStringOrThrow(this, "puzzle-reward-token")
38+
39+let puzzleRewardAssetId = getAssetId(puzzleRewardAssetStr)
40+
2641 let pPools = split(getStringOrThrow(this, "p-pools"), ",")
27-
28-func getAssetId (asset) = if ((asset == "WAVES"))
29- then unit
30- else fromBase58String(asset)
31-
3242
3343 func assetIdToString (assetId) = match assetId {
3444 case asset: ByteVector =>
3545 toBase58String(asset)
3646 case waves: Unit =>
3747 "WAVES"
3848 case _ =>
3949 throw("Match error")
4050 }
4151
4252
4353 func getBalance (assetId) = match assetId {
4454 case asset: ByteVector =>
4555 assetBalance(this, asset)
4656 case waves: Unit =>
4757 wavesBalance(this).available
4858 case _ =>
4959 throw("Match error")
5060 }
5161
5262
63+func getBalanceByAddress (address,assetId) = match assetId {
64+ case asset: ByteVector =>
65+ assetBalance(address, asset)
66+ case waves: Unit =>
67+ wavesBalance(address).available
68+ case _ =>
69+ throw("Match error")
70+}
71+
72+
5373 func deductFee (amount) = {
5474 let fee = fraction(amount, 1, feeRate)
5575 $Tuple2((amount - fee), fee)
76+ }
77+
78+
79+func getReferrerData (referrerName) = {
80+ let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found")))
81+ let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate)
82+ if (if ((0 > refPercent))
83+ then true
84+ else (refPercent > 100))
85+ then throw("Incorrect percent rate")
86+ else $Tuple2(refAddress, refPercent)
5687 }
5788
5889
5990 func doSwap (pool,payment,assetReceived,estAmountToReceive,slippageTolerance) = {
6091 let poolAddress = parseAddressOrThrow(pool)
6192 let versionMajor = parseIntOrThrow(split(getStringOrThrow(poolAddress, "version"), ".")[0])
6293 let assetReceivedId = getAssetId(assetReceived)
6394 if ((0 > estAmountToReceive))
6495 then throw("estAmountToReceive must be positive")
6596 else if (containsElement(pools, pool))
6697 then {
6798 let poolAssetA = getStringOrThrow(poolAddress, "A_asset_id")
6899 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
69100 let poolAssetIdA = getAssetId(poolAssetA)
70101 let poolAssetIdB = getAssetId(poolAssetB)
71- let $t023282672 = if (if ((payment.assetId == poolAssetIdA))
102+ let $t032873631 = if (if ((payment.assetId == poolAssetIdA))
72103 then (assetReceivedId == poolAssetIdB)
73104 else false)
74105 then $Tuple2(poolAssetIdA, poolAssetIdB)
75106 else if (if ((assetReceivedId == poolAssetIdA))
76107 then (payment.assetId == poolAssetIdB)
77108 else false)
78109 then $Tuple2(poolAssetIdB, poolAssetIdA)
79110 else throw("Unsupported assets pair")
80- let assetIn = $t023282672._1
81- let assetOut = $t023282672._2
111+ let assetIn = $t032873631._1
112+ let assetOut = $t032873631._2
82113 let args = if ((versionMajor == 1))
83114 then [1]
84115 else if ((versionMajor == 2))
85116 then if ((0 >= estAmountToReceive))
86117 then throw("estAmountToReceive must be positive")
87118 else if (if ((0 > slippageTolerance))
88119 then true
89120 else (slippageTolerance > 1000))
90121 then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
91122 else {
92123 let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000))
93124 [estAmountToReceive, if ((minAmount > 0))
94125 then minAmount
95126 else 1]
96127 }
97128 else throw((("Unknown pool version '" + toString(versionMajor)) + "', but 1 or 2 expected"))
98129 let balanceBefore = getBalance(assetReceivedId)
99130 if ((balanceBefore == balanceBefore))
100131 then {
101132 let result = invoke(poolAddress, "exchange", args, [payment])
102133 if ((result == result))
103134 then {
104135 let received = (getBalance(assetReceivedId) - balanceBefore)
105136 if ((received == received))
106137 then if ((0 >= received))
107138 then throw("Received amount from pool must be positive")
108139 else received
109140 else throw("Strict value is not equal to itself.")
110141 }
111142 else throw("Strict value is not equal to itself.")
112143 }
113144 else throw("Strict value is not equal to itself.")
114145 }
115146 else if (containsElement(pPools, pool))
116147 then {
117148 let balanceBefore = getBalance(assetReceivedId)
118149 if ((balanceBefore == balanceBefore))
119150 then {
120151 let result = invoke(poolAddress, "swap", [assetReceived, 0], [payment])
121152 if ((result == result))
122153 then {
123154 let received = (getBalance(assetReceivedId) - balanceBefore)
124155 if ((received == received))
125156 then if ((0 >= received))
126157 then throw("Received amount from pool must be positive")
127158 else received
128159 else throw("Strict value is not equal to itself.")
129160 }
130161 else throw("Strict value is not equal to itself.")
131162 }
132163 else throw("Strict value is not equal to itself.")
133164 }
134165 else throw((("There is no pool at address '" + pool) + "'"))
135166 }
136167
137168
138-@Callable(inv)
139-func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
169+func wrapSwap (inv,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
140170 let pmt = if ((size(inv.payments) > 0))
141171 then inv.payments[0]
142172 else throw("Payment required")
143173 let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
144174 let assetFinalId = getAssetId(assetFinal)
145175 let indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
146176 func foldSwap (previousReceived,index) = if ((index >= size(addresses)))
147177 then previousReceived
148178 else {
149179 let assetReceived = assetsToReceive[index]
150180 let assetReceivedId = getAssetId(assetReceived)
151181 match doSwap(addresses[index], previousReceived, assetReceived, estReceived[index], slippageTolerance) {
152182 case income: Int =>
153183 AttachedPayment(assetReceivedId, income)
154184 case _ =>
155185 throw("Can't handle swap result")
156186 }
157187 }
158188
159189 let final = if ((size(addresses) > 0))
160190 then {
161191 let $l = indices
162192 let $s = size($l)
163193 let $acc0 = pmt
164194 func $f0_1 ($a,$i) = if (($i >= $s))
165195 then $a
166196 else foldSwap($a, $l[$i])
167197
168198 func $f0_2 ($a,$i) = if (($i >= $s))
169199 then $a
170200 else throw("List size exceeds 10")
171201
172202 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
173203 }
174204 else throw("Path cannot be empty")
175- let $t053225374 = deductFee(final.amount)
176- let resultAfterFee = $t053225374._1
177- let fee = $t053225374._2
205+ let $t062886340 = deductFee(final.amount)
206+ let resultAfterFee = $t062886340._1
207+ let fee = $t062886340._2
178208 if ((0 >= final.amount))
179209 then throw((("Swap result " + toString(final.amount)) + " must be positive"))
180210 else if ((minReceived > resultAfterFee))
181211 then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minReceived)))
182212 else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
183213 }
184214
185215
186-
187-@Callable(inv)
188-func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = {
216+func wrapSwopfiSwap (inv,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = {
189217 let pmt = if ((size(inv.payments) > 0))
190218 then inv.payments[0]
191219 else throw("Payment required")
192220 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
193221 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
194222 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
195223 let assetFinalId = getAssetId(assetFinal)
196224 let balanceBefore = getBalance(assetFinalId)
197225 if ((balanceBefore == balanceBefore))
198226 then {
199227 let result = invoke(swopfiRouting, "routingTrade", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive], [pmt])
200228 if ((result == result))
201229 then {
202230 let balanceAfter = getBalance(assetFinalId)
203231 if ((balanceAfter == balanceAfter))
204232 then {
205233 let delta = (balanceAfter - balanceBefore)
206- let $t070107055 = deductFee(delta)
207- let resultAfterFee = $t070107055._1
208- let fee = $t070107055._2
234+ let $t079828027 = deductFee(delta)
235+ let resultAfterFee = $t079828027._1
236+ let fee = $t079828027._2
209237 if ((0 >= delta))
210238 then throw((("Swap result " + toString(delta)) + " must be positive"))
211239 else if ((minAmountToReceive > resultAfterFee))
212240 then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minAmountToReceive)))
213241 else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
214242 }
215243 else throw("Strict value is not equal to itself.")
216244 }
217245 else throw("Strict value is not equal to itself.")
218246 }
219247 else throw("Strict value is not equal to itself.")
220248 }
249+
250+
251+func wrapPuzzleSwap (inv,routesStr,minToReceive) = {
252+ let pmt = if ((size(inv.payments) > 0))
253+ then inv.payments[0]
254+ else throw("Payment required")
255+ let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
256+ let assetId = getAssetId(assetIdFinal)
257+ let balanceBefore = getBalance(assetId)
258+ if ((balanceBefore == balanceBefore))
259+ then {
260+ let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, refKey], [pmt])
261+ if ((result == result))
262+ then {
263+ let balanceAfter = getBalance(assetId)
264+ if ((balanceAfter == balanceAfter))
265+ then {
266+ let deltaProxy = (balanceAfter - balanceBefore)
267+ if ((deltaProxy == deltaProxy))
268+ then [ScriptTransfer(inv.caller, deltaProxy, assetId)]
269+ else throw("Strict value is not equal to itself.")
270+ }
271+ else throw("Strict value is not equal to itself.")
272+ }
273+ else throw("Strict value is not equal to itself.")
274+ }
275+ else throw("Strict value is not equal to itself.")
276+ }
277+
278+
279+@Callable(inv)
280+func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
281+
282+
283+
284+@Callable(inv)
285+func swapWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,referrerName) = if ((size(referrerName) == 0))
286+ then throw("Referrer name invalid")
287+ else {
288+ let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
289+ let assetId = getAssetId(assetFinal)
290+ let $t096919761 = getReferrerData(referrerName)
291+ let referrerAddress = $t096919761._1
292+ let referrerPercent = $t096919761._2
293+ let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
294+ if ((result == result))
295+ then {
296+ let collectorFee = result[1].amount
297+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
298+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
299+ }
300+ else throw("Strict value is not equal to itself.")
301+ }
302+
303+
304+
305+@Callable(inv)
306+func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
307+
308+
309+
310+@Callable(inv)
311+func swopfiSwapWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,referrerName) = if ((size(referrerName) == 0))
312+ then throw("Referrer name invalid")
313+ else {
314+ let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
315+ let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
316+ let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
317+ let assetId = getAssetId(assetFinal)
318+ let $t01126511335 = getReferrerData(referrerName)
319+ let referrerAddress = $t01126511335._1
320+ let referrerPercent = $t01126511335._2
321+ let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
322+ if ((result == result))
323+ then {
324+ let collectorFee = result[1].amount
325+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
326+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
327+ }
328+ else throw("Strict value is not equal to itself.")
329+ }
330+
331+
332+
333+@Callable(inv)
334+func puzzleSwap (routesStr,minToReceive) = wrapPuzzleSwap(inv, routesStr, minToReceive)
335+
336+
337+
338+@Callable(inv)
339+func puzzleSwapWithReferrer (routesStr,minToReceive,referrerName) = if ((size(routesStr) == 0))
340+ then throw("Invalid routing")
341+ else if ((0 >= minToReceive))
342+ then throw("Sum to receive is to low")
343+ else if ((size(referrerName) == 0))
344+ then throw("Referrer name is invalid")
345+ else {
346+ let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
347+ let assetId = getAssetId(assetIdFinal)
348+ let $t01235612426 = getReferrerData(referrerName)
349+ let referrerAddress = $t01235612426._1
350+ let referrerPercent = $t01235612426._2
351+ let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
352+ if ((balanceBefore == balanceBefore))
353+ then {
354+ let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
355+ if ((result == result))
356+ then {
357+ let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
358+ if ((balanceAfter == balanceAfter))
359+ then {
360+ let delta = (balanceAfter - balanceBefore)
361+ if ((delta == delta))
362+ then {
363+ let reward = fraction(delta, referrerPercent, 100)
364+ let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
365+ if ((res == res))
366+ then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
367+ else throw("Strict value is not equal to itself.")
368+ }
369+ else throw("Strict value is not equal to itself.")
370+ }
371+ else throw("Strict value is not equal to itself.")
372+ }
373+ else throw("Strict value is not equal to itself.")
374+ }
375+ else throw("Strict value is not equal to itself.")
376+ }
221377
222378
223379
224380 @Callable(inv)
225381 func addPools (poolAddresses) = {
226382 func addIfDoesNotExist (pools,pool) = if (containsElement(pools, pool))
227383 then throw((("Pool '" + pool) + "' is already added"))
228384 else (pools :+ toString(parseAddressOrThrow(pool)))
229385
230386 if (!(containsElement([this, collector], inv.caller)))
231387 then throw("only self calls or by collector are allowed")
232388 else [StringEntry("p-pools", makeString({
233389 let $l = poolAddresses
234390 let $s = size($l)
235391 let $acc0 = pPools
236392 func $f0_1 ($a,$i) = if (($i >= $s))
237393 then $a
238394 else addIfDoesNotExist($a, $l[$i])
239395
240396 func $f0_2 ($a,$i) = if (($i >= $s))
241397 then $a
242398 else throw("List size exceeds 10")
243399
244400 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
245401 }, ","))]
246402 }
247403
248404
405+
406+@Callable(inv)
407+func addReferer (referrerName,refererAddress,percent) = {
408+ let address = parseAddressOrThrow(refererAddress)
409+ if (if ((0 > percent))
410+ then true
411+ else (percent > 100))
412+ then throw("Incorrect percent rate")
413+ else if ((size(referrerName) == 0))
414+ then throw("Referrer name invalid")
415+ else if (!(containsElement([this, collector], inv.caller)))
416+ then throw("only self calls or by collector are allowed")
417+ else [StringEntry((("referrer-" + referrerName) + "-address"), refererAddress), IntegerEntry((("referrer-" + referrerName) + "-percent"), percent)]
418+ }
419+
420+

github/deemru/w8io/3ef1775 
61.95 ms