tx · JZnKukPtggPTJ7QKxNcGWpKzCN7Cd18XyU1EwXRgwAB

3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw:  -0.02000000 Waves

2022.12.01 10:04 [3406439] smart account 3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw > SELF 0.00000000 Waves

{ "type": 13, "id": "JZnKukPtggPTJ7QKxNcGWpKzCN7Cd18XyU1EwXRgwAB", "fee": 2000000, "feeAssetId": null, "timestamp": 1669877440357, "version": 2, "chainId": 87, "sender": "3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw", "senderPublicKey": "4MfTwwE7yP4BFGaifQrcc9Nwb5BA9t92WKhVb6Ton65k", "proofs": [ "4CUeMzrHhEuD7TFYSbgPu1N2VFFfLT2gC21FojPajLezdsEbyHTnFSWv6JEJTKdSuYMZPG2w4ZDFnRa3ZK3A8GER" ], "script": "base64:AAIFAAAAAAAAACoIAhIICgYYGBEBARgSCQoHGBgRERgBGBIFCgMIARgSAwoBGBIFCgMICAEAAAAcAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMQ2FuJ3QgcmVhZCAnBQAAAANrZXkCAAAADScgYXQgYWRkcmVzcyAJAAQlAAAAAQUAAAAHYWRkcmVzcwEAAAARZ2V0SW50ZWdlck9yVGhyb3cAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAxDYW4ndCByZWFkICcFAAAAA2tleQIAAAANJyBhdCBhZGRyZXNzIAkABCUAAAABBQAAAAdhZGRyZXNzAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQAAAAxtYXliZUFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABBQAAAAxtYXliZUFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAABpDYW4ndCBwYXJzZSBhZGRyZXNzIGZyb20gJwUAAAAMbWF5YmVBZGRyZXNzAgAAAAEnAQAAABFwYXJzZUludE9yRGVmYXVsdAAAAAIAAAAIbWF5YmVJbnQAAAAHZGVmYXVsdAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABLYAAAABBQAAAAhtYXliZUludAUAAAAHZGVmYXVsdAEAAAAPcGFyc2VJbnRPclRocm93AAAAAQAAAAhtYXliZUludAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEtgAAAAEFAAAACG1heWJlSW50CQABLAAAAAIJAAEsAAAAAgIAAAAaQ2FuJ3QgcGFyc2UgaW50ZWdlciBmcm9tICcFAAAACG1heWJlSW50AgAAAAEnAQAAAApnZXRBc3NldElkAAAAAQAAAAVhc3NldAMJAAAAAAAAAgUAAAAFYXNzZXQCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAABWFzc2V0AAAAAAljb2xsZWN0b3IJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAljb2xsZWN0b3IAAAAAB2ZlZVJhdGUJAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAACGZlZS1yYXRlAAAAAAZvcmFjbGUJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAZvcmFjbGUAAAAADXN3b3BmaVJvdXRpbmcJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAA5zd29wZmktcm91dGluZwAAAAANcHV6emxlUm91dGluZwkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAADnB1enpsZS1yb3V0aW5nAAAAAAVwb29scwkABLUAAAACCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABm9yYWNsZQIAAAAFcG9vbHMCAAAAASwAAAAAC3BlcmNlbnRSYXRlCQEAAAARZ2V0SW50ZWdlck9yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAxwZXJjZW50LXJhdGUAAAAABnJlZktleQIAAAAGa2VlcGVyAAAAABRwdXp6bGVSZXdhcmRBc3NldFN0cgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAABNwdXp6bGUtcmV3YXJkLXRva2VuAAAAABNwdXp6bGVSZXdhcmRBc3NldElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAAFHB1enpsZVJld2FyZEFzc2V0U3RyAAAAAAZwUG9vbHMJAAS1AAAAAgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAdwLXBvb2xzAgAAAAEsAQAAAA9hc3NldElkVG9TdHJpbmcAAAABAAAAB2Fzc2V0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c2V0UmVjZWl2ZWQDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEmVzdEFtb3VudFRvUmVjZWl2ZQkAAAIAAAABAgAAACNlc3RBbW91bnRUb1JlY2VpdmUgbXVzdCBiZSBwb3NpdGl2ZQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAVwb29scwUAAAAEcG9vbAQAAAAKcG9vbEFzc2V0QQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAtwb29sQWRkcmVzcwIAAAAKQV9hc3NldF9pZAQAAAAKcG9vbEFzc2V0QgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAtwb29sQWRkcmVzcwIAAAAKQl9hc3NldF9pZAQAAAAMcG9vbEFzc2V0SWRBCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAACnBvb2xBc3NldEEEAAAADHBvb2xBc3NldElkQgkBAAAACmdldEFzc2V0SWQAAAABBQAAAApwb29sQXNzZXRCBAAAAAskdDA0MDY4NDQxMgMDCQAAAAAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAADHBvb2xBc3NldElkQQkAAAAAAAACBQAAAA9hc3NldFJlY2VpdmVkSWQFAAAADHBvb2xBc3NldElkQgcJAAUUAAAAAgUAAAAMcG9vbEFzc2V0SWRBBQAAAAxwb29sQXNzZXRJZEIDAwkAAAAAAAACBQAAAA9hc3NldFJlY2VpdmVkSWQFAAAADHBvb2xBc3NldElkQQkAAAAAAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAAxwb29sQXNzZXRJZEIHCQAFFAAAAAIFAAAADHBvb2xBc3NldElkQgUAAAAMcG9vbEFzc2V0SWRBCQAAAgAAAAECAAAAF1Vuc3VwcG9ydGVkIGFzc2V0cyBwYWlyBAAAAAdhc3NldEluCAUAAAALJHQwNDA2ODQ0MTIAAAACXzEEAAAACGFzc2V0T3V0CAUAAAALJHQwNDA2ODQ0MTIAAAACXzIEAAAACyR0MDQ0Mzk1MjczAwkAAAAAAAACBQAAAAx2ZXJzaW9uTWFqb3IAAAAAAAAAAAEJAAUUAAAAAgIAAAAMY2FsbEZ1bmN0aW9uCQAETAAAAAICAAAACGV4Y2hhbmdlCQAETAAAAAIJ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AA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAANpbnYAAAAGY2FsbGVyBQAAAApkZWx0YVByb3h5BQAAAAdhc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAABQAAAANpbnYBAAAABHN3YXAAAAAGAAAACWFkZHJlc3NlcwAAAA9hc3NldHNUb1JlY2VpdmUAAAALZXN0UmVjZWl2ZWQAAAARc2xpcHBhZ2VUb2xlcmFuY2UAAAALbWluUmVjZWl2ZWQAAAAHb3B0aW9ucwQAAAANJHQwMTAxMTIxMDE2NgkBAAAADmdldFN3YXBPcHRpb25zAAAAAQUAAAAHb3B0aW9ucwQAAAAIZGVhZGxpbmUIBQAAAA0kdDAxMDExMjEwMTY2AAAAAl8xBAAAAAxyZWZlcnJlck5hbWUIBQAAAA0kdDAxMDExMjEwMTY2AAAAAl8yBAAAABBpc1ZhbGlkVGltZXN0YW1wCQEAAAAWdmFsaWRhdGVCbG9ja1RpbWVzdGFtcAAAAAEFAAAACGRlYWRsaW5lAwkAAAAAAAACBQAAABBpc1ZhbGlkVGltZXN0YW1wBQAAABBpc1ZhbGlkVGltZXN0YW1wBAAAAAZyZXN1bHQJAQAAAAh3cmFwU3dhcAAAAAYFAAAAA2ludgUAAAAJYWRkcmVzc2VzBQAAAA9hc3NldHNUb1JlY2VpdmUFAAAAC2VzdFJlY2VpdmVkBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAALbWluUmVjZWl2ZWQDCQAAAAAAAAIFAAAABnJlc3VsdAUAAAAGcmVzdWx0AwkAAGYAAAACCQABMQAAAAEFAAAADHJlZmVycmVyTmFtZQAAAAAAAAAAAAQAAAAKYXNzZXRGaW5hbAkAAZEAAAACBQAAAA9hc3NldHNUb1JlY2VpdmUJAABlAAAAAgkAAZAAAAABBQAAAA9hc3NldHNUb1JlY2VpdmUAAAAAAAAAAAEEAAAAB2Fzc2V0SWQJAQAAAApnZXRBc3NldElkAAAAAQUAAAAKYXNzZXRGaW5hbAQAAAANJHQwMTA0OTgxMDU2OAkBAAAAD2dldFJlZmVycmVyRGF0YQAAAAEFAAAADHJlZmVycmVyTmFtZQQAAAAPcmVmZXJyZXJBZGRyZXNzCAUAAAANJHQwMTA0OTgxMDU2OAAAAAJfMQQAAAAPcmVmZXJyZXJQZXJjZW50CAUAAAANJHQwMTA0OTgxMDU2OAAAAAJfMgQAAAAMY29sbGVjdG9yRmVlCAkAAZEAAAACBQAAAAZyZXN1bHQAAAAAAAAAAAEAAAAGYW1vdW50BAAAAA5yZWZlcnJlclJld2FyZAkAAGsAAAADBQAAAAxjb2xsZWN0b3JGZWUFAAAAD3JlZmVycmVyUGVyY2VudAAAAAAAAAAAZAkABEwAAAACCQABkQAAAAIFAAAABnJlc3VsdAAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAljb2xsZWN0b3IJAABlAAAAAgUAAAAMY29sbGVjdG9yRmVlBQAAAA5yZWZlcnJlclJld2FyZAUAAAAHYXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA9yZWZlcnJlckFkZHJlc3MFAAAADnJlZmVycmVyUmV3YXJkBQAAAAdhc3NldElkBQAAAANuaWwFAAAABnJlc3VsdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAA2ludgEAAAAKc3dvcGZpU3dhcAAAAAcAAAAKZXhjaGFuZ2VycwAAAA5leGNoYW5nZXJzVHlwZQAAAAVhcmdzMQAAAAVhcmdzMgAAABFyb3V0aW5nQXNzZXRzS2V5cwAAABJtaW5BbW91bnRUb1JlY2VpdmUAAAAHb3B0aW9ucwQAAAANJHQwMTExMjExMTE3NQkBAAAADmdldFN3YXBPcHRpb25zAAAAAQUAAAAHb3B0aW9ucwQAAAAIZGVhZGxpbmUIBQAAAA0kdDAxMTEyMTExMTc1AAAAAl8xBAAAAAxyZWZlcnJlck5hbWUIBQAAAA0kdDAxMTEyMTExMTc1AAAAAl8yBAAAABBpc1ZhbGlkVGltZXN0YW1wCQEAAAAWdmFsaWRhdGVCbG9ja1RpbWVzdGFtcAAAAAEFAAAACGRlYWRsaW5lAwkAAAAAAAACBQAAABBpc1ZhbGlkVGltZXN0YW1wBQAAABBpc1ZhbGlkVGltZXN0YW1wBAAAAAZyZXN1bHQJAQAAAA53cmFwU3dvcGZpU3dhcAAAAAcFAAAAA2ludgUAAAAKZXhjaGFuZ2VycwUAAAAOZXhjaGFuZ2Vyc1R5cGUFAAAABWFyZ3MxBQAAAAVhcmdzMgUAAAARcm91dGluZ0Fzc2V0c0tleXMFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQMJAAAAAAAAAgUAAAAGcmVzdWx0BQAAAAZyZXN1bHQDCQAAZgAAAAIJAAExAAAAAQUAAAAMcmVmZXJyZXJOYW1lAAAAAAAAAAAABAAAAA1sYXN0RXhjaGFuZ2VyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkAAZEAAAACBQAAAApleGNoYW5nZXJzCQAAZQAAAAIJAAGQAAAAAQUAAAAKZXhjaGFuZ2VycwAAAAAAAAAAAQIAAAApQ2FuJ3QgcGFyc2UgbGFzdCBleGNoYW5nZXIgc3dvcGZpIGFkZHJlc3MEAAAADmxhc3RBc3NldElkS2V5CQABLAAAAAIJAAGRAAAAAgkABLUAAAACCQABkQAAAAIFAAAAEXJvdXRpbmdBc3NldHNLZXlzCQAAZQAAAAIJAAGQAAAAAQUAAAARcm91dGluZ0Fzc2V0c0tleXMAAAAAAAAAAAECAAAAAV8AAAAAAAAAAAACAAAACV9hc3NldF9pZAQAAAAKYXNzZXRGaW5hbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADWxhc3RFeGNoYW5nZXIFAAAADmxhc3RBc3NldElkS2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABZDYW4ndCByZWFkIHBhcmFtZXRlciAnBQAAAA5sYXN0QXNzZXRJZEtleQIAAAAQJyBmb3IgZXhjaGFuZ2VyIAkABCUAAAABBQAAAA1sYXN0RXhjaGFuZ2VyBAAAAAdhc3NldElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAACmFzc2V0RmluYWwEAAAADSR0MDExODg1MTE5NTUJAQAAAA9nZXRSZWZlcnJlckRhdGEAAAABBQAAAAxyZWZlcnJlck5hbWUEAAAAD3JlZmVycmVyQWRkcmVzcwgFAAAADSR0MDExODg1MTE5NTUAAAACXzEEAAAAD3JlZmVycmVyUGVyY2VudAgFAAAADSR0MDExODg1MTE5NTUAAAACXzIEAAAADGNvbGxlY3RvckZlZQgJAAGRAAAAAgUAAAAGcmVzdWx0AAAAAAAAAAABAAAABmFtb3VudAQAAAAOcmVmZXJyZXJSZXdhcmQJAABrAAAAAwUAAAAMY29sbGVjdG9yRmVlBQAAAA9yZWZlcnJlclBlcmNlbnQAAAAAAAAAAGQJAARMAAAAAgkAAZEAAAACBQAAAAZyZXN1bHQAAAAAAAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAJY29sbGVjdG9yCQAAZQAAAAIFAAAADGNvbGxlY3RvckZlZQUAAAAOcmVmZXJyZXJSZXdhcmQFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAPcmVmZXJyZXJBZGRyZXNzBQAAAA5yZWZlcnJlclJld2FyZAUAAAAHYXNzZXRJZAUAAAADbmlsBQAAAAZyZXN1bHQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAANpbnYBAAAACnB1enpsZVN3YXAAAAADAAAACXJvdXRlc1N0cgAAAAxtaW5Ub1JlY2VpdmUAAAAHb3B0aW9ucwQAAAANJHQwMTIzOTAxMjQ0NAkBAAAADmdldFN3YXBPcHRpb25zAAAAAQUAAAAHb3B0aW9ucwQAAAAIZGVhZGxpbmUIBQAAAA0kdDAxMjM5MDEyNDQ0AAAAAl8xBAAAAAxyZWZlcnJlck5hbWUIBQAAAA0kdDAxMjM5MDEyNDQ0AAAAAl8yBAAAABBpc1ZhbGlkVGltZXN0YW1wCQEAAAAWdmFsaWRhdGVCbG9ja1RpbWVzdGFtcAAAAAEFAAAACGRlYWRsaW5lAwkAAAAAAAACBQAAABBpc1ZhbGlkVGltZXN0YW1wBQAAABBpc1ZhbGlkVGltZXN0YW1wAwkAAAAAAAACCQABMQAAAAEFAAAACXJvdXRlc1N0cgAAAAAAAAAAAAkAAAIAAAABAgAAAA9JbnZhbGlkIHJvdXRpbmcDCQAAZwAAAAIAAAAAAAAAAAAFAAAADG1pblRvUmVjZWl2ZQkAAAIAAAABAgAAABhTdW0gdG8gcmVjZWl2ZSBpcyB0byBsb3cEAAAADWJhbGFuY2VCZWZvcmUJAQAAABNnZXRCYWxhbmNlQnlBZGRyZXNzAAAAAgUAAAAJY29sbGVjdG9yBQAAABNwdXp6bGVSZXdhcmRBc3NldElkAwkAAAAAAAACBQAAAA1iYWxhbmNlQmVmb3JlBQAAAA1iYWxhbmNlQmVmb3JlBAAAAAZyZXN1bHQJAQAAAA53cmFwUHV6emxlU3dhcAAAAAMFAAAAA2ludgUAAAAJcm91dGVzU3RyBQAAAAxtaW5Ub1JlY2VpdmUDCQAAAAAAAAIFAAAABnJlc3VsdAUAAAAGcmVzdWx0AwkAAGYAAAACCQABMQAAAAEFAAAADHJlZmVycmVyTmFtZQAAAAAAAAAAAAQAAAAMYXNzZXRJZEZpbmFsCQABkQAAAAIJAAS1AAAAAgUAAAAJcm91dGVzU3RyAgAAAAEsCQAAZQAAAAIJAAGQAAAAAQkABLUAAAACBQAAAAlyb3V0ZXNTdHICAAAAASwAAAAAAAAAAAEEAAAAB2Fzc2V0SWQJAQAAAApnZXRBc3NldElkAAAAAQUAAAAMYXNzZXRJZEZpbmFsBAAAAA0kdDAxMzAwNTEzMDc1CQEAAAAPZ2V0UmVmZXJyZXJEYXRhAAAAAQUAAAAMcmVmZXJyZXJOYW1lBAAAAA9yZWZlcnJlckFkZHJlc3MIBQAAAA0kdDAxMzAwNTEzMDc1AAAAAl8xBAAAAA9yZWZlcnJlclBlcmNlbnQIBQAAAA0kdDAxMzAwNTEzMDc1AAAAAl8yBAAAAAxiYWxhbmNlQWZ0ZXIJAQAAABNnZXRCYWxhbmNlQnlBZGRyZXNzAAAAAgUAAAAJY29sbGVjdG9yBQAAABNwdXp6bGVSZXdhcmRBc3NldElkAwkAAAAA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", "height": 3406439, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GfTnsiXQRMHNpc7sutS4z2B5K7LPWAzWNsZ8ezHXSrQC Next: AQVsacWoCM5qvxdASZDzMqS4iGiYd62VxHfiHwcLCDLm Diff:
OldNewDifferences
88
99
1010 func parseAddressOrThrow (maybeAddress) = valueOrErrorMessage(addressFromString(maybeAddress), (("Can't parse address from '" + maybeAddress) + "'"))
11+
12+
13+func parseIntOrDefault (maybeInt,default) = valueOrElse(parseInt(maybeInt), default)
1114
1215
1316 func parseIntOrThrow (maybeInt) = valueOrErrorMessage(parseInt(maybeInt), (("Can't parse integer from '" + maybeInt) + "'"))
8790 }
8891
8992
93+func getSwapOptions (options) = {
94+ func foldArguments (acc,index) = if ((index >= size(options)))
95+ then (acc :+ "")
96+ else (acc :+ options[index])
97+
98+ let indices = [0, 1]
99+ let arguments = {
100+ let $l = indices
101+ let $s = size($l)
102+ let $acc0 = nil
103+ func $f0_1 ($a,$i) = if (($i >= $s))
104+ then $a
105+ else foldArguments($a, $l[$i])
106+
107+ func $f0_2 ($a,$i) = if (($i >= $s))
108+ then $a
109+ else throw("List size exceeds 2")
110+
111+ $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
112+ }
113+ let deadline = parseIntOrDefault(arguments[0], 0)
114+ let referrerName = arguments[1]
115+ $Tuple2(deadline, referrerName)
116+ }
117+
118+
119+func validateBlockTimestamp (deadline) = if (if ((deadline > 0))
120+ then (lastBlock.timestamp > deadline)
121+ else false)
122+ then throw(((("This swap expired at timestamp " + toString(deadline)) + ". Current: ") + toString(lastBlock.timestamp)))
123+ else true
124+
125+
90126 func doSwap (pool,payment,assetReceived,estAmountToReceive,slippageTolerance) = {
91127 let poolAddress = parseAddressOrThrow(pool)
92128 let versionMajor = parseIntOrThrow(split(getStringOrThrow(poolAddress, "version"), ".")[0])
99135 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
100136 let poolAssetIdA = getAssetId(poolAssetA)
101137 let poolAssetIdB = getAssetId(poolAssetB)
102- let $t032873631 = if (if ((payment.assetId == poolAssetIdA))
138+ let $t040684412 = if (if ((payment.assetId == poolAssetIdA))
103139 then (assetReceivedId == poolAssetIdB)
104140 else false)
105141 then $Tuple2(poolAssetIdA, poolAssetIdB)
108144 else false)
109145 then $Tuple2(poolAssetIdB, poolAssetIdA)
110146 else throw("Unsupported assets pair")
111- let assetIn = $t032873631._1
112- let assetOut = $t032873631._2
113- let args = if ((versionMajor == 1))
114- then [1]
147+ let assetIn = $t040684412._1
148+ let assetOut = $t040684412._2
149+ let $t044395273 = if ((versionMajor == 1))
150+ then $Tuple2("callFunction", ["exchange", [1]])
115151 else if ((versionMajor == 2))
116152 then if ((0 >= estAmountToReceive))
117153 then throw("estAmountToReceive must be positive")
121157 then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
122158 else {
123159 let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000))
124-[estAmountToReceive, if ((minAmount > 0))
160+ $Tuple2("exchange", [estAmountToReceive, if ((minAmount > 0))
125161 then minAmount
126- else 1]
162+ else 1])
127163 }
128164 else throw((("Unknown pool version '" + toString(versionMajor)) + "', but 1 or 2 expected"))
165+ let method = $t044395273._1
166+ let args = $t044395273._2
129167 let balanceBefore = getBalance(assetReceivedId)
130168 if ((balanceBefore == balanceBefore))
131169 then {
132- let result = invoke(poolAddress, "exchange", args, [payment])
170+ let result = invoke(poolAddress, method, args, [payment])
133171 if ((result == result))
134172 then {
135173 let received = (getBalance(assetReceivedId) - balanceBefore)
202240 $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)
203241 }
204242 else throw("Path cannot be empty")
205- let $t062886340 = deductFee(final.amount)
206- let resultAfterFee = $t062886340._1
207- let fee = $t062886340._2
243+ let $t071677219 = deductFee(final.amount)
244+ let resultAfterFee = $t071677219._1
245+ let fee = $t071677219._2
208246 if ((0 >= final.amount))
209247 then throw((("Swap result " + toString(final.amount)) + " must be positive"))
210248 else if ((minReceived > resultAfterFee))
231269 if ((balanceAfter == balanceAfter))
232270 then {
233271 let delta = (balanceAfter - balanceBefore)
234- let $t079828027 = deductFee(delta)
235- let resultAfterFee = $t079828027._1
236- let fee = $t079828027._2
272+ let $t088618906 = deductFee(delta)
273+ let resultAfterFee = $t088618906._1
274+ let fee = $t088618906._2
237275 if ((0 >= delta))
238276 then throw((("Swap result " + toString(delta)) + " must be positive"))
239277 else if ((minAmountToReceive > resultAfterFee))
277315
278316
279317 @Callable(inv)
280-func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
318+func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
319+ let $t01011210166 = getSwapOptions(options)
320+ let deadline = $t01011210166._1
321+ let referrerName = $t01011210166._2
322+ let isValidTimestamp = validateBlockTimestamp(deadline)
323+ if ((isValidTimestamp == isValidTimestamp))
324+ then {
325+ let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
326+ if ((result == result))
327+ then if ((size(referrerName) > 0))
328+ then {
329+ let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
330+ let assetId = getAssetId(assetFinal)
331+ let $t01049810568 = getReferrerData(referrerName)
332+ let referrerAddress = $t01049810568._1
333+ let referrerPercent = $t01049810568._2
334+ let collectorFee = result[1].amount
335+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
336+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
337+ }
338+ else result
339+ else throw("Strict value is not equal to itself.")
340+ }
341+ else throw("Strict value is not equal to itself.")
342+ }
281343
282344
283345
284346 @Callable(inv)
285-func swapExp (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,expiresAt) = if ((lastBlock.timestamp > expiresAt))
286- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
287- else wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
347+func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
348+ let $t01112111175 = getSwapOptions(options)
349+ let deadline = $t01112111175._1
350+ let referrerName = $t01112111175._2
351+ let isValidTimestamp = validateBlockTimestamp(deadline)
352+ if ((isValidTimestamp == isValidTimestamp))
353+ then {
354+ let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
355+ if ((result == result))
356+ then if ((size(referrerName) > 0))
357+ then {
358+ let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
359+ let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
360+ let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
361+ let assetId = getAssetId(assetFinal)
362+ let $t01188511955 = getReferrerData(referrerName)
363+ let referrerAddress = $t01188511955._1
364+ let referrerPercent = $t01188511955._2
365+ let collectorFee = result[1].amount
366+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
367+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
368+ }
369+ else result
370+ else throw("Strict value is not equal to itself.")
371+ }
372+ else throw("Strict value is not equal to itself.")
373+ }
288374
289375
290376
291377 @Callable(inv)
292-func swapWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,referrerName) = if ((size(referrerName) == 0))
293- then throw("Referrer name invalid")
294- else {
295- let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
296- let assetId = getAssetId(assetFinal)
297- let $t01013110201 = getReferrerData(referrerName)
298- let referrerAddress = $t01013110201._1
299- let referrerPercent = $t01013110201._2
300- let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
301- if ((result == result))
302- then {
303- let collectorFee = result[1].amount
304- let referrerReward = fraction(collectorFee, referrerPercent, 100)
305-[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
306- }
307- else throw("Strict value is not equal to itself.")
308- }
309-
310-
311-
312-@Callable(inv)
313-func swapExpWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
314- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
315- else if ((size(referrerName) == 0))
316- then throw("Referrer name invalid")
317- else {
318- let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
319- let assetId = getAssetId(assetFinal)
320- let $t01121611286 = getReferrerData(referrerName)
321- let referrerAddress = $t01121611286._1
322- let referrerPercent = $t01121611286._2
323- let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
324- if ((result == result))
325- then {
326- let collectorFee = result[1].amount
327- let referrerReward = fraction(collectorFee, referrerPercent, 100)
328-[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
329- }
330- else throw("Strict value is not equal to itself.")
331- }
332-
333-
334-
335-@Callable(inv)
336-func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
337-
338-
339-
340-@Callable(inv)
341-func swopfiSwapExp (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt))
342- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
343- else wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
344-
345-
346-
347-@Callable(inv)
348-func swopfiSwapWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,referrerName) = if ((size(referrerName) == 0))
349- then throw("Referrer name invalid")
350- else {
351- let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
352- let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
353- let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
354- let assetId = getAssetId(assetFinal)
355- let $t01328013350 = getReferrerData(referrerName)
356- let referrerAddress = $t01328013350._1
357- let referrerPercent = $t01328013350._2
358- let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
359- if ((result == result))
360- then {
361- let collectorFee = result[1].amount
362- let referrerReward = fraction(collectorFee, referrerPercent, 100)
363-[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
364- }
365- else throw("Strict value is not equal to itself.")
366- }
367-
368-
369-
370-@Callable(inv)
371-func swopfiSwapExpWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
372- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
373- else if ((size(referrerName) == 0))
374- then throw("Referrer name invalid")
375- else {
376- let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
377- let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
378- let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
379- let assetId = getAssetId(assetFinal)
380- let $t01477214842 = getReferrerData(referrerName)
381- let referrerAddress = $t01477214842._1
382- let referrerPercent = $t01477214842._2
383- let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
384- if ((result == result))
385- then {
386- let collectorFee = result[1].amount
387- let referrerReward = fraction(collectorFee, referrerPercent, 100)
388-[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
389- }
390- else throw("Strict value is not equal to itself.")
391- }
392-
393-
394-
395-@Callable(inv)
396-func puzzleSwap (routesStr,minToReceive) = wrapPuzzleSwap(inv, routesStr, minToReceive)
397-
398-
399-
400-@Callable(inv)
401-func puzzleSwapExp (routesStr,minToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt))
402- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
403- else wrapPuzzleSwap(inv, routesStr, minToReceive)
404-
405-
406-
407-@Callable(inv)
408-func puzzleSwapWithReferrer (routesStr,minToReceive,referrerName) = if ((size(routesStr) == 0))
409- then throw("Invalid routing")
410- else if ((0 >= minToReceive))
411- then throw("Sum to receive is to low")
412- else if ((size(referrerName) == 0))
413- then throw("Referrer name is invalid")
414- else {
415- let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
416- let assetId = getAssetId(assetIdFinal)
417- let $t01620916279 = getReferrerData(referrerName)
418- let referrerAddress = $t01620916279._1
419- let referrerPercent = $t01620916279._2
420- let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
421- if ((balanceBefore == balanceBefore))
422- then {
423- let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
424- if ((result == result))
425- then {
426- let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
427- if ((balanceAfter == balanceAfter))
428- then {
429- let delta = (balanceAfter - balanceBefore)
430- if ((delta == delta))
431- then {
432- let reward = fraction(delta, referrerPercent, 100)
433- let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
434- if ((res == res))
435- then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
436- else throw("Strict value is not equal to itself.")
437- }
438- else throw("Strict value is not equal to itself.")
439- }
440- else throw("Strict value is not equal to itself.")
441- }
442- else throw("Strict value is not equal to itself.")
443- }
444- else throw("Strict value is not equal to itself.")
445- }
446-
447-
448-
449-@Callable(inv)
450-func puzzleSwapExpWithReferrer (routesStr,minToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
451- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
452- else if ((size(routesStr) == 0))
453- then throw("Invalid routing")
454- else if ((0 >= minToReceive))
455- then throw("Sum to receive is to low")
456- else if ((size(referrerName) == 0))
457- then throw("Referrer name is invalid")
378+func puzzleSwap (routesStr,minToReceive,options) = {
379+ let $t01239012444 = getSwapOptions(options)
380+ let deadline = $t01239012444._1
381+ let referrerName = $t01239012444._2
382+ let isValidTimestamp = validateBlockTimestamp(deadline)
383+ if ((isValidTimestamp == isValidTimestamp))
384+ then if ((size(routesStr) == 0))
385+ then throw("Invalid routing")
386+ else if ((0 >= minToReceive))
387+ then throw("Sum to receive is to low")
458388 else {
459- let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
460- let assetId = getAssetId(assetIdFinal)
461- let $t01749217562 = getReferrerData(referrerName)
462- let referrerAddress = $t01749217562._1
463- let referrerPercent = $t01749217562._2
464389 let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
465390 if ((balanceBefore == balanceBefore))
466391 then {
467392 let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
468393 if ((result == result))
469- then {
470- let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
471- if ((balanceAfter == balanceAfter))
472- then {
473- let delta = (balanceAfter - balanceBefore)
474- if ((delta == delta))
475- then {
476- let reward = fraction(delta, referrerPercent, 100)
477- let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
478- if ((res == res))
479- then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
480- else throw("Strict value is not equal to itself.")
481- }
482- else throw("Strict value is not equal to itself.")
483- }
484- else throw("Strict value is not equal to itself.")
485- }
394+ then if ((size(referrerName) > 0))
395+ then {
396+ let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
397+ let assetId = getAssetId(assetIdFinal)
398+ let $t01300513075 = getReferrerData(referrerName)
399+ let referrerAddress = $t01300513075._1
400+ let referrerPercent = $t01300513075._2
401+ let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
402+ if ((balanceAfter == balanceAfter))
403+ then {
404+ let delta = (balanceAfter - balanceBefore)
405+ if ((delta == delta))
406+ then {
407+ let reward = fraction(delta, referrerPercent, 100)
408+ let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
409+ if ((res == res))
410+ then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
411+ else throw("Strict value is not equal to itself.")
412+ }
413+ else throw("Strict value is not equal to itself.")
414+ }
415+ else throw("Strict value is not equal to itself.")
416+ }
417+ else result
486418 else throw("Strict value is not equal to itself.")
487419 }
488420 else throw("Strict value is not equal to itself.")
489421 }
422+ else throw("Strict value is not equal to itself.")
423+ }
490424
491425
492426
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) + "'"))
11+
12+
13+func parseIntOrDefault (maybeInt,default) = valueOrElse(parseInt(maybeInt), default)
1114
1215
1316 func parseIntOrThrow (maybeInt) = valueOrErrorMessage(parseInt(maybeInt), (("Can't parse integer from '" + maybeInt) + "'"))
1417
1518
1619 func getAssetId (asset) = if ((asset == "WAVES"))
1720 then unit
1821 else fromBase58String(asset)
1922
2023
2124 let collector = parseAddressOrThrow(getStringOrThrow(this, "collector"))
2225
2326 let feeRate = getIntegerOrThrow(this, "fee-rate")
2427
2528 let oracle = parseAddressOrThrow(getStringOrThrow(this, "oracle"))
2629
2730 let swopfiRouting = parseAddressOrThrow(getStringOrThrow(this, "swopfi-routing"))
2831
2932 let puzzleRouting = parseAddressOrThrow(getStringOrThrow(this, "puzzle-routing"))
3033
3134 let pools = split(getStringOrThrow(oracle, "pools"), ",")
3235
3336 let percentRate = getIntegerOrThrow(this, "percent-rate")
3437
3538 let refKey = "keeper"
3639
3740 let puzzleRewardAssetStr = getStringOrThrow(this, "puzzle-reward-token")
3841
3942 let puzzleRewardAssetId = getAssetId(puzzleRewardAssetStr)
4043
4144 let pPools = split(getStringOrThrow(this, "p-pools"), ",")
4245
4346 func assetIdToString (assetId) = match assetId {
4447 case asset: ByteVector =>
4548 toBase58String(asset)
4649 case waves: Unit =>
4750 "WAVES"
4851 case _ =>
4952 throw("Match error")
5053 }
5154
5255
5356 func getBalance (assetId) = match assetId {
5457 case asset: ByteVector =>
5558 assetBalance(this, asset)
5659 case waves: Unit =>
5760 wavesBalance(this).available
5861 case _ =>
5962 throw("Match error")
6063 }
6164
6265
6366 func getBalanceByAddress (address,assetId) = match assetId {
6467 case asset: ByteVector =>
6568 assetBalance(address, asset)
6669 case waves: Unit =>
6770 wavesBalance(address).available
6871 case _ =>
6972 throw("Match error")
7073 }
7174
7275
7376 func deductFee (amount) = {
7477 let fee = fraction(amount, 1, feeRate)
7578 $Tuple2((amount - fee), fee)
7679 }
7780
7881
7982 func getReferrerData (referrerName) = {
8083 let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found")))
8184 let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate)
8285 if (if ((0 > refPercent))
8386 then true
8487 else (refPercent > 100))
8588 then throw("Incorrect percent rate")
8689 else $Tuple2(refAddress, refPercent)
8790 }
8891
8992
93+func getSwapOptions (options) = {
94+ func foldArguments (acc,index) = if ((index >= size(options)))
95+ then (acc :+ "")
96+ else (acc :+ options[index])
97+
98+ let indices = [0, 1]
99+ let arguments = {
100+ let $l = indices
101+ let $s = size($l)
102+ let $acc0 = nil
103+ func $f0_1 ($a,$i) = if (($i >= $s))
104+ then $a
105+ else foldArguments($a, $l[$i])
106+
107+ func $f0_2 ($a,$i) = if (($i >= $s))
108+ then $a
109+ else throw("List size exceeds 2")
110+
111+ $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
112+ }
113+ let deadline = parseIntOrDefault(arguments[0], 0)
114+ let referrerName = arguments[1]
115+ $Tuple2(deadline, referrerName)
116+ }
117+
118+
119+func validateBlockTimestamp (deadline) = if (if ((deadline > 0))
120+ then (lastBlock.timestamp > deadline)
121+ else false)
122+ then throw(((("This swap expired at timestamp " + toString(deadline)) + ". Current: ") + toString(lastBlock.timestamp)))
123+ else true
124+
125+
90126 func doSwap (pool,payment,assetReceived,estAmountToReceive,slippageTolerance) = {
91127 let poolAddress = parseAddressOrThrow(pool)
92128 let versionMajor = parseIntOrThrow(split(getStringOrThrow(poolAddress, "version"), ".")[0])
93129 let assetReceivedId = getAssetId(assetReceived)
94130 if ((0 > estAmountToReceive))
95131 then throw("estAmountToReceive must be positive")
96132 else if (containsElement(pools, pool))
97133 then {
98134 let poolAssetA = getStringOrThrow(poolAddress, "A_asset_id")
99135 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
100136 let poolAssetIdA = getAssetId(poolAssetA)
101137 let poolAssetIdB = getAssetId(poolAssetB)
102- let $t032873631 = if (if ((payment.assetId == poolAssetIdA))
138+ let $t040684412 = if (if ((payment.assetId == poolAssetIdA))
103139 then (assetReceivedId == poolAssetIdB)
104140 else false)
105141 then $Tuple2(poolAssetIdA, poolAssetIdB)
106142 else if (if ((assetReceivedId == poolAssetIdA))
107143 then (payment.assetId == poolAssetIdB)
108144 else false)
109145 then $Tuple2(poolAssetIdB, poolAssetIdA)
110146 else throw("Unsupported assets pair")
111- let assetIn = $t032873631._1
112- let assetOut = $t032873631._2
113- let args = if ((versionMajor == 1))
114- then [1]
147+ let assetIn = $t040684412._1
148+ let assetOut = $t040684412._2
149+ let $t044395273 = if ((versionMajor == 1))
150+ then $Tuple2("callFunction", ["exchange", [1]])
115151 else if ((versionMajor == 2))
116152 then if ((0 >= estAmountToReceive))
117153 then throw("estAmountToReceive must be positive")
118154 else if (if ((0 > slippageTolerance))
119155 then true
120156 else (slippageTolerance > 1000))
121157 then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
122158 else {
123159 let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000))
124-[estAmountToReceive, if ((minAmount > 0))
160+ $Tuple2("exchange", [estAmountToReceive, if ((minAmount > 0))
125161 then minAmount
126- else 1]
162+ else 1])
127163 }
128164 else throw((("Unknown pool version '" + toString(versionMajor)) + "', but 1 or 2 expected"))
165+ let method = $t044395273._1
166+ let args = $t044395273._2
129167 let balanceBefore = getBalance(assetReceivedId)
130168 if ((balanceBefore == balanceBefore))
131169 then {
132- let result = invoke(poolAddress, "exchange", args, [payment])
170+ let result = invoke(poolAddress, method, args, [payment])
133171 if ((result == result))
134172 then {
135173 let received = (getBalance(assetReceivedId) - balanceBefore)
136174 if ((received == received))
137175 then if ((0 >= received))
138176 then throw("Received amount from pool must be positive")
139177 else received
140178 else throw("Strict value is not equal to itself.")
141179 }
142180 else throw("Strict value is not equal to itself.")
143181 }
144182 else throw("Strict value is not equal to itself.")
145183 }
146184 else if (containsElement(pPools, pool))
147185 then {
148186 let balanceBefore = getBalance(assetReceivedId)
149187 if ((balanceBefore == balanceBefore))
150188 then {
151189 let result = invoke(poolAddress, "swap", [assetReceived, 0], [payment])
152190 if ((result == result))
153191 then {
154192 let received = (getBalance(assetReceivedId) - balanceBefore)
155193 if ((received == received))
156194 then if ((0 >= received))
157195 then throw("Received amount from pool must be positive")
158196 else received
159197 else throw("Strict value is not equal to itself.")
160198 }
161199 else throw("Strict value is not equal to itself.")
162200 }
163201 else throw("Strict value is not equal to itself.")
164202 }
165203 else throw((("There is no pool at address '" + pool) + "'"))
166204 }
167205
168206
169207 func wrapSwap (inv,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
170208 let pmt = if ((size(inv.payments) > 0))
171209 then inv.payments[0]
172210 else throw("Payment required")
173211 let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
174212 let assetFinalId = getAssetId(assetFinal)
175213 let indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
176214 func foldSwap (previousReceived,index) = if ((index >= size(addresses)))
177215 then previousReceived
178216 else {
179217 let assetReceived = assetsToReceive[index]
180218 let assetReceivedId = getAssetId(assetReceived)
181219 match doSwap(addresses[index], previousReceived, assetReceived, estReceived[index], slippageTolerance) {
182220 case income: Int =>
183221 AttachedPayment(assetReceivedId, income)
184222 case _ =>
185223 throw("Can't handle swap result")
186224 }
187225 }
188226
189227 let final = if ((size(addresses) > 0))
190228 then {
191229 let $l = indices
192230 let $s = size($l)
193231 let $acc0 = pmt
194232 func $f0_1 ($a,$i) = if (($i >= $s))
195233 then $a
196234 else foldSwap($a, $l[$i])
197235
198236 func $f0_2 ($a,$i) = if (($i >= $s))
199237 then $a
200238 else throw("List size exceeds 10")
201239
202240 $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)
203241 }
204242 else throw("Path cannot be empty")
205- let $t062886340 = deductFee(final.amount)
206- let resultAfterFee = $t062886340._1
207- let fee = $t062886340._2
243+ let $t071677219 = deductFee(final.amount)
244+ let resultAfterFee = $t071677219._1
245+ let fee = $t071677219._2
208246 if ((0 >= final.amount))
209247 then throw((("Swap result " + toString(final.amount)) + " must be positive"))
210248 else if ((minReceived > resultAfterFee))
211249 then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minReceived)))
212250 else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
213251 }
214252
215253
216254 func wrapSwopfiSwap (inv,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = {
217255 let pmt = if ((size(inv.payments) > 0))
218256 then inv.payments[0]
219257 else throw("Payment required")
220258 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
221259 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
222260 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
223261 let assetFinalId = getAssetId(assetFinal)
224262 let balanceBefore = getBalance(assetFinalId)
225263 if ((balanceBefore == balanceBefore))
226264 then {
227265 let result = invoke(swopfiRouting, "routingTrade", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive], [pmt])
228266 if ((result == result))
229267 then {
230268 let balanceAfter = getBalance(assetFinalId)
231269 if ((balanceAfter == balanceAfter))
232270 then {
233271 let delta = (balanceAfter - balanceBefore)
234- let $t079828027 = deductFee(delta)
235- let resultAfterFee = $t079828027._1
236- let fee = $t079828027._2
272+ let $t088618906 = deductFee(delta)
273+ let resultAfterFee = $t088618906._1
274+ let fee = $t088618906._2
237275 if ((0 >= delta))
238276 then throw((("Swap result " + toString(delta)) + " must be positive"))
239277 else if ((minAmountToReceive > resultAfterFee))
240278 then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minAmountToReceive)))
241279 else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
242280 }
243281 else throw("Strict value is not equal to itself.")
244282 }
245283 else throw("Strict value is not equal to itself.")
246284 }
247285 else throw("Strict value is not equal to itself.")
248286 }
249287
250288
251289 func wrapPuzzleSwap (inv,routesStr,minToReceive) = {
252290 let pmt = if ((size(inv.payments) > 0))
253291 then inv.payments[0]
254292 else throw("Payment required")
255293 let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
256294 let assetId = getAssetId(assetIdFinal)
257295 let balanceBefore = getBalance(assetId)
258296 if ((balanceBefore == balanceBefore))
259297 then {
260298 let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, refKey], [pmt])
261299 if ((result == result))
262300 then {
263301 let balanceAfter = getBalance(assetId)
264302 if ((balanceAfter == balanceAfter))
265303 then {
266304 let deltaProxy = (balanceAfter - balanceBefore)
267305 if ((deltaProxy == deltaProxy))
268306 then [ScriptTransfer(inv.caller, deltaProxy, assetId)]
269307 else throw("Strict value is not equal to itself.")
270308 }
271309 else throw("Strict value is not equal to itself.")
272310 }
273311 else throw("Strict value is not equal to itself.")
274312 }
275313 else throw("Strict value is not equal to itself.")
276314 }
277315
278316
279317 @Callable(inv)
280-func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
318+func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
319+ let $t01011210166 = getSwapOptions(options)
320+ let deadline = $t01011210166._1
321+ let referrerName = $t01011210166._2
322+ let isValidTimestamp = validateBlockTimestamp(deadline)
323+ if ((isValidTimestamp == isValidTimestamp))
324+ then {
325+ let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
326+ if ((result == result))
327+ then if ((size(referrerName) > 0))
328+ then {
329+ let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
330+ let assetId = getAssetId(assetFinal)
331+ let $t01049810568 = getReferrerData(referrerName)
332+ let referrerAddress = $t01049810568._1
333+ let referrerPercent = $t01049810568._2
334+ let collectorFee = result[1].amount
335+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
336+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
337+ }
338+ else result
339+ else throw("Strict value is not equal to itself.")
340+ }
341+ else throw("Strict value is not equal to itself.")
342+ }
281343
282344
283345
284346 @Callable(inv)
285-func swapExp (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,expiresAt) = if ((lastBlock.timestamp > expiresAt))
286- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
287- else wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
347+func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
348+ let $t01112111175 = getSwapOptions(options)
349+ let deadline = $t01112111175._1
350+ let referrerName = $t01112111175._2
351+ let isValidTimestamp = validateBlockTimestamp(deadline)
352+ if ((isValidTimestamp == isValidTimestamp))
353+ then {
354+ let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
355+ if ((result == result))
356+ then if ((size(referrerName) > 0))
357+ then {
358+ let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
359+ let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
360+ let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
361+ let assetId = getAssetId(assetFinal)
362+ let $t01188511955 = getReferrerData(referrerName)
363+ let referrerAddress = $t01188511955._1
364+ let referrerPercent = $t01188511955._2
365+ let collectorFee = result[1].amount
366+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
367+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
368+ }
369+ else result
370+ else throw("Strict value is not equal to itself.")
371+ }
372+ else throw("Strict value is not equal to itself.")
373+ }
288374
289375
290376
291377 @Callable(inv)
292-func swapWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,referrerName) = if ((size(referrerName) == 0))
293- then throw("Referrer name invalid")
294- else {
295- let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
296- let assetId = getAssetId(assetFinal)
297- let $t01013110201 = getReferrerData(referrerName)
298- let referrerAddress = $t01013110201._1
299- let referrerPercent = $t01013110201._2
300- let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
301- if ((result == result))
302- then {
303- let collectorFee = result[1].amount
304- let referrerReward = fraction(collectorFee, referrerPercent, 100)
305-[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
306- }
307- else throw("Strict value is not equal to itself.")
308- }
309-
310-
311-
312-@Callable(inv)
313-func swapExpWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
314- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
315- else if ((size(referrerName) == 0))
316- then throw("Referrer name invalid")
317- else {
318- let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
319- let assetId = getAssetId(assetFinal)
320- let $t01121611286 = getReferrerData(referrerName)
321- let referrerAddress = $t01121611286._1
322- let referrerPercent = $t01121611286._2
323- let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
324- if ((result == result))
325- then {
326- let collectorFee = result[1].amount
327- let referrerReward = fraction(collectorFee, referrerPercent, 100)
328-[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
329- }
330- else throw("Strict value is not equal to itself.")
331- }
332-
333-
334-
335-@Callable(inv)
336-func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
337-
338-
339-
340-@Callable(inv)
341-func swopfiSwapExp (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt))
342- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
343- else wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
344-
345-
346-
347-@Callable(inv)
348-func swopfiSwapWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,referrerName) = if ((size(referrerName) == 0))
349- then throw("Referrer name invalid")
350- else {
351- let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
352- let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
353- let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
354- let assetId = getAssetId(assetFinal)
355- let $t01328013350 = getReferrerData(referrerName)
356- let referrerAddress = $t01328013350._1
357- let referrerPercent = $t01328013350._2
358- let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
359- if ((result == result))
360- then {
361- let collectorFee = result[1].amount
362- let referrerReward = fraction(collectorFee, referrerPercent, 100)
363-[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
364- }
365- else throw("Strict value is not equal to itself.")
366- }
367-
368-
369-
370-@Callable(inv)
371-func swopfiSwapExpWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
372- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
373- else if ((size(referrerName) == 0))
374- then throw("Referrer name invalid")
375- else {
376- let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
377- let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
378- let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
379- let assetId = getAssetId(assetFinal)
380- let $t01477214842 = getReferrerData(referrerName)
381- let referrerAddress = $t01477214842._1
382- let referrerPercent = $t01477214842._2
383- let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
384- if ((result == result))
385- then {
386- let collectorFee = result[1].amount
387- let referrerReward = fraction(collectorFee, referrerPercent, 100)
388-[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
389- }
390- else throw("Strict value is not equal to itself.")
391- }
392-
393-
394-
395-@Callable(inv)
396-func puzzleSwap (routesStr,minToReceive) = wrapPuzzleSwap(inv, routesStr, minToReceive)
397-
398-
399-
400-@Callable(inv)
401-func puzzleSwapExp (routesStr,minToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt))
402- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
403- else wrapPuzzleSwap(inv, routesStr, minToReceive)
404-
405-
406-
407-@Callable(inv)
408-func puzzleSwapWithReferrer (routesStr,minToReceive,referrerName) = if ((size(routesStr) == 0))
409- then throw("Invalid routing")
410- else if ((0 >= minToReceive))
411- then throw("Sum to receive is to low")
412- else if ((size(referrerName) == 0))
413- then throw("Referrer name is invalid")
414- else {
415- let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
416- let assetId = getAssetId(assetIdFinal)
417- let $t01620916279 = getReferrerData(referrerName)
418- let referrerAddress = $t01620916279._1
419- let referrerPercent = $t01620916279._2
420- let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
421- if ((balanceBefore == balanceBefore))
422- then {
423- let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
424- if ((result == result))
425- then {
426- let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
427- if ((balanceAfter == balanceAfter))
428- then {
429- let delta = (balanceAfter - balanceBefore)
430- if ((delta == delta))
431- then {
432- let reward = fraction(delta, referrerPercent, 100)
433- let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
434- if ((res == res))
435- then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
436- else throw("Strict value is not equal to itself.")
437- }
438- else throw("Strict value is not equal to itself.")
439- }
440- else throw("Strict value is not equal to itself.")
441- }
442- else throw("Strict value is not equal to itself.")
443- }
444- else throw("Strict value is not equal to itself.")
445- }
446-
447-
448-
449-@Callable(inv)
450-func puzzleSwapExpWithReferrer (routesStr,minToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
451- then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
452- else if ((size(routesStr) == 0))
453- then throw("Invalid routing")
454- else if ((0 >= minToReceive))
455- then throw("Sum to receive is to low")
456- else if ((size(referrerName) == 0))
457- then throw("Referrer name is invalid")
378+func puzzleSwap (routesStr,minToReceive,options) = {
379+ let $t01239012444 = getSwapOptions(options)
380+ let deadline = $t01239012444._1
381+ let referrerName = $t01239012444._2
382+ let isValidTimestamp = validateBlockTimestamp(deadline)
383+ if ((isValidTimestamp == isValidTimestamp))
384+ then if ((size(routesStr) == 0))
385+ then throw("Invalid routing")
386+ else if ((0 >= minToReceive))
387+ then throw("Sum to receive is to low")
458388 else {
459- let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
460- let assetId = getAssetId(assetIdFinal)
461- let $t01749217562 = getReferrerData(referrerName)
462- let referrerAddress = $t01749217562._1
463- let referrerPercent = $t01749217562._2
464389 let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
465390 if ((balanceBefore == balanceBefore))
466391 then {
467392 let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
468393 if ((result == result))
469- then {
470- let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
471- if ((balanceAfter == balanceAfter))
472- then {
473- let delta = (balanceAfter - balanceBefore)
474- if ((delta == delta))
475- then {
476- let reward = fraction(delta, referrerPercent, 100)
477- let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
478- if ((res == res))
479- then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
480- else throw("Strict value is not equal to itself.")
481- }
482- else throw("Strict value is not equal to itself.")
483- }
484- else throw("Strict value is not equal to itself.")
485- }
394+ then if ((size(referrerName) > 0))
395+ then {
396+ let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
397+ let assetId = getAssetId(assetIdFinal)
398+ let $t01300513075 = getReferrerData(referrerName)
399+ let referrerAddress = $t01300513075._1
400+ let referrerPercent = $t01300513075._2
401+ let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
402+ if ((balanceAfter == balanceAfter))
403+ then {
404+ let delta = (balanceAfter - balanceBefore)
405+ if ((delta == delta))
406+ then {
407+ let reward = fraction(delta, referrerPercent, 100)
408+ let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
409+ if ((res == res))
410+ then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
411+ else throw("Strict value is not equal to itself.")
412+ }
413+ else throw("Strict value is not equal to itself.")
414+ }
415+ else throw("Strict value is not equal to itself.")
416+ }
417+ else result
486418 else throw("Strict value is not equal to itself.")
487419 }
488420 else throw("Strict value is not equal to itself.")
489421 }
422+ else throw("Strict value is not equal to itself.")
423+ }
490424
491425
492426
493427 @Callable(inv)
494428 func addPools (poolAddresses) = {
495429 func addIfDoesNotExist (pools,pool) = if (containsElement(pools, pool))
496430 then throw((("Pool '" + pool) + "' is already added"))
497431 else (pools :+ toString(parseAddressOrThrow(pool)))
498432
499433 if (!(containsElement([this, collector], inv.caller)))
500434 then throw("only self calls or by collector are allowed")
501435 else [StringEntry("p-pools", makeString({
502436 let $l = poolAddresses
503437 let $s = size($l)
504438 let $acc0 = pPools
505439 func $f0_1 ($a,$i) = if (($i >= $s))
506440 then $a
507441 else addIfDoesNotExist($a, $l[$i])
508442
509443 func $f0_2 ($a,$i) = if (($i >= $s))
510444 then $a
511445 else throw("List size exceeds 10")
512446
513447 $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)
514448 }, ","))]
515449 }
516450
517451
518452
519453 @Callable(inv)
520454 func addReferer (referrerName,refererAddress,percent) = {
521455 let address = parseAddressOrThrow(refererAddress)
522456 if (if ((0 > percent))
523457 then true
524458 else (percent > 100))
525459 then throw("Incorrect percent rate")
526460 else if ((size(referrerName) == 0))
527461 then throw("Referrer name invalid")
528462 else if (!(containsElement([this, collector], inv.caller)))
529463 then throw("only self calls or by collector are allowed")
530464 else [StringEntry((("referrer-" + referrerName) + "-address"), refererAddress), IntegerEntry((("referrer-" + referrerName) + "-percent"), percent)]
531465 }
532466
533467

github/deemru/w8io/3ef1775 
88.72 ms