tx · 2SrM22bQJmLjTt99QdaXTXkfLuHfFeVrV9PmeFTsmQ6e

3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw:  -0.02700000 Waves

2023.03.14 12:56 [3555101] smart account 3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw > SELF 0.00000000 Waves

{ "type": 13, "id": "2SrM22bQJmLjTt99QdaXTXkfLuHfFeVrV9PmeFTsmQ6e", "fee": 2700000, "feeAssetId": null, "timestamp": 1678787679531, "version": 2, "chainId": 87, "sender": "3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw", "senderPublicKey": "4MfTwwE7yP4BFGaifQrcc9Nwb5BA9t92WKhVb6Ton65k", "proofs": [ "5uCW9rYTS3bVrgwrvAhkQ8C1rvnVcKQugburb6bF4MSzrsSPrSpn2sQLdU9QegGHJEP5uz5ssJiN24Z6NMEjJeXW", "r7fWMpWJtmggbVhcwsZBPipgroR2ZeHg6go7yt9iHejpiQwYpaoeqbwrGPttTGCuvSKeYkKxJQuuzgdT8tXQBoP" ], "script": "base64:AAIFAAAAAAAAACYIAhIJCgcRGBgYAQEYEgkKBxgYEREYARgSBQoDCAEYEgUKAwgIAQAAAB8BAAAAEGdldFN0cmluZ09yVGhyb3cAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAxDYW4ndCByZWFkICcFAAAAA2tleQIAAAANJyBhdCBhZGRyZXNzIAkABCUAAAABBQAAAAdhZGRyZXNzAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADENhbid0IHJlYWQgJwUAAAADa2V5AgAAAA0nIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAB2FkZHJlc3MBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABAAAADG1heWJlQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEFAAAADG1heWJlQWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAGkNhbid0IHBhcnNlIGFkZHJlc3MgZnJvbSAnBQAAAAxtYXliZUFkZHJlc3MCAAAAAScBAAAAEXBhcnNlSW50T3JEZWZhdWx0AAAAAgAAAAhtYXliZUludAAAAAdkZWZhdWx0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEtgAAAAEFAAAACG1heWJlSW50BQAAAAdkZWZhdWx0AQAAAA9wYXJzZUludE9yVGhyb3cAAAABAAAACG1heWJlSW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAS2AAAAAQUAAAAIbWF5YmVJbnQJAAEsAAAAAgkAASwAAAACAgAAABpDYW4ndCBwYXJzZSBpbnRlZ2VyIGZyb20gJwUAAAAIbWF5YmVJbnQCAAAAAScBAAAACmdldEFzc2V0SWQAAAABAAAABWFzc2V0AwkAAAAAAAACBQAAAAVhc3NldAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAFYXNzZXQAAAAACWNvbGxlY3RvcgkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAACWNvbGxlY3RvcgAAAAAHZmVlUmF0ZQkBAAAAEWdldEludGVnZXJPclRocm93AAAAAgUAAAAEdGhpcwIAAAAIZmVlLXJhdGUAAAAADHN3b3BmaU9yYWNsZQkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAABm9yYWNsZQAAAAANc3dvcGZpUm91dGluZwkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAADHN3b3BmaU9yYWNsZQIAAAAPcm91dGluZ19hZGRyZXNzAQAAAAxpc1N3b3BmaVBvb2wAAAABAAAAB2FkZHJlc3MJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAADHN3b3BmaU9yYWNsZQkAASwAAAACAgAAAAVwb29sXwUAAAAHYWRkcmVzcwAAAAAJd3hGYWN0b3J5CQEAAAATcGFyc2VBZGRyZXNzT3JUaHJvdwAAAAEJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAAEdGhpcwIAAAAKd3gtZmFjdG9yeQAAAAAGd3hTd2FwCQEAAAATcGFyc2VBZGRyZXNzT3JUaHJvdwAAAAEJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAAJd3hGYWN0b3J5AgAAABAlc19fc3dhcENvbnRyYWN0AQAAAAhpc1d4UG9vbAAAAAEAAAAHYWRkcmVzcwkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAJd3hGYWN0b3J5CQABLAAAAAIJAAEsAAAAAgIAAAAIJXMlcyVzX18FAAAAB2FkZHJlc3MCAAAAI19fbWFwcGluZ3NfX3Bvb2xDb250cmFjdDJQb29sQXNzZXRzAAAAAA1wdXp6bGVSb3V0aW5nCQEAAAATcGFyc2VBZGRyZXNzT3JUaHJvdwAAAAEJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAAEdGhpcwIAAAAOcHV6emxlLXJvdXRpbmcAAAAAFHB1enpsZVJld2FyZEFzc2V0U3RyCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAAE3B1enpsZS1yZXdhcmQtdG9rZW4AAAAAE3B1enpsZVJld2FyZEFzc2V0SWQJAQAAAApnZXRBc3NldElkAAAAAQUAAAAUcHV6emxlUmV3YXJkQXNzZXRTdHIAAAAADHB1enpsZVJlZktleQIAAAAGa2VlcGVyAAAAAAtwZXJjZW50UmF0ZQkBAAAAEWdldEludGVnZXJPclRocm93AAAAAgUAAAAEdGhpcwIAAAAMcGVyY2VudC1yYXRlAQAAAA9hc3NldElkVG9TdHJpbmcAAAABAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAABWFzc2V0BQAAAAckbWF0Y2gwCQACWAAAAAEFAAAABWFzc2V0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAV3YXZlcwUAAAAHJG1hdGNoMAIAAAAFV0FWRVMJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAACmdldEJhbGFuY2UAAAABAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAABWFzc2V0BQAAAAckbWF0Y2gwCQAD8AAAAAIFAAAABHRoaXMFAAAABWFzc2V0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAV3YXZlcwUAAAAHJG1hdGNoMAgJAAPvAAAAAQUAAAAEdGhpcwAAAAlhdmFpbGFibGUJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAAE2dldEJhbGFuY2VCeUFkZHJlc3MAAAACAAAAB2FkZHJlc3MAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAAFYXNzZXQFAAAAByRtYXRjaDAJAAPwAAAAAgUA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aW1lc3RhbXAgCQABpAAAAAEFAAAACGRlYWRsaW5lAgAAAAsuIEN1cnJlbnQ6IAkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAYBAAAABmRvU3dhcAAAAAUAAAAEcG9vbAAAAAdwYXltZW50AAAADWFzc2V0UmVjZWl2ZWQAAAASZXN0QW1vdW50VG9SZWNlaXZlAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAAtwb29sQWRkcmVzcwkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABBQAAAARwb29sBAAAAAx2ZXJzaW9uTWFqb3IJAQAAAA9wYXJzZUludE9yVGhyb3cAAAABCQABkQAAAAIJAAS1AAAAAgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAtwb29sQWRkcmVzcwIAAAAHdmVyc2lvbgIAAAABLgAAAAAAAAAAAAQAAAAPYXNzZXRSZWNlaXZlZElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAADWFzc2V0UmVjZWl2ZWQEAAAACyR0MDQyMDU2MDY3AwkAAGYAAAACAAAAAAAAAAAABQAAABJlc3RBbW91bnRUb1JlY2VpdmUJAAACAAAAAQIAAAAjZXN0QW1vdW50VG9SZWNlaXZlIG11c3QgYmUgcG9zaXRpdmUDCQEAAAAMaXNTd29wZmlQb29sAAAAAQUAAAAEcG9vbAQAAAAKcG9vbEFzc2V0QQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAtwb29sQWRkcmVzcwIAAAAKQV9hc3NldF9pZAQAAAAKcG9vbEFzc2V0QgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAtwb29sQWRkcmVzcwIAAAAKQl9hc3NldF9pZAQAAAAMcG9vbEFzc2V0SWRBCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAACnBvb2xBc3NldEEEAAAADHBvb2xBc3NldElkQgkBAAAACmdldEFzc2V0SWQAAAABBQAAAApwb29sQXNzZXRCBAAAAAskdDA0NjAzNDk0NwMDCQAAAAAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAADHBvb2xBc3NldElkQQkAAAAAAAACBQAAAA9hc3NldFJlY2VpdmVkSWQFAAAA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bmNlQWZ0ZXIFAAAADWJhbGFuY2VCZWZvcmUDCQAAAAAAAAIFAAAACmRlbHRhUHJveHkFAAAACmRlbHRhUHJveHkJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAA2ludgAAAAZjYWxsZXIFAAAACmRlbHRhUHJveHkFAAAAB2Fzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAAEAAAAA2ludgEAAAAEc3dhcAAAAAcAAAAJYW1vdW50c0luAAAACWFkZHJlc3NlcwAAAA9hc3NldHNUb1JlY2VpdmUAAAALZXN0UmVjZWl2ZWQAAAARc2xpcHBhZ2VUb2xlcmFuY2UAAAALbWluUmVjZWl2ZWQAAAAHb3B0aW9ucwQAAAADcG10AwkAAAAAAAACCQABkAAAAAEIBQAAAANpbnYAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAGRAAAAAggFAAAAA2ludgAAAAhwYXltZW50cwAAAAAAAAAAAAkAAAIAAAABAgAAABdTaW5nbGUgcGF5bWVudCByZXF1aXJlZAQAAAANJHQwMTE5MTIxMTk2NgkBAAAADmdldFN3YXBPcHRpb25zAAAAAQUAAAAHb3B0aW9ucwQAAAAIZGVhZGxpbmUIBQAAAA0kdDAxMTkxMjExOTY2AAAAAl8xBAAAAAxyZWZlcnJlck5hbWUIBQAAAA0kdDAxMTkxMjExOTY2AAAAAl8yBAAAABBpc1ZhbGlkVGltZXN0YW1wCQEAAAAWdmFsaWRhdGVCbG9ja1RpbWVzdGFtcAAAAAEFAAAACGRlYWRsaW5lAwkAAAAAAAACBQAAABBpc1ZhbGlkVGltZXN0YW1wBQAAABBpc1ZhbGlkVGltZXN0YW1wBAAAAA0kdDAxMjAzNDEyMTE0CQEAAAAWZ2V0UmVmZXJyZXJEYXRhT3JU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IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAANpbnYBAAAACnN3b3BmaVN3YXAAAAAHAAAACmV4Y2hhbmdlcnMAAAAOZXhjaGFuZ2Vyc1R5cGUAAAAFYXJnczEAAAAFYXJnczIAAAARcm91dGluZ0Fzc2V0c0tleXMAAAASbWluQW1vdW50VG9SZWNlaXZlAAAAB29wdGlvbnMEAAAADSR0MDE0MTY1MTQyMTkJAQAAAA5nZXRTd2FwT3B0aW9ucwAAAAEFAAAAB29wdGlvbnMEAAAACGRlYWRsaW5lCAUAAAANJHQwMTQxNjUxNDIxOQAAAAJfMQQAAAAMcmVmZXJyZXJOYW1lCAUAAAANJHQwMTQxNjUxNDIxOQAAAAJfMgQAAAAQaXNWYWxpZFRpbWVzdGFtcAkBAAAAFnZhbGlkYXRlQmxvY2tUaW1lc3RhbXAAAAABBQAAAAhkZWFkbGluZQMJAAAAAAAAAgUAAAAQaXNWYWxpZFRpbWVzdGFtcAUAAAAQaXNWYWxpZFRpbWVzdGFtcAQAAAANJHQwMTQyODcxNDM2NwkBAAAAFmdldFJlZmVycmVyRGF0YU9yVGhyb3cAAAABBQAAAAxyZWZlcnJlck5hbWUDCQAAAAAAAAIFAAAADSR0MDE0Mjg3MTQzNjcFAAAADSR0MDE0Mjg3MTQzNjcEAAAAD3JlZmVycmVyUGVyY2VudAgFAAAADSR0MDE0Mjg3MTQzNjcAAAACXzIEAAAAD3JlZmVycmVyQWRkcmVzcwgFAAAADSR0MDE0Mjg3MTQzNjcAAAACXzEEAAAABnJlc3VsdAkBAAAADndyYXBTd29wZmlTd2FwAAAABwUAAAADaW52BQAAAApleGNoYW5nZXJzBQAAAA5leGNoYW5nZXJzVHlwZQUAAAAFYXJnczEFAAAABWFyZ3MyBQAAABFyb3V0aW5nQXNzZXRzS2V5cwUAAAASbWluQW1vdW50VG9SZWNlaXZlAwkAAAAAAAACBQAAAAZyZXN1bHQFAAAABnJlc3VsdAMJAABmAAAAAgUAAAAPcmVmZXJyZXJQZXJjZW50AAAAAAAAAAAABAAAAA1sYXN0RXhjaGFuZ2VyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkAAZEAAAACBQAAAApleGNoYW5nZXJzCQAAZQAAAAIJAAGQAAAAAQUAAAAKZXhjaGFuZ2VycwAAAAAAAAAAAQIAAAApQ2FuJ3QgcGFyc2UgbGFzdCBleGNoYW5nZXIgc3dvcGZpIGFkZHJlc3MEAAAADmxhc3RBc3NldElkS2V5CQABLAAAAAIJAAGRAAAAAgkABLUAAAACCQABkQAAAAIFAAAAEXJvdXRpbmdBc3NldHNLZXlzCQAAZQAAAAIJAAGQAAAAAQUAAAARcm91dGluZ0Fzc2V0c0tleXMAAAAAAAAAAAECAAAAAV8AAAAAAAAAAAACAAAACV9hc3NldF9pZAQAAAAKYXNzZXRGaW5hbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADWxhc3RFeGNoYW5nZXIFAAAADmxhc3RBc3NldElkS2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABZDYW4ndCByZWFkIHBhcmFtZXRlciAnBQAAAA5sYXN0QXNzZXRJZEtleQIAAAAQJyBmb3IgZXhjaGFuZ2VyIAkABCUAAAABBQAAAA1sYXN0RXhjaGFuZ2VyBAAAAAdhc3NldElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAACmFzc2V0RmluYWwEAAAADGNvbGxlY3RvckZlZQgJAAGRAAAAAgUAAAAGcmVzdWx0AAAAAAAAAAABAAAABmFtb3VudAQAAAAOcmVmZXJyZXJSZXdhcmQJAABrAAAAAwUAAAAMY29sbGVjdG9yRmVlBQAAAA9yZWZlcnJlclBlcmNlbnQAAAAAAAAAAGQJAARMAAAAAgkAAZEAAAACBQAAAAZyZXN1bHQAAAAAAAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAJY29sbGVjdG9yCQAAZQAAAAIFAAAADGNvbGxlY3RvckZlZQUAAAAOcmVmZXJyZXJSZXdhcmQFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAPcmVmZXJyZXJBZGRyZXNzBQAAAA5yZWZlcnJlclJld2FyZAUAAAAHYXNzZXRJZAUAAAADbmlsBQAAAAZyZXN1bHQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAADaW52AQAAAApwdXp6bGVTd2FwAAAAAwAAAAlyb3V0ZXNTdHIAAAAMbWluVG9SZWNlaXZlAAAAB29wdGlvbnMEAAAADSR0MDE1NDM3MTU0OTEJAQAAAA5nZXRTd2FwT3B0aW9ucwAAAAEFAAAAB29wdGlvbnMEAAAACGRlYWRsaW5lCAUAAAANJHQwMTU0MzcxNTQ5MQAAAAJfMQQAAAAMcmVmZXJyZXJOYW1lCAUAAAANJHQwMTU0MzcxNTQ5MQAAAAJfMgQAAAAQaXNWYWxpZFRpbWVzdGFtcAkBAAAAFnZhbGlkYXRlQmxvY2tUaW1lc3RhbXAAAAABBQAAAAhkZWFkbGluZQMJAAAAAAAAAgUAAAAQaXNWYWxpZFRpbWVzdGFtcAUAAAAQaXNWYWxpZFRpbWVzdGFtcAQAAAANJHQwMTU1NTkxNTYzOQkBAAAAFmdldFJlZmVycmVyRGF0YU9yVGhyb3cAAAABBQAAAAxyZWZlcnJlck5hbWUDCQAAAAAAAAIFAAAADSR0MDE1NTU5MTU2MzkFAAAADSR0MDE1NTU5MTU2MzkEAAAAD3JlZmVycmVyUGVyY2VudAgFAAAADSR0MDE1NTU5MTU2MzkAAAACXzIEAAAAD3JlZmVycmVyQWRkcmVzcwgFAAAADSR0MDE1NTU5MTU2MzkAAAACXzEDCQAAAAAAAAIJAAExAAAAAQUAAAAJcm91dGVzU3RyAAAAAAAAAAAACQAAAgAAAAECAAAAD0ludmFsaWQgcm91dGluZwMJAABnAAAAAgAAAAAAAAAAAAUAAAAMbWluVG9SZWNlaXZlCQAAAgAAAAECAAAAGFN1bSB0byByZWNlaXZlIGlzIHRvIGxvdwQAAAANYmFsYW5jZUJlZm9yZQkBAAAAE2dldEJhbGFuY2VCeUFkZHJlc3MAAAACBQAAAAljb2xsZWN0b3IFAAAAE3B1enpsZVJld2FyZEFzc2V0SWQDCQAAAAAAAAIFAAAADWJhbGFuY2VCZWZvcmUFAAAADWJhbGFuY2VCZWZvcmUEAAAABnJlc3VsdAkBAAAADndyYXBQdXp6bGVTd2FwAAAAAwUAAAADaW52BQAAAAlyb3V0ZXNTdHIFAAAADG1pblRvUmVjZWl2ZQMJAAAAAAAAAgUAAAAGcmVzdWx0BQAAAAZyZXN1bHQDCQAAZgAAAAIFAAAAD3JlZmVycmVyUGVyY2VudAAAAAAAAAAAAAQAAAAMYXNzZXRJZEZpbmFsCQABkQAAAAIJAAS1AAAAAgUAAAAJcm91dGVzU3RyAgAAAAEsCQAAZQAAAAIJAAGQAAAAAQkABLUAAAACBQAAAAlyb3V0ZXNTdHICAAAAASwAAAAAAAAAAAEEAAAAB2Fzc2V0SWQJAQAAAApnZXRBc3NldElkAAAAAQUAAAAMYXNzZXRJZEZpbmFsBAAAAAxiYWxhbmNlQWZ0ZXIJAQAAABNnZXRCYWxhbmNlQnlBZGRyZXNzAAAAAgUAAAAJY29sbGVjdG9yBQAAABNwdXp6bGVSZXdhcmRBc3NldElkAwkAAAAAAAACBQAAAAxiYWxhbmNlQWZ0ZXIFAAAADGJhbGFuY2VBZnRlcgQAAAAFZGVsdGEJAABlAAAAAgUAAAAMYmFsYW5jZUFmdGVyBQAAAA1iYWxhbmNlQmVmb3JlAwkAAAAAAAACBQAAAAVkZWx0YQUAAAAFZGVsdGEEAAAABnJld2FyZAkAAGsAAAADBQAAAAVkZWx0YQUAAAAPcmVmZXJyZXJQZXJjZW50AAAAAAAAAABkBAAAAANyZXMJAAP8AAAABAUAAAAJY29sbGVjdG9yAgAAABNjbGFpbVJlZmVycmVyUmV3YXJkCQAETAAAAAIFAAAABnJld2FyZAkABEwAAAACBQAAABRwdXp6bGVSZXdhcmRBc3NldFN0cgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAA3JlcwUAAAADcmVzCQAETQAAAAIFAAAABnJlc3VsdAkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAPcmVmZXJyZXJBZGRyZXNzBQAAAAZyZXdhcmQFAAAAE3B1enpsZVJld2FyZEFzc2V0SWQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FAAAABnJlc3VsdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAADaW52AQAAAAthZGRSZWZlcnJlcgAAAAMAAAAMcmVmZXJyZXJOYW1lAAAADnJlZmVyZXJBZGRyZXNzAAAAB3BlcmNlbnQEAAAAB2FkZHJlc3MJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQUAAAAOcmVmZXJlckFkZHJlc3MDAwkAAGYAAAACAAAAAAAAAAAABQAAAAdwZXJjZW50BgkAAGYAAAACBQAAAAdwZXJjZW50AAAAAAAAAABkCQAAAgAAAAECAAAAFkluY29ycmVjdCBwZXJjZW50IHJhdGUDCQAAAAAAAAIJAAExAAAAAQUAAAAMcmVmZXJyZXJOYW1lAAAAAAAAAAAACQAAAgAAAAECAAAAFVJlZmVycmVyIG5hbWUgaW52YWxpZAMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAEdGhpcwkABEwAAAACBQAAAAljb2xsZWN0b3IFAAAAA25pbAgFAAAAA2ludgAAAAZjYWxsZXIJAAACAAAAAQIAAAArb25seSBzZWxmIGNhbGxzIG9yIGJ5IGNvbGxlY3RvciBhcmUgYWxsb3dlZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJcmVmZXJyZXItBQAAAAxyZWZlcnJlck5hbWUCAAAACC1hZGRyZXNzBQAAAA5yZWZlcmVyQWRkcmVzcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAACXJlZmVycmVyLQUAAAAMcmVmZXJyZXJOYW1lAgAAAAgtcGVyY2VudAUAAAAHcGVyY2VudAUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAALbWF5YmVPcmFjbGUJAAQmAAAAAQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzAgAAAAZPcmFjbGUCAAAAAAQAAAAObWF5YmVBZG1pbktleXMDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAALbWF5YmVPcmFjbGUJAAQdAAAAAgkBAAAABXZhbHVlAAAAAQUAAAALbWF5YmVPcmFjbGUCAAAACUFkbWluS2V5cwUAAAAEdW5pdAQAAAAHJG1hdGNoMAUAAAAObWF5YmVBZG1pbktleXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAAMYWRtaW5LZXlzU3RyBQAAAAckbWF0Y2gwBAAAAAlhZG1pbktleXMEAAAACnN0cmluZ0tleXMJAAS1AAAAAgUAAAAMYWRtaW5LZXlzU3RyAgAAAAEsCQAETAAAAAIJAAJZAAAAAQkAAZEAAAACBQAAAApzdHJpbmdLZXlzAAAAAAAAAAAACQAETAAAAAIJAAJZAAAAAQkAAZEAAAACBQAAAApzdHJpbmdLZXlzAAAAAAAAAAABCQAETAAAAAIJAAJZAAAAAQkAAZEAAAACBQAAAApzdHJpbmdLZXlzAAAAAAAAAAACBQAAAANuaWwKAQAAAA92ZXJpZnlCeUFsbEtleXMAAAABAAAABXByb29mAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzBQAAAAVwcm9vZgkAAZEAAAACBQAAAAlhZG1pbktleXMAAAAAAAAAAAAAAAAAAAAAAAEDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMFAAAABXByb29mCQABkQAAAAIFAAAACWFkbWluS2V5cwAAAAAAAAAAAQAAAAAAAAAACgMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwUAAAAFcHJvb2YJAAGRAAAAAgUAAAAJYWRtaW5LZXlzAAAAAAAAAAACAAAAAAAAAABkAAAAAAAAAAAACQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACAAAAAAAAAABuCQAETAAAAAIAAAAAAAAAAGUJAARMAAAAAgAAAAAAAAAACwUAAAADbmlsCQAAZAAAAAIJAQAAAA92ZXJpZnlCeUFsbEtleXMAAAABCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAJAQAAAA92ZXJpZnlCeUFsbEtleXMAAAABCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAEJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5TlCMBA==", "height": 3555101, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Dbo7SzxoTB96BduL8Rg1BkEoTG1xBHZ3NRQdExS9chgL Next: 6PkNEyMhwoXcGVyLZ2s5QRX4LXSj3h7rVY3W6WZBtxvd Diff:
OldNewDifferences
2525
2626 let feeRate = getIntegerOrThrow(this, "fee-rate")
2727
28-let oracle = parseAddressOrThrow(getStringOrThrow(this, "oracle"))
28+let swopfiOracle = parseAddressOrThrow(getStringOrThrow(this, "oracle"))
2929
30-let swopfiRouting = parseAddressOrThrow(getStringOrThrow(this, "swopfi-routing"))
30+let swopfiRouting = parseAddressOrThrow(getStringOrThrow(swopfiOracle, "routing_address"))
31+
32+func isSwopfiPool (address) = isDefined(getString(swopfiOracle, ("pool_" + address)))
33+
34+
35+let wxFactory = parseAddressOrThrow(getStringOrThrow(this, "wx-factory"))
36+
37+let wxSwap = parseAddressOrThrow(getStringOrThrow(wxFactory, "%s__swapContract"))
38+
39+func isWxPool (address) = isDefined(getString(wxFactory, (("%s%s%s__" + address) + "__mappings__poolContract2PoolAssets")))
40+
3141
3242 let puzzleRouting = parseAddressOrThrow(getStringOrThrow(this, "puzzle-routing"))
33-
34-let pools = split(getStringOrThrow(oracle, "pools"), ",")
35-
36-let percentRate = getIntegerOrThrow(this, "percent-rate")
37-
38-let refKey = "keeper"
3943
4044 let puzzleRewardAssetStr = getStringOrThrow(this, "puzzle-reward-token")
4145
4246 let puzzleRewardAssetId = getAssetId(puzzleRewardAssetStr)
4347
44-let pPools = split(getStringOrThrow(this, "p-pools"), ",")
48+let puzzleRefKey = "keeper"
49+
50+let percentRate = getIntegerOrThrow(this, "percent-rate")
4551
4652 func assetIdToString (assetId) = match assetId {
4753 case asset: ByteVector =>
7985 }
8086
8187
82-func getReferrerData (referrerName) = {
83- let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found")))
84- let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate)
85- if (if ((0 > refPercent))
86- then true
87- else (refPercent > 100))
88- then throw("Incorrect percent rate")
89- else $Tuple2(refAddress, refPercent)
90- }
88+func getReferrerDataOrThrow (referrerName) = if ((size(referrerName) == 0))
89+ then $Tuple2(collector, 0)
90+ else {
91+ let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found")))
92+ let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate)
93+ if (if ((0 > refPercent))
94+ then true
95+ else (refPercent > 100))
96+ then throw("Incorrect percent rate")
97+ else $Tuple2(refAddress, refPercent)
98+ }
9199
92100
93101 func getSwapOptions (options) = {
127135 let poolAddress = parseAddressOrThrow(pool)
128136 let versionMajor = parseIntOrThrow(split(getStringOrThrow(poolAddress, "version"), ".")[0])
129137 let assetReceivedId = getAssetId(assetReceived)
130- if ((0 > estAmountToReceive))
138+ let $t042056067 = if ((0 > estAmountToReceive))
131139 then throw("estAmountToReceive must be positive")
132- else if (containsElement(pools, pool))
140+ else if (isSwopfiPool(pool))
133141 then {
134142 let poolAssetA = getStringOrThrow(poolAddress, "A_asset_id")
135143 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
136144 let poolAssetIdA = getAssetId(poolAssetA)
137145 let poolAssetIdB = getAssetId(poolAssetB)
138- let $t040684412 = if (if ((payment.assetId == poolAssetIdA))
146+ let $t046034947 = if (if ((payment.assetId == poolAssetIdA))
139147 then (assetReceivedId == poolAssetIdB)
140148 else false)
141149 then $Tuple2(poolAssetIdA, poolAssetIdB)
144152 else false)
145153 then $Tuple2(poolAssetIdB, poolAssetIdA)
146154 else throw("Unsupported assets pair")
147- let assetIn = $t040684412._1
148- let assetOut = $t040684412._2
149- let $t044395275 = if ((versionMajor == 1))
150- then $Tuple2("callFunction", ["exchange", ["1"]])
155+ let assetIn = $t046034947._1
156+ let assetOut = $t046034947._2
157+ if ((versionMajor == 1))
158+ then $Tuple3(poolAddress, "callFunction", ["exchange", ["1"]])
151159 else if ((versionMajor == 2))
152160 then if ((0 >= estAmountToReceive))
153161 then throw("estAmountToReceive must be positive")
154- else if (if ((0 > slippageTolerance))
155- then true
156- else (slippageTolerance > 1000))
157- then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
158- else {
159- let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000))
160- $Tuple2("exchange", [estAmountToReceive, if ((minAmount > 0))
161- then minAmount
162- else 1])
163- }
162+ else {
163+ let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000))
164+ $Tuple3(poolAddress, "exchange", [estAmountToReceive, if ((minAmount > 0))
165+ then minAmount
166+ else 1])
167+ }
164168 else throw((("Unknown pool version '" + toString(versionMajor)) + "', but 1 or 2 expected"))
165- let method = $t044395275._1
166- let args = $t044395275._2
167- let balanceBefore = getBalance(assetReceivedId)
168- if ((balanceBefore == balanceBefore))
169- then {
170- let result = invoke(poolAddress, method, args, [payment])
171- if ((result == result))
172- then {
173- let received = (getBalance(assetReceivedId) - balanceBefore)
174- if ((received == received))
175- then if ((0 >= received))
176- then throw("Received amount from pool must be positive")
177- else received
178- else throw("Strict value is not equal to itself.")
179- }
180- else throw("Strict value is not equal to itself.")
181- }
182- else throw("Strict value is not equal to itself.")
183169 }
184- else if (containsElement(pPools, pool))
170+ else if (isWxPool(pool))
171+ then $Tuple3(wxSwap, "swap", [1, assetReceived, toString(this)])
172+ else $Tuple3(poolAddress, "swap", [assetReceived, 0])
173+ let dApp = $t042056067._1
174+ let function = $t042056067._2
175+ let args = $t042056067._3
176+ let balanceBefore = getBalance(assetReceivedId)
177+ if ((balanceBefore == balanceBefore))
178+ then {
179+ let result = invoke(dApp, function, args, [payment])
180+ if ((result == result))
185181 then {
186- let balanceBefore = getBalance(assetReceivedId)
187- if ((balanceBefore == balanceBefore))
188- then {
189- let result = invoke(poolAddress, "swap", [assetReceived, 0], [payment])
190- if ((result == result))
191- then {
192- let received = (getBalance(assetReceivedId) - balanceBefore)
193- if ((received == received))
194- then if ((0 >= received))
195- then throw("Received amount from pool must be positive")
196- else received
197- else throw("Strict value is not equal to itself.")
198- }
199- else throw("Strict value is not equal to itself.")
200- }
182+ let received = (getBalance(assetReceivedId) - balanceBefore)
183+ if ((received == received))
184+ then if ((0 >= received))
185+ then throw("Received amount from pool must be positive")
186+ else received
201187 else throw("Strict value is not equal to itself.")
202188 }
203- else throw((("There is no pool at address '" + pool) + "'"))
189+ else throw("Strict value is not equal to itself.")
190+ }
191+ else throw("Strict value is not equal to itself.")
204192 }
205193
206194
207-func wrapSwap (inv,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
208- let pmt = if ((size(inv.payments) > 0))
195+func swapSingleRoute (inv,addresses,assetsToReceive,estReceived,slippageTolerance) = {
196+ let pmt = if ((size(inv.payments) == 1))
209197 then inv.payments[0]
210- else throw("Payment required")
211- let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
212- let assetFinalId = getAssetId(assetFinal)
213- let indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
198+ else throw("Single payment required")
214199 func foldSwap (previousReceived,index) = if ((index >= size(addresses)))
215200 then previousReceived
216201 else {
224209 }
225210 }
226211
227- let final = if ((size(addresses) > 0))
212+ let received = if ((size(addresses) > 0))
228213 then {
229- let $l = indices
214+ let $l = [0, 1, 2, 3, 4]
230215 let $s = size($l)
231216 let $acc0 = pmt
232217 func $f0_1 ($a,$i) = if (($i >= $s))
235220
236221 func $f0_2 ($a,$i) = if (($i >= $s))
237222 then $a
238- else throw("List size exceeds 10")
223+ else throw("List size exceeds 5")
239224
240- $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)
225+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
241226 }
242227 else throw("Path cannot be empty")
243- let $t071697221 = deductFee(final.amount)
244- let resultAfterFee = $t071697221._1
245- let fee = $t071697221._2
246- if ((0 >= final.amount))
247- then throw((("Swap result " + toString(final.amount)) + " must be positive"))
248- else if ((minReceived > resultAfterFee))
249- then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minReceived)))
250- else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
228+ if ((0 >= received.amount))
229+ then throw((("Swap result " + toString(received.amount)) + " must be positive"))
230+ else received
231+ }
232+
233+
234+func swapMultipleRoutes (inv,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance) = {
235+ let pmt = if ((size(inv.payments) == 1))
236+ then inv.payments[0]
237+ else throw("Single payment required")
238+ func foldSplit (splitResults,index) = if ((index >= size(addresses)))
239+ then splitResults
240+ else {
241+ let splitInv = Invocation([AttachedPayment(pmt.assetId, amountsIn[index])], inv.caller, inv.callerPublicKey, inv.transactionId, inv.fee, inv.feeAssetId, inv.originCaller, inv.originCallerPublicKey)
242+ let splitAddresses = split(addresses[index], "_")
243+ let splitAssets = split(assetsToReceive[index], "_")
244+ func mapIntOrThrow (result,maybeInt) = (result :+ parseIntOrThrow(maybeInt))
245+
246+ let splitEstReceived = {
247+ let $l = split(estReceived[index], "_")
248+ let $s = size($l)
249+ let $acc0 = nil
250+ func $f0_1 ($a,$i) = if (($i >= $s))
251+ then $a
252+ else mapIntOrThrow($a, $l[$i])
253+
254+ func $f0_2 ($a,$i) = if (($i >= $s))
255+ then $a
256+ else throw("List size exceeds 5")
257+
258+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
259+ }
260+ let result = swapSingleRoute(splitInv, splitAddresses, splitAssets, splitEstReceived, slippageTolerance)
261+ if ((result == result))
262+ then (splitResults :+ result)
263+ else throw("Strict value is not equal to itself.")
264+ }
265+
266+ let $l = [0, 1, 2]
267+ let $s = size($l)
268+ let $acc0 = nil
269+ func $f0_1 ($a,$i) = if (($i >= $s))
270+ then $a
271+ else foldSplit($a, $l[$i])
272+
273+ func $f0_2 ($a,$i) = if (($i >= $s))
274+ then $a
275+ else throw("List size exceeds 3")
276+
277+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
251278 }
252279
253280
254281 func wrapSwopfiSwap (inv,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = {
255- let pmt = if ((size(inv.payments) > 0))
282+ let pmt = if ((size(inv.payments) == 1))
256283 then inv.payments[0]
257- else throw("Payment required")
284+ else throw("Single payment required")
258285 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
259286 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
260287 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
269296 if ((balanceAfter == balanceAfter))
270297 then {
271298 let delta = (balanceAfter - balanceBefore)
272- let $t088638908 = deductFee(delta)
273- let resultAfterFee = $t088638908._1
274- let fee = $t088638908._2
299+ let $t01049010535 = deductFee(delta)
300+ let resultAfterFee = $t01049010535._1
301+ let fee = $t01049010535._2
275302 if ((0 >= delta))
276303 then throw((("Swap result " + toString(delta)) + " must be positive"))
277304 else if ((minAmountToReceive > resultAfterFee))
287314
288315
289316 func wrapPuzzleSwap (inv,routesStr,minToReceive) = {
290- let pmt = if ((size(inv.payments) > 0))
317+ let pmt = if ((size(inv.payments) == 1))
291318 then inv.payments[0]
292- else throw("Payment required")
319+ else throw("Single payment required")
293320 let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
294321 let assetId = getAssetId(assetIdFinal)
295322 let balanceBefore = getBalance(assetId)
296323 if ((balanceBefore == balanceBefore))
297324 then {
298- let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, refKey], [pmt])
325+ let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, puzzleRefKey], [pmt])
299326 if ((result == result))
300327 then {
301328 let balanceAfter = getBalance(assetId)
315342
316343
317344 @Callable(inv)
318-func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
319- let $t01011410168 = getSwapOptions(options)
320- let deadline = $t01011410168._1
321- let referrerName = $t01011410168._2
345+func swap (amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
346+ let pmt = if ((size(inv.payments) == 1))
347+ then inv.payments[0]
348+ else throw("Single payment required")
349+ let $t01191211966 = getSwapOptions(options)
350+ let deadline = $t01191211966._1
351+ let referrerName = $t01191211966._2
322352 let isValidTimestamp = validateBlockTimestamp(deadline)
323353 if ((isValidTimestamp == isValidTimestamp))
324354 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 $t01050010570 = getReferrerData(referrerName)
332- let referrerAddress = $t01050010570._1
333- let referrerPercent = $t01050010570._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)]
355+ let $t01203412114 = getReferrerDataOrThrow(referrerName)
356+ if (($t01203412114 == $t01203412114))
357+ then {
358+ let referrerPercent = $t01203412114._2
359+ let referrerAddress = $t01203412114._1
360+ let validAddresses = if (if ((1 > size(addresses)))
361+ then true
362+ else (size(addresses) > 3))
363+ then throw("Supported swap of 1 to 3 splits")
364+ else addresses
365+ let validSlippageTolerance = if (if ((0 > slippageTolerance))
366+ then true
367+ else (slippageTolerance > 1000))
368+ then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
369+ else slippageTolerance
370+ func sumIn (accum,next) = (accum + next)
371+
372+ let totalAmountIn = {
373+ let $l = amountsIn
374+ let $s = size($l)
375+ let $acc0 = 0
376+ func $f0_1 ($a,$i) = if (($i >= $s))
377+ then $a
378+ else sumIn($a, $l[$i])
379+
380+ func $f0_2 ($a,$i) = if (($i >= $s))
381+ then $a
382+ else throw("List size exceeds 3")
383+
384+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
337385 }
338- else result
386+ let amountsOut = if ((pmt.amount != totalAmountIn))
387+ then throw(((("Total amount after split " + toString(totalAmountIn)) + " is not equal original payment amount ") + toString(pmt.amount)))
388+ else swapMultipleRoutes(inv, amountsIn, validAddresses, assetsToReceive, estReceived, validSlippageTolerance)
389+ if ((amountsOut == amountsOut))
390+ then {
391+ func sumOut (total,next) = (total + next.amount)
392+
393+ let totalAmountOut = {
394+ let $l = amountsOut
395+ let $s = size($l)
396+ let $acc0 = 0
397+ func $f1_1 ($a,$i) = if (($i >= $s))
398+ then $a
399+ else sumOut($a, $l[$i])
400+
401+ func $f1_2 ($a,$i) = if (($i >= $s))
402+ then $a
403+ else throw("List size exceeds 3")
404+
405+ $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
406+ }
407+ let assetId = amountsOut[0].assetId
408+ let $t01331213366 = deductFee(totalAmountOut)
409+ let amountMinusFee = $t01331213366._1
410+ let fee = $t01331213366._2
411+ let referrerReward = fraction(fee, referrerPercent, 100)
412+ let collectorReward = (fee - referrerReward)
413+ let transfers = [ScriptTransfer(inv.caller, amountMinusFee, assetId), ScriptTransfer(collector, collectorReward, assetId)]
414+ if ((minReceived > amountMinusFee))
415+ then throw(((("Swap result " + toString(amountMinusFee)) + " is less then expected ") + toString(minReceived)))
416+ else if ((referrerReward == 0))
417+ then transfers
418+ else (transfers :+ ScriptTransfer(referrerAddress, referrerReward, assetId))
419+ }
420+ else throw("Strict value is not equal to itself.")
421+ }
339422 else throw("Strict value is not equal to itself.")
340423 }
341424 else throw("Strict value is not equal to itself.")
345428
346429 @Callable(inv)
347430 func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
348- let $t01112311177 = getSwapOptions(options)
349- let deadline = $t01112311177._1
350- let referrerName = $t01112311177._2
431+ let $t01416514219 = getSwapOptions(options)
432+ let deadline = $t01416514219._1
433+ let referrerName = $t01416514219._2
351434 let isValidTimestamp = validateBlockTimestamp(deadline)
352435 if ((isValidTimestamp == isValidTimestamp))
353436 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 $t01188711957 = getReferrerData(referrerName)
363- let referrerAddress = $t01188711957._1
364- let referrerPercent = $t01188711957._2
365- let collectorFee = result[1].amount
366- let referrerReward = fraction(collectorFee, referrerPercent, 100)
437+ let $t01428714367 = getReferrerDataOrThrow(referrerName)
438+ if (($t01428714367 == $t01428714367))
439+ then {
440+ let referrerPercent = $t01428714367._2
441+ let referrerAddress = $t01428714367._1
442+ let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
443+ if ((result == result))
444+ then if ((referrerPercent > 0))
445+ then {
446+ let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
447+ let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
448+ let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
449+ let assetId = getAssetId(assetFinal)
450+ let collectorFee = result[1].amount
451+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
367452 [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
368- }
369- else result
453+ }
454+ else result
455+ else throw("Strict value is not equal to itself.")
456+ }
370457 else throw("Strict value is not equal to itself.")
371458 }
372459 else throw("Strict value is not equal to itself.")
376463
377464 @Callable(inv)
378465 func puzzleSwap (routesStr,minToReceive,options) = {
379- let $t01239212446 = getSwapOptions(options)
380- let deadline = $t01239212446._1
381- let referrerName = $t01239212446._2
466+ let $t01543715491 = getSwapOptions(options)
467+ let deadline = $t01543715491._1
468+ let referrerName = $t01543715491._2
382469 let isValidTimestamp = validateBlockTimestamp(deadline)
383470 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")
388- else {
389- let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
390- if ((balanceBefore == balanceBefore))
391- then {
392- let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
393- if ((result == result))
394- then if ((size(referrerName) > 0))
471+ then {
472+ let $t01555915639 = getReferrerDataOrThrow(referrerName)
473+ if (($t01555915639 == $t01555915639))
474+ then {
475+ let referrerPercent = $t01555915639._2
476+ let referrerAddress = $t01555915639._1
477+ if ((size(routesStr) == 0))
478+ then throw("Invalid routing")
479+ else if ((0 >= minToReceive))
480+ then throw("Sum to receive is to low")
481+ else {
482+ let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
483+ if ((balanceBefore == balanceBefore))
395484 then {
396- let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
397- let assetId = getAssetId(assetIdFinal)
398- let $t01300713077 = getReferrerData(referrerName)
399- let referrerAddress = $t01300713077._1
400- let referrerPercent = $t01300713077._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- }
485+ let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
486+ if ((result == result))
487+ then if ((referrerPercent > 0))
488+ then {
489+ let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
490+ let assetId = getAssetId(assetIdFinal)
491+ let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
492+ if ((balanceAfter == balanceAfter))
493+ then {
494+ let delta = (balanceAfter - balanceBefore)
495+ if ((delta == delta))
496+ then {
497+ let reward = fraction(delta, referrerPercent, 100)
498+ let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
499+ if ((res == res))
500+ then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
501+ else throw("Strict value is not equal to itself.")
502+ }
503+ else throw("Strict value is not equal to itself.")
504+ }
505+ else throw("Strict value is not equal to itself.")
506+ }
507+ else result
415508 else throw("Strict value is not equal to itself.")
416509 }
417- else result
418- else throw("Strict value is not equal to itself.")
419- }
420- else throw("Strict value is not equal to itself.")
510+ else throw("Strict value is not equal to itself.")
511+ }
421512 }
513+ else throw("Strict value is not equal to itself.")
514+ }
422515 else throw("Strict value is not equal to itself.")
423516 }
424517
425518
426519
427520 @Callable(inv)
428-func addPools (poolAddresses) = {
429- func addIfDoesNotExist (pools,pool) = if (containsElement(pools, pool))
430- then throw((("Pool '" + pool) + "' is already added"))
431- else (pools :+ toString(parseAddressOrThrow(pool)))
432-
433- if (!(containsElement([this, collector], inv.caller)))
434- then throw("only self calls or by collector are allowed")
435- else [StringEntry("p-pools", makeString({
436- let $l = poolAddresses
437- let $s = size($l)
438- let $acc0 = pPools
439- func $f0_1 ($a,$i) = if (($i >= $s))
440- then $a
441- else addIfDoesNotExist($a, $l[$i])
442-
443- func $f0_2 ($a,$i) = if (($i >= $s))
444- then $a
445- else throw("List size exceeds 10")
446-
447- $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)
448- }, ","))]
449- }
450-
451-
452-
453-@Callable(inv)
454-func addReferer (referrerName,refererAddress,percent) = {
521+func addReferrer (referrerName,refererAddress,percent) = {
455522 let address = parseAddressOrThrow(refererAddress)
456523 if (if ((0 > percent))
457524 then true
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
28-let oracle = parseAddressOrThrow(getStringOrThrow(this, "oracle"))
28+let swopfiOracle = parseAddressOrThrow(getStringOrThrow(this, "oracle"))
2929
30-let swopfiRouting = parseAddressOrThrow(getStringOrThrow(this, "swopfi-routing"))
30+let swopfiRouting = parseAddressOrThrow(getStringOrThrow(swopfiOracle, "routing_address"))
31+
32+func isSwopfiPool (address) = isDefined(getString(swopfiOracle, ("pool_" + address)))
33+
34+
35+let wxFactory = parseAddressOrThrow(getStringOrThrow(this, "wx-factory"))
36+
37+let wxSwap = parseAddressOrThrow(getStringOrThrow(wxFactory, "%s__swapContract"))
38+
39+func isWxPool (address) = isDefined(getString(wxFactory, (("%s%s%s__" + address) + "__mappings__poolContract2PoolAssets")))
40+
3141
3242 let puzzleRouting = parseAddressOrThrow(getStringOrThrow(this, "puzzle-routing"))
33-
34-let pools = split(getStringOrThrow(oracle, "pools"), ",")
35-
36-let percentRate = getIntegerOrThrow(this, "percent-rate")
37-
38-let refKey = "keeper"
3943
4044 let puzzleRewardAssetStr = getStringOrThrow(this, "puzzle-reward-token")
4145
4246 let puzzleRewardAssetId = getAssetId(puzzleRewardAssetStr)
4347
44-let pPools = split(getStringOrThrow(this, "p-pools"), ",")
48+let puzzleRefKey = "keeper"
49+
50+let percentRate = getIntegerOrThrow(this, "percent-rate")
4551
4652 func assetIdToString (assetId) = match assetId {
4753 case asset: ByteVector =>
4854 toBase58String(asset)
4955 case waves: Unit =>
5056 "WAVES"
5157 case _ =>
5258 throw("Match error")
5359 }
5460
5561
5662 func getBalance (assetId) = match assetId {
5763 case asset: ByteVector =>
5864 assetBalance(this, asset)
5965 case waves: Unit =>
6066 wavesBalance(this).available
6167 case _ =>
6268 throw("Match error")
6369 }
6470
6571
6672 func getBalanceByAddress (address,assetId) = match assetId {
6773 case asset: ByteVector =>
6874 assetBalance(address, asset)
6975 case waves: Unit =>
7076 wavesBalance(address).available
7177 case _ =>
7278 throw("Match error")
7379 }
7480
7581
7682 func deductFee (amount) = {
7783 let fee = fraction(amount, 1, feeRate)
7884 $Tuple2((amount - fee), fee)
7985 }
8086
8187
82-func getReferrerData (referrerName) = {
83- let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found")))
84- let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate)
85- if (if ((0 > refPercent))
86- then true
87- else (refPercent > 100))
88- then throw("Incorrect percent rate")
89- else $Tuple2(refAddress, refPercent)
90- }
88+func getReferrerDataOrThrow (referrerName) = if ((size(referrerName) == 0))
89+ then $Tuple2(collector, 0)
90+ else {
91+ let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found")))
92+ let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate)
93+ if (if ((0 > refPercent))
94+ then true
95+ else (refPercent > 100))
96+ then throw("Incorrect percent rate")
97+ else $Tuple2(refAddress, refPercent)
98+ }
9199
92100
93101 func getSwapOptions (options) = {
94102 func foldArguments (acc,index) = if ((index >= size(options)))
95103 then (acc :+ "")
96104 else (acc :+ options[index])
97105
98106 let indices = [0, 1]
99107 let arguments = {
100108 let $l = indices
101109 let $s = size($l)
102110 let $acc0 = nil
103111 func $f0_1 ($a,$i) = if (($i >= $s))
104112 then $a
105113 else foldArguments($a, $l[$i])
106114
107115 func $f0_2 ($a,$i) = if (($i >= $s))
108116 then $a
109117 else throw("List size exceeds 2")
110118
111119 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
112120 }
113121 let deadline = parseIntOrDefault(arguments[0], 0)
114122 let referrerName = arguments[1]
115123 $Tuple2(deadline, referrerName)
116124 }
117125
118126
119127 func validateBlockTimestamp (deadline) = if (if ((deadline > 0))
120128 then (lastBlock.timestamp > deadline)
121129 else false)
122130 then throw(((("This swap expired at timestamp " + toString(deadline)) + ". Current: ") + toString(lastBlock.timestamp)))
123131 else true
124132
125133
126134 func doSwap (pool,payment,assetReceived,estAmountToReceive,slippageTolerance) = {
127135 let poolAddress = parseAddressOrThrow(pool)
128136 let versionMajor = parseIntOrThrow(split(getStringOrThrow(poolAddress, "version"), ".")[0])
129137 let assetReceivedId = getAssetId(assetReceived)
130- if ((0 > estAmountToReceive))
138+ let $t042056067 = if ((0 > estAmountToReceive))
131139 then throw("estAmountToReceive must be positive")
132- else if (containsElement(pools, pool))
140+ else if (isSwopfiPool(pool))
133141 then {
134142 let poolAssetA = getStringOrThrow(poolAddress, "A_asset_id")
135143 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
136144 let poolAssetIdA = getAssetId(poolAssetA)
137145 let poolAssetIdB = getAssetId(poolAssetB)
138- let $t040684412 = if (if ((payment.assetId == poolAssetIdA))
146+ let $t046034947 = if (if ((payment.assetId == poolAssetIdA))
139147 then (assetReceivedId == poolAssetIdB)
140148 else false)
141149 then $Tuple2(poolAssetIdA, poolAssetIdB)
142150 else if (if ((assetReceivedId == poolAssetIdA))
143151 then (payment.assetId == poolAssetIdB)
144152 else false)
145153 then $Tuple2(poolAssetIdB, poolAssetIdA)
146154 else throw("Unsupported assets pair")
147- let assetIn = $t040684412._1
148- let assetOut = $t040684412._2
149- let $t044395275 = if ((versionMajor == 1))
150- then $Tuple2("callFunction", ["exchange", ["1"]])
155+ let assetIn = $t046034947._1
156+ let assetOut = $t046034947._2
157+ if ((versionMajor == 1))
158+ then $Tuple3(poolAddress, "callFunction", ["exchange", ["1"]])
151159 else if ((versionMajor == 2))
152160 then if ((0 >= estAmountToReceive))
153161 then throw("estAmountToReceive must be positive")
154- else if (if ((0 > slippageTolerance))
155- then true
156- else (slippageTolerance > 1000))
157- then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
158- else {
159- let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000))
160- $Tuple2("exchange", [estAmountToReceive, if ((minAmount > 0))
161- then minAmount
162- else 1])
163- }
162+ else {
163+ let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000))
164+ $Tuple3(poolAddress, "exchange", [estAmountToReceive, if ((minAmount > 0))
165+ then minAmount
166+ else 1])
167+ }
164168 else throw((("Unknown pool version '" + toString(versionMajor)) + "', but 1 or 2 expected"))
165- let method = $t044395275._1
166- let args = $t044395275._2
167- let balanceBefore = getBalance(assetReceivedId)
168- if ((balanceBefore == balanceBefore))
169- then {
170- let result = invoke(poolAddress, method, args, [payment])
171- if ((result == result))
172- then {
173- let received = (getBalance(assetReceivedId) - balanceBefore)
174- if ((received == received))
175- then if ((0 >= received))
176- then throw("Received amount from pool must be positive")
177- else received
178- else throw("Strict value is not equal to itself.")
179- }
180- else throw("Strict value is not equal to itself.")
181- }
182- else throw("Strict value is not equal to itself.")
183169 }
184- else if (containsElement(pPools, pool))
170+ else if (isWxPool(pool))
171+ then $Tuple3(wxSwap, "swap", [1, assetReceived, toString(this)])
172+ else $Tuple3(poolAddress, "swap", [assetReceived, 0])
173+ let dApp = $t042056067._1
174+ let function = $t042056067._2
175+ let args = $t042056067._3
176+ let balanceBefore = getBalance(assetReceivedId)
177+ if ((balanceBefore == balanceBefore))
178+ then {
179+ let result = invoke(dApp, function, args, [payment])
180+ if ((result == result))
185181 then {
186- let balanceBefore = getBalance(assetReceivedId)
187- if ((balanceBefore == balanceBefore))
188- then {
189- let result = invoke(poolAddress, "swap", [assetReceived, 0], [payment])
190- if ((result == result))
191- then {
192- let received = (getBalance(assetReceivedId) - balanceBefore)
193- if ((received == received))
194- then if ((0 >= received))
195- then throw("Received amount from pool must be positive")
196- else received
197- else throw("Strict value is not equal to itself.")
198- }
199- else throw("Strict value is not equal to itself.")
200- }
182+ let received = (getBalance(assetReceivedId) - balanceBefore)
183+ if ((received == received))
184+ then if ((0 >= received))
185+ then throw("Received amount from pool must be positive")
186+ else received
201187 else throw("Strict value is not equal to itself.")
202188 }
203- else throw((("There is no pool at address '" + pool) + "'"))
189+ else throw("Strict value is not equal to itself.")
190+ }
191+ else throw("Strict value is not equal to itself.")
204192 }
205193
206194
207-func wrapSwap (inv,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
208- let pmt = if ((size(inv.payments) > 0))
195+func swapSingleRoute (inv,addresses,assetsToReceive,estReceived,slippageTolerance) = {
196+ let pmt = if ((size(inv.payments) == 1))
209197 then inv.payments[0]
210- else throw("Payment required")
211- let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
212- let assetFinalId = getAssetId(assetFinal)
213- let indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
198+ else throw("Single payment required")
214199 func foldSwap (previousReceived,index) = if ((index >= size(addresses)))
215200 then previousReceived
216201 else {
217202 let assetReceived = assetsToReceive[index]
218203 let assetReceivedId = getAssetId(assetReceived)
219204 match doSwap(addresses[index], previousReceived, assetReceived, estReceived[index], slippageTolerance) {
220205 case income: Int =>
221206 AttachedPayment(assetReceivedId, income)
222207 case _ =>
223208 throw("Can't handle swap result")
224209 }
225210 }
226211
227- let final = if ((size(addresses) > 0))
212+ let received = if ((size(addresses) > 0))
228213 then {
229- let $l = indices
214+ let $l = [0, 1, 2, 3, 4]
230215 let $s = size($l)
231216 let $acc0 = pmt
232217 func $f0_1 ($a,$i) = if (($i >= $s))
233218 then $a
234219 else foldSwap($a, $l[$i])
235220
236221 func $f0_2 ($a,$i) = if (($i >= $s))
237222 then $a
238- else throw("List size exceeds 10")
223+ else throw("List size exceeds 5")
239224
240- $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)
225+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
241226 }
242227 else throw("Path cannot be empty")
243- let $t071697221 = deductFee(final.amount)
244- let resultAfterFee = $t071697221._1
245- let fee = $t071697221._2
246- if ((0 >= final.amount))
247- then throw((("Swap result " + toString(final.amount)) + " must be positive"))
248- else if ((minReceived > resultAfterFee))
249- then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minReceived)))
250- else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
228+ if ((0 >= received.amount))
229+ then throw((("Swap result " + toString(received.amount)) + " must be positive"))
230+ else received
231+ }
232+
233+
234+func swapMultipleRoutes (inv,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance) = {
235+ let pmt = if ((size(inv.payments) == 1))
236+ then inv.payments[0]
237+ else throw("Single payment required")
238+ func foldSplit (splitResults,index) = if ((index >= size(addresses)))
239+ then splitResults
240+ else {
241+ let splitInv = Invocation([AttachedPayment(pmt.assetId, amountsIn[index])], inv.caller, inv.callerPublicKey, inv.transactionId, inv.fee, inv.feeAssetId, inv.originCaller, inv.originCallerPublicKey)
242+ let splitAddresses = split(addresses[index], "_")
243+ let splitAssets = split(assetsToReceive[index], "_")
244+ func mapIntOrThrow (result,maybeInt) = (result :+ parseIntOrThrow(maybeInt))
245+
246+ let splitEstReceived = {
247+ let $l = split(estReceived[index], "_")
248+ let $s = size($l)
249+ let $acc0 = nil
250+ func $f0_1 ($a,$i) = if (($i >= $s))
251+ then $a
252+ else mapIntOrThrow($a, $l[$i])
253+
254+ func $f0_2 ($a,$i) = if (($i >= $s))
255+ then $a
256+ else throw("List size exceeds 5")
257+
258+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
259+ }
260+ let result = swapSingleRoute(splitInv, splitAddresses, splitAssets, splitEstReceived, slippageTolerance)
261+ if ((result == result))
262+ then (splitResults :+ result)
263+ else throw("Strict value is not equal to itself.")
264+ }
265+
266+ let $l = [0, 1, 2]
267+ let $s = size($l)
268+ let $acc0 = nil
269+ func $f0_1 ($a,$i) = if (($i >= $s))
270+ then $a
271+ else foldSplit($a, $l[$i])
272+
273+ func $f0_2 ($a,$i) = if (($i >= $s))
274+ then $a
275+ else throw("List size exceeds 3")
276+
277+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
251278 }
252279
253280
254281 func wrapSwopfiSwap (inv,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = {
255- let pmt = if ((size(inv.payments) > 0))
282+ let pmt = if ((size(inv.payments) == 1))
256283 then inv.payments[0]
257- else throw("Payment required")
284+ else throw("Single payment required")
258285 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
259286 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
260287 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
261288 let assetFinalId = getAssetId(assetFinal)
262289 let balanceBefore = getBalance(assetFinalId)
263290 if ((balanceBefore == balanceBefore))
264291 then {
265292 let result = invoke(swopfiRouting, "routingTrade", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive], [pmt])
266293 if ((result == result))
267294 then {
268295 let balanceAfter = getBalance(assetFinalId)
269296 if ((balanceAfter == balanceAfter))
270297 then {
271298 let delta = (balanceAfter - balanceBefore)
272- let $t088638908 = deductFee(delta)
273- let resultAfterFee = $t088638908._1
274- let fee = $t088638908._2
299+ let $t01049010535 = deductFee(delta)
300+ let resultAfterFee = $t01049010535._1
301+ let fee = $t01049010535._2
275302 if ((0 >= delta))
276303 then throw((("Swap result " + toString(delta)) + " must be positive"))
277304 else if ((minAmountToReceive > resultAfterFee))
278305 then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minAmountToReceive)))
279306 else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
280307 }
281308 else throw("Strict value is not equal to itself.")
282309 }
283310 else throw("Strict value is not equal to itself.")
284311 }
285312 else throw("Strict value is not equal to itself.")
286313 }
287314
288315
289316 func wrapPuzzleSwap (inv,routesStr,minToReceive) = {
290- let pmt = if ((size(inv.payments) > 0))
317+ let pmt = if ((size(inv.payments) == 1))
291318 then inv.payments[0]
292- else throw("Payment required")
319+ else throw("Single payment required")
293320 let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
294321 let assetId = getAssetId(assetIdFinal)
295322 let balanceBefore = getBalance(assetId)
296323 if ((balanceBefore == balanceBefore))
297324 then {
298- let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, refKey], [pmt])
325+ let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, puzzleRefKey], [pmt])
299326 if ((result == result))
300327 then {
301328 let balanceAfter = getBalance(assetId)
302329 if ((balanceAfter == balanceAfter))
303330 then {
304331 let deltaProxy = (balanceAfter - balanceBefore)
305332 if ((deltaProxy == deltaProxy))
306333 then [ScriptTransfer(inv.caller, deltaProxy, assetId)]
307334 else throw("Strict value is not equal to itself.")
308335 }
309336 else throw("Strict value is not equal to itself.")
310337 }
311338 else throw("Strict value is not equal to itself.")
312339 }
313340 else throw("Strict value is not equal to itself.")
314341 }
315342
316343
317344 @Callable(inv)
318-func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
319- let $t01011410168 = getSwapOptions(options)
320- let deadline = $t01011410168._1
321- let referrerName = $t01011410168._2
345+func swap (amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
346+ let pmt = if ((size(inv.payments) == 1))
347+ then inv.payments[0]
348+ else throw("Single payment required")
349+ let $t01191211966 = getSwapOptions(options)
350+ let deadline = $t01191211966._1
351+ let referrerName = $t01191211966._2
322352 let isValidTimestamp = validateBlockTimestamp(deadline)
323353 if ((isValidTimestamp == isValidTimestamp))
324354 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 $t01050010570 = getReferrerData(referrerName)
332- let referrerAddress = $t01050010570._1
333- let referrerPercent = $t01050010570._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)]
355+ let $t01203412114 = getReferrerDataOrThrow(referrerName)
356+ if (($t01203412114 == $t01203412114))
357+ then {
358+ let referrerPercent = $t01203412114._2
359+ let referrerAddress = $t01203412114._1
360+ let validAddresses = if (if ((1 > size(addresses)))
361+ then true
362+ else (size(addresses) > 3))
363+ then throw("Supported swap of 1 to 3 splits")
364+ else addresses
365+ let validSlippageTolerance = if (if ((0 > slippageTolerance))
366+ then true
367+ else (slippageTolerance > 1000))
368+ then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
369+ else slippageTolerance
370+ func sumIn (accum,next) = (accum + next)
371+
372+ let totalAmountIn = {
373+ let $l = amountsIn
374+ let $s = size($l)
375+ let $acc0 = 0
376+ func $f0_1 ($a,$i) = if (($i >= $s))
377+ then $a
378+ else sumIn($a, $l[$i])
379+
380+ func $f0_2 ($a,$i) = if (($i >= $s))
381+ then $a
382+ else throw("List size exceeds 3")
383+
384+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
337385 }
338- else result
386+ let amountsOut = if ((pmt.amount != totalAmountIn))
387+ then throw(((("Total amount after split " + toString(totalAmountIn)) + " is not equal original payment amount ") + toString(pmt.amount)))
388+ else swapMultipleRoutes(inv, amountsIn, validAddresses, assetsToReceive, estReceived, validSlippageTolerance)
389+ if ((amountsOut == amountsOut))
390+ then {
391+ func sumOut (total,next) = (total + next.amount)
392+
393+ let totalAmountOut = {
394+ let $l = amountsOut
395+ let $s = size($l)
396+ let $acc0 = 0
397+ func $f1_1 ($a,$i) = if (($i >= $s))
398+ then $a
399+ else sumOut($a, $l[$i])
400+
401+ func $f1_2 ($a,$i) = if (($i >= $s))
402+ then $a
403+ else throw("List size exceeds 3")
404+
405+ $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
406+ }
407+ let assetId = amountsOut[0].assetId
408+ let $t01331213366 = deductFee(totalAmountOut)
409+ let amountMinusFee = $t01331213366._1
410+ let fee = $t01331213366._2
411+ let referrerReward = fraction(fee, referrerPercent, 100)
412+ let collectorReward = (fee - referrerReward)
413+ let transfers = [ScriptTransfer(inv.caller, amountMinusFee, assetId), ScriptTransfer(collector, collectorReward, assetId)]
414+ if ((minReceived > amountMinusFee))
415+ then throw(((("Swap result " + toString(amountMinusFee)) + " is less then expected ") + toString(minReceived)))
416+ else if ((referrerReward == 0))
417+ then transfers
418+ else (transfers :+ ScriptTransfer(referrerAddress, referrerReward, assetId))
419+ }
420+ else throw("Strict value is not equal to itself.")
421+ }
339422 else throw("Strict value is not equal to itself.")
340423 }
341424 else throw("Strict value is not equal to itself.")
342425 }
343426
344427
345428
346429 @Callable(inv)
347430 func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
348- let $t01112311177 = getSwapOptions(options)
349- let deadline = $t01112311177._1
350- let referrerName = $t01112311177._2
431+ let $t01416514219 = getSwapOptions(options)
432+ let deadline = $t01416514219._1
433+ let referrerName = $t01416514219._2
351434 let isValidTimestamp = validateBlockTimestamp(deadline)
352435 if ((isValidTimestamp == isValidTimestamp))
353436 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 $t01188711957 = getReferrerData(referrerName)
363- let referrerAddress = $t01188711957._1
364- let referrerPercent = $t01188711957._2
365- let collectorFee = result[1].amount
366- let referrerReward = fraction(collectorFee, referrerPercent, 100)
437+ let $t01428714367 = getReferrerDataOrThrow(referrerName)
438+ if (($t01428714367 == $t01428714367))
439+ then {
440+ let referrerPercent = $t01428714367._2
441+ let referrerAddress = $t01428714367._1
442+ let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
443+ if ((result == result))
444+ then if ((referrerPercent > 0))
445+ then {
446+ let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
447+ let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
448+ let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
449+ let assetId = getAssetId(assetFinal)
450+ let collectorFee = result[1].amount
451+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
367452 [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
368- }
369- else result
453+ }
454+ else result
455+ else throw("Strict value is not equal to itself.")
456+ }
370457 else throw("Strict value is not equal to itself.")
371458 }
372459 else throw("Strict value is not equal to itself.")
373460 }
374461
375462
376463
377464 @Callable(inv)
378465 func puzzleSwap (routesStr,minToReceive,options) = {
379- let $t01239212446 = getSwapOptions(options)
380- let deadline = $t01239212446._1
381- let referrerName = $t01239212446._2
466+ let $t01543715491 = getSwapOptions(options)
467+ let deadline = $t01543715491._1
468+ let referrerName = $t01543715491._2
382469 let isValidTimestamp = validateBlockTimestamp(deadline)
383470 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")
388- else {
389- let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
390- if ((balanceBefore == balanceBefore))
391- then {
392- let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
393- if ((result == result))
394- then if ((size(referrerName) > 0))
471+ then {
472+ let $t01555915639 = getReferrerDataOrThrow(referrerName)
473+ if (($t01555915639 == $t01555915639))
474+ then {
475+ let referrerPercent = $t01555915639._2
476+ let referrerAddress = $t01555915639._1
477+ if ((size(routesStr) == 0))
478+ then throw("Invalid routing")
479+ else if ((0 >= minToReceive))
480+ then throw("Sum to receive is to low")
481+ else {
482+ let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
483+ if ((balanceBefore == balanceBefore))
395484 then {
396- let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
397- let assetId = getAssetId(assetIdFinal)
398- let $t01300713077 = getReferrerData(referrerName)
399- let referrerAddress = $t01300713077._1
400- let referrerPercent = $t01300713077._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- }
485+ let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
486+ if ((result == result))
487+ then if ((referrerPercent > 0))
488+ then {
489+ let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
490+ let assetId = getAssetId(assetIdFinal)
491+ let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
492+ if ((balanceAfter == balanceAfter))
493+ then {
494+ let delta = (balanceAfter - balanceBefore)
495+ if ((delta == delta))
496+ then {
497+ let reward = fraction(delta, referrerPercent, 100)
498+ let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
499+ if ((res == res))
500+ then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
501+ else throw("Strict value is not equal to itself.")
502+ }
503+ else throw("Strict value is not equal to itself.")
504+ }
505+ else throw("Strict value is not equal to itself.")
506+ }
507+ else result
415508 else throw("Strict value is not equal to itself.")
416509 }
417- else result
418- else throw("Strict value is not equal to itself.")
419- }
420- else throw("Strict value is not equal to itself.")
510+ else throw("Strict value is not equal to itself.")
511+ }
421512 }
513+ else throw("Strict value is not equal to itself.")
514+ }
422515 else throw("Strict value is not equal to itself.")
423516 }
424517
425518
426519
427520 @Callable(inv)
428-func addPools (poolAddresses) = {
429- func addIfDoesNotExist (pools,pool) = if (containsElement(pools, pool))
430- then throw((("Pool '" + pool) + "' is already added"))
431- else (pools :+ toString(parseAddressOrThrow(pool)))
432-
433- if (!(containsElement([this, collector], inv.caller)))
434- then throw("only self calls or by collector are allowed")
435- else [StringEntry("p-pools", makeString({
436- let $l = poolAddresses
437- let $s = size($l)
438- let $acc0 = pPools
439- func $f0_1 ($a,$i) = if (($i >= $s))
440- then $a
441- else addIfDoesNotExist($a, $l[$i])
442-
443- func $f0_2 ($a,$i) = if (($i >= $s))
444- then $a
445- else throw("List size exceeds 10")
446-
447- $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)
448- }, ","))]
449- }
450-
451-
452-
453-@Callable(inv)
454-func addReferer (referrerName,refererAddress,percent) = {
521+func addReferrer (referrerName,refererAddress,percent) = {
455522 let address = parseAddressOrThrow(refererAddress)
456523 if (if ((0 > percent))
457524 then true
458525 else (percent > 100))
459526 then throw("Incorrect percent rate")
460527 else if ((size(referrerName) == 0))
461528 then throw("Referrer name invalid")
462529 else if (!(containsElement([this, collector], inv.caller)))
463530 then throw("only self calls or by collector are allowed")
464531 else [StringEntry((("referrer-" + referrerName) + "-address"), refererAddress), IntegerEntry((("referrer-" + referrerName) + "-percent"), percent)]
465532 }
466533
467534
468535 @Verifier(tx)
469536 func verify () = {
470537 let maybeOracle = addressFromString(valueOrElse(getString(this, "Oracle"), ""))
471538 let maybeAdminKeys = if (isDefined(maybeOracle))
472539 then getString(value(maybeOracle), "AdminKeys")
473540 else unit
474541 match maybeAdminKeys {
475542 case adminKeysStr: String =>
476543 let adminKeys = {
477544 let stringKeys = split(adminKeysStr, ",")
478545 [fromBase58String(stringKeys[0]), fromBase58String(stringKeys[1]), fromBase58String(stringKeys[2])]
479546 }
480547 func verifyByAllKeys (proof) = if (sigVerify(tx.bodyBytes, proof, adminKeys[0]))
481548 then 1
482549 else if (sigVerify(tx.bodyBytes, proof, adminKeys[1]))
483550 then 10
484551 else if (sigVerify(tx.bodyBytes, proof, adminKeys[2]))
485552 then 100
486553 else 0
487554
488555 containsElement([110, 101, 11], (verifyByAllKeys(tx.proofs[0]) + verifyByAllKeys(tx.proofs[1])))
489556 case _ =>
490557 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
491558 }
492559 }
493560

github/deemru/w8io/3ef1775 
95.09 ms