tx · EHZAuKWwWG4sxwvPWJ9ncH1wAHrsx7YK6b2mrFnyyY1B

3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw:  -0.02400000 Waves

2022.09.06 23:50 [3283271] smart account 3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw > SELF 0.00000000 Waves

{ "type": 13, "id": "EHZAuKWwWG4sxwvPWJ9ncH1wAHrsx7YK6b2mrFnyyY1B", "fee": 2400000, "feeAssetId": null, "timestamp": 1662497436637, "version": 2, "chainId": 87, "sender": "3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw", "senderPublicKey": "4MfTwwE7yP4BFGaifQrcc9Nwb5BA9t92WKhVb6Ton65k", "proofs": [ "QQb4UQ1grtLK6N1gyPzhxUNHi5EZccBQs9RYrBRMV68LESsnx7J2kNLHRKVe1dMu3r5H9nDCXKRtv8Vqia9EA4u" ], "script": "base64:AAIFAAAAAAAAAH4IAhIHCgUYGBEBARIICgYYGBEBAQESCAoGGBgRAQEIEgkKBxgYEQEBAQgSCAoGGBgRERgBEgkKBxgYEREYAQESCQoHGBgRERgBCBIKCggYGBERGAEBCBIECgIIARIFCgMIAQESBQoDCAEIEgYKBAgBAQgSAwoBGBIFCgMICAEAAAAZAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMQ2FuJ3QgcmVhZCAnBQAAAANrZXkCAAAADScgYXQgYWRkcmVzcyAJAAQlAAAAAQUAAAAHYWRkcmVzcwEAAAARZ2V0SW50ZWdlck9yVGhyb3cAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAxDYW4ndCByZWFkICcFAAAAA2tleQIAAAANJyBhdCBhZGRyZXNzIAkABCUAAAABBQAAAAdhZGRyZXNzAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQAAAAxtYXliZUFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABBQAAAAxtYXliZUFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAABpDYW4ndCBwYXJzZSBhZGRyZXNzIGZyb20gJwUAAAAMbWF5YmVBZGRyZXNzAgAAAAEnAQAAAA9wYXJzZUludE9yVGhyb3cAAAABAAAACG1heWJlSW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAS2AAAAAQUAAAAIbWF5YmVJbnQJAAEsAAAAAgkAASwAAAACAgAAABpDYW4ndCBwYXJzZSBpbnRlZ2VyIGZyb20gJwUAAAAIbWF5YmVJbnQCAAAAAScBAAAACmdldEFzc2V0SWQAAAABAAAABWFzc2V0AwkAAAAAAAACBQAAAAVhc3NldAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAFYXNzZXQAAAAACWNvbGxlY3RvcgkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAACWNvbGxlY3RvcgAAAAAHZmVlUmF0ZQkBAAAAEWdldEludGVnZXJPclRocm93AAAAAgUAAAAEdGhpcwIAAAAIZmVlLXJhdGUAAAAABm9yYWNsZQkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAABm9yYWNsZQAAAAANc3dvcGZpUm91dGluZwkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAADnN3b3BmaS1yb3V0aW5nAAAAAA1wdXp6bGVSb3V0aW5nCQEAAAATcGFyc2VBZGRyZXNzT3JUaHJvdwAAAAEJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAAEdGhpcwIAAAAOcHV6emxlLXJvdXRpbmcAAAAABXBvb2xzCQAEtQAAAAIJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAAGb3JhY2xlAgAAAAVwb29scwIAAAABLAAAAAALcGVyY2VudFJhdGUJAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAADHBlcmNlbnQtcmF0ZQAAAAAGcmVmS2V5AgAAAAZrZWVwZXIAAAAAFHB1enpsZVJld2FyZEFzc2V0U3RyCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAAE3B1enpsZS1yZXdhcmQtdG9rZW4AAAAAE3B1enpsZVJld2FyZEFzc2V0SWQJAQAAAApnZXRBc3NldElkAAAAAQUAAAAUcHV6emxlUmV3YXJkQXNzZXRTdHIAAAAABnBQb29scwkABLUAAAACCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMCAAAAB3AtcG9vbHMCAAAAASwBAAAAD2Fzc2V0SWRUb1N0cmluZwAAAAEAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAAFYXNzZXQFAAAAByRtYXRjaDAJAAJYAAAAAQUAAAAFYXNzZXQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwAgAAAAVXQVZFUwkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAKZ2V0QmFsYW5jZQAAAAEAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAAFYXNzZXQFAAAAByRtYXRjaDAJAAPwAAAAAgUAAAAEdGhpcwUAAAAFYXNzZXQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwCAkAA+8AAAABBQAAAAR0aGlzAAAACWF2YWlsYWJsZQkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAATZ2V0QmFsYW5jZUJ5QWRkcmVzcwAAAAIAAAAHYWRkcmVzcwAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAVhc3NldAUAAAAHJG1hdGNoMAkAA/AAAAACBQAAAAdhZGRyZXNzBQAAAAVhc3NldAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAICQAD7wAAAAEFAAAAB2FkZHJlc3MAAAAJYXZhaWxhYmxlCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAlkZWR1Y3RGZWUAAAABAAAABmFtb3VudAQAAAADZmVlCQAAawAAAAMFAAAABmFtb3VudAAAAAAAAAAAAQUAAAAHZmVlUmF0ZQkABRQAAAACCQAAZQAAAAIFAAAABmFtb3VudAUAAAADZmVlBQAAAANmZWUBAAAAD2dldFJlZmVycmVyRGF0YQAAAAEAAAAMcmVmZXJyZXJOYW1lBAAAAApyZWZBZGRyZXNzCQEAAAATcGFyc2VBZGRyZXNzT3JUaHJvdwAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgIAAAAJcmVmZXJyZXItBQAAAAxyZWZlcnJlck5hbWUCAAAACC1hZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAATcmVmZXJyZXIgd2l0aCBuYW1lIAUAAAAMcmVmZXJyZXJOYW1lAgAAAAogbm90IGZvdW5kBAAAAApyZWZQZXJjZW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACAgAAAAlyZWZlcnJlci0FAAAADHJlZmVycmVyTmFtZQIAAAAILXBlcmNlbnQFAAAAC3BlcmNlbnRSYXRlAwMJAABmAAAAAgAAAAAAAAAAAAUAAAAKcmVmUGVyY2VudAYJAABmAAAAAgUAAAAKcmVmUGVyY2VudAAAAAAAAAAAZAkAAAIAAAABAgAAABZJbmNvcnJlY3QgcGVyY2VudCByYXRlCQAFFAAAAAIFAAAACnJlZkFkZHJlc3MFAAAACnJlZlBlcmNlbnQBAAAABmRvU3dhcAAAAAUAAAAEcG9vbAAAAAdwYXltZW50AAAADWFzc2V0UmVjZWl2ZWQAAAASZXN0QW1vdW50VG9SZWNlaXZlAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAAtwb29sQWRkcmVzcwkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABBQAAAARwb29sBAAAAAx2ZXJzaW9uTWFqb3IJAQAAAA9wYXJzZUludE9yVGhyb3cAAAABCQABkQAAAAIJAAS1AAAAAgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAtwb29sQWRkcmVzcwIAAAAHdmVyc2lvbgIAAAABLgAAAAAAAAAAAAQAAAAPYXNzZXRSZWNlaXZlZElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAADWFzc2V0UmVjZWl2ZWQDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEmVzdEFtb3VudFRvUmVjZWl2ZQkAAAIAAAABAgAAACNlc3RBbW91bnRUb1JlY2VpdmUgbXVzdCBiZSBwb3NpdGl2ZQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAVwb29scwUAAAAEcG9vbAQAAAAKcG9vbEFzc2V0QQkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAtwb29sQWRkcmVzcwIAAAAKQV9hc3NldF9pZAQAAAAKcG9vbEFzc2V0QgkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAtwb29sQWRkcmVzcwIAAAAKQl9hc3NldF9pZAQAAAAMcG9vbEFzc2V0SWRBCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAACnBvb2xBc3NldEEEAAAADHBvb2xBc3NldElkQgkBAAAACmdldEFzc2V0SWQAAAABBQAAAApwb29sQXNzZXRCBAAAAAskdDAzMjg3MzYzMQMDCQAAAAAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAADHBvb2xBc3NldElkQQkAAAAAAAACBQAAAA9hc3NldFJlY2VpdmVkSWQFAAAADHBvb2xBc3NldElkQgcJAAUUAAAAAgUAAAAMcG9vbEFzc2V0SWRBBQAAAAxwb29sQXNzZXRJZEIDAwkAAAAAAAACBQAAAA9hc3NldFJlY2VpdmVkSWQFAAAADHBvb2xBc3NldElkQQkAAAAAAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAAxwb29sQXNzZXRJZEIHCQAFFAAAAAIFAAAADHBvb2xBc3NldElkQgUAAAAMcG9vbEFzc2V0SWRBCQAAAgAAAAECAAAAF1Vuc3VwcG9ydGVkIGFzc2V0cyBwYWlyBAAAAAdhc3NldEluCAUAAAALJHQwMzI4NzM2MzEAAAACXzEEAAAACGFzc2V0T3V0CAUAAAALJHQwMzI4NzM2MzEAAAACXzIEAAAABGFyZ3MDCQAAAAAAAAIFAAAADHZlcnNpb25NYWpvcgAAAAAAAAAAAQkABEwAAAACAAAAAAAAAAABBQAAAANuaWwDCQAAAAAAAAIFAAAADHZlcnNpb25NYWpvcgAAAAAAAAAAAgMJAABnAAAAAgAAAAAAAAAAAAUAAAASZXN0QW1vdW50VG9SZWNlaXZlCQAAAgAAAAECAAAAI2VzdEFtb3VudFRvUmVjZWl2ZSBtdXN0IGJlIHBvc2l0aXZlAwMJAABmAAAAAgAAAAAAAAAAAAUAAAARc2xpcHBhZ2VUb2xlcmFuY2UGCQAAZgAAAAIFAAAA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bmdBc3NldHNLZXlzCQAAZQAAAAIJAAGQAAAAAQUAAAARcm91dGluZ0Fzc2V0c0tleXMAAAAAAAAAAAECAAAAAV8AAAAAAAAAAAACAAAACV9hc3NldF9pZAQAAAAKYXNzZXRGaW5hbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADWxhc3RFeGNoYW5nZXIFAAAADmxhc3RBc3NldElkS2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABZDYW4ndCByZWFkIHBhcmFtZXRlciAnBQAAAA5sYXN0QXNzZXRJZEtleQIAAAAQJyBmb3IgZXhjaGFuZ2VyIAkABCUAAAABBQAAAA1sYXN0RXhjaGFuZ2VyBAAAAAxhc3NldEZpbmFsSWQJAQAAAApnZXRBc3NldElkAAAAAQUAAAAKYXNzZXRGaW5hbAQAAAANYmFsYW5jZUJlZm9yZQkBAAAACmdldEJhbGFuY2UAAAABBQAAAAxhc3NldEZpbmFsSWQDCQAAAAAAAAIFAAAADWJhbGFuY2VCZWZvcmUFAAAADWJhbGFuY2VCZWZvcmUEAAAABnJlc3VsdAkAA/wAAAAEBQAAAA1zd29wZmlSb3V0aW5nAgAAAAxyb3V0aW5nVHJhZGUJAARMAAAAAgUAAAAKZXhjaGFuZ2VycwkABEwAAAACBQAAAA5leGNoYW5nZXJzVHlwZQkABEwAAAACBQAAAAVhcmdzMQkABEwAAAACBQAAAAVhcmdzMgkABEwAAAACBQAAABFyb3V0aW5nQXNzZXRzS2V5cwkABEwAAAACBQAAABJtaW5BbW91bnRUb1JlY2VpdmUFAAAAA25pbAkABEwAAAACBQAAAANwbXQFAAAAA25pbAMJAAAAAAAAAgUAAAAGcmVzdWx0BQAAAAZyZXN1bHQEAAAADGJhbGFuY2VBZnRlcgkBAAAACmdldEJhbGFuY2UAAAABBQAAAAxhc3NldEZpbmFsSWQDCQAAAAAAAAIFAAAADGJhbGFuY2VBZnRlcgUAAAAMYmFsYW5jZUFmdGVyBAAAAAVkZWx0YQkAAGUAAAACBQAAAAxiYWxhbmNlQWZ0ZXIFAAAADWJhbGFuY2VCZWZvcmUEAAAACyR0MDc5ODI4MDI3CQEAAAAJZGVkdWN0RmVlAAAAAQUAAAAF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AAAJYWRkcmVzc2VzAAAAD2Fzc2V0c1RvUmVjZWl2ZQAAAAtlc3RSZWNlaXZlZAAAABFzbGlwcGFnZVRvbGVyYW5jZQAAAAttaW5SZWNlaXZlZAkBAAAACHdyYXBTd2FwAAAABgUAAAADaW52BQAAAAlhZGRyZXNzZXMFAAAAD2Fzc2V0c1RvUmVjZWl2ZQUAAAALZXN0UmVjZWl2ZWQFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAAAttaW5SZWNlaXZlZAAAAANpbnYBAAAAB3N3YXBFeHAAAAAGAAAACWFkZHJlc3NlcwAAAA9hc3NldHNUb1JlY2VpdmUAAAALZXN0UmVjZWl2ZWQAAAARc2xpcHBhZ2VUb2xlcmFuY2UAAAALbWluUmVjZWl2ZWQAAAAJZXhwaXJlc0F0AwkAAGYAAAACCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAAJZXhwaXJlc0F0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAH1RoaXMgc3dhcCBleHBpcmVkIGF0IHRpbWVzdGFtcCAJAAGkAAAAAQUAAAAJZXhwaXJlc0F0AgAAAAsuIEN1cnJlbnQ6IAkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkBAAAACHdyYXBTd2FwAAAABgUAAAADaW52BQAAAAlhZGRyZXNzZXMFAAAAD2Fzc2V0c1RvUmVjZWl2ZQUAAAALZXN0UmVjZWl2ZWQFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAAAttaW5SZWNlaXZlZAAAAANpbnYBAAAAEHN3YXBXaXRoUmVmZXJyZXIAAAAGAAAACWFkZHJlc3NlcwAAAA9hc3NldHNUb1JlY2VpdmUAAAALZXN0UmVjZWl2ZWQAAAARc2xpcHBhZ2VUb2xlcmFuY2UAAAALbWluUmVjZWl2ZWQAAAAMcmVmZXJyZXJOYW1lAwkAAAAAAAACCQABMQAAAAEFAAAADHJlZmVycmVyTmFtZQAAAAAAAAAAAAkAAAIAAAABAgAAABVSZWZlcnJlciBuYW1lIGludmFsaWQEAAAACmFzc2V0RmluYWwJAAGRAAAAAgUAAAAPYXNzZXRzVG9SZWNlaXZlCQAAZQAAAAIJAAGQAAAAAQUAAAAPYXNzZXRzVG9SZWNlaXZlAAAAAAAAAAABBAAAAAdhc3NldElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAACmFzc2V0RmluYWwEAAAADSR0MDEwMTMxMTAyMDEJAQAAAA9nZXRSZWZlcnJlckRhdGEAAAABBQAAAAxyZWZlcnJlck5hbWUEAAAAD3JlZmVycmVyQWRkcmVzcwgFAAAADSR0MDEwMTMxMTAyMDEAAAACXzEEAAAAD3JlZmVycmVyUGVyY2VudAgFAAAADSR0MDEwMTMxMTAyMDEAAAACXzIEAAAABnJlc3VsdAkBAAAACHdyYXBTd2FwAAAABgUAAAADaW52BQAAAAlhZGRyZXNzZXMFAAAAD2Fzc2V0c1RvUmVjZWl2ZQUAAAALZXN0UmVjZWl2ZWQFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAAAttaW5SZWNlaXZlZAMJAAAAAAAAAgUAAAAGcmVzdWx0BQAAAAZyZXN1bHQEAAAADGNvbGxlY3RvckZlZQgJAAGRAAAAAgUAAAAGcmVzdWx0AAAAAAAAAAABAAAABmFtb3VudAQAAAAOcmVmZXJyZXJSZXdhcmQJAABrAAAAAwUAAAAMY29sbGVjdG9yRmVlBQAAAA9yZWZlcnJlclBlcmNlbnQAAAAAAAAAAGQJAARMAAAAAgkAAZEAAAACBQAAAAZyZXN1bHQAAAAAAAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAJY29sbGVjdG9yCQAAZQAAAAIFAAAADGNvbGxlY3RvckZlZQUAAAAOcmVmZXJyZXJSZXdhcmQFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAPcmVmZXJyZXJBZGRyZXNzBQAAAA5yZWZlcnJlclJld2FyZAUAAAAHYXNzZXRJZAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAANpbnYBAAAAE3N3YXBFeHBXaXRoUmVmZXJyZXIAAAAHAAAACWFkZHJlc3NlcwAAAA9hc3NldHNUb1JlY2VpdmUAAAALZXN0UmVjZWl2ZWQAAAARc2xpcHBhZ2VUb2xlcmFuY2UAAAALbWluUmVjZWl2ZWQAAAAJZXhwaXJlc0F0AAAADHJlZmVycmVyTmFtZQMJAABmAAAAAggFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAACWV4cGlyZXNBdAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB9UaGlzIHN3YXAgZXhwaXJlZCBhdCB0aW1lc3RhbXAgCQABpAAAAAEFAAAACWV4cGlyZXNBdAIAAAALLiBDdXJyZW50OiAJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXADCQAAAAAAAAIJAAExAAAAAQUAAAAMcmVmZXJyZXJOYW1lAAAAAAAAAAAACQAAAgAAAAECAAAAFVJlZmVycmVyIG5hbWUgaW52YWxpZAQAAAAKYXNzZXRGaW5hbAkAAZEAAAACBQAAAA9hc3NldHNUb1JlY2VpdmUJAABlAAAAAgkAAZAAAAABBQAAAA9hc3NldHNUb1JlY2VpdmUAAAAAAAAAAAEEAAAAB2Fzc2V0SWQJAQAAAApnZXRBc3NldElkAAAAAQUAAAAKYXNzZXRGaW5hbAQAAAANJHQwMTEyMTYxMTI4NgkBAAAAD2dldFJlZmVycmVyRGF0YQAAAAEFAAAADHJlZmVycmVyTmFtZQQAAAAPcmVmZXJyZXJBZGRyZXNzCAUAAAANJHQwMTEyMTYxMTI4NgAAAAJfMQQAAAAPcmVmZXJyZXJQZXJjZW50CAUAAAANJHQwMTEyMTYxMTI4NgAAAAJfMgQAAAAGcmVzdWx0CQEAAAAId3JhcFN3YXAAAAAGBQAAAANpbnYFAAAACWFkZHJlc3NlcwUAAAAPYXNzZXRzVG9SZWNlaXZlBQAAAAtlc3RSZWNlaXZlZAUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAC21pblJlY2VpdmVkAwkAAAAAAAACBQAAAAZyZXN1bHQFAAAABnJlc3VsdAQAAAAMY29sbGVjdG9yRmVlCAkAAZEAAAACBQAAAAZyZXN1bHQAAAAAAAAAAAEAAAAGYW1vdW50BAAAAA5yZWZlcnJlclJld2FyZAkAAGsAAAADBQAAAAxjb2xsZWN0b3JGZWUFAAAAD3JlZmVycmVyUGVyY2VudAAAAAAAAAAAZAkABEwAAAACCQABkQAAAAIFAAAABnJlc3VsdAAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAljb2xsZWN0b3IJAABlAAAAAgUAAAAMY29sbGVjdG9yRmVlBQAAAA5yZWZlcnJlclJld2FyZAUAAAAHYXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA9yZWZlcnJlckFkZHJlc3MFAAAADnJlZmVycmVyUmV3YXJkBQAAAAdhc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAA2ludgEAAAAKc3dvcGZpU3dhcAAAAAYAAAAKZXhjaGFuZ2VycwAAAA5leGNoYW5nZXJzVHlwZQAAAAVhcmdzMQAAAAVhcmdzMgAAABFyb3V0aW5nQXNzZXRzS2V5cwAAABJtaW5BbW91bnRUb1JlY2VpdmUJAQAAAA53cmFwU3dvcGZpU3dhcAAAAAcFAAAAA2ludgUAAAAKZXhjaGFuZ2VycwUAAAAOZXhjaGFuZ2Vyc1R5cGUFAAAABWFyZ3MxBQAAAAVhcmdzMgUAAAARcm91dGluZ0Fzc2V0c0tleXMFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQAAAANpbnYBAAAADXN3b3BmaVN3YXBFeHAAAAAHAAAACmV4Y2hhbmdlcnMAAAAOZXhjaGFuZ2Vyc1R5cGUAAAAFYXJnczEAAAAFYXJnczIAAAARcm91dGluZ0Fzc2V0c0tleXMAAAASbWluQW1vdW50VG9SZWNlaXZlAAAACWV4cGlyZXNBdAMJAABmAAAAAggFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAACWV4cGlyZXNBdAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB9UaGlzIHN3YXAgZXhwaXJlZCBhdCB0aW1lc3RhbXAgCQABpAAAAAEFAAAACWV4cGlyZXNBdAIAAAALLiBDdXJyZW50OiAJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAQAAAA53cmFwU3dvcGZpU3dhcAAAAAcFAAAAA2ludgUAAAAKZXhjaGFuZ2VycwUAAAAOZXhjaGFuZ2Vyc1R5cGUFAAAABWFyZ3MxBQAAAAVhcmdzMgUAAAARcm91dGluZ0Fzc2V0c0tleXMFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQAAAANpbnYBAAAAFnN3b3BmaVN3YXBXaXRoUmVmZXJyZXIAAAAHAAAACmV4Y2hhbmdlcnMAAAAOZXhjaGFuZ2Vyc1R5cGUAAAAFYXJnczEAAAAFYXJnczIAAAARcm91dGluZ0Fzc2V0c0tleXMAAAASbWluQW1vdW50VG9SZWNlaXZlAAAADHJlZmVycmVyTmFtZQMJAAAAAAAAAgkAATEAAAABBQAAAAxyZWZlcnJlck5hbWUAAAAAAAAAAAAJAAACAAAAAQIAAAAVUmVmZXJyZXIgbmFtZSBpbnZhbGlkBAAAAA1sYXN0RXhjaGFuZ2VyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkAAZEAAAACBQAAAApleGNoYW5nZXJzCQAAZQAAAAIJAAGQAAAAAQUAAAAKZXhjaGFuZ2VycwAAAAAAAAAAAQIAAAApQ2FuJ3QgcGFyc2UgbGFzdCBleGNoYW5nZXIgc3dvcGZpIGFkZHJlc3MEAAAADmxhc3RBc3NldElkS2V5CQABLAAAAAIJAAGRAAAAAgkABLUAAAACCQABkQAAAAIFAAAAEXJvdXRpbmdBc3NldHNLZXlzCQAAZQAAAAIJAAGQAAAAAQUAAAARcm91dGluZ0Fzc2V0c0tleXMAAAAAAAAAAAECAAAAAV8AAAAAAAAAAAACAAAACV9hc3NldF9pZAQAAAAKYXNzZXRGaW5hbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADWxhc3RFeGNoYW5nZXIFAAAADmxhc3RBc3NldElkS2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABZDYW4ndCByZWFkIHBhcmFtZXRlciAnBQAAAA5sYXN0QXNzZXRJZEtleQIAAAAQJyBmb3IgZXhjaGFuZ2VyIAkABCUAAAABBQAAAA1sYXN0RXhjaGFuZ2VyBAAAAAdhc3NldElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAACmFzc2V0RmluYWwEAAAADSR0MDEzMjgwMTMzNTAJAQAAAA9nZXRSZWZlcnJlckRhdGEAAAABBQAAAAxyZWZlcnJlck5hbWUEAAAAD3JlZmVycmVyQWRkcmVzcwgFAAAADSR0MDEzMjgwMTMzNTAAAAACXzEEAAAAD3JlZmVycmVyUGVyY2VudAgFAAAADSR0MDEzMjgwMTMzNTAAAAACXzIEAAAABnJlc3VsdAkBAAAADndyYXBTd29wZmlTd2FwAAAABwUAAAADaW52BQAAAApleGNoYW5nZXJzBQAAAA5leGNoYW5nZXJzVHlwZQUAAAAFYXJnczEFAAAABWFyZ3MyBQAAABFyb3V0aW5nQXNzZXRzS2V5cwUAAAASbWluQW1vdW50VG9SZWNlaXZlAwkAAAAAAAACBQAAAAZyZXN1bHQFAAAABnJlc3VsdAQAAAAMY29sbGVjdG9yRmVlCAkAAZEAAAACBQAAAAZyZXN1bHQAAAAAAAAAAAEAAAAGYW1vdW50BAAAAA5yZWZlcnJlclJld2FyZAkAAGsAAAADBQAAAAxjb2xsZWN0b3JGZWUFAAAAD3JlZmVycmVyUGVyY2VudAAAAAAAAAAAZAkABEwAAAACCQABkQAAAAIFAAAABnJlc3VsdAAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAljb2xsZWN0b3IJAABlAAAAAgUAAAAMY29sbGVjdG9yRmVlBQAAAA5yZWZlcnJlclJld2FyZAUAAAAHYXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA9yZWZlcnJlckFkZHJlc3MFAAAADnJlZmVycmVyUmV3YXJkBQAAAAdhc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAA2ludgEAAAAZc3dvcGZpU3dhcEV4cFdpdGhSZWZlcnJlcgAAAAgAAAAKZXhjaGFuZ2VycwAAAA5leGNoYW5nZXJzVHlwZQAAAAVhcmdzMQAAAAVhcmdzMgAAABFyb3V0aW5nQXNzZXRzS2V5cwAAABJtaW5BbW91bnRUb1JlY2VpdmUAAAAJZXhwaXJlc0F0AAAADHJlZmVycmVyTmFtZQMJAABmAAAAAggFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAACWV4cGlyZXNBdAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB9UaGlzIHN3YXAgZXhwaXJlZCBhdCB0aW1lc3RhbXAgCQABpAAAAAEFAAAACWV4cGlyZXNBdAIAAAALLiBDdXJyZW50OiAJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXADCQAAAAAAAAIJAAExAAAAAQUAAAAMcmVmZXJyZXJOYW1lAAAAAAAAAAAACQAAAgAAAAECAAAAFVJlZmVycmVyIG5hbWUgaW52YWxpZAQAAAANbGFzdEV4Y2hhbmdlcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAAGRAAAAAgUAAAAKZXhjaGFuZ2VycwkAAGUAAAACCQABkAAAAAEFAAAACmV4Y2hhbmdlcnMAAAAAAAAAAAECAAAAKUNhbid0IHBhcnNlIGxhc3QgZXhjaGFuZ2VyIHN3b3BmaSBhZGRyZXNzBAAAAA5sYXN0QXNzZXRJZEtleQkAASwAAAACCQABkQAAAAIJAAS1AAAAAgkAAZEAAAACBQAAABFyb3V0aW5nQXNzZXRzS2V5cwkAAGUAAAACCQABkAAAAAEFAAAAEXJvdXRpbmdBc3NldHNLZXlzAAAAAAAAAAABAgAAAAFfAAAAAAAAAAAAAgAAAAlfYXNzZXRfaWQEAAAACmFzc2V0RmluYWwJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAA1sYXN0RXhjaGFuZ2VyBQAAAA5sYXN0QXNzZXRJZEtleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAWQ2FuJ3QgcmVhZCBwYXJhbWV0ZXIgJwUAAAAObGFzdEFzc2V0SWRLZXkCAAAAECcgZm9yIGV4Y2hhbmdlciAJAAQlAAAAAQUAAAANbGFzdEV4Y2hhbmdlcgQAAAAHYXNzZXRJZAkBAAAACmdldEFzc2V0SWQAAAABBQAAAAphc3NldEZpbmFsBAAAAA0kdDAxNDc3MjE0ODQyCQEAAAAPZ2V0UmVmZXJyZXJEYXRhAAAAAQUAAAAMcmVmZXJyZXJOYW1lBAAAAA9yZWZlcnJlckFkZHJlc3MIBQAAAA0kdDAxNDc3MjE0ODQyAAAAAl8xBAAAAA9yZWZlcnJlclBlcmNlbnQIBQAAAA0kdDAxNDc3MjE0ODQyAAAAAl8yBAAAAAZyZXN1bHQJAQAAAA53cmFwU3dvcGZpU3dhcAAAAAcFAAAAA2ludgUAAAAKZXhjaGFuZ2VycwUAAAAOZXhjaGFuZ2Vyc1R5cGUFAAAABWFyZ3MxBQAAAAVhcmdzMgUAAAARcm91dGluZ0Fzc2V0c0tleXMFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQMJAAAAAAAAAgUAAAAGcmVzdWx0BQAAAAZyZXN1bHQEAAAADGNvbGxlY3RvckZlZQgJAAGRAAAAAgUAAAAGcmVzdWx0AAAAAAAAAAABAAAABmFtb3VudAQAAAAOcmVmZXJyZXJSZXdhcmQJAABrAAAAAwUAAAAMY29sbGVjdG9yRmVlBQAAAA9yZWZlcnJlclBlcmNlbnQAAAAAAAAAAGQJAARMAAAAAgkAAZEAAAACBQAAAAZyZXN1bHQAAAAAAAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAJY29sbGVjdG9yCQAAZQAAAAIFAAAADGNvbGxlY3RvckZlZQUAAAAOcmVmZXJyZXJSZXdhcmQFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAPcmVmZXJyZXJBZGRyZXNzBQAAAA5yZWZlcnJlclJld2FyZAUAAAAHYXNzZXRJZAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAANpbnYBAAAACnB1enpsZVN3YXAAAAACAAAACXJvdXRlc1N0cgAAAAxtaW5Ub1JlY2VpdmUJAQAAAA53cmFwUHV6emxlU3dhcAAAAAMFAAAAA2ludgUAAAAJcm91dGVzU3RyBQAAAAxtaW5Ub1JlY2VpdmUAAAADaW52AQAAAA1wdXp6bGVTd2FwRXhwAAAAAwAAAAlyb3V0ZXNTdHIAAAAMbWluVG9SZWNlaXZlAAAACWV4cGlyZXNBdAMJAABmAAAAAggFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAACWV4cGlyZXNBdAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB9UaGlzIHN3YXAgZXhwaXJlZCBhdCB0aW1lc3RhbXAgCQABpAAAAAEFAAAACWV4cGlyZXNBdAIAAAALLiBDdXJyZW50OiAJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAQAAAA53cmFwUHV6emxlU3dhcAAAAAMFAAAAA2ludgUAAAAJcm91dGVzU3RyBQAAAAxtaW5Ub1JlY2VpdmUAAAADaW52AQAAABZwdXp6bGVTd2FwV2l0aFJlZmVycmVyAAAAAwAAAAlyb3V0ZXNTdHIAAAAMbWluVG9SZWNlaXZlAAAADHJlZmVycmVyTmFtZQMJAAAAAAAAAgkAATEAAAABBQAAAAlyb3V0ZXNTdHIAAAAAAAAAAAAJAAACAAAAAQIAAAAPSW52YWxpZCByb3V0aW5nAwkAAGcAAAACAAAAAAAAAAAABQAAAAxtaW5Ub1JlY2VpdmUJAAACAAAAAQIAAAAYU3VtIHRvIHJlY2VpdmUgaXMgdG8gbG93AwkAAAAAAAACCQABMQAAAAEFAAAADHJlZmVycmVyTmFtZQAAAAAAAAAAAAkAAAIAAAABAgAAABhSZWZlcnJlciBuYW1lIGlzIGludmFsaWQEAAAADGFzc2V0SWRGaW5hbAkAAZEAAAACCQAEtQAAAAIFAAAACXJvdXRlc1N0cgIAAAABLAkAAGUAAAACCQABkAAAAAEJAAS1AAAAAgUAAAAJcm91dGVzU3RyAgAAAAEsAAAAAAAAAAABBAAAAAdhc3NldElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAADGFzc2V0SWRGaW5hbAQAAAANJHQwMTYyMDkxNjI3OQkBAAAAD2dldFJlZmVycmVyRGF0YQAAAAEFAAAADHJlZmVycmVyTmFtZQQAAAAPcmVmZXJyZXJBZGRyZXNzCAUAAAANJHQwMTYyMDkxNjI3OQAAAAJfMQQAAAAPcmVmZXJyZXJQZXJjZW50CAUAAAANJHQwMTYyMDkxNjI3OQAAAAJfMgQAAAANYmFsYW5jZUJlZm9yZQkBAAAAE2dldEJhbGFuY2VCeUFkZHJlc3MAAAACBQAAAAljb2xsZWN0b3IFAAAAE3B1enpsZVJld2FyZEFzc2V0SWQDCQAAAAAAAAIFAAAADWJhbGFuY2VCZWZvcmUFAAAADWJhbGFuY2VCZWZvcmUEAAAABnJlc3VsdAkBAAAADndyYXBQdXp6bGVTd2FwAAAAAwUAAAADaW52BQAAAAlyb3V0ZXNTdHIFAAAADG1pblRvUmVjZWl2ZQMJAAAAAAAAAgUAAAAGcmVzdWx0BQAAAAZyZXN1bHQEAAAADGJhbGFuY2VBZnRlcgkBAAAAE2dldEJhbGFuY2VCeUFkZHJlc3MAAAACBQAAAAljb2xsZWN0b3IFAAAAE3B1enpsZVJld2FyZEFzc2V0SWQDCQAAAAAAAAIFAAAADGJhbGFuY2VBZnRlcgUAAAAMYmFsYW5jZUFmdGVyBAAAAAVkZWx0YQkAAGUAAAACBQAAAAxiYWxhbmNlQWZ0ZXIFAAAADWJhbGFuY2VCZWZvcmUDCQAAAAAAAAIFAAAABWRlbHRhBQAAAAVkZWx0YQQAAAAGcmV3YXJkCQAAawAAAAMFAAAABWRlbHRhBQAAAA9yZWZlcnJlclBlcmNlbnQAAAAAAAAAAGQEAAAAA3JlcwkAA/wAAAAEBQAAAAljb2xsZWN0b3ICAAAAE2NsYWltUmVmZXJyZXJSZXdhcmQJAARMAAAAAgUAAAAGcmV3YXJkCQAETAAAAAIFAAAAFHB1enpsZVJld2FyZEFzc2V0U3RyBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAADcmVzBQAAAANyZXMJAARNAAAAAgUAAAAGcmVzdWx0CQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA9yZWZlcnJlckFkZHJlc3MFAAAABnJld2FyZAUAAAATcHV6emxlUmV3YXJkQXNzZXRJZAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAA2ludgEAAAAZcHV6emxlU3dhcEV4cFdpdGhSZWZlcnJlcgAAAAQAAAAJcm91dGVzU3Ry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", "height": 3283271, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2nyzACnqpWzh8eoMYDb2sNWuAqWzAuGWXbKajWwPSeAo Next: 8rpx2K9rRiNCSfBY78Syndev4t5kdwAcHeWJKK9Q65Wu Diff:
OldNewDifferences
282282
283283
284284 @Callable(inv)
285+func swapExp (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,expiresAt) = if ((lastBlock.timestamp > expiresAt))
286+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
287+ else wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
288+
289+
290+
291+@Callable(inv)
285292 func swapWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,referrerName) = if ((size(referrerName) == 0))
286293 then throw("Referrer name invalid")
287294 else {
288295 let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
289296 let assetId = getAssetId(assetFinal)
290- let $t096919761 = getReferrerData(referrerName)
291- let referrerAddress = $t096919761._1
292- let referrerPercent = $t096919761._2
297+ let $t01013110201 = getReferrerData(referrerName)
298+ let referrerAddress = $t01013110201._1
299+ let referrerPercent = $t01013110201._2
293300 let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
294301 if ((result == result))
295302 then {
303310
304311
305312 @Callable(inv)
313+func swapExpWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
314+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
315+ else if ((size(referrerName) == 0))
316+ then throw("Referrer name invalid")
317+ else {
318+ let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
319+ let assetId = getAssetId(assetFinal)
320+ let $t01121611286 = getReferrerData(referrerName)
321+ let referrerAddress = $t01121611286._1
322+ let referrerPercent = $t01121611286._2
323+ let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
324+ if ((result == result))
325+ then {
326+ let collectorFee = result[1].amount
327+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
328+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
329+ }
330+ else throw("Strict value is not equal to itself.")
331+ }
332+
333+
334+
335+@Callable(inv)
306336 func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
337+
338+
339+
340+@Callable(inv)
341+func swopfiSwapExp (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt))
342+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
343+ else wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
307344
308345
309346
315352 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
316353 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
317354 let assetId = getAssetId(assetFinal)
318- let $t01126511335 = getReferrerData(referrerName)
319- let referrerAddress = $t01126511335._1
320- let referrerPercent = $t01126511335._2
355+ let $t01328013350 = getReferrerData(referrerName)
356+ let referrerAddress = $t01328013350._1
357+ let referrerPercent = $t01328013350._2
321358 let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
322359 if ((result == result))
323360 then {
331368
332369
333370 @Callable(inv)
371+func swopfiSwapExpWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
372+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
373+ else if ((size(referrerName) == 0))
374+ then throw("Referrer name invalid")
375+ else {
376+ let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
377+ let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
378+ let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
379+ let assetId = getAssetId(assetFinal)
380+ let $t01477214842 = getReferrerData(referrerName)
381+ let referrerAddress = $t01477214842._1
382+ let referrerPercent = $t01477214842._2
383+ let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
384+ if ((result == result))
385+ then {
386+ let collectorFee = result[1].amount
387+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
388+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
389+ }
390+ else throw("Strict value is not equal to itself.")
391+ }
392+
393+
394+
395+@Callable(inv)
334396 func puzzleSwap (routesStr,minToReceive) = wrapPuzzleSwap(inv, routesStr, minToReceive)
397+
398+
399+
400+@Callable(inv)
401+func puzzleSwapExp (routesStr,minToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt))
402+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
403+ else wrapPuzzleSwap(inv, routesStr, minToReceive)
335404
336405
337406
345414 else {
346415 let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
347416 let assetId = getAssetId(assetIdFinal)
348- let $t01235612426 = getReferrerData(referrerName)
349- let referrerAddress = $t01235612426._1
350- let referrerPercent = $t01235612426._2
417+ let $t01620916279 = getReferrerData(referrerName)
418+ let referrerAddress = $t01620916279._1
419+ let referrerPercent = $t01620916279._2
351420 let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
352421 if ((balanceBefore == balanceBefore))
353422 then {
374443 }
375444 else throw("Strict value is not equal to itself.")
376445 }
446+
447+
448+
449+@Callable(inv)
450+func puzzleSwapExpWithReferrer (routesStr,minToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
451+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
452+ else if ((size(routesStr) == 0))
453+ then throw("Invalid routing")
454+ else if ((0 >= minToReceive))
455+ then throw("Sum to receive is to low")
456+ else if ((size(referrerName) == 0))
457+ then throw("Referrer name is invalid")
458+ else {
459+ let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
460+ let assetId = getAssetId(assetIdFinal)
461+ let $t01749217562 = getReferrerData(referrerName)
462+ let referrerAddress = $t01749217562._1
463+ let referrerPercent = $t01749217562._2
464+ let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
465+ if ((balanceBefore == balanceBefore))
466+ then {
467+ let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
468+ if ((result == result))
469+ then {
470+ let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
471+ if ((balanceAfter == balanceAfter))
472+ then {
473+ let delta = (balanceAfter - balanceBefore)
474+ if ((delta == delta))
475+ then {
476+ let reward = fraction(delta, referrerPercent, 100)
477+ let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
478+ if ((res == res))
479+ then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
480+ else throw("Strict value is not equal to itself.")
481+ }
482+ else throw("Strict value is not equal to itself.")
483+ }
484+ else throw("Strict value is not equal to itself.")
485+ }
486+ else throw("Strict value is not equal to itself.")
487+ }
488+ else throw("Strict value is not equal to itself.")
489+ }
377490
378491
379492
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringOrThrow (address,key) = valueOrErrorMessage(getString(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
55
66
77 func getIntegerOrThrow (address,key) = valueOrErrorMessage(getInteger(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
88
99
1010 func parseAddressOrThrow (maybeAddress) = valueOrErrorMessage(addressFromString(maybeAddress), (("Can't parse address from '" + maybeAddress) + "'"))
1111
1212
1313 func parseIntOrThrow (maybeInt) = valueOrErrorMessage(parseInt(maybeInt), (("Can't parse integer from '" + maybeInt) + "'"))
1414
1515
1616 func getAssetId (asset) = if ((asset == "WAVES"))
1717 then unit
1818 else fromBase58String(asset)
1919
2020
2121 let collector = parseAddressOrThrow(getStringOrThrow(this, "collector"))
2222
2323 let feeRate = getIntegerOrThrow(this, "fee-rate")
2424
2525 let oracle = parseAddressOrThrow(getStringOrThrow(this, "oracle"))
2626
2727 let swopfiRouting = parseAddressOrThrow(getStringOrThrow(this, "swopfi-routing"))
2828
2929 let puzzleRouting = parseAddressOrThrow(getStringOrThrow(this, "puzzle-routing"))
3030
3131 let pools = split(getStringOrThrow(oracle, "pools"), ",")
3232
3333 let percentRate = getIntegerOrThrow(this, "percent-rate")
3434
3535 let refKey = "keeper"
3636
3737 let puzzleRewardAssetStr = getStringOrThrow(this, "puzzle-reward-token")
3838
3939 let puzzleRewardAssetId = getAssetId(puzzleRewardAssetStr)
4040
4141 let pPools = split(getStringOrThrow(this, "p-pools"), ",")
4242
4343 func assetIdToString (assetId) = match assetId {
4444 case asset: ByteVector =>
4545 toBase58String(asset)
4646 case waves: Unit =>
4747 "WAVES"
4848 case _ =>
4949 throw("Match error")
5050 }
5151
5252
5353 func getBalance (assetId) = match assetId {
5454 case asset: ByteVector =>
5555 assetBalance(this, asset)
5656 case waves: Unit =>
5757 wavesBalance(this).available
5858 case _ =>
5959 throw("Match error")
6060 }
6161
6262
6363 func getBalanceByAddress (address,assetId) = match assetId {
6464 case asset: ByteVector =>
6565 assetBalance(address, asset)
6666 case waves: Unit =>
6767 wavesBalance(address).available
6868 case _ =>
6969 throw("Match error")
7070 }
7171
7272
7373 func deductFee (amount) = {
7474 let fee = fraction(amount, 1, feeRate)
7575 $Tuple2((amount - fee), fee)
7676 }
7777
7878
7979 func getReferrerData (referrerName) = {
8080 let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found")))
8181 let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate)
8282 if (if ((0 > refPercent))
8383 then true
8484 else (refPercent > 100))
8585 then throw("Incorrect percent rate")
8686 else $Tuple2(refAddress, refPercent)
8787 }
8888
8989
9090 func doSwap (pool,payment,assetReceived,estAmountToReceive,slippageTolerance) = {
9191 let poolAddress = parseAddressOrThrow(pool)
9292 let versionMajor = parseIntOrThrow(split(getStringOrThrow(poolAddress, "version"), ".")[0])
9393 let assetReceivedId = getAssetId(assetReceived)
9494 if ((0 > estAmountToReceive))
9595 then throw("estAmountToReceive must be positive")
9696 else if (containsElement(pools, pool))
9797 then {
9898 let poolAssetA = getStringOrThrow(poolAddress, "A_asset_id")
9999 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
100100 let poolAssetIdA = getAssetId(poolAssetA)
101101 let poolAssetIdB = getAssetId(poolAssetB)
102102 let $t032873631 = if (if ((payment.assetId == poolAssetIdA))
103103 then (assetReceivedId == poolAssetIdB)
104104 else false)
105105 then $Tuple2(poolAssetIdA, poolAssetIdB)
106106 else if (if ((assetReceivedId == poolAssetIdA))
107107 then (payment.assetId == poolAssetIdB)
108108 else false)
109109 then $Tuple2(poolAssetIdB, poolAssetIdA)
110110 else throw("Unsupported assets pair")
111111 let assetIn = $t032873631._1
112112 let assetOut = $t032873631._2
113113 let args = if ((versionMajor == 1))
114114 then [1]
115115 else if ((versionMajor == 2))
116116 then if ((0 >= estAmountToReceive))
117117 then throw("estAmountToReceive must be positive")
118118 else if (if ((0 > slippageTolerance))
119119 then true
120120 else (slippageTolerance > 1000))
121121 then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
122122 else {
123123 let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000))
124124 [estAmountToReceive, if ((minAmount > 0))
125125 then minAmount
126126 else 1]
127127 }
128128 else throw((("Unknown pool version '" + toString(versionMajor)) + "', but 1 or 2 expected"))
129129 let balanceBefore = getBalance(assetReceivedId)
130130 if ((balanceBefore == balanceBefore))
131131 then {
132132 let result = invoke(poolAddress, "exchange", args, [payment])
133133 if ((result == result))
134134 then {
135135 let received = (getBalance(assetReceivedId) - balanceBefore)
136136 if ((received == received))
137137 then if ((0 >= received))
138138 then throw("Received amount from pool must be positive")
139139 else received
140140 else throw("Strict value is not equal to itself.")
141141 }
142142 else throw("Strict value is not equal to itself.")
143143 }
144144 else throw("Strict value is not equal to itself.")
145145 }
146146 else if (containsElement(pPools, pool))
147147 then {
148148 let balanceBefore = getBalance(assetReceivedId)
149149 if ((balanceBefore == balanceBefore))
150150 then {
151151 let result = invoke(poolAddress, "swap", [assetReceived, 0], [payment])
152152 if ((result == result))
153153 then {
154154 let received = (getBalance(assetReceivedId) - balanceBefore)
155155 if ((received == received))
156156 then if ((0 >= received))
157157 then throw("Received amount from pool must be positive")
158158 else received
159159 else throw("Strict value is not equal to itself.")
160160 }
161161 else throw("Strict value is not equal to itself.")
162162 }
163163 else throw("Strict value is not equal to itself.")
164164 }
165165 else throw((("There is no pool at address '" + pool) + "'"))
166166 }
167167
168168
169169 func wrapSwap (inv,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = {
170170 let pmt = if ((size(inv.payments) > 0))
171171 then inv.payments[0]
172172 else throw("Payment required")
173173 let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
174174 let assetFinalId = getAssetId(assetFinal)
175175 let indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
176176 func foldSwap (previousReceived,index) = if ((index >= size(addresses)))
177177 then previousReceived
178178 else {
179179 let assetReceived = assetsToReceive[index]
180180 let assetReceivedId = getAssetId(assetReceived)
181181 match doSwap(addresses[index], previousReceived, assetReceived, estReceived[index], slippageTolerance) {
182182 case income: Int =>
183183 AttachedPayment(assetReceivedId, income)
184184 case _ =>
185185 throw("Can't handle swap result")
186186 }
187187 }
188188
189189 let final = if ((size(addresses) > 0))
190190 then {
191191 let $l = indices
192192 let $s = size($l)
193193 let $acc0 = pmt
194194 func $f0_1 ($a,$i) = if (($i >= $s))
195195 then $a
196196 else foldSwap($a, $l[$i])
197197
198198 func $f0_2 ($a,$i) = if (($i >= $s))
199199 then $a
200200 else throw("List size exceeds 10")
201201
202202 $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)
203203 }
204204 else throw("Path cannot be empty")
205205 let $t062886340 = deductFee(final.amount)
206206 let resultAfterFee = $t062886340._1
207207 let fee = $t062886340._2
208208 if ((0 >= final.amount))
209209 then throw((("Swap result " + toString(final.amount)) + " must be positive"))
210210 else if ((minReceived > resultAfterFee))
211211 then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minReceived)))
212212 else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
213213 }
214214
215215
216216 func wrapSwopfiSwap (inv,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = {
217217 let pmt = if ((size(inv.payments) > 0))
218218 then inv.payments[0]
219219 else throw("Payment required")
220220 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
221221 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
222222 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
223223 let assetFinalId = getAssetId(assetFinal)
224224 let balanceBefore = getBalance(assetFinalId)
225225 if ((balanceBefore == balanceBefore))
226226 then {
227227 let result = invoke(swopfiRouting, "routingTrade", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive], [pmt])
228228 if ((result == result))
229229 then {
230230 let balanceAfter = getBalance(assetFinalId)
231231 if ((balanceAfter == balanceAfter))
232232 then {
233233 let delta = (balanceAfter - balanceBefore)
234234 let $t079828027 = deductFee(delta)
235235 let resultAfterFee = $t079828027._1
236236 let fee = $t079828027._2
237237 if ((0 >= delta))
238238 then throw((("Swap result " + toString(delta)) + " must be positive"))
239239 else if ((minAmountToReceive > resultAfterFee))
240240 then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minAmountToReceive)))
241241 else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
242242 }
243243 else throw("Strict value is not equal to itself.")
244244 }
245245 else throw("Strict value is not equal to itself.")
246246 }
247247 else throw("Strict value is not equal to itself.")
248248 }
249249
250250
251251 func wrapPuzzleSwap (inv,routesStr,minToReceive) = {
252252 let pmt = if ((size(inv.payments) > 0))
253253 then inv.payments[0]
254254 else throw("Payment required")
255255 let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
256256 let assetId = getAssetId(assetIdFinal)
257257 let balanceBefore = getBalance(assetId)
258258 if ((balanceBefore == balanceBefore))
259259 then {
260260 let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, refKey], [pmt])
261261 if ((result == result))
262262 then {
263263 let balanceAfter = getBalance(assetId)
264264 if ((balanceAfter == balanceAfter))
265265 then {
266266 let deltaProxy = (balanceAfter - balanceBefore)
267267 if ((deltaProxy == deltaProxy))
268268 then [ScriptTransfer(inv.caller, deltaProxy, assetId)]
269269 else throw("Strict value is not equal to itself.")
270270 }
271271 else throw("Strict value is not equal to itself.")
272272 }
273273 else throw("Strict value is not equal to itself.")
274274 }
275275 else throw("Strict value is not equal to itself.")
276276 }
277277
278278
279279 @Callable(inv)
280280 func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
281281
282282
283283
284284 @Callable(inv)
285+func swapExp (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,expiresAt) = if ((lastBlock.timestamp > expiresAt))
286+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
287+ else wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
288+
289+
290+
291+@Callable(inv)
285292 func swapWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,referrerName) = if ((size(referrerName) == 0))
286293 then throw("Referrer name invalid")
287294 else {
288295 let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
289296 let assetId = getAssetId(assetFinal)
290- let $t096919761 = getReferrerData(referrerName)
291- let referrerAddress = $t096919761._1
292- let referrerPercent = $t096919761._2
297+ let $t01013110201 = getReferrerData(referrerName)
298+ let referrerAddress = $t01013110201._1
299+ let referrerPercent = $t01013110201._2
293300 let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
294301 if ((result == result))
295302 then {
296303 let collectorFee = result[1].amount
297304 let referrerReward = fraction(collectorFee, referrerPercent, 100)
298305 [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
299306 }
300307 else throw("Strict value is not equal to itself.")
301308 }
302309
303310
304311
305312 @Callable(inv)
313+func swapExpWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
314+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
315+ else if ((size(referrerName) == 0))
316+ then throw("Referrer name invalid")
317+ else {
318+ let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)]
319+ let assetId = getAssetId(assetFinal)
320+ let $t01121611286 = getReferrerData(referrerName)
321+ let referrerAddress = $t01121611286._1
322+ let referrerPercent = $t01121611286._2
323+ let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived)
324+ if ((result == result))
325+ then {
326+ let collectorFee = result[1].amount
327+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
328+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
329+ }
330+ else throw("Strict value is not equal to itself.")
331+ }
332+
333+
334+
335+@Callable(inv)
306336 func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
337+
338+
339+
340+@Callable(inv)
341+func swopfiSwapExp (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt))
342+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
343+ else wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
307344
308345
309346
310347 @Callable(inv)
311348 func swopfiSwapWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,referrerName) = if ((size(referrerName) == 0))
312349 then throw("Referrer name invalid")
313350 else {
314351 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
315352 let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
316353 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
317354 let assetId = getAssetId(assetFinal)
318- let $t01126511335 = getReferrerData(referrerName)
319- let referrerAddress = $t01126511335._1
320- let referrerPercent = $t01126511335._2
355+ let $t01328013350 = getReferrerData(referrerName)
356+ let referrerAddress = $t01328013350._1
357+ let referrerPercent = $t01328013350._2
321358 let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
322359 if ((result == result))
323360 then {
324361 let collectorFee = result[1].amount
325362 let referrerReward = fraction(collectorFee, referrerPercent, 100)
326363 [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
327364 }
328365 else throw("Strict value is not equal to itself.")
329366 }
330367
331368
332369
333370 @Callable(inv)
371+func swopfiSwapExpWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
372+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
373+ else if ((size(referrerName) == 0))
374+ then throw("Referrer name invalid")
375+ else {
376+ let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
377+ let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
378+ let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
379+ let assetId = getAssetId(assetFinal)
380+ let $t01477214842 = getReferrerData(referrerName)
381+ let referrerAddress = $t01477214842._1
382+ let referrerPercent = $t01477214842._2
383+ let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
384+ if ((result == result))
385+ then {
386+ let collectorFee = result[1].amount
387+ let referrerReward = fraction(collectorFee, referrerPercent, 100)
388+[result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
389+ }
390+ else throw("Strict value is not equal to itself.")
391+ }
392+
393+
394+
395+@Callable(inv)
334396 func puzzleSwap (routesStr,minToReceive) = wrapPuzzleSwap(inv, routesStr, minToReceive)
397+
398+
399+
400+@Callable(inv)
401+func puzzleSwapExp (routesStr,minToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt))
402+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
403+ else wrapPuzzleSwap(inv, routesStr, minToReceive)
335404
336405
337406
338407 @Callable(inv)
339408 func puzzleSwapWithReferrer (routesStr,minToReceive,referrerName) = if ((size(routesStr) == 0))
340409 then throw("Invalid routing")
341410 else if ((0 >= minToReceive))
342411 then throw("Sum to receive is to low")
343412 else if ((size(referrerName) == 0))
344413 then throw("Referrer name is invalid")
345414 else {
346415 let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
347416 let assetId = getAssetId(assetIdFinal)
348- let $t01235612426 = getReferrerData(referrerName)
349- let referrerAddress = $t01235612426._1
350- let referrerPercent = $t01235612426._2
417+ let $t01620916279 = getReferrerData(referrerName)
418+ let referrerAddress = $t01620916279._1
419+ let referrerPercent = $t01620916279._2
351420 let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
352421 if ((balanceBefore == balanceBefore))
353422 then {
354423 let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
355424 if ((result == result))
356425 then {
357426 let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
358427 if ((balanceAfter == balanceAfter))
359428 then {
360429 let delta = (balanceAfter - balanceBefore)
361430 if ((delta == delta))
362431 then {
363432 let reward = fraction(delta, referrerPercent, 100)
364433 let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
365434 if ((res == res))
366435 then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
367436 else throw("Strict value is not equal to itself.")
368437 }
369438 else throw("Strict value is not equal to itself.")
370439 }
371440 else throw("Strict value is not equal to itself.")
372441 }
373442 else throw("Strict value is not equal to itself.")
374443 }
375444 else throw("Strict value is not equal to itself.")
376445 }
446+
447+
448+
449+@Callable(inv)
450+func puzzleSwapExpWithReferrer (routesStr,minToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt))
451+ then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp)))
452+ else if ((size(routesStr) == 0))
453+ then throw("Invalid routing")
454+ else if ((0 >= minToReceive))
455+ then throw("Sum to receive is to low")
456+ else if ((size(referrerName) == 0))
457+ then throw("Referrer name is invalid")
458+ else {
459+ let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
460+ let assetId = getAssetId(assetIdFinal)
461+ let $t01749217562 = getReferrerData(referrerName)
462+ let referrerAddress = $t01749217562._1
463+ let referrerPercent = $t01749217562._2
464+ let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
465+ if ((balanceBefore == balanceBefore))
466+ then {
467+ let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
468+ if ((result == result))
469+ then {
470+ let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
471+ if ((balanceAfter == balanceAfter))
472+ then {
473+ let delta = (balanceAfter - balanceBefore)
474+ if ((delta == delta))
475+ then {
476+ let reward = fraction(delta, referrerPercent, 100)
477+ let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
478+ if ((res == res))
479+ then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
480+ else throw("Strict value is not equal to itself.")
481+ }
482+ else throw("Strict value is not equal to itself.")
483+ }
484+ else throw("Strict value is not equal to itself.")
485+ }
486+ else throw("Strict value is not equal to itself.")
487+ }
488+ else throw("Strict value is not equal to itself.")
489+ }
377490
378491
379492
380493 @Callable(inv)
381494 func addPools (poolAddresses) = {
382495 func addIfDoesNotExist (pools,pool) = if (containsElement(pools, pool))
383496 then throw((("Pool '" + pool) + "' is already added"))
384497 else (pools :+ toString(parseAddressOrThrow(pool)))
385498
386499 if (!(containsElement([this, collector], inv.caller)))
387500 then throw("only self calls or by collector are allowed")
388501 else [StringEntry("p-pools", makeString({
389502 let $l = poolAddresses
390503 let $s = size($l)
391504 let $acc0 = pPools
392505 func $f0_1 ($a,$i) = if (($i >= $s))
393506 then $a
394507 else addIfDoesNotExist($a, $l[$i])
395508
396509 func $f0_2 ($a,$i) = if (($i >= $s))
397510 then $a
398511 else throw("List size exceeds 10")
399512
400513 $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)
401514 }, ","))]
402515 }
403516
404517
405518
406519 @Callable(inv)
407520 func addReferer (referrerName,refererAddress,percent) = {
408521 let address = parseAddressOrThrow(refererAddress)
409522 if (if ((0 > percent))
410523 then true
411524 else (percent > 100))
412525 then throw("Incorrect percent rate")
413526 else if ((size(referrerName) == 0))
414527 then throw("Referrer name invalid")
415528 else if (!(containsElement([this, collector], inv.caller)))
416529 then throw("only self calls or by collector are allowed")
417530 else [StringEntry((("referrer-" + referrerName) + "-address"), refererAddress), IntegerEntry((("referrer-" + referrerName) + "-percent"), percent)]
418531 }
419532
420533

github/deemru/w8io/6500d08 
105.27 ms