tx · FUaBfudfNHyz7w9gakhBgr8EFes14e5W8mobtR6wN6mm

3PCZsQrcizF4GwV6Cch3acQNDXsei4XJ9MH:  -0.01900000 Waves

2022.09.09 15:23 [3287080] smart account 3PCZsQrcizF4GwV6Cch3acQNDXsei4XJ9MH > SELF 0.00000000 Waves

{ "type": 13, "id": "FUaBfudfNHyz7w9gakhBgr8EFes14e5W8mobtR6wN6mm", "fee": 1900000, "feeAssetId": null, "timestamp": 1662726226188, "version": 2, "chainId": 87, "sender": "3PCZsQrcizF4GwV6Cch3acQNDXsei4XJ9MH", "senderPublicKey": "zVFub7Emob9L7K3QhVvk2aMCcPQWfhrWXB2twkBfh6M", "proofs": [ "G5G21dYfrzUkH8og6wCfxVkd1N51tXysd3P7JP9fu3e6pGWdT52nAiGYfqiRiLrG61vCCngWmkHRCtX8UF9YhW6" ], "script": "base64:AAIFAAAAAAAAACoIAhIICgYYGBEBARgSCQoHGBgRERgBGBIFCgMIARgSAwoBGBIFCgMICAEAAAAcAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMQ2FuJ3QgcmVhZCAnBQAAAANrZXkCAAAADScgYXQgYWRkcmVzcyAJAAQlAAAAAQUAAAAHYWRkcmVzcwEAAAARZ2V0SW50ZWdlck9yVGhyb3cAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAxDYW4ndCByZWFkICcFAAAAA2tleQIAAAANJyBhdCBhZGRyZXNzIAkABCUAAAABBQAAAAdhZGRyZXNzAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQAAAAxtYXliZUFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABBQAAAAxtYXliZUFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAABpDYW4ndCBwYXJzZSBhZGRyZXNzIGZyb20gJwUAAAAMbWF5YmVBZGRyZXNzAgAAAAEnAQAAABFwYXJzZUludE9yRGVmYXVsdAAAAAIAAAAIbWF5YmVJbnQAAAAHZGVmYXVsdAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABLYAAAABBQAAAAhtYXliZUludAUAAAAHZGVmYXVsdAEAAAAPcGFyc2VJbnRPclRocm93AAAAAQAAAAhtYXliZUludAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEtgAAAAEFAAAACG1heWJlSW50CQABLAAAAAIJAAEsAAAAAgIAAAAaQ2FuJ3QgcGFyc2UgaW50ZWdlciBmcm9tICcFAAAACG1heWJlSW50AgAAAAEnAQAAAApnZXRBc3NldElkAAAAAQAAAAVhc3NldAMJAAAAAAAAAgUAAAAFYXNzZXQCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAABWFzc2V0AAAAAAljb2xsZWN0b3IJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAljb2xsZWN0b3IAAAAAB2ZlZVJhdGUJAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAACGZlZS1yYXRlAAAAAAZvcmFjbGUJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAZvcmFjbGUAAAAADXN3b3BmaVJvdXRpbmcJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAA5zd29wZmktcm91dGluZwAAAAANcHV6emxlUm91dGluZwkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAADnB1enpsZS1yb3V0aW5nAAAAAAVwb29scwkABLUAAAACCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABm9yYWNsZQIAAAAFcG9vbHMCAAAAASwAAAAAC3BlcmNlbnRSYXRlCQEAAAARZ2V0SW50ZWdlck9yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAxwZXJjZW50LXJhdGUAAAAABnJlZktleQIAAAAGa2VlcGVyAAAAABRwdXp6bGVSZXdhcmRBc3NldFN0cgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAABNwdXp6bGUtcmV3YXJkLXRva2VuAAAAABNwdXp6bGVSZXdhcmRBc3NldElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAAFHB1enpsZVJld2FyZEFzc2V0U3RyAAAAAAZwUG9vbHMJAAS1AAAAAgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzAgAAAAdwLXBvb2xzAgAAAAEsAQAAAA9hc3NldElkVG9TdHJpbmcAAAABAAAAB2Fzc2V0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c2V0UmVjZWl2ZWQDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEmVzdEFtb3VudFRvUmVjZWl2ZQkAAAIAAAABAgAAACNlc3RBbW91bnRUb1JlY2VpdmUgbXVzdCBiZSBwb3NpdGl2ZQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAVwb29scwUAAAAEcG9vbAQAAAAKcG9vbEFzc2V0QQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAtwb29sQWRkcmVzcwIAAAAKQV9hc3NldF9pZAQAAAAKcG9vbEFzc2V0QgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAtwb29sQWRkcmVzcwIAAAAKQl9hc3NldF9pZAQAAAAMcG9vbEFzc2V0SWRBCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAACnBvb2xBc3NldEEEAAAADHBvb2xBc3NldElkQgkBAAAACmdldEFzc2V0SWQAAAABBQAAAApwb29sQXNzZXRCBAAAAAskdDA0MDY4NDQxMgMDCQAAAAAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAADHBvb2xBc3NldElkQQkAAAAAAAACBQAAAA9hc3NldFJlY2VpdmVkSWQFAAAADHBvb2xBc3NldElkQgcJAAUUAAAAAgUAAAAMcG9vbEFzc2V0SWRBBQAAAAxwb29sQXNzZXRJZEIDAwkAAAAAAAACBQAAAA9hc3NldFJlY2VpdmVkSWQFAAAADHBvb2xBc3NldElkQQkAAAAAAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAAxwb29sQXNzZXRJZEIHCQAFFAAAAAIFAAAADHBvb2xBc3NldElkQgUAAAAMcG9vbEFzc2V0SWRBCQAAAgAAAAECAAAAF1Vuc3VwcG9ydGVkIGFzc2V0cyBwYWlyBAAAAAdhc3NldEluCAUAAAALJHQwNDA2ODQ0MTIAAAACXzEEAAAACGFzc2V0T3V0CAUAAAALJHQwNDA2ODQ0MTIAAAACXzIEAAAABGFyZ3MDCQAAAAAAAAIFAAAADHZlcnNpb25NYWpvcgAAAAAAAAAAAQkABEwAAAACAAAAAAAAAAABBQAAAANuaWwDCQAAAAAAAAIFAAAADHZlcnNpb25NYWpvcgAAAAAAAAAAAgMJ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dCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAAFAAAAA2ludgEAAAAEc3dhcAAAAAYAAAAJYWRkcmVzc2VzAAAAD2Fzc2V0c1RvUmVjZWl2ZQAAAAtlc3RSZWNlaXZlZAAAABFzbGlwcGFnZVRvbGVyYW5jZQAAAAttaW5SZWNlaXZlZAAAAAdvcHRpb25zBAAAAA0kdDAxMDAxNDEwMDY4CQEAAAAOZ2V0U3dhcE9wdGlvbnMAAAABBQAAAAdvcHRpb25zBAAAAAhkZWFkbGluZQgFAAAADSR0MDEwMDE0MTAwNjgAAAACXzEEAAAADHJlZmVycmVyTmFtZQgFAAAADSR0MDEwMDE0MTAwNjgAAAACXzIEAAAAEGlzVmFsaWRUaW1lc3RhbXAJAQAAABZ2YWxpZGF0ZUJsb2NrVGltZXN0YW1wAAAAAQUAAAAIZGVhZGxpbmUDCQAAAAAAAAIFAAAAEGlzVmFsaWRUaW1lc3RhbXAFAAAAEGlzVmFsaWRUaW1lc3RhbXAEAAAABnJlc3VsdAkBAAAACHdyYXBTd2FwAAAABgUAAAADaW52BQAAAAlhZGRyZXNzZXMFAAAAD2Fzc2V0c1RvUmVjZWl2ZQUAAAALZXN0UmVjZWl2ZWQFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAAAttaW5SZWNlaXZlZAMJAAAAAAAAAgUAAAAGcmVzdWx0BQAAAAZyZXN1bHQDCQAAZgAAAAIJAAExAAAAAQUAAAAMcmVmZXJyZXJOYW1lAAAAAAAAAAAABAAAAAphc3NldEZpbmFsCQABkQAAAAIFAAAAD2Fzc2V0c1RvUmVjZWl2ZQkAAGUAAAACCQABkAAAAAEFAAAAD2Fzc2V0c1RvUmVjZWl2ZQAAAAAAAAAAAQQAAAAHYXNzZXRJZAkBAAAACmdldEFzc2V0SWQAAAABBQAAAAphc3NldEZpbmFsBAAAAA0kdDAxMDQwMDEwNDcwCQEAAAAPZ2V0UmVmZXJyZXJEYXRhAAAAAQUAAAAMcmVmZXJyZXJOYW1lBAAAAA9yZWZlcnJlckFkZHJlc3MIBQAAAA0kdDAxMDQwMDEwNDcwAAAAAl8xBAAAAA9yZWZlcnJlclBlcmNlbnQIBQAAAA0kdDAxMDQwMDEwNDcwAAAAAl8yBAAAAAxjb2xsZWN0b3JGZWUICQABkQAAAAIFAAAABnJlc3VsdAAAAAAAAAAAAQAAAAZhbW91bnQEAAAADnJlZmVycmVyUmV3YXJkCQAAawAAAAMFAAAADGNvbGxlY3RvckZlZQUAAAAPcmVmZXJyZXJQZXJjZW50AAAAAAAAAABkCQAETAAAAAIJAAGRAAAAAgUAAAAGcmVzdWx0AAAAAAAAAAAACQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAACWNvbGxlY3RvcgkAAGUAAAACBQAAAAxjb2xsZWN0b3JGZWUFAAAADnJlZmVycmVyUmV3YXJkBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAD3JlZmVycmVyQWRkcmVzcwUAAAAOcmVmZXJyZXJSZXdhcmQFAAAAB2Fzc2V0SWQFAAAAA25pbAUAAAAGcmVzdWx0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAADaW52AQAAAApzd29wZmlTd2FwAAAABwAAAApleGNoYW5nZXJzAAAADmV4Y2hhbmdlcnNUeXBlAAAABWFyZ3MxAAAABWFyZ3MyAAAAEXJvdXRpbmdBc3NldHNLZXlzAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQAAAAdvcHRpb25zBAAAAA0kdDAxMTAyMzExMDc3CQEAAAAOZ2V0U3dhcE9wdGlvbnMAAAABBQAAAAdvcHRpb25zBAAAAAhkZWFkbGluZQgFAAAADSR0MDExMDIzMTEwNzcAAAACXzEEAAAADHJlZmVycmVyTmFtZQgFAAAADSR0MDExMDIzMTEwNzcAAAACXzIEAAAAEGlzVmFsaWRUaW1lc3RhbXAJAQAAABZ2YWxpZGF0ZUJsb2NrVGltZXN0YW1wAAAAAQUAAAAIZGVhZGxpbmUDCQAAAAAAAAIFAAAAEGlzVmFsaWRUaW1lc3RhbXAFAAAAEGlzVmFsaWRUaW1lc3RhbXAEAAAABnJlc3VsdAkBAAAADndyYXBTd29wZmlTd2FwAAAABwUAAAADaW52BQAAAApleGNoYW5nZXJzBQAAAA5leGNoYW5nZXJzVHlwZQUAAAAFYXJnczEFAAAABWFyZ3MyBQAAABFyb3V0aW5nQXNzZXRzS2V5cwUAAAASbWluQW1vdW50VG9SZWNlaXZlAwkAAAAAAAACBQAAAAZyZXN1bHQFAAAABnJlc3VsdAMJAABmAAAAAgkAATEAAAABBQAAAAxyZWZlcnJlck5hbWUAAAAAAAAAAAAEAAAADWxhc3RFeGNoYW5nZXIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAACmV4Y2hhbmdlcnMJAABlAAAAAgkAAZAAAAABBQAAAApleGNoYW5nZXJzAAAAAAAAAAABAgAAAClDYW4ndCBwYXJzZSBsYXN0IGV4Y2hhbmdlciBzd29wZmkgYWRkcmVzcwQAAAAObGFzdEFzc2V0SWRLZXkJAAEsAAAAAgkAAZEAAAACCQAEtQAAAAIJAAGRAAAAAgUAAAARcm91dGluZ0Fzc2V0c0tleXMJAABlAAAAAgkAAZAAAAABBQAAABFyb3V0aW5nQXNzZXRzS2V5cwAAAAAAAAAAAQIAAAABXwAAAAAAAAAAAAIAAAAJX2Fzc2V0X2lkBAAAAAphc3NldEZpbmFsCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANbGFzdEV4Y2hhbmdlcgUAAAAObGFzdEFzc2V0SWRLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAFkNhbid0IHJlYWQgcGFyYW1ldGVyICcFAAAADmxhc3RBc3NldElkS2V5AgAAABAnIGZvciBleGNoYW5nZXIgCQAEJQAAAAEFAAAADWxhc3RFeGNoYW5nZXIEAAAAB2Fzc2V0SWQJAQAAAApnZXRBc3NldElkAAAAAQUAAAAKYXNzZXRGaW5hbAQAAAANJHQwMTE3ODcxMTg1NwkBAAAAD2dldFJlZmVycmVyRGF0YQAAAAEFAAAADHJlZmVycmVyTmFtZQQAAAAPcmVmZXJyZXJBZGRyZXNzCAUAAAANJHQwMTE3ODcxMTg1NwAAAAJfMQQAAAAPcmVmZXJyZXJQZXJjZW50CAUAAAANJHQwMTE3ODcxMTg1NwAAAAJfMgQAAAAMY29sbGVjdG9yRmVlCAkAAZEAAAACBQAAAAZyZXN1bHQAAAAAAAAAAAEAAAAGYW1vdW50BAAAAA5yZWZlcnJlclJld2FyZAkAAGsAAAADBQAAAAxjb2xsZWN0b3JGZWUFAAAAD3JlZmVycmVyUGVyY2VudAAAAAAAAAAAZAkABEwAAAACCQABkQAAAAIFAAAABnJlc3VsdAAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAljb2xsZWN0b3IJAABlAAAAAgUAAAAMY29sbGVjdG9yRmVlBQAAAA5yZWZlcnJlclJld2FyZAUAAAAHYXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA9yZWZlcnJlckFkZHJlc3MFAAAADnJlZmVycmVyUmV3YXJkBQAAAAdhc3NldElkBQAAAANuaWwFAAAABnJlc3VsdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAA2ludgEAAAAKcHV6emxlU3dhcAAAAAMAAAAJcm91dGVzU3RyAAAADG1pblRvUmVjZWl2ZQAAAAdvcHRpb25zBAAAAA0kdDAxMjI5MjEyMzQ2CQEAAAAOZ2V0U3dhcE9wdGlvbnMAAAABBQAAAAdvcHRpb25zBAAAAAhkZWFkbGluZQgFAAAADSR0MDEyMjkyMTIzNDYAAAACXzEEAAAADHJlZmVycmVyTmFtZQgFAAAADSR0MDEyMjkyMTIzNDYAAAACXzIEAAAAEGlzVmFsaWRUaW1lc3RhbXAJAQAAABZ2YWxpZGF0ZUJsb2NrVGltZXN0YW1wAAAAAQUAAAAIZGVhZGxpbmUDCQAAAAAAAAIFAAAAEGlzVmFsaWRUaW1lc3RhbXAFAAAAEGlzVmFsaWRUaW1lc3RhbXADCQAAAAAAAAIJAAExAAAAAQUAAAAJcm91dGVzU3RyAAAAAAAAAAAACQAAAgAAAAECAAAAD0ludmFsaWQgcm91dGluZwMJAABnAAAAAgAAAAAAAAAAAAUAAAAMbWluVG9SZWNlaXZlCQAAAgAAAAECAAAAGFN1bSB0byByZWNlaXZlIGlzIHRvIGxvdwQAAAANYmFsYW5jZUJlZm9yZQkBAAAAE2dldEJhbGFuY2VCeUFkZHJlc3MAAAACBQAAAAljb2xsZWN0b3IFAAAAE3B1enpsZVJld2FyZEFzc2V0SWQDCQAAAAAAAAIFAAAADWJhbGFuY2VCZWZvcmUFAAAADWJhbGFuY2VCZWZvcmUEAAAABnJlc3VsdAkBAAAADndyYXBQdXp6bGVTd2FwAAAAAwUAAAADaW52BQAAAAlyb3V0ZXNTdHIFAAAADG1pblRvUmVjZWl2ZQMJAAAAAAAAAgUAAAAGcmVzdWx0BQAAAAZyZXN1bHQDCQAAZgAAAAIJAAExAAAAAQUAAAAMcmVmZXJyZXJOYW1lAAAAAAAAAAAABAAAAAxhc3NldElkRmluYWwJAAGRAAAAAgkABLUAAAACBQAAAAlyb3V0ZXNTdHICAAAAASwJAABlAAAAAgkAAZAAAAABCQAEtQAAAAIFAAAACXJvdXRlc1N0cgIAAAABLAAAAAAAAAAAAQQAAAAHYXNzZXRJZAkBAAAACmdldEFzc2V0SWQAAAABBQAAAAxhc3NldElkRmluYWwEAAAADSR0MDEyOTA3MTI5NzcJAQAAAA9nZXRSZWZlcnJlckRhdGEAAAABBQAAAAxyZWZlcnJlck5hbWUEAAAAD3JlZmVycmVyQWRkcmVzcwgFAAAADSR0MDEyOTA3MTI5NzcAAAACXzEEAAAAD3JlZmVycmVyUGVyY2VudAgFAAAADSR0MDEyOTA3MTI5NzcAAAACXzIEAAAADGJhbGFuY2VBZnRlcgkBAAAAE2dldEJhbGFuY2VCeUFkZHJlc3MAAAACBQAAAAljb2xsZWN0b3IFAAAAE3B1enpsZVJld2FyZEFzc2V0SWQDCQAAAAAAAAIFAAAADGJhbGFuY2VBZnRlcgUAAAAMYmFsYW5jZUFmdGVyBAAAAAVkZWx0YQkAAGUAAAACBQAAAAxiYWxhbmNlQWZ0ZXIFAAAADWJhbGFuY2VCZWZvcmUDCQAAAAAAAAIFAAAABWRlbHRhBQAAAAVkZWx0YQQAAAAGcmV3YXJkCQAAawAAAAMFAAAABWRlbHRhBQAAAA9y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", "height": 3287080, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2ycMiiZNXRurHZeNB3dJi2S535u7FJoxYfJmeb1tZXdM Next: none Diff:
OldNewDifferences
9090 }
9191
9292
93-func getOptionalParams (options) = if ((size(options) != 2))
94- then throw("Wrong amount of optional arguments")
95- else $Tuple2(options[1], parseIntOrDefault(options[0], 0))
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
96124
97125
98126 func doSwap (pool,payment,assetReceived,estAmountToReceive,slippageTolerance) = {
107135 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
108136 let poolAssetIdA = getAssetId(poolAssetA)
109137 let poolAssetIdB = getAssetId(poolAssetB)
110- let $t035853929 = if (if ((payment.assetId == poolAssetIdA))
138+ let $t040684412 = if (if ((payment.assetId == poolAssetIdA))
111139 then (assetReceivedId == poolAssetIdB)
112140 else false)
113141 then $Tuple2(poolAssetIdA, poolAssetIdB)
116144 else false)
117145 then $Tuple2(poolAssetIdB, poolAssetIdA)
118146 else throw("Unsupported assets pair")
119- let assetIn = $t035853929._1
120- let assetOut = $t035853929._2
147+ let assetIn = $t040684412._1
148+ let assetOut = $t040684412._2
121149 let args = if ((versionMajor == 1))
122150 then [1]
123151 else if ((versionMajor == 2))
210238 $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)
211239 }
212240 else throw("Path cannot be empty")
213- let $t065866638 = deductFee(final.amount)
214- let resultAfterFee = $t065866638._1
215- let fee = $t065866638._2
241+ let $t070697121 = deductFee(final.amount)
242+ let resultAfterFee = $t070697121._1
243+ let fee = $t070697121._2
216244 if ((0 >= final.amount))
217245 then throw((("Swap result " + toString(final.amount)) + " must be positive"))
218246 else if ((minReceived > resultAfterFee))
239267 if ((balanceAfter == balanceAfter))
240268 then {
241269 let delta = (balanceAfter - balanceBefore)
242- let $t082808325 = deductFee(delta)
243- let resultAfterFee = $t082808325._1
244- let fee = $t082808325._2
270+ let $t087638808 = deductFee(delta)
271+ let resultAfterFee = $t087638808._1
272+ let fee = $t087638808._2
245273 if ((0 >= delta))
246274 then throw((("Swap result " + toString(delta)) + " must be positive"))
247275 else if ((minAmountToReceive > resultAfterFee))
286314
287315 @Callable(inv)
288316 func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
289- let $t095319588 = getOptionalParams(options)
290- let referrerName = $t095319588._1
291- let deadline = $t095319588._2
292- if (if ((deadline > 0))
293- then (lastBlock.timestamp > deadline)
294- else false)
295- then throw(((("This swap expired at timestamp " + toString(deadline)) + ". Current: ") + toString(lastBlock.timestamp)))
296- else {
317+ let $t01001410068 = getSwapOptions(options)
318+ let deadline = $t01001410068._1
319+ let referrerName = $t01001410068._2
320+ let isValidTimestamp = validateBlockTimestamp(deadline)
321+ if ((isValidTimestamp == isValidTimestamp))
322+ then {
297323 let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
298324 if ((result == result))
299325 then if ((size(referrerName) > 0))
300326 then {
301327 let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
302328 let assetId = getAssetId(assetFinal)
303- let $t01006410134 = getReferrerData(referrerName)
304- let referrerAddress = $t01006410134._1
305- let referrerPercent = $t01006410134._2
329+ let $t01040010470 = getReferrerData(referrerName)
330+ let referrerAddress = $t01040010470._1
331+ let referrerPercent = $t01040010470._2
306332 let collectorFee = result[1].amount
307333 let referrerReward = fraction(collectorFee, referrerPercent, 100)
308334 [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
310336 else result
311337 else throw("Strict value is not equal to itself.")
312338 }
339+ else throw("Strict value is not equal to itself.")
313340 }
314341
315342
316343
317344 @Callable(inv)
318345 func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
319- let $t01072310780 = getOptionalParams(options)
320- let referrerName = $t01072310780._1
321- let deadline = $t01072310780._2
322- if (if ((deadline > 0))
323- then (lastBlock.timestamp > deadline)
324- else false)
325- then throw(((("This swap expired at timestamp " + toString(deadline)) + ". Current: ") + toString(lastBlock.timestamp)))
326- else {
346+ let $t01102311077 = getSwapOptions(options)
347+ let deadline = $t01102311077._1
348+ let referrerName = $t01102311077._2
349+ let isValidTimestamp = validateBlockTimestamp(deadline)
350+ if ((isValidTimestamp == isValidTimestamp))
351+ then {
327352 let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
328353 if ((result == result))
329354 then if ((size(referrerName) > 0))
332357 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
333358 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
334359 let assetId = getAssetId(assetFinal)
335- let $t01163811708 = getReferrerData(referrerName)
336- let referrerAddress = $t01163811708._1
337- let referrerPercent = $t01163811708._2
360+ let $t01178711857 = getReferrerData(referrerName)
361+ let referrerAddress = $t01178711857._1
362+ let referrerPercent = $t01178711857._2
338363 let collectorFee = result[1].amount
339364 let referrerReward = fraction(collectorFee, referrerPercent, 100)
340365 [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
342367 else result
343368 else throw("Strict value is not equal to itself.")
344369 }
370+ else throw("Strict value is not equal to itself.")
345371 }
346372
347373
348374
349375 @Callable(inv)
350376 func puzzleSwap (routesStr,minToReceive,options) = {
351- let $t01217912236 = getOptionalParams(options)
352- let referrerName = $t01217912236._1
353- let deadline = $t01217912236._2
354- if (if ((deadline > 0))
355- then (lastBlock.timestamp > deadline)
356- else false)
357- then throw(((("This swap expired at timestamp " + toString(deadline)) + ". Current: ") + toString(lastBlock.timestamp)))
358- else if ((size(routesStr) == 0))
377+ let $t01229212346 = getSwapOptions(options)
378+ let deadline = $t01229212346._1
379+ let referrerName = $t01229212346._2
380+ let isValidTimestamp = validateBlockTimestamp(deadline)
381+ if ((isValidTimestamp == isValidTimestamp))
382+ then if ((size(routesStr) == 0))
359383 then throw("Invalid routing")
360384 else if ((0 >= minToReceive))
361385 then throw("Sum to receive is to low")
369393 then {
370394 let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
371395 let assetId = getAssetId(assetIdFinal)
372- let $t01291712987 = getReferrerData(referrerName)
373- let referrerAddress = $t01291712987._1
374- let referrerPercent = $t01291712987._2
396+ let $t01290712977 = getReferrerData(referrerName)
397+ let referrerAddress = $t01290712977._1
398+ let referrerPercent = $t01290712977._2
375399 let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
376400 if ((balanceAfter == balanceAfter))
377401 then {
393417 }
394418 else throw("Strict value is not equal to itself.")
395419 }
420+ else throw("Strict value is not equal to itself.")
396421 }
397422
398423
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 parseIntOrDefault (maybeInt,default) = valueOrElse(parseInt(maybeInt), default)
1414
1515
1616 func parseIntOrThrow (maybeInt) = valueOrErrorMessage(parseInt(maybeInt), (("Can't parse integer from '" + maybeInt) + "'"))
1717
1818
1919 func getAssetId (asset) = if ((asset == "WAVES"))
2020 then unit
2121 else fromBase58String(asset)
2222
2323
2424 let collector = parseAddressOrThrow(getStringOrThrow(this, "collector"))
2525
2626 let feeRate = getIntegerOrThrow(this, "fee-rate")
2727
2828 let oracle = parseAddressOrThrow(getStringOrThrow(this, "oracle"))
2929
3030 let swopfiRouting = parseAddressOrThrow(getStringOrThrow(this, "swopfi-routing"))
3131
3232 let puzzleRouting = parseAddressOrThrow(getStringOrThrow(this, "puzzle-routing"))
3333
3434 let pools = split(getStringOrThrow(oracle, "pools"), ",")
3535
3636 let percentRate = getIntegerOrThrow(this, "percent-rate")
3737
3838 let refKey = "keeper"
3939
4040 let puzzleRewardAssetStr = getStringOrThrow(this, "puzzle-reward-token")
4141
4242 let puzzleRewardAssetId = getAssetId(puzzleRewardAssetStr)
4343
4444 let pPools = split(getStringOrThrow(this, "p-pools"), ",")
4545
4646 func assetIdToString (assetId) = match assetId {
4747 case asset: ByteVector =>
4848 toBase58String(asset)
4949 case waves: Unit =>
5050 "WAVES"
5151 case _ =>
5252 throw("Match error")
5353 }
5454
5555
5656 func getBalance (assetId) = match assetId {
5757 case asset: ByteVector =>
5858 assetBalance(this, asset)
5959 case waves: Unit =>
6060 wavesBalance(this).available
6161 case _ =>
6262 throw("Match error")
6363 }
6464
6565
6666 func getBalanceByAddress (address,assetId) = match assetId {
6767 case asset: ByteVector =>
6868 assetBalance(address, asset)
6969 case waves: Unit =>
7070 wavesBalance(address).available
7171 case _ =>
7272 throw("Match error")
7373 }
7474
7575
7676 func deductFee (amount) = {
7777 let fee = fraction(amount, 1, feeRate)
7878 $Tuple2((amount - fee), fee)
7979 }
8080
8181
8282 func getReferrerData (referrerName) = {
8383 let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found")))
8484 let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate)
8585 if (if ((0 > refPercent))
8686 then true
8787 else (refPercent > 100))
8888 then throw("Incorrect percent rate")
8989 else $Tuple2(refAddress, refPercent)
9090 }
9191
9292
93-func getOptionalParams (options) = if ((size(options) != 2))
94- then throw("Wrong amount of optional arguments")
95- else $Tuple2(options[1], parseIntOrDefault(options[0], 0))
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
96124
97125
98126 func doSwap (pool,payment,assetReceived,estAmountToReceive,slippageTolerance) = {
99127 let poolAddress = parseAddressOrThrow(pool)
100128 let versionMajor = parseIntOrThrow(split(getStringOrThrow(poolAddress, "version"), ".")[0])
101129 let assetReceivedId = getAssetId(assetReceived)
102130 if ((0 > estAmountToReceive))
103131 then throw("estAmountToReceive must be positive")
104132 else if (containsElement(pools, pool))
105133 then {
106134 let poolAssetA = getStringOrThrow(poolAddress, "A_asset_id")
107135 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
108136 let poolAssetIdA = getAssetId(poolAssetA)
109137 let poolAssetIdB = getAssetId(poolAssetB)
110- let $t035853929 = if (if ((payment.assetId == poolAssetIdA))
138+ let $t040684412 = if (if ((payment.assetId == poolAssetIdA))
111139 then (assetReceivedId == poolAssetIdB)
112140 else false)
113141 then $Tuple2(poolAssetIdA, poolAssetIdB)
114142 else if (if ((assetReceivedId == poolAssetIdA))
115143 then (payment.assetId == poolAssetIdB)
116144 else false)
117145 then $Tuple2(poolAssetIdB, poolAssetIdA)
118146 else throw("Unsupported assets pair")
119- let assetIn = $t035853929._1
120- let assetOut = $t035853929._2
147+ let assetIn = $t040684412._1
148+ let assetOut = $t040684412._2
121149 let args = if ((versionMajor == 1))
122150 then [1]
123151 else if ((versionMajor == 2))
124152 then if ((0 >= estAmountToReceive))
125153 then throw("estAmountToReceive must be positive")
126154 else if (if ((0 > slippageTolerance))
127155 then true
128156 else (slippageTolerance > 1000))
129157 then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
130158 else {
131159 let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000))
132160 [estAmountToReceive, if ((minAmount > 0))
133161 then minAmount
134162 else 1]
135163 }
136164 else throw((("Unknown pool version '" + toString(versionMajor)) + "', but 1 or 2 expected"))
137165 let balanceBefore = getBalance(assetReceivedId)
138166 if ((balanceBefore == balanceBefore))
139167 then {
140168 let result = invoke(poolAddress, "exchange", args, [payment])
141169 if ((result == result))
142170 then {
143171 let received = (getBalance(assetReceivedId) - balanceBefore)
144172 if ((received == received))
145173 then if ((0 >= received))
146174 then throw("Received amount from pool must be positive")
147175 else received
148176 else throw("Strict value is not equal to itself.")
149177 }
150178 else throw("Strict value is not equal to itself.")
151179 }
152180 else throw("Strict value is not equal to itself.")
153181 }
154182 else if (containsElement(pPools, pool))
155183 then {
156184 let balanceBefore = getBalance(assetReceivedId)
157185 if ((balanceBefore == balanceBefore))
158186 then {
159187 let result = invoke(poolAddress, "swap", [assetReceived, 0], [payment])
160188 if ((result == result))
161189 then {
162190 let received = (getBalance(assetReceivedId) - balanceBefore)
163191 if ((received == received))
164192 then if ((0 >= received))
165193 then throw("Received amount from pool must be positive")
166194 else received
167195 else throw("Strict value is not equal to itself.")
168196 }
169197 else throw("Strict value is not equal to itself.")
170198 }
171199 else throw("Strict value is not equal to itself.")
172200 }
173201 else throw((("There is no pool at address '" + pool) + "'"))
174202 }
175203
176204
177205 func wrapSwap (inv,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
178206 let pmt = if ((size(inv.payments) > 0))
179207 then inv.payments[0]
180208 else throw("Payment required")
181209 let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
182210 let assetFinalId = getAssetId(assetFinal)
183211 let indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
184212 func foldSwap (previousReceived,index) = if ((index >= size(addresses)))
185213 then previousReceived
186214 else {
187215 let assetReceived = assetsToReceive[index]
188216 let assetReceivedId = getAssetId(assetReceived)
189217 match doSwap(addresses[index], previousReceived, assetReceived, estReceived[index], slippageTolerance) {
190218 case income: Int =>
191219 AttachedPayment(assetReceivedId, income)
192220 case _ =>
193221 throw("Can't handle swap result")
194222 }
195223 }
196224
197225 let final = if ((size(addresses) > 0))
198226 then {
199227 let $l = indices
200228 let $s = size($l)
201229 let $acc0 = pmt
202230 func $f0_1 ($a,$i) = if (($i >= $s))
203231 then $a
204232 else foldSwap($a, $l[$i])
205233
206234 func $f0_2 ($a,$i) = if (($i >= $s))
207235 then $a
208236 else throw("List size exceeds 10")
209237
210238 $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)
211239 }
212240 else throw("Path cannot be empty")
213- let $t065866638 = deductFee(final.amount)
214- let resultAfterFee = $t065866638._1
215- let fee = $t065866638._2
241+ let $t070697121 = deductFee(final.amount)
242+ let resultAfterFee = $t070697121._1
243+ let fee = $t070697121._2
216244 if ((0 >= final.amount))
217245 then throw((("Swap result " + toString(final.amount)) + " must be positive"))
218246 else if ((minReceived > resultAfterFee))
219247 then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minReceived)))
220248 else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
221249 }
222250
223251
224252 func wrapSwopfiSwap (inv,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = {
225253 let pmt = if ((size(inv.payments) > 0))
226254 then inv.payments[0]
227255 else throw("Payment required")
228256 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
229257 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
230258 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
231259 let assetFinalId = getAssetId(assetFinal)
232260 let balanceBefore = getBalance(assetFinalId)
233261 if ((balanceBefore == balanceBefore))
234262 then {
235263 let result = invoke(swopfiRouting, "routingTrade", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive], [pmt])
236264 if ((result == result))
237265 then {
238266 let balanceAfter = getBalance(assetFinalId)
239267 if ((balanceAfter == balanceAfter))
240268 then {
241269 let delta = (balanceAfter - balanceBefore)
242- let $t082808325 = deductFee(delta)
243- let resultAfterFee = $t082808325._1
244- let fee = $t082808325._2
270+ let $t087638808 = deductFee(delta)
271+ let resultAfterFee = $t087638808._1
272+ let fee = $t087638808._2
245273 if ((0 >= delta))
246274 then throw((("Swap result " + toString(delta)) + " must be positive"))
247275 else if ((minAmountToReceive > resultAfterFee))
248276 then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minAmountToReceive)))
249277 else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
250278 }
251279 else throw("Strict value is not equal to itself.")
252280 }
253281 else throw("Strict value is not equal to itself.")
254282 }
255283 else throw("Strict value is not equal to itself.")
256284 }
257285
258286
259287 func wrapPuzzleSwap (inv,routesStr,minToReceive) = {
260288 let pmt = if ((size(inv.payments) > 0))
261289 then inv.payments[0]
262290 else throw("Payment required")
263291 let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
264292 let assetId = getAssetId(assetIdFinal)
265293 let balanceBefore = getBalance(assetId)
266294 if ((balanceBefore == balanceBefore))
267295 then {
268296 let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, refKey], [pmt])
269297 if ((result == result))
270298 then {
271299 let balanceAfter = getBalance(assetId)
272300 if ((balanceAfter == balanceAfter))
273301 then {
274302 let deltaProxy = (balanceAfter - balanceBefore)
275303 if ((deltaProxy == deltaProxy))
276304 then [ScriptTransfer(inv.caller, deltaProxy, assetId)]
277305 else throw("Strict value is not equal to itself.")
278306 }
279307 else throw("Strict value is not equal to itself.")
280308 }
281309 else throw("Strict value is not equal to itself.")
282310 }
283311 else throw("Strict value is not equal to itself.")
284312 }
285313
286314
287315 @Callable(inv)
288316 func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
289- let $t095319588 = getOptionalParams(options)
290- let referrerName = $t095319588._1
291- let deadline = $t095319588._2
292- if (if ((deadline > 0))
293- then (lastBlock.timestamp > deadline)
294- else false)
295- then throw(((("This swap expired at timestamp " + toString(deadline)) + ". Current: ") + toString(lastBlock.timestamp)))
296- else {
317+ let $t01001410068 = getSwapOptions(options)
318+ let deadline = $t01001410068._1
319+ let referrerName = $t01001410068._2
320+ let isValidTimestamp = validateBlockTimestamp(deadline)
321+ if ((isValidTimestamp == isValidTimestamp))
322+ then {
297323 let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
298324 if ((result == result))
299325 then if ((size(referrerName) > 0))
300326 then {
301327 let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
302328 let assetId = getAssetId(assetFinal)
303- let $t01006410134 = getReferrerData(referrerName)
304- let referrerAddress = $t01006410134._1
305- let referrerPercent = $t01006410134._2
329+ let $t01040010470 = getReferrerData(referrerName)
330+ let referrerAddress = $t01040010470._1
331+ let referrerPercent = $t01040010470._2
306332 let collectorFee = result[1].amount
307333 let referrerReward = fraction(collectorFee, referrerPercent, 100)
308334 [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
309335 }
310336 else result
311337 else throw("Strict value is not equal to itself.")
312338 }
339+ else throw("Strict value is not equal to itself.")
313340 }
314341
315342
316343
317344 @Callable(inv)
318345 func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
319- let $t01072310780 = getOptionalParams(options)
320- let referrerName = $t01072310780._1
321- let deadline = $t01072310780._2
322- if (if ((deadline > 0))
323- then (lastBlock.timestamp > deadline)
324- else false)
325- then throw(((("This swap expired at timestamp " + toString(deadline)) + ". Current: ") + toString(lastBlock.timestamp)))
326- else {
346+ let $t01102311077 = getSwapOptions(options)
347+ let deadline = $t01102311077._1
348+ let referrerName = $t01102311077._2
349+ let isValidTimestamp = validateBlockTimestamp(deadline)
350+ if ((isValidTimestamp == isValidTimestamp))
351+ then {
327352 let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
328353 if ((result == result))
329354 then if ((size(referrerName) > 0))
330355 then {
331356 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
332357 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
333358 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
334359 let assetId = getAssetId(assetFinal)
335- let $t01163811708 = getReferrerData(referrerName)
336- let referrerAddress = $t01163811708._1
337- let referrerPercent = $t01163811708._2
360+ let $t01178711857 = getReferrerData(referrerName)
361+ let referrerAddress = $t01178711857._1
362+ let referrerPercent = $t01178711857._2
338363 let collectorFee = result[1].amount
339364 let referrerReward = fraction(collectorFee, referrerPercent, 100)
340365 [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
341366 }
342367 else result
343368 else throw("Strict value is not equal to itself.")
344369 }
370+ else throw("Strict value is not equal to itself.")
345371 }
346372
347373
348374
349375 @Callable(inv)
350376 func puzzleSwap (routesStr,minToReceive,options) = {
351- let $t01217912236 = getOptionalParams(options)
352- let referrerName = $t01217912236._1
353- let deadline = $t01217912236._2
354- if (if ((deadline > 0))
355- then (lastBlock.timestamp > deadline)
356- else false)
357- then throw(((("This swap expired at timestamp " + toString(deadline)) + ". Current: ") + toString(lastBlock.timestamp)))
358- else if ((size(routesStr) == 0))
377+ let $t01229212346 = getSwapOptions(options)
378+ let deadline = $t01229212346._1
379+ let referrerName = $t01229212346._2
380+ let isValidTimestamp = validateBlockTimestamp(deadline)
381+ if ((isValidTimestamp == isValidTimestamp))
382+ then if ((size(routesStr) == 0))
359383 then throw("Invalid routing")
360384 else if ((0 >= minToReceive))
361385 then throw("Sum to receive is to low")
362386 else {
363387 let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
364388 if ((balanceBefore == balanceBefore))
365389 then {
366390 let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
367391 if ((result == result))
368392 then if ((size(referrerName) > 0))
369393 then {
370394 let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
371395 let assetId = getAssetId(assetIdFinal)
372- let $t01291712987 = getReferrerData(referrerName)
373- let referrerAddress = $t01291712987._1
374- let referrerPercent = $t01291712987._2
396+ let $t01290712977 = getReferrerData(referrerName)
397+ let referrerAddress = $t01290712977._1
398+ let referrerPercent = $t01290712977._2
375399 let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
376400 if ((balanceAfter == balanceAfter))
377401 then {
378402 let delta = (balanceAfter - balanceBefore)
379403 if ((delta == delta))
380404 then {
381405 let reward = fraction(delta, referrerPercent, 100)
382406 let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
383407 if ((res == res))
384408 then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
385409 else throw("Strict value is not equal to itself.")
386410 }
387411 else throw("Strict value is not equal to itself.")
388412 }
389413 else throw("Strict value is not equal to itself.")
390414 }
391415 else result
392416 else throw("Strict value is not equal to itself.")
393417 }
394418 else throw("Strict value is not equal to itself.")
395419 }
420+ else throw("Strict value is not equal to itself.")
396421 }
397422
398423
399424
400425 @Callable(inv)
401426 func addPools (poolAddresses) = {
402427 func addIfDoesNotExist (pools,pool) = if (containsElement(pools, pool))
403428 then throw((("Pool '" + pool) + "' is already added"))
404429 else (pools :+ toString(parseAddressOrThrow(pool)))
405430
406431 if (!(containsElement([this, collector], inv.caller)))
407432 then throw("only self calls or by collector are allowed")
408433 else [StringEntry("p-pools", makeString({
409434 let $l = poolAddresses
410435 let $s = size($l)
411436 let $acc0 = pPools
412437 func $f0_1 ($a,$i) = if (($i >= $s))
413438 then $a
414439 else addIfDoesNotExist($a, $l[$i])
415440
416441 func $f0_2 ($a,$i) = if (($i >= $s))
417442 then $a
418443 else throw("List size exceeds 10")
419444
420445 $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)
421446 }, ","))]
422447 }
423448
424449
425450
426451 @Callable(inv)
427452 func addReferer (referrerName,refererAddress,percent) = {
428453 let address = parseAddressOrThrow(refererAddress)
429454 if (if ((0 > percent))
430455 then true
431456 else (percent > 100))
432457 then throw("Incorrect percent rate")
433458 else if ((size(referrerName) == 0))
434459 then throw("Referrer name invalid")
435460 else if (!(containsElement([this, collector], inv.caller)))
436461 then throw("only self calls or by collector are allowed")
437462 else [StringEntry((("referrer-" + referrerName) + "-address"), refererAddress), IntegerEntry((("referrer-" + referrerName) + "-percent"), percent)]
438463 }
439464
440465

github/deemru/w8io/3ef1775 
65.87 ms