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/wAAAAEBQAAAAljb2xsZWN0b3ICAAAAE2NsYWltUmVmZXJyZXJSZXdhcmQJAARMAAAAAgUAAAAGcmV3YXJkCQAETAAAAAIFAAAAFHB1enpsZVJld2FyZEFzc2V0U3RyBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAADcmVzBQAAAANyZXMJAARNAAAAAgUAAAAGcmVzdWx0CQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA9yZWZlcnJlckFkZHJlc3MFAAAABnJld2FyZAUAAAATcHV6emxlUmV3YXJkQXNzZXRJZAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAA2ludgEAAAAZcHV6emxlU3dhcEV4cFdpdGhSZWZlcnJlcgAAAAQAAAAJcm91dGVzU3RyAAAADG1pblRvUmVjZWl2ZQAAAAlleHBpcmVzQXQAAAAMcmVmZXJyZXJOYW1lAwkAAGYAAAACCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAAJZXhwaXJlc0F0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAH1RoaXMgc3dhcCBleHBpcmVkIGF0IHRpbWVzdGFtcCAJAAGkAAAAAQUAAAAJZXhwaXJlc0F0AgAAAAsuIEN1cnJlbnQ6IAkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAMJAAAAAAAAAgkAATEAAAABBQAAAAlyb3V0ZXNTdHIAAAAAAAAAAAAJAAACAAAAAQIAAAAPSW52YWxpZCByb3V0aW5nAwkAAGcAAAACAAAAAAAAAAAABQAAAAxtaW5Ub1JlY2VpdmUJAAACAAAAAQIAAAAYU3VtIHRvIHJlY2VpdmUgaXMgdG8gbG93AwkAAAAAAAACCQABMQAAAAEFAAAADHJlZmVycmVyTmFtZQAAAAAAAAAAAAkAAAIAAAABAgAAABhSZWZlcnJlciBuYW1lIGlzIGludmFsaWQEAAAADGFzc2V0SWRGaW5hbAkAAZEAAAACCQAEtQAAAAIFAAAACXJvdXRlc1N0cgIAAAABLAkAAGUAAAACCQABkAAAAAEJAAS1AAAAAgUAAAAJcm91dGVzU3RyAgAAAAEsAAAAAAAAAAABBAAAAAdhc3NldElkCQEAAAAKZ2V0QXNzZXRJZAAAAAEFAAAADGFzc2V0SWRGaW5hbAQAAAANJHQwMTc0OTIxNzU2MgkBAAAAD2dldFJlZmVycmVyRGF0YQAAAAEFAAAADHJlZmVycmVyTmFtZQQAAAAPcmVmZXJyZXJBZGRyZXNzCAUAAAANJHQwMTc0OTIxNzU2MgAAAAJfMQQAAAAPcmVmZXJyZXJQZXJjZW50CAUAAAANJHQwMTc0OTIxNzU2MgAAAAJfMgQAAAANYmFsYW5jZUJlZm9yZQkBAAAAE2dldEJhbGFuY2VCeUFkZHJlc3MAAAACBQAAAAljb2xsZWN0b3IFAAAAE3B1enpsZVJld2FyZEFzc2V0SWQDCQAAAAAAAAIFAAAADWJhbGFuY2VCZWZvcmUFAAAADWJhbGFuY2VCZWZvcmUEAAAABnJlc3VsdAkBAAAADndyYXBQdXp6bGVTd2FwAAAAAwUAAAADaW52BQAAAAlyb3V0ZXNTdHIFAAAADG1pblRvUmVjZWl2ZQMJAAAAAAAAAgUAAAAGcmVzdWx0BQAAAAZyZXN1bHQEAAAADGJhbGFuY2VBZnRlcgkBAAAAE2dldEJhbGFuY2VCeUFkZHJlc3MAAAACBQAAAAljb2xsZWN0b3IFAAAAE3B1enpsZVJld2FyZEFzc2V0SWQDCQAAAAAAAAIFAAAADGJhbGFuY2VBZnRlcgUAAAAMYmFsYW5jZUFmdGVyBAAAAAVkZWx0YQkAAGUAAAACBQAAAAxiYWxhbmNlQWZ0ZXIFAAAADWJhbGFuY2VCZWZvcmUDCQAAAAAAAAIFAAAABWRlbHRhBQAAAAVkZWx0YQQAAAAGcmV3YXJkCQAAawAAAAMFAAAABWRlbHRhBQAAAA9yZWZlcnJlclBlcmNlbnQAAAAAAAAAAGQEAAAAA3JlcwkAA/wAAAAEBQAAAAljb2xsZWN0b3ICAAAAE2NsYWltUmVmZXJyZXJSZXdhcmQJAARMAAAAAgUAAAAGcmV3YXJkCQAETAAAAAIFAAAAFHB1enpsZVJld2FyZEFzc2V0U3RyBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAADcmVzBQAAAANyZXMJAARNAAAAAgUAAAAGcmVzdWx0CQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA9yZWZlcnJlckFkZHJlc3MFAAAABnJld2FyZAUAAAATcHV6emxlUmV3YXJkQXNzZXRJZAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAA2ludgEAAAAIYWRkUG9vbHMAAAABAAAADXBvb2xBZGRyZXNzZXMKAQAAABFhZGRJZkRvZXNOb3RFeGlzdAAAAAIAAAAFcG9vbHMAAAAEcG9vbAMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAVwb29scwUAAAAEcG9vbAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAGUG9vbCAnBQAAAARwb29sAgAAABInIGlzIGFscmVhZHkgYWRkZWQJAARNAAAAAgUAAAAFcG9vbHMJAAQlAAAAAQkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABBQAAAARwb29sAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAR0aGlzCQAETAAAAAIFAAAACWNvbGxlY3RvcgUAAAADbmlsCAUAAAADaW52AAAABmNhbGxlcgkAAAIAAAABAgAAACtvbmx5IHNlbGYgY2FsbHMgb3IgYnkgY29sbGVjdG9yIGFyZSBhbGxvd2VkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAAB3AtcG9vbHMJAAS5AAAAAgoAAAAAAiRsBQAAAA1wb29sQWRkcmVzc2VzCgAAAAACJHMJAAGQAAAAAQUAAAACJGwKAAAAAAUkYWNjMAUAAAAGcFBvb2xzCgEAAAAFJGYwXzEAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQEAAAARYWRkSWZEb2VzTm90RXhpc3QAAAACBQAAAAIkYQkAAZEAAAACBQAAAAIkbAUAAAACJGkKAQAAAAUkZjBfMgAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAAACAAAAAQIAAAAUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQAAAAUkZjBfMgAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIFAAAABSRhY2MwAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACAAAAAAAAAAADAAAAAAAAAAAEAAAAAAAAAAAFAAAAAAAAAAAGAAAAAAAAAAAHAAAAAAAAAAAIAAAAAAAAAAAJAAAAAAAAAAAKAgAAAAEsBQAAAANuaWwAAAADaW52AQAAAAphZGRSZWZlcmVyAAAAAwAAAAxyZWZlcnJlck5hbWUAAAAOcmVmZXJlckFkZHJlc3MAAAAHcGVyY2VudAQAAAAHYWRkcmVzcwkBAAAAE3BhcnNlQWRkcmVzc09yVGhyb3cAAAABBQAAAA5yZWZlcmVyQWRkcmVzcwMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAB3BlcmNlbnQGCQAAZgAAAAIFAAAAB3BlcmNlbnQAAAAAAAAAAGQJAAACAAAAAQIAAAAWSW5jb3JyZWN0IHBlcmNlbnQgcmF0ZQMJAAAAAAAAAgkAATEAAAABBQAAAAxyZWZlcnJlck5hbWUAAAAAAAAAAAAJAAACAAAAAQIAAAAVUmVmZXJyZXIgbmFtZSBpbnZhbGlkAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAR0aGlzCQAETAAAAAIFAAAACWNvbGxlY3RvcgUAAAADbmlsCAUAAAADaW52AAAABmNhbGxlcgkAAAIAAAABAgAAACtvbmx5IHNlbGYgY2FsbHMgb3IgYnkgY29sbGVjdG9yIGFyZSBhbGxvd2VkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlyZWZlcnJlci0FAAAADHJlZmVycmVyTmFtZQIAAAAILWFkZHJlc3MFAAAADnJlZmVyZXJBZGRyZXNzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJcmVmZXJyZXItBQAAAAxyZWZlcnJlck5hbWUCAAAACC1wZXJjZW50BQAAAAdwZXJjZW50BQAAAANuaWwAAAAAvJSm7Q==", "height": 3283271, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2nyzACnqpWzh8eoMYDb2sNWuAqWzAuGWXbKajWwPSeAo Next: 8rpx2K9rRiNCSfBY78Syndev4t5kdwAcHeWJKK9Q65Wu Diff:
Old | New | Differences | |
---|---|---|---|
282 | 282 | ||
283 | 283 | ||
284 | 284 | @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) | |
285 | 292 | func swapWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,referrerName) = if ((size(referrerName) == 0)) | |
286 | 293 | then throw("Referrer name invalid") | |
287 | 294 | else { | |
288 | 295 | let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)] | |
289 | 296 | let assetId = getAssetId(assetFinal) | |
290 | - | let $ | |
291 | - | let referrerAddress = $ | |
292 | - | let referrerPercent = $ | |
297 | + | let $t01013110201 = getReferrerData(referrerName) | |
298 | + | let referrerAddress = $t01013110201._1 | |
299 | + | let referrerPercent = $t01013110201._2 | |
293 | 300 | let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived) | |
294 | 301 | if ((result == result)) | |
295 | 302 | then { | |
303 | 310 | ||
304 | 311 | ||
305 | 312 | @Callable(inv) | |
313 | + | func swapExpWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt)) | |
314 | + | then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp))) | |
315 | + | else if ((size(referrerName) == 0)) | |
316 | + | then throw("Referrer name invalid") | |
317 | + | else { | |
318 | + | let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)] | |
319 | + | let assetId = getAssetId(assetFinal) | |
320 | + | let $t01121611286 = getReferrerData(referrerName) | |
321 | + | let referrerAddress = $t01121611286._1 | |
322 | + | let referrerPercent = $t01121611286._2 | |
323 | + | let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived) | |
324 | + | if ((result == result)) | |
325 | + | then { | |
326 | + | let collectorFee = result[1].amount | |
327 | + | let referrerReward = fraction(collectorFee, referrerPercent, 100) | |
328 | + | [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)] | |
329 | + | } | |
330 | + | else throw("Strict value is not equal to itself.") | |
331 | + | } | |
332 | + | ||
333 | + | ||
334 | + | ||
335 | + | @Callable(inv) | |
306 | 336 | func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive) | |
337 | + | ||
338 | + | ||
339 | + | ||
340 | + | @Callable(inv) | |
341 | + | func swopfiSwapExp (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt)) | |
342 | + | then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp))) | |
343 | + | else wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive) | |
307 | 344 | ||
308 | 345 | ||
309 | 346 | ||
315 | 352 | let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id") | |
316 | 353 | let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger))) | |
317 | 354 | let assetId = getAssetId(assetFinal) | |
318 | - | let $ | |
319 | - | let referrerAddress = $ | |
320 | - | let referrerPercent = $ | |
355 | + | let $t01328013350 = getReferrerData(referrerName) | |
356 | + | let referrerAddress = $t01328013350._1 | |
357 | + | let referrerPercent = $t01328013350._2 | |
321 | 358 | let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive) | |
322 | 359 | if ((result == result)) | |
323 | 360 | then { | |
331 | 368 | ||
332 | 369 | ||
333 | 370 | @Callable(inv) | |
371 | + | func swopfiSwapExpWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt)) | |
372 | + | then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp))) | |
373 | + | else if ((size(referrerName) == 0)) | |
374 | + | then throw("Referrer name invalid") | |
375 | + | else { | |
376 | + | let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address") | |
377 | + | let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id") | |
378 | + | let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger))) | |
379 | + | let assetId = getAssetId(assetFinal) | |
380 | + | let $t01477214842 = getReferrerData(referrerName) | |
381 | + | let referrerAddress = $t01477214842._1 | |
382 | + | let referrerPercent = $t01477214842._2 | |
383 | + | let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive) | |
384 | + | if ((result == result)) | |
385 | + | then { | |
386 | + | let collectorFee = result[1].amount | |
387 | + | let referrerReward = fraction(collectorFee, referrerPercent, 100) | |
388 | + | [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)] | |
389 | + | } | |
390 | + | else throw("Strict value is not equal to itself.") | |
391 | + | } | |
392 | + | ||
393 | + | ||
394 | + | ||
395 | + | @Callable(inv) | |
334 | 396 | func puzzleSwap (routesStr,minToReceive) = wrapPuzzleSwap(inv, routesStr, minToReceive) | |
397 | + | ||
398 | + | ||
399 | + | ||
400 | + | @Callable(inv) | |
401 | + | func puzzleSwapExp (routesStr,minToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt)) | |
402 | + | then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp))) | |
403 | + | else wrapPuzzleSwap(inv, routesStr, minToReceive) | |
335 | 404 | ||
336 | 405 | ||
337 | 406 | ||
345 | 414 | else { | |
346 | 415 | let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)] | |
347 | 416 | let assetId = getAssetId(assetIdFinal) | |
348 | - | let $ | |
349 | - | let referrerAddress = $ | |
350 | - | let referrerPercent = $ | |
417 | + | let $t01620916279 = getReferrerData(referrerName) | |
418 | + | let referrerAddress = $t01620916279._1 | |
419 | + | let referrerPercent = $t01620916279._2 | |
351 | 420 | let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId) | |
352 | 421 | if ((balanceBefore == balanceBefore)) | |
353 | 422 | then { | |
374 | 443 | } | |
375 | 444 | else throw("Strict value is not equal to itself.") | |
376 | 445 | } | |
446 | + | ||
447 | + | ||
448 | + | ||
449 | + | @Callable(inv) | |
450 | + | func puzzleSwapExpWithReferrer (routesStr,minToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt)) | |
451 | + | then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp))) | |
452 | + | else if ((size(routesStr) == 0)) | |
453 | + | then throw("Invalid routing") | |
454 | + | else if ((0 >= minToReceive)) | |
455 | + | then throw("Sum to receive is to low") | |
456 | + | else if ((size(referrerName) == 0)) | |
457 | + | then throw("Referrer name is invalid") | |
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 | + | } | |
377 | 490 | ||
378 | 491 | ||
379 | 492 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func getStringOrThrow (address,key) = valueOrErrorMessage(getString(address, key), ((("Can't read '" + key) + "' at address ") + toString(address))) | |
5 | 5 | ||
6 | 6 | ||
7 | 7 | func getIntegerOrThrow (address,key) = valueOrErrorMessage(getInteger(address, key), ((("Can't read '" + key) + "' at address ") + toString(address))) | |
8 | 8 | ||
9 | 9 | ||
10 | 10 | func parseAddressOrThrow (maybeAddress) = valueOrErrorMessage(addressFromString(maybeAddress), (("Can't parse address from '" + maybeAddress) + "'")) | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | func parseIntOrThrow (maybeInt) = valueOrErrorMessage(parseInt(maybeInt), (("Can't parse integer from '" + maybeInt) + "'")) | |
14 | 14 | ||
15 | 15 | ||
16 | 16 | func getAssetId (asset) = if ((asset == "WAVES")) | |
17 | 17 | then unit | |
18 | 18 | else fromBase58String(asset) | |
19 | 19 | ||
20 | 20 | ||
21 | 21 | let collector = parseAddressOrThrow(getStringOrThrow(this, "collector")) | |
22 | 22 | ||
23 | 23 | let feeRate = getIntegerOrThrow(this, "fee-rate") | |
24 | 24 | ||
25 | 25 | let oracle = parseAddressOrThrow(getStringOrThrow(this, "oracle")) | |
26 | 26 | ||
27 | 27 | let swopfiRouting = parseAddressOrThrow(getStringOrThrow(this, "swopfi-routing")) | |
28 | 28 | ||
29 | 29 | let puzzleRouting = parseAddressOrThrow(getStringOrThrow(this, "puzzle-routing")) | |
30 | 30 | ||
31 | 31 | let pools = split(getStringOrThrow(oracle, "pools"), ",") | |
32 | 32 | ||
33 | 33 | let percentRate = getIntegerOrThrow(this, "percent-rate") | |
34 | 34 | ||
35 | 35 | let refKey = "keeper" | |
36 | 36 | ||
37 | 37 | let puzzleRewardAssetStr = getStringOrThrow(this, "puzzle-reward-token") | |
38 | 38 | ||
39 | 39 | let puzzleRewardAssetId = getAssetId(puzzleRewardAssetStr) | |
40 | 40 | ||
41 | 41 | let pPools = split(getStringOrThrow(this, "p-pools"), ",") | |
42 | 42 | ||
43 | 43 | func assetIdToString (assetId) = match assetId { | |
44 | 44 | case asset: ByteVector => | |
45 | 45 | toBase58String(asset) | |
46 | 46 | case waves: Unit => | |
47 | 47 | "WAVES" | |
48 | 48 | case _ => | |
49 | 49 | throw("Match error") | |
50 | 50 | } | |
51 | 51 | ||
52 | 52 | ||
53 | 53 | func getBalance (assetId) = match assetId { | |
54 | 54 | case asset: ByteVector => | |
55 | 55 | assetBalance(this, asset) | |
56 | 56 | case waves: Unit => | |
57 | 57 | wavesBalance(this).available | |
58 | 58 | case _ => | |
59 | 59 | throw("Match error") | |
60 | 60 | } | |
61 | 61 | ||
62 | 62 | ||
63 | 63 | func getBalanceByAddress (address,assetId) = match assetId { | |
64 | 64 | case asset: ByteVector => | |
65 | 65 | assetBalance(address, asset) | |
66 | 66 | case waves: Unit => | |
67 | 67 | wavesBalance(address).available | |
68 | 68 | case _ => | |
69 | 69 | throw("Match error") | |
70 | 70 | } | |
71 | 71 | ||
72 | 72 | ||
73 | 73 | func deductFee (amount) = { | |
74 | 74 | let fee = fraction(amount, 1, feeRate) | |
75 | 75 | $Tuple2((amount - fee), fee) | |
76 | 76 | } | |
77 | 77 | ||
78 | 78 | ||
79 | 79 | func getReferrerData (referrerName) = { | |
80 | 80 | let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found"))) | |
81 | 81 | let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate) | |
82 | 82 | if (if ((0 > refPercent)) | |
83 | 83 | then true | |
84 | 84 | else (refPercent > 100)) | |
85 | 85 | then throw("Incorrect percent rate") | |
86 | 86 | else $Tuple2(refAddress, refPercent) | |
87 | 87 | } | |
88 | 88 | ||
89 | 89 | ||
90 | 90 | func doSwap (pool,payment,assetReceived,estAmountToReceive,slippageTolerance) = { | |
91 | 91 | let poolAddress = parseAddressOrThrow(pool) | |
92 | 92 | let versionMajor = parseIntOrThrow(split(getStringOrThrow(poolAddress, "version"), ".")[0]) | |
93 | 93 | let assetReceivedId = getAssetId(assetReceived) | |
94 | 94 | if ((0 > estAmountToReceive)) | |
95 | 95 | then throw("estAmountToReceive must be positive") | |
96 | 96 | else if (containsElement(pools, pool)) | |
97 | 97 | then { | |
98 | 98 | let poolAssetA = getStringOrThrow(poolAddress, "A_asset_id") | |
99 | 99 | let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id") | |
100 | 100 | let poolAssetIdA = getAssetId(poolAssetA) | |
101 | 101 | let poolAssetIdB = getAssetId(poolAssetB) | |
102 | 102 | let $t032873631 = if (if ((payment.assetId == poolAssetIdA)) | |
103 | 103 | then (assetReceivedId == poolAssetIdB) | |
104 | 104 | else false) | |
105 | 105 | then $Tuple2(poolAssetIdA, poolAssetIdB) | |
106 | 106 | else if (if ((assetReceivedId == poolAssetIdA)) | |
107 | 107 | then (payment.assetId == poolAssetIdB) | |
108 | 108 | else false) | |
109 | 109 | then $Tuple2(poolAssetIdB, poolAssetIdA) | |
110 | 110 | else throw("Unsupported assets pair") | |
111 | 111 | let assetIn = $t032873631._1 | |
112 | 112 | let assetOut = $t032873631._2 | |
113 | 113 | let args = if ((versionMajor == 1)) | |
114 | 114 | then [1] | |
115 | 115 | else if ((versionMajor == 2)) | |
116 | 116 | then if ((0 >= estAmountToReceive)) | |
117 | 117 | then throw("estAmountToReceive must be positive") | |
118 | 118 | else if (if ((0 > slippageTolerance)) | |
119 | 119 | then true | |
120 | 120 | else (slippageTolerance > 1000)) | |
121 | 121 | then throw("Slippage tolerance must be non-negative and less than or equal to 1000") | |
122 | 122 | else { | |
123 | 123 | let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000)) | |
124 | 124 | [estAmountToReceive, if ((minAmount > 0)) | |
125 | 125 | then minAmount | |
126 | 126 | else 1] | |
127 | 127 | } | |
128 | 128 | else throw((("Unknown pool version '" + toString(versionMajor)) + "', but 1 or 2 expected")) | |
129 | 129 | let balanceBefore = getBalance(assetReceivedId) | |
130 | 130 | if ((balanceBefore == balanceBefore)) | |
131 | 131 | then { | |
132 | 132 | let result = invoke(poolAddress, "exchange", args, [payment]) | |
133 | 133 | if ((result == result)) | |
134 | 134 | then { | |
135 | 135 | let received = (getBalance(assetReceivedId) - balanceBefore) | |
136 | 136 | if ((received == received)) | |
137 | 137 | then if ((0 >= received)) | |
138 | 138 | then throw("Received amount from pool must be positive") | |
139 | 139 | else received | |
140 | 140 | else throw("Strict value is not equal to itself.") | |
141 | 141 | } | |
142 | 142 | else throw("Strict value is not equal to itself.") | |
143 | 143 | } | |
144 | 144 | else throw("Strict value is not equal to itself.") | |
145 | 145 | } | |
146 | 146 | else if (containsElement(pPools, pool)) | |
147 | 147 | then { | |
148 | 148 | let balanceBefore = getBalance(assetReceivedId) | |
149 | 149 | if ((balanceBefore == balanceBefore)) | |
150 | 150 | then { | |
151 | 151 | let result = invoke(poolAddress, "swap", [assetReceived, 0], [payment]) | |
152 | 152 | if ((result == result)) | |
153 | 153 | then { | |
154 | 154 | let received = (getBalance(assetReceivedId) - balanceBefore) | |
155 | 155 | if ((received == received)) | |
156 | 156 | then if ((0 >= received)) | |
157 | 157 | then throw("Received amount from pool must be positive") | |
158 | 158 | else received | |
159 | 159 | else throw("Strict value is not equal to itself.") | |
160 | 160 | } | |
161 | 161 | else throw("Strict value is not equal to itself.") | |
162 | 162 | } | |
163 | 163 | else throw("Strict value is not equal to itself.") | |
164 | 164 | } | |
165 | 165 | else throw((("There is no pool at address '" + pool) + "'")) | |
166 | 166 | } | |
167 | 167 | ||
168 | 168 | ||
169 | 169 | func wrapSwap (inv,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = { | |
170 | 170 | let pmt = if ((size(inv.payments) > 0)) | |
171 | 171 | then inv.payments[0] | |
172 | 172 | else throw("Payment required") | |
173 | 173 | let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)] | |
174 | 174 | let assetFinalId = getAssetId(assetFinal) | |
175 | 175 | let indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
176 | 176 | func foldSwap (previousReceived,index) = if ((index >= size(addresses))) | |
177 | 177 | then previousReceived | |
178 | 178 | else { | |
179 | 179 | let assetReceived = assetsToReceive[index] | |
180 | 180 | let assetReceivedId = getAssetId(assetReceived) | |
181 | 181 | match doSwap(addresses[index], previousReceived, assetReceived, estReceived[index], slippageTolerance) { | |
182 | 182 | case income: Int => | |
183 | 183 | AttachedPayment(assetReceivedId, income) | |
184 | 184 | case _ => | |
185 | 185 | throw("Can't handle swap result") | |
186 | 186 | } | |
187 | 187 | } | |
188 | 188 | ||
189 | 189 | let final = if ((size(addresses) > 0)) | |
190 | 190 | then { | |
191 | 191 | let $l = indices | |
192 | 192 | let $s = size($l) | |
193 | 193 | let $acc0 = pmt | |
194 | 194 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
195 | 195 | then $a | |
196 | 196 | else foldSwap($a, $l[$i]) | |
197 | 197 | ||
198 | 198 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
199 | 199 | then $a | |
200 | 200 | else throw("List size exceeds 10") | |
201 | 201 | ||
202 | 202 | $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) | |
203 | 203 | } | |
204 | 204 | else throw("Path cannot be empty") | |
205 | 205 | let $t062886340 = deductFee(final.amount) | |
206 | 206 | let resultAfterFee = $t062886340._1 | |
207 | 207 | let fee = $t062886340._2 | |
208 | 208 | if ((0 >= final.amount)) | |
209 | 209 | then throw((("Swap result " + toString(final.amount)) + " must be positive")) | |
210 | 210 | else if ((minReceived > resultAfterFee)) | |
211 | 211 | then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minReceived))) | |
212 | 212 | else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)] | |
213 | 213 | } | |
214 | 214 | ||
215 | 215 | ||
216 | 216 | func wrapSwopfiSwap (inv,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = { | |
217 | 217 | let pmt = if ((size(inv.payments) > 0)) | |
218 | 218 | then inv.payments[0] | |
219 | 219 | else throw("Payment required") | |
220 | 220 | let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address") | |
221 | 221 | let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id") | |
222 | 222 | let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger))) | |
223 | 223 | let assetFinalId = getAssetId(assetFinal) | |
224 | 224 | let balanceBefore = getBalance(assetFinalId) | |
225 | 225 | if ((balanceBefore == balanceBefore)) | |
226 | 226 | then { | |
227 | 227 | let result = invoke(swopfiRouting, "routingTrade", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive], [pmt]) | |
228 | 228 | if ((result == result)) | |
229 | 229 | then { | |
230 | 230 | let balanceAfter = getBalance(assetFinalId) | |
231 | 231 | if ((balanceAfter == balanceAfter)) | |
232 | 232 | then { | |
233 | 233 | let delta = (balanceAfter - balanceBefore) | |
234 | 234 | let $t079828027 = deductFee(delta) | |
235 | 235 | let resultAfterFee = $t079828027._1 | |
236 | 236 | let fee = $t079828027._2 | |
237 | 237 | if ((0 >= delta)) | |
238 | 238 | then throw((("Swap result " + toString(delta)) + " must be positive")) | |
239 | 239 | else if ((minAmountToReceive > resultAfterFee)) | |
240 | 240 | then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minAmountToReceive))) | |
241 | 241 | else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)] | |
242 | 242 | } | |
243 | 243 | else throw("Strict value is not equal to itself.") | |
244 | 244 | } | |
245 | 245 | else throw("Strict value is not equal to itself.") | |
246 | 246 | } | |
247 | 247 | else throw("Strict value is not equal to itself.") | |
248 | 248 | } | |
249 | 249 | ||
250 | 250 | ||
251 | 251 | func wrapPuzzleSwap (inv,routesStr,minToReceive) = { | |
252 | 252 | let pmt = if ((size(inv.payments) > 0)) | |
253 | 253 | then inv.payments[0] | |
254 | 254 | else throw("Payment required") | |
255 | 255 | let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)] | |
256 | 256 | let assetId = getAssetId(assetIdFinal) | |
257 | 257 | let balanceBefore = getBalance(assetId) | |
258 | 258 | if ((balanceBefore == balanceBefore)) | |
259 | 259 | then { | |
260 | 260 | let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, refKey], [pmt]) | |
261 | 261 | if ((result == result)) | |
262 | 262 | then { | |
263 | 263 | let balanceAfter = getBalance(assetId) | |
264 | 264 | if ((balanceAfter == balanceAfter)) | |
265 | 265 | then { | |
266 | 266 | let deltaProxy = (balanceAfter - balanceBefore) | |
267 | 267 | if ((deltaProxy == deltaProxy)) | |
268 | 268 | then [ScriptTransfer(inv.caller, deltaProxy, assetId)] | |
269 | 269 | else throw("Strict value is not equal to itself.") | |
270 | 270 | } | |
271 | 271 | else throw("Strict value is not equal to itself.") | |
272 | 272 | } | |
273 | 273 | else throw("Strict value is not equal to itself.") | |
274 | 274 | } | |
275 | 275 | else throw("Strict value is not equal to itself.") | |
276 | 276 | } | |
277 | 277 | ||
278 | 278 | ||
279 | 279 | @Callable(inv) | |
280 | 280 | func swap (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived) = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived) | |
281 | 281 | ||
282 | 282 | ||
283 | 283 | ||
284 | 284 | @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) | |
285 | 292 | func swapWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,referrerName) = if ((size(referrerName) == 0)) | |
286 | 293 | then throw("Referrer name invalid") | |
287 | 294 | else { | |
288 | 295 | let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)] | |
289 | 296 | let assetId = getAssetId(assetFinal) | |
290 | - | let $ | |
291 | - | let referrerAddress = $ | |
292 | - | let referrerPercent = $ | |
297 | + | let $t01013110201 = getReferrerData(referrerName) | |
298 | + | let referrerAddress = $t01013110201._1 | |
299 | + | let referrerPercent = $t01013110201._2 | |
293 | 300 | let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived) | |
294 | 301 | if ((result == result)) | |
295 | 302 | then { | |
296 | 303 | let collectorFee = result[1].amount | |
297 | 304 | let referrerReward = fraction(collectorFee, referrerPercent, 100) | |
298 | 305 | [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)] | |
299 | 306 | } | |
300 | 307 | else throw("Strict value is not equal to itself.") | |
301 | 308 | } | |
302 | 309 | ||
303 | 310 | ||
304 | 311 | ||
305 | 312 | @Callable(inv) | |
313 | + | func swapExpWithReferrer (addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt)) | |
314 | + | then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp))) | |
315 | + | else if ((size(referrerName) == 0)) | |
316 | + | then throw("Referrer name invalid") | |
317 | + | else { | |
318 | + | let assetFinal = assetsToReceive[(size(assetsToReceive) - 1)] | |
319 | + | let assetId = getAssetId(assetFinal) | |
320 | + | let $t01121611286 = getReferrerData(referrerName) | |
321 | + | let referrerAddress = $t01121611286._1 | |
322 | + | let referrerPercent = $t01121611286._2 | |
323 | + | let result = wrapSwap(inv, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived) | |
324 | + | if ((result == result)) | |
325 | + | then { | |
326 | + | let collectorFee = result[1].amount | |
327 | + | let referrerReward = fraction(collectorFee, referrerPercent, 100) | |
328 | + | [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)] | |
329 | + | } | |
330 | + | else throw("Strict value is not equal to itself.") | |
331 | + | } | |
332 | + | ||
333 | + | ||
334 | + | ||
335 | + | @Callable(inv) | |
306 | 336 | func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive) | |
337 | + | ||
338 | + | ||
339 | + | ||
340 | + | @Callable(inv) | |
341 | + | func swopfiSwapExp (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt)) | |
342 | + | then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp))) | |
343 | + | else wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive) | |
307 | 344 | ||
308 | 345 | ||
309 | 346 | ||
310 | 347 | @Callable(inv) | |
311 | 348 | func swopfiSwapWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,referrerName) = if ((size(referrerName) == 0)) | |
312 | 349 | then throw("Referrer name invalid") | |
313 | 350 | else { | |
314 | 351 | let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address") | |
315 | 352 | let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id") | |
316 | 353 | let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger))) | |
317 | 354 | let assetId = getAssetId(assetFinal) | |
318 | - | let $ | |
319 | - | let referrerAddress = $ | |
320 | - | let referrerPercent = $ | |
355 | + | let $t01328013350 = getReferrerData(referrerName) | |
356 | + | let referrerAddress = $t01328013350._1 | |
357 | + | let referrerPercent = $t01328013350._2 | |
321 | 358 | let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive) | |
322 | 359 | if ((result == result)) | |
323 | 360 | then { | |
324 | 361 | let collectorFee = result[1].amount | |
325 | 362 | let referrerReward = fraction(collectorFee, referrerPercent, 100) | |
326 | 363 | [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)] | |
327 | 364 | } | |
328 | 365 | else throw("Strict value is not equal to itself.") | |
329 | 366 | } | |
330 | 367 | ||
331 | 368 | ||
332 | 369 | ||
333 | 370 | @Callable(inv) | |
371 | + | func swopfiSwapExpWithReferrer (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt)) | |
372 | + | then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp))) | |
373 | + | else if ((size(referrerName) == 0)) | |
374 | + | then throw("Referrer name invalid") | |
375 | + | else { | |
376 | + | let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address") | |
377 | + | let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id") | |
378 | + | let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger))) | |
379 | + | let assetId = getAssetId(assetFinal) | |
380 | + | let $t01477214842 = getReferrerData(referrerName) | |
381 | + | let referrerAddress = $t01477214842._1 | |
382 | + | let referrerPercent = $t01477214842._2 | |
383 | + | let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive) | |
384 | + | if ((result == result)) | |
385 | + | then { | |
386 | + | let collectorFee = result[1].amount | |
387 | + | let referrerReward = fraction(collectorFee, referrerPercent, 100) | |
388 | + | [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)] | |
389 | + | } | |
390 | + | else throw("Strict value is not equal to itself.") | |
391 | + | } | |
392 | + | ||
393 | + | ||
394 | + | ||
395 | + | @Callable(inv) | |
334 | 396 | func puzzleSwap (routesStr,minToReceive) = wrapPuzzleSwap(inv, routesStr, minToReceive) | |
397 | + | ||
398 | + | ||
399 | + | ||
400 | + | @Callable(inv) | |
401 | + | func puzzleSwapExp (routesStr,minToReceive,expiresAt) = if ((lastBlock.timestamp > expiresAt)) | |
402 | + | then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp))) | |
403 | + | else wrapPuzzleSwap(inv, routesStr, minToReceive) | |
335 | 404 | ||
336 | 405 | ||
337 | 406 | ||
338 | 407 | @Callable(inv) | |
339 | 408 | func puzzleSwapWithReferrer (routesStr,minToReceive,referrerName) = if ((size(routesStr) == 0)) | |
340 | 409 | then throw("Invalid routing") | |
341 | 410 | else if ((0 >= minToReceive)) | |
342 | 411 | then throw("Sum to receive is to low") | |
343 | 412 | else if ((size(referrerName) == 0)) | |
344 | 413 | then throw("Referrer name is invalid") | |
345 | 414 | else { | |
346 | 415 | let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)] | |
347 | 416 | let assetId = getAssetId(assetIdFinal) | |
348 | - | let $ | |
349 | - | let referrerAddress = $ | |
350 | - | let referrerPercent = $ | |
417 | + | let $t01620916279 = getReferrerData(referrerName) | |
418 | + | let referrerAddress = $t01620916279._1 | |
419 | + | let referrerPercent = $t01620916279._2 | |
351 | 420 | let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId) | |
352 | 421 | if ((balanceBefore == balanceBefore)) | |
353 | 422 | then { | |
354 | 423 | let result = wrapPuzzleSwap(inv, routesStr, minToReceive) | |
355 | 424 | if ((result == result)) | |
356 | 425 | then { | |
357 | 426 | let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId) | |
358 | 427 | if ((balanceAfter == balanceAfter)) | |
359 | 428 | then { | |
360 | 429 | let delta = (balanceAfter - balanceBefore) | |
361 | 430 | if ((delta == delta)) | |
362 | 431 | then { | |
363 | 432 | let reward = fraction(delta, referrerPercent, 100) | |
364 | 433 | let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil) | |
365 | 434 | if ((res == res)) | |
366 | 435 | then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId)) | |
367 | 436 | else throw("Strict value is not equal to itself.") | |
368 | 437 | } | |
369 | 438 | else throw("Strict value is not equal to itself.") | |
370 | 439 | } | |
371 | 440 | else throw("Strict value is not equal to itself.") | |
372 | 441 | } | |
373 | 442 | else throw("Strict value is not equal to itself.") | |
374 | 443 | } | |
375 | 444 | else throw("Strict value is not equal to itself.") | |
376 | 445 | } | |
446 | + | ||
447 | + | ||
448 | + | ||
449 | + | @Callable(inv) | |
450 | + | func puzzleSwapExpWithReferrer (routesStr,minToReceive,expiresAt,referrerName) = if ((lastBlock.timestamp > expiresAt)) | |
451 | + | then throw(((("This swap expired at timestamp " + toString(expiresAt)) + ". Current: ") + toString(lastBlock.timestamp))) | |
452 | + | else if ((size(routesStr) == 0)) | |
453 | + | then throw("Invalid routing") | |
454 | + | else if ((0 >= minToReceive)) | |
455 | + | then throw("Sum to receive is to low") | |
456 | + | else if ((size(referrerName) == 0)) | |
457 | + | then throw("Referrer name is invalid") | |
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 | + | } | |
377 | 490 | ||
378 | 491 | ||
379 | 492 | ||
380 | 493 | @Callable(inv) | |
381 | 494 | func addPools (poolAddresses) = { | |
382 | 495 | func addIfDoesNotExist (pools,pool) = if (containsElement(pools, pool)) | |
383 | 496 | then throw((("Pool '" + pool) + "' is already added")) | |
384 | 497 | else (pools :+ toString(parseAddressOrThrow(pool))) | |
385 | 498 | ||
386 | 499 | if (!(containsElement([this, collector], inv.caller))) | |
387 | 500 | then throw("only self calls or by collector are allowed") | |
388 | 501 | else [StringEntry("p-pools", makeString({ | |
389 | 502 | let $l = poolAddresses | |
390 | 503 | let $s = size($l) | |
391 | 504 | let $acc0 = pPools | |
392 | 505 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
393 | 506 | then $a | |
394 | 507 | else addIfDoesNotExist($a, $l[$i]) | |
395 | 508 | ||
396 | 509 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
397 | 510 | then $a | |
398 | 511 | else throw("List size exceeds 10") | |
399 | 512 | ||
400 | 513 | $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) | |
401 | 514 | }, ","))] | |
402 | 515 | } | |
403 | 516 | ||
404 | 517 | ||
405 | 518 | ||
406 | 519 | @Callable(inv) | |
407 | 520 | func addReferer (referrerName,refererAddress,percent) = { | |
408 | 521 | let address = parseAddressOrThrow(refererAddress) | |
409 | 522 | if (if ((0 > percent)) | |
410 | 523 | then true | |
411 | 524 | else (percent > 100)) | |
412 | 525 | then throw("Incorrect percent rate") | |
413 | 526 | else if ((size(referrerName) == 0)) | |
414 | 527 | then throw("Referrer name invalid") | |
415 | 528 | else if (!(containsElement([this, collector], inv.caller))) | |
416 | 529 | then throw("only self calls or by collector are allowed") | |
417 | 530 | else [StringEntry((("referrer-" + referrerName) + "-address"), refererAddress), IntegerEntry((("referrer-" + referrerName) + "-percent"), percent)] | |
418 | 531 | } | |
419 | 532 | ||
420 | 533 |
github/deemru/w8io/6500d08 105.27 ms ◑