tx · 5m5N4E235jqDmiN5ViZSa2oyWyiLDEgcHCZQnD5t69QR

3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw:  -0.02100000 Waves

2023.03.30 10:35 [3577980] smart account 3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw > SELF 0.00000000 Waves

{ "type": 13, "id": "5m5N4E235jqDmiN5ViZSa2oyWyiLDEgcHCZQnD5t69QR", "fee": 2100000, "feeAssetId": null, "timestamp": 1680161621336, "version": 2, "chainId": 87, "sender": "3P5UKXpQbom7GB2WGdPG5yGQPeQQuM3hFmw", "senderPublicKey": "4MfTwwE7yP4BFGaifQrcc9Nwb5BA9t92WKhVb6Ton65k", "proofs": [ "4Kj3axM8JLMAsyksNiFbXceVbANWeUhioH85yEF6gRfD36SJUqgwxBnyNkfRGJT2RtvGWFtbNrDafPhgyF4dYzxU", "46fS8cEBKi2BXkee2nu3Tzxq2rT2i4xStZrQCh9yKCcfHGiFLYz2xisgfLzXmBWo9siAzi5GDARH87ufCvNi1xba" ], "script": "base64:BgImCAISCQoHERgYGAEBGBIJCgcYGBERGAEYEgUKAwgBGBIFCgMICAEhARBnZXRTdHJpbmdPclRocm93AgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkArAICCQCsAgIJAKwCAgIMQ2FuJ3QgcmVhZCAnBQNrZXkCDScgYXQgYWRkcmVzcyAJAKUIAQUHYWRkcmVzcwERZ2V0SW50ZWdlck9yVGhyb3cCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUHYWRkcmVzcwUDa2V5CQCsAgIJAKwCAgkArAICAgxDYW4ndCByZWFkICcFA2tleQINJyBhdCBhZGRyZXNzIAkApQgBBQdhZGRyZXNzARNwYXJzZUFkZHJlc3NPclRocm93AQxtYXliZUFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQxtYXliZUFkZHJlc3MJAKwCAgkArAICAhpDYW4ndCBwYXJzZSBhZGRyZXNzIGZyb20gJwUMbWF5YmVBZGRyZXNzAgEnARFwYXJzZUludE9yRGVmYXVsdAIIbWF5YmVJbnQHZGVmYXVsdAkBC3ZhbHVlT3JFbHNlAgkAtgkBBQhtYXliZUludAUHZGVmYXVsdAEPcGFyc2VJbnRPclRocm93AQhtYXliZUludAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEFCG1heWJlSW50CQCsAgIJAKwCAgIaQ2FuJ3QgcGFyc2UgaW50ZWdlciBmcm9tICcFCG1heWJlSW50AgEnAQpnZXRBc3NldElkAQVhc3NldAMJAAACBQVhc3NldAIFV0FWRVMFBHVuaXQJANkEAQUFYXNzZXQACWNvbGxlY3RvcgkBE3BhcnNlQWRkcmVzc09yVGhyb3cBCQEQZ2V0U3RyaW5nT3JUaHJvdwIFBHRoaXMCCWNvbGxlY3RvcgAHZmVlUmF0ZQkBEWdldEludGVnZXJPclRocm93AgUEdGhpcwIIZmVlLXJhdGUACWZlZUdyYWRlcwkAtQkCCQEQZ2V0U3RyaW5nT3JUaHJvdwIFBHRoaXMCCmZlZS1ncmFkZXMCAl9fAAxzd29wZmlPcmFjbGUJARNwYXJzZUFkZHJlc3NPclRocm93AQkBEGdldFN0cmluZ09yVGhyb3cCBQR0aGlzAgZvcmFjbGUADXN3b3BmaVJvdXRpbmcJARNwYXJzZUFkZHJlc3NPclRocm93AQkBEGdldFN0cmluZ09yVGhyb3cCBQxzd29wZmlPcmFjbGUCD3JvdXRpbmdfYWRkcmVzcwEMaXNTd29wZmlQb29sAQdhZGRyZXNzCQEJaXNEZWZpbmVkAQkAnQgCBQxzd29wZmlPcmFjbGUJAKwCAgIFcG9vbF8FB2FkZHJlc3MACXd4RmFjdG9yeQkBE3BhcnNlQWRkcmVzc09yVGhyb3cBCQEQZ2V0U3RyaW5nT3JUaHJvdwIFBHRoaXMCCnd4LWZhY3RvcnkABnd4U3dhcAkBE3BhcnNlQWRkcmVzc09yVGhyb3cBCQEQZ2V0U3RyaW5nT3JUaHJvdwIFCXd4RmFjdG9yeQIQJXNfX3N3YXBDb250cmFjdAEIaXNXeFBvb2wBB2FkZHJlc3MJAQlpc0RlZmluZWQBCQCdCAIFCXd4RmFjdG9yeQkArAICCQCsAgICCCVzJXMlc19fBQdhZGRyZXNzAiNfX21hcHBpbmdzX19wb29sQ29udHJhY3QyUG9vbEFzc2V0cwANcHV6emxlUm91dGluZwkBE3BhcnNlQWRkcmVzc09yVGhyb3cBCQEQZ2V0U3RyaW5nT3JUaHJvdwIFBHRoaXMCDnB1enpsZS1yb3V0aW5nABRwdXp6bGVSZXdhcmRBc3NldFN0cgkBEGdldFN0cmluZ09yVGhyb3cCBQR0aGlzAhNwdXp6bGUtcmV3YXJkLXRva2VuABNwdXp6bGVSZXdhcmRBc3NldElkCQEKZ2V0QXNzZXRJZAEFFHB1enpsZVJld2FyZEFzc2V0U3RyAAxwdXp6bGVSZWZLZXkCBmtlZXBlcgALcGVyY2VudFJhdGUJARFnZXRJbnRlZ2VyT3JUaHJvdwIFBHRoaXMCDHBlcmNlbnQtcmF0ZQEPYXNzZXRJZFRvU3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEBWFzc2V0BQckbWF0Y2gwCQDYBAEFBWFzc2V0AwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECC01hdGNoIGVycm9yAQpnZXRCYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEBWFzc2V0BQckbWF0Y2gwCQDwBwIFBHRoaXMFBWFzc2V0AwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yARNnZXRCYWxhbmNlQnlBZGRyZXNzAgdhZGRyZXNzB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQFYXNzZXQFByRtYXRjaDAJAPAHAgUHYWRkcmVzcwUFYXNzZXQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFB2FkZHJlc3MJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBCGZlZVJhdGlvAQZzcGxpdHMDCQBmAgUGc3BsaXRzCQCQAwEFCWZlZUdyYWRlcwkBD3BhcnNlSW50T3JUaHJvdwEJAJEDAgUJZmVlR3JhZGVzCQBlAgkAkAMBBQlmZWVHcmFkZXMAAQkBD3BhcnNlSW50T3JUaHJvdwEJAJEDAgUJZmVlR3JhZGVzCQBlAgUGc3BsaXRzAAEBCWRlZHVjdEZlZQIGYW1vdW50BXJhdGlvBANmZWUJAGsDBQZhbW91bnQAAQUFcmF0aW8JAJQKAgkAZQIFBmFtb3VudAUDZmVlBQNmZWUBFmdldFJlZmVycmVyRGF0YU9yVGhyb3cBDHJlZmVycmVyTmFtZQMJAAACCQCxAgEFDHJlZmVycmVyTmFtZQAACQCUCgIFCWNvbGxlY3RvcgAABApyZWZBZGRyZXNzCQETcGFyc2VBZGRyZXNzT3JUaHJvdwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgIJcmVmZXJyZXItBQxyZWZlcnJlck5hbWUCCC1hZGRyZXNzCQCsAgIJAKwCAgITcmVmZXJyZXIgd2l0aCBuYW1lIAUMcmVmZXJyZXJOYW1lAgogbm90IGZvdW5kBApyZWZQZXJjZW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICAglyZWZlcnJlci0FDHJlZmVycmVyTmFtZQIILXBlcmNlbnQFC3BlcmNlbnRSYXRlAwMJAGYCAAAFCnJlZlBlcmNlbnQGCQBmAgUKcmVmUGVyY2VudABkCQACAQIWSW5jb3JyZWN0IHBlcmNlbnQgcmF0ZQkAlAoCBQpyZWZBZGRyZXNzBQpyZWZQZXJjZW50AQ5nZXRTd2FwT3B0aW9ucwEHb3B0aW9ucwoBDWZvbGRBcmd1bWVudHMCA2FjYwVpbmRleAMJAGcCBQVpbmRleAkAkAMBBQdvcHRpb25zCQDNCAIFA2FjYwIACQDNCAIFA2FjYwkAkQMCBQdvcHRpb25zBQVpbmRleAQHaW5kaWNlcwkAzAgCAAAJAMwIAgABBQNuaWwECWFyZ3VtZW50cwoAAiRsBQdpbmRpY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1mb2xkQXJndW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgQIZGVhZGxpbmUJARFwYXJzZUludE9yRGVmYXVsdAIJAJEDAgUJYXJndW1lbnRzAAAAAAQMcmVmZXJyZXJOYW1lCQCRAwIFCWFyZ3VtZW50cwABCQCUCgIFCGRlYWRsaW5lBQxyZWZlcnJlck5hbWUBFnZhbGlkYXRlQmxvY2tUaW1lc3RhbXABCGRlYWRsaW5lAwMJAGYCBQhkZWFkbGluZQAACQBmAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFCGRlYWRsaW5lBwkAAgEJAKwCAgkArAICCQCsAgICH1RoaXMgc3dhcCBleHBpcmVkIGF0IHRpbWVzdGFtcCAJAKQDAQUIZGVhZGxpbmUCCy4gQ3VycmVudDogCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBgEGZG9Td2FwBQRwb29sB3BheW1lbnQNYXNzZXRSZWNlaXZlZBJlc3RBbW91bnRUb1JlY2VpdmURc2xpcHBhZ2VUb2xlcmFuY2UEC3Bvb2xBZGRyZXNzCQETcGFyc2VBZGRyZXNzT3JUaHJvdwEFBHBvb2wEDHZlcnNpb25NYWpvcgkBD3BhcnNlSW50T3JUaHJvdwEJAJEDAgkAtQkCCQEQZ2V0U3RyaW5nT3JUaHJvdwIFC3Bvb2xBZGRyZXNzAgd2ZXJzaW9uAgEuAAAED2Fzc2V0UmVjZWl2ZWRJZAkBCmdldEFzc2V0SWQBBQ1hc3NldFJlY2VpdmVkBAskdDA0NDY3NjMyOQMJAGYCAAAFEmVzdEFtb3VudFRvUmVjZWl2ZQkAAgECI2VzdEFtb3VudFRvUmVjZWl2ZSBtdXN0IGJlIHBvc2l0aXZlAwkBDGlzU3dvcGZpUG9vbAEFBHBvb2wECnBvb2xBc3NldEEJARBnZXRTdHJpbmdPclRocm93AgULcG9vbEFkZHJlc3MCCkFfYXNzZXRfaWQECnBvb2xBc3NldEIJARBnZXRTdHJpbmdPclRocm93AgULcG9vbEFkZHJlc3MCCkJfYXNzZXRfaWQEDHBvb2xBc3NldElkQQkBCmdldEFzc2V0SWQBBQpwb29sQXNzZXRBBAxwb29sQXNzZXRJZEIJAQpnZXRBc3NldElkAQUKcG9vbEFzc2V0QgQLJHQwNDg2NTUyMDkDAwkAAAIIBQdwYXltZW50B2Fzc2V0SWQFDHBvb2xBc3NldElkQQkAAAIFD2Fzc2V0UmVjZWl2ZWRJZAUMcG9vbEFzc2V0SWRCBwkAlAoCBQxwb29sQXNzZXRJZEEFDHBvb2xBc3NldElkQgMDCQAAAgUPYXNzZXRSZWNlaXZlZElkBQxwb29sQXNzZXRJZEEJAAACCAUHcGF5bWVudAdhc3NldElkBQxwb29sQXNzZXRJZEIHCQCUCgIFDHBvb2xBc3NldElkQgUMcG9vbEFzc2V0SWRBCQACAQIXVW5zdXBwb3J0ZWQgYXNzZXRzIHBhaXIEB2Fzc2V0SW4IBQskdDA0ODY1NTIwOQJfMQQIYXNzZXRPdXQIBQskdDA0ODY1NTIwOQJfMgMJAAACBQx2ZXJzaW9uTWFqb3IAAQkAlQoDBQtwb29sQWRkcmVzcwIMY2FsbEZ1bmN0aW9uCQDMCAICCGV4Y2hhbmdlCQDMCAIJAMwIAgIBMQUDbmlsBQNuaWwDCQAAAgUMdmVyc2lvbk1ham9yAAIDCQBnAgAABRJlc3RBbW91bnRUb1JlY2VpdmUJAAIBAiNlc3RBbW91bnRUb1JlY2VpdmUgbXVzdCBiZSBwb3NpdGl2ZQQJbWluQW1vdW50CQBlAgUSZXN0QW1vdW50VG9SZWNlaXZlCQBrAwUSZXN0QW1vdW50VG9SZWNlaXZlBRFzbGlwcGFnZVRvbGVyYW5jZQDoBwkAlQoDBQtwb29sQWRkcmVzcwIIZXhjaGFuZ2UJAMwIAgUSZXN0QW1vdW50VG9SZWNlaXZlCQDMCAIDCQBmAgUJbWluQW1vdW50AAAFCW1pbkFtb3VudAABBQNuaWwJAAIBCQCsAgIJAKwCAgIWVW5rbm93biBwb29sIHZlcnNpb24gJwkApAMBBQx2ZXJzaW9uTWFqb3ICFicsIGJ1dCAxIG9yIDIgZXhwZWN0ZWQDCQEIaXNXeFBvb2wBBQRwb29sCQCVCgMFBnd4U3dhcAIEc3dhcAkAzAgCAAEJAMwIAgUNYXNzZXRSZWNlaXZlZAkAzAgCCQClCAEFBHRoaXMFA25pbAkAlQoDBQtwb29sQWRkcmVzcwIEc3dhcAkAzAgCBQ1hc3NldFJlY2VpdmVkCQDMCAIAAAUDbmlsBARkQXBwCAULJHQwNDQ2NzYzMjkCXzEECGZ1bmN0aW9uCAULJHQwNDQ2NzYzMjkCXzIEBGFyZ3MIBQskdDA0NDY3NjMyOQJfMwQNYmFsYW5jZUJlZm9yZQkBCmdldEJhbGFuY2UBBQ9hc3NldFJlY2VpdmVkSWQDCQAAAgUNYmFsYW5jZUJlZm9yZQUNYmFsYW5jZUJlZm9yZQQGcmVzdWx0CQD8BwQFBGRBcHAFCGZ1bmN0aW9uBQRhcmdzCQDMCAIFB3BheW1lbnQFA25pbAMJAAACBQZyZXN1bHQFBnJlc3VsdAQIcmVjZWl2ZWQJAGUCCQEKZ2V0QmFsYW5jZQEFD2Fzc2V0UmVjZWl2ZWRJZAUNYmFsYW5jZUJlZm9yZQMJAAACBQhyZWNlaXZlZAUIcmVjZWl2ZWQDCQBnAgAABQhyZWNlaXZlZAkAAgECKlJlY2VpdmVkIGFtb3VudCBmcm9tIHBvb2wgbXVzdCBiZSBwb3NpdGl2ZQUIcmVjZWl2ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD3N3YXBTaW5nbGVSb3V0ZQUDaW52CWFkZHJlc3Nlcw9hc3NldHNUb1JlY2VpdmULZXN0UmVjZWl2ZWQRc2xpcHBhZ2VUb2xlcmFuY2UEA3BtdAMJAAACCQCQAwEIBQNpbnYIcGF5bWVudHMAAQkAkQMCCAUDaW52CHBheW1lbnRzAAAJAAIBAhdTaW5nbGUgcGF5bWVudCByZXF1aXJlZAoBCGZvbGRTd2FwAhBwcmV2aW91c1JlY2VpdmVkBWluZGV4AwkAZwIFBWluZGV4CQCQAwEFCWFkZHJlc3NlcwUQcHJldmlvdXNSZWNlaXZlZAQNYXNzZXRSZWNlaXZlZAkAkQMCBQ9hc3NldHNUb1JlY2VpdmUFBWluZGV4BA9hc3NldFJlY2VpdmVkSWQJAQpnZXRBc3NldElkAQUNYXNzZXRSZWNlaXZlZAQHJG1hdGNoMAkBBmRvU3dhcAUJAJEDAgUJYWRkcmVzc2VzBQVpbmRleAUQcHJldmlvdXNSZWNlaXZlZAUNYXNzZXRSZWNlaXZlZAkAkQMCBQtlc3RSZWNlaXZlZAUFaW5kZXgFEXNsaXBwYWdlVG9sZXJhbmNlAwkAAQIFByRtYXRjaDACA0ludAQGaW5jb21lBQckbWF0Y2gwCQEPQXR0YWNoZWRQYXltZW50AgUPYXNzZXRSZWNlaXZlZElkBQZpbmNvbWUJAAIBAhhDYW4ndCBoYW5kbGUgc3dhcCByZXN1bHQECHJlY2VpdmVkAwkAZgIJAJADAQUJYWRkcmVzc2VzAAAKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAEBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNwbXQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRTd2FwAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQkAAgECFFBhdGggY2Fubm90IGJlIGVtcHR5AwkAZwIAAAgFCHJlY2VpdmVkBmFtb3VudAkAAgEJAKwCAgkArAICAgxTd2FwIHJlc3VsdCAJAKQDAQgFCHJlY2VpdmVkBmFtb3VudAIRIG11c3QgYmUgcG9zaXRpdmUFCHJlY2VpdmVkARJzd2FwTXVsdGlwbGVSb3V0ZXMGA2ludglhbW91bnRzSW4JYWRkcmVzc2VzD2Fzc2V0c1RvUmVjZWl2ZQtlc3RSZWNlaXZlZBFzbGlwcGFnZVRvbGVyYW5jZQQDcG10AwkAAAIJAJADAQgFA2ludghwYXltZW50cwABCQCRAwIIBQNpbnYIcGF5bWVudHMAAAkAAgECF1NpbmdsZSBwYXltZW50IHJlcXVpcmVkCgEJZm9sZFNwbGl0AgxzcGxpdFJlc3VsdHMFaW5kZXgDCQBnAgUFaW5kZXgJAJADAQUJYWRkcmVzc2VzBQxzcGxpdFJlc3VsdHMECHNwbGl0SW52CQEKSW52b2NhdGlvbggJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIIBQNwbXQHYXNzZXRJZAkAkQMCBQlhbW91bnRzSW4FBWluZGV4BQNuaWwIBQNpbnYGY2FsbGVyCAUDaW52D2NhbGxlclB1YmxpY0tleQgFA2ludg10cmFuc2FjdGlvbklkCAUDaW52A2ZlZQgFA2ludgpmZWVBc3NldElkCAUDaW52DG9yaWdpbkNhbGxlcggFA2ludhVvcmlnaW5DYWxsZXJQdWJsaWNLZXkEDnNwbGl0QWRkcmVzc2VzCQC8CQIJAJEDAgUJYWRkcmVzc2VzBQVpbmRleAIBXwQLc3BsaXRBc3NldHMJALwJAgkAkQMCBQ9hc3NldHNUb1JlY2VpdmUFBWluZGV4AgFfCgENbWFwSW50T3JUaHJvdwIGcmVzdWx0CG1heWJlSW50CQDNCAIFBnJlc3VsdAkBD3BhcnNlSW50T3JUaHJvdwEFCG1heWJlSW50BBBzcGxpdEVzdFJlY2VpdmVkCgACJGwJALwJAgkAkQMCBQtlc3RSZWNlaXZlZAUFaW5kZXgCAV8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDW1hcEludE9yVGhyb3cCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAZyZXN1bHQJAQ9zd2FwU2luZ2xlUm91dGUFBQhzcGxpdEludgUOc3BsaXRBZGRyZXNzZXMFC3NwbGl0QXNzZXRzBRBzcGxpdEVzdFJlY2VpdmVkBRFzbGlwcGFnZVRvbGVyYW5jZQMJAAACBQZyZXN1bHQFBnJlc3VsdAkAzQgCBQxzcGxpdFJlc3VsdHMFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWZvbGRTcGxpdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMwkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwEOd3JhcFN3b3BmaVN3YXAHA2ludgpleGNoYW5nZXJzDmV4Y2hhbmdlcnNUeXBlBWFyZ3MxBWFyZ3MyEXJvdXRpbmdBc3NldHNLZXlzEm1pbkFtb3VudFRvUmVjZWl2ZQQDcG10AwkAAAIJAJADAQgFA2ludghwYXltZW50cwABCQCRAwIIBQNpbnYIcGF5bWVudHMAAAkAAgECF1NpbmdsZSBwYXltZW50IHJlcXVpcmVkBA1sYXN0RXhjaGFuZ2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQpleGNoYW5nZXJzCQBlAgkAkAMBBQpleGNoYW5nZXJzAAECKUNhbid0IHBhcnNlIGxhc3QgZXhjaGFuZ2VyIHN3b3BmaSBhZGRyZXNzBA5sYXN0QXNzZXRJZEtleQkArAICCQCRAwIJALwJAgkAkQMCBRFyb3V0aW5nQXNzZXRzS2V5cwkAZQIJAJADAQURcm91dGluZ0Fzc2V0c0tleXMAAQIBXwAAAglfYXNzZXRfaWQECmFzc2V0RmluYWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1sYXN0RXhjaGFuZ2VyBQ5sYXN0QXNzZXRJZEtleQkArAICCQCsAgIJAKwCAgIWQ2FuJ3QgcmVhZCBwYXJhbWV0ZXIgJwUObGFzdEFzc2V0SWRLZXkCECcgZm9yIGV4Y2hhbmdlciAJAKUIAQUNbGFzdEV4Y2hhbmdlcgQMYXNzZXRGaW5hbElkCQEKZ2V0QXNzZXRJZAEFCmFzc2V0RmluYWwEDWJhbGFuY2VCZWZvcmUJAQpnZXRCYWxhbmNlAQUMYXNzZXRGaW5hbElkAwkAAAIFDWJhbGFuY2VCZWZvcmUFDWJhbGFuY2VCZWZvcmUEBnJlc3VsdAkA/AcEBQ1zd29wZmlSb3V0aW5nAgxyb3V0aW5nVHJhZGUJAMwIAgUKZXhjaGFuZ2VycwkAzAgCBQ5leGNoYW5nZXJzVHlwZQkAzAgCBQVhcmdzMQkAzAgCBQVhcmdzMgkAzAgCBRFyb3V0aW5nQXNzZXRzS2V5cwkAzAgCBRJtaW5BbW91bnRUb1JlY2VpdmUFA25pbAkAzAgCBQNwbXQFA25pbAMJAAACBQZyZXN1bHQFBnJlc3VsdAQMYmFsYW5jZUFmdGVyCQEKZ2V0QmFsYW5jZQEFDGFzc2V0RmluYWxJZAMJAAACBQxiYWxhbmNlQWZ0ZXIFDGJhbGFuY2VBZnRlcgQFZGVsdGEJAGUCBQxiYWxhbmNlQWZ0ZXIFDWJhbGFuY2VCZWZvcmUEDSR0MDEwNzY0MTA4MTYJAQlkZWR1Y3RGZWUCBQVkZWx0YQUHZmVlUmF0ZQQOcmVzdWx0QWZ0ZXJGZWUIBQ0kdDAxMDc2NDEwODE2Al8xBANmZWUIBQ0kdDAxMDc2NDEwODE2Al8yAwkAZwIAAAUFZGVsdGEJAAIBCQCsAgIJAKwCAgIMU3dhcCByZXN1bHQgCQCkAwEFBWRlbHRhAhEgbXVzdCBiZSBwb3NpdGl2ZQMJAGYCBRJtaW5BbW91bnRUb1JlY2VpdmUFDnJlc3VsdEFmdGVyRmVlCQACAQkArAICCQCsAgIJAKwCAgIMU3dhcCByZXN1bHQgCQCkAwEFDnJlc3VsdEFmdGVyRmVlAhcgaXMgbGVzcyB0aGVuIGV4cGVjdGVkIAkApAMBBRJtaW5BbW91bnRUb1JlY2VpdmUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA2ludgZjYWxsZXIFDnJlc3VsdEFmdGVyRmVlBQxhc3NldEZpbmFsSWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUJY29sbGVjdG9yBQNmZWUFDGFzc2V0RmluYWxJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ53cmFwUHV6emxlU3dhcAMDaW52CXJvdXRlc1N0cgxtaW5Ub1JlY2VpdmUEA3BtdAMJAAACCQCQAwEIBQNpbnYIcGF5bWVudHMAAQkAkQMCCAUDaW52CHBheW1lbnRzAAAJAAIBAhdTaW5nbGUgcGF5bWVudCByZXF1aXJlZAQMYXNzZXRJZEZpbmFsCQCRAwIJALwJAgUJcm91dGVzU3RyAgEsCQBlAgkAkAMBCQC8CQIFCXJvdXRlc1N0cgIBLAABBAdhc3NldElkCQEKZ2V0QXNzZXRJZAEFDGFzc2V0SWRGaW5hbAQNYmFsYW5jZUJlZm9yZQkBCmdldEJhbGFuY2UBBQdhc3NldElkAwkAAAIFDWJhbGFuY2VCZWZvcmUFDWJhbGFuY2VCZWZvcmUEBnJlc3VsdAkA/AcEBQ1wdXp6bGVSb3V0aW5nAhBzd2FwV2l0aFJlZmVycmFsCQDMCAIFCXJvdXRlc1N0cgkAzAgCBQxtaW5Ub1JlY2VpdmUJAMwIAgUMcHV6emxlUmVmS2V5BQNuaWwJAMwIAgUDcG10BQNuaWwDCQAAAgUGcmVzdWx0BQZyZXN1bHQEDGJhbGFuY2VBZnRlcgkBCmdldEJhbGFuY2UBBQdhc3NldElkAwkAAAIFDGJhbGFuY2VBZnRlcgUMYmFsYW5jZUFmdGVyBApkZWx0YVByb3h5CQBlAgUMYmFsYW5jZUFmdGVyBQ1iYWxhbmNlQmVmb3JlAwkAAAIFCmRlbHRhUHJveHkFCmRlbHRhUHJveHkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA2ludgZjYWxsZXIFCmRlbHRhUHJveHkFB2Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQDaW52AQRzd2FwBwlhbW91bnRzSW4JYWRkcmVzc2VzD2Fzc2V0c1RvUmVjZWl2ZQtlc3RSZWNlaXZlZBFzbGlwcGFnZVRvbGVyYW5jZQttaW5SZWNlaXZlZAdvcHRpb25zBANwbXQDCQAAAgkAkAMBCAUDaW52CHBheW1lbnRzAAEJAJEDAggFA2ludghwYXltZW50cwAACQACAQIXU2luZ2xlIHBheW1lbnQgcmVxdWlyZWQEDSR0MDEyMTk5MTIyNTMJAQ5nZXRTd2FwT3B0aW9ucwEFB29wdGlvbnMECGRlYWRsaW5lCAUNJHQwMTIxOTkxMjI1MwJfMQQMcmVmZXJyZXJOYW1lCAUNJHQwMTIxOTkxMjI1MwJfMgQQaXNWYWxpZFRpbWVzdGFtcAkBFnZhbGlkYXRlQmxvY2tUaW1lc3RhbXABBQhkZWFkbGluZQMJAAACBRBpc1ZhbGlkVGltZXN0YW1wBRBpc1ZhbGlkVGltZXN0YW1wBA0kdDAxMjMyMTEyNDAxCQEWZ2V0UmVmZXJyZXJEYXRhT3JUaHJvdwEFDHJlZmVycmVyTmFtZQMJAAACBQ0kdDAxMjMyMTEyNDAxBQ0kdDAxMjMyMTEyNDAxBA9yZWZlcnJlclBlcmNlbnQIBQ0kdDAxMjMyMTEyNDAxAl8yBA9yZWZlcnJlckFkZHJlc3MIBQ0kdDAxMjMyMTEyNDAxAl8xBAZzcGxpdHMDAwMJAQIhPQIJAJADAQUJYW1vdW50c0luCQCQAwEFCWFkZHJlc3NlcwYJAQIhPQIJAJADAQUJYWRkcmVzc2VzCQCQAwEFD2Fzc2V0c1RvUmVjZWl2ZQYJAQIhPQIJAJADAQUPYXNzZXRzVG9SZWNlaXZlCQCQAwEFC2VzdFJlY2VpdmVkCQACAQIkU3dhcCBhcmd1bWVudHMgbXVzdCBiZSB0aGUgc2FtZSBzaXplAwMJAGYCAAEJAJADAQUJYW1vdW50c0luBgkAZgIJAJADAQUJYW1vdW50c0luAAMJAAIBAh9TdXBwb3J0ZWQgc3dhcCBvZiAxIHRvIDMgc3BsaXRzCQCQAwEFCWFtb3VudHNJbgMJAAACBQZzcGxpdHMFBnNwbGl0cwQWdmFsaWRTbGlwcGFnZVRvbGVyYW5jZQMDCQBmAgAABRFzbGlwcGFnZVRvbGVyYW5jZQYJAGYCBRFzbGlwcGFnZVRvbGVyYW5jZQDoBwkAAgECRlNsaXBwYWdlIHRvbGVyYW5jZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEwMDAFEXNsaXBwYWdlVG9sZXJhbmNlCgEFc3VtSW4CBWFjY3VtBG5leHQJAGQCBQVhY2N1bQUEbmV4dAQNdG90YWxBbW91bnRJbgoAAiRsBQlhbW91bnRzSW4KAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBXN1bUluAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADBAphbW91bnRzT3V0AwkBAiE9AggFA3BtdAZhbW91bnQFDXRvdGFsQW1vdW50SW4JAAIBCQCsAgIJAKwCAgkArAICAhlUb3RhbCBhbW91bnQgYWZ0ZXIgc3BsaXQgCQCkAwEFDXRvdGFsQW1vdW50SW4CJiBpcyBub3QgZXF1YWwgb3JpZ2luYWwgcGF5bWVudCBhbW91bnQgCQCkAwEIBQNwbXQGYW1vdW50CQESc3dhcE11bHRpcGxlUm91dGVzBgUDaW52BQlhbW91bnRzSW4FCWFkZHJlc3NlcwUPYXNzZXRzVG9SZWNlaXZlBQtlc3RSZWNlaXZlZAUWdmFsaWRTbGlwcGFnZVRvbGVyYW5jZQMJAAACBQphbW91bnRzT3V0BQphbW91bnRzT3V0CgEGc3VtT3V0AgV0b3RhbARuZXh0CQBkAgUFdG90YWwIBQRuZXh0BmFtb3VudAQOdG90YWxBbW91bnRPdXQKAAIkbAUKYW1vdW50c091dAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEGc3VtT3V0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADBAdhc3NldElkCAkAkQMCBQphbW91bnRzT3V0AAAHYXNzZXRJZAQNJHQwMTM4NTExMzkyMQkBCWRlZHVjdEZlZQIFDnRvdGFsQW1vdW50T3V0CQEIZmVlUmF0aW8BBQZzcGxpdHMEDmFtb3VudE1pbnVzRmVlCAUNJHQwMTM4NTExMzkyMQJfMQQDZmVlCAUNJHQwMTM4NTExMzkyMQJfMgQOcmVmZXJyZXJSZXdhcmQJAGsDBQNmZWUFD3JlZmVycmVyUGVyY2VudABkBA9jb2xsZWN0b3JSZXdhcmQJAGUCBQNmZWUFDnJlZmVycmVyUmV3YXJkBAl0cmFuc2ZlcnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA2ludgZjYWxsZXIFDmFtb3VudE1pbnVzRmVlBQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCWNvbGxlY3RvcgUPY29sbGVjdG9yUmV3YXJkBQdhc3NldElkBQNuaWwDCQBmAgULbWluUmVjZWl2ZWQFDmFtb3VudE1pbnVzRmVlCQACAQkArAICCQCsAgIJAKwCAgIMU3dhcCByZXN1bHQgCQCkAwEFDmFtb3VudE1pbnVzRmVlAhcgaXMgbGVzcyB0aGVuIGV4cGVjdGVkIAkApAMBBQttaW5SZWNlaXZlZAMJAAACBQ5yZWZlcnJlclJld2FyZAAABQl0cmFuc2ZlcnMJAM0IAgUJdHJhbnNmZXJzCQEOU2NyaXB0VHJhbnNmZXIDBQ9yZWZlcnJlckFkZHJlc3MFDnJlZmVycmVyUmV3YXJkBQdhc3NldElkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA2ludgEKc3dvcGZpU3dhcAcKZXhjaGFuZ2Vycw5leGNoYW5nZXJzVHlwZQVhcmdzMQVhcmdzMhFyb3V0aW5nQXNzZXRzS2V5cxJtaW5BbW91bnRUb1JlY2VpdmUHb3B0aW9ucwQNJHQwMTQ3MjAxNDc3NAkBDmdldFN3YXBPcHRpb25zAQUHb3B0aW9ucwQIZGVhZGxpbmUIBQ0kdDAxNDcyMDE0Nzc0Al8xBAxyZWZlcnJlck5hbWUIBQ0kdDAxNDcyMDE0Nzc0Al8yBBBpc1ZhbGlkVGltZXN0YW1wCQEWdmFsaWRhdGVCbG9ja1RpbWVzdGFtcAEFCGRlYWRsaW5lAwkAAAIFEGlzVmFsaWRUaW1lc3RhbXAFEGlzVmFsaWRUaW1lc3RhbXAEDSR0MDE0ODQyMTQ5MjIJARZnZXRSZWZlcnJlckRhdGFPclRocm93AQUMcmVmZXJyZXJOYW1lAwkAAAIFDSR0MDE0ODQyMTQ5MjIFDSR0MDE0ODQyMTQ5MjIED3JlZmVycmVyUGVyY2VudAgFDSR0MDE0ODQyMTQ5MjICXzIED3JlZmVycmVyQWRkcmVzcwgFDSR0MDE0ODQyMTQ5MjICXzEEBnJlc3VsdAkBDndyYXBTd29wZmlTd2FwBwUDaW52BQpleGNoYW5nZXJzBQ5leGNoYW5nZXJzVHlwZQUFYXJnczEFBWFyZ3MyBRFyb3V0aW5nQXNzZXRzS2V5cwUSbWluQW1vdW50VG9SZWNlaXZlAwkAAAIFBnJlc3VsdAUGcmVzdWx0AwkAZgIFD3JlZmVycmVyUGVyY2VudAAABA1sYXN0RXhjaGFuZ2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQpleGNoYW5nZXJzCQBlAgkAkAMBBQpleGNoYW5nZXJzAAECKUNhbid0IHBhcnNlIGxhc3QgZXhjaGFuZ2VyIHN3b3BmaSBhZGRyZXNzBA5sYXN0QXNzZXRJZEtleQkArAICCQCRAwIJALwJAgkAkQMCBRFyb3V0aW5nQXNzZXRzS2V5cwkAZQIJAJADAQURcm91dGluZ0Fzc2V0c0tleXMAAQIBXwAAAglfYXNzZXRfaWQECmFzc2V0RmluYWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1sYXN0RXhjaGFuZ2VyBQ5sYXN0QXNzZXRJZEtleQkArAICCQCsAgIJAKwCAgIWQ2FuJ3QgcmVhZCBwYXJhbWV0ZXIgJwUObGFzdEFzc2V0SWRLZXkCECcgZm9yIGV4Y2hhbmdlciAJAKUIAQUNbGFzdEV4Y2hhbmdlcgQHYXNzZXRJZAkBCmdldEFzc2V0SWQBBQphc3NldEZpbmFsBAxjb2xsZWN0b3JGZWUICQCRAwIFBnJlc3VsdAABBmFtb3VudAQOcmVmZXJyZXJSZXdhcmQJAGsDBQxjb2xsZWN0b3JGZWUFD3JlZmVycmVyUGVyY2VudABkCQDMCAIJAJEDAgUGcmVzdWx0AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUJY29sbGVjdG9yCQBlAgUMY29sbGVjdG9yRmVlBQ5yZWZlcnJlclJld2FyZAUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9yZWZlcnJlckFkZHJlc3MFDnJlZmVycmVyUmV3YXJkBQdhc3NldElkBQNuaWwFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNpbnYBCnB1enpsZVN3YXADCXJvdXRlc1N0cgxtaW5Ub1JlY2VpdmUHb3B0aW9ucwQNJHQwMTU5OTUxNjA0OQkBDmdldFN3YXBPcHRpb25zAQUHb3B0aW9ucwQIZGVhZGxpbmUIBQ0kdDAxNTk5NTE2MDQ5Al8xBAxyZWZlcnJlck5hbWUIBQ0kdDAxNTk5NTE2MDQ5Al8yBBBpc1ZhbGlkVGltZXN0YW1wCQEWdmFsaWRhdGVCbG9ja1RpbWVzdGFtcAEFCGRlYWRsaW5lAwkAAAIFEGlzVmFsaWRUaW1lc3RhbXAFEGlzVmFsaWRUaW1lc3RhbXAEDSR0MDE2MTE3MTYxOTcJARZnZXRSZWZlcnJlckRhdGFPclRocm93AQUMcmVmZXJyZXJOYW1lAwkAAAIFDSR0MDE2MTE3MTYxOTcFDSR0MDE2MTE3MTYxOTcED3JlZmVycmVyUGVyY2VudAgFDSR0MDE2MTE3MTYxOTcCXzIED3JlZmVycmVyQWRkcmVzcwgFDSR0MDE2MTE3MTYxOTcCXzEDCQAAAgkAsQIBBQlyb3V0ZXNTdHIAAAkAAgECD0ludmFsaWQgcm91dGluZwMJAGcCAAAFDG1pblRvUmVjZWl2ZQkAAgECGFN1bSB0byByZWNlaXZlIGlzIHRvIGxvdwQNYmFsYW5jZUJlZm9yZQkBE2dldEJhbGFuY2VCeUFkZHJlc3MCBQljb2xsZWN0b3IFE3B1enpsZVJld2FyZEFzc2V0SWQDCQAAAgUNYmFsYW5jZUJlZm9yZQUNYmFsYW5jZUJlZm9yZQQGcmVzdWx0CQEOd3JhcFB1enpsZVN3YXADBQNpbnYFCXJvdXRlc1N0cgUMbWluVG9SZWNlaXZlAwkAAAIFBnJlc3VsdAUGcmVzdWx0AwkAZgIFD3JlZmVycmVyUGVyY2VudAAABAxhc3NldElkRmluYWwJAJEDAgkAvAkCBQlyb3V0ZXNTdHICASwJAGUCCQCQAwEJALwJAgUJcm91dGVzU3RyAgEsAAEEB2Fzc2V0SWQJAQpnZXRBc3NldElkAQUMYXNzZXRJZEZpbmFsBAxiYWxhbmNlQWZ0ZXIJARNnZXRCYWxhbmNlQnlBZGRyZXNzAgUJY29sbGVjdG9yBRNwdXp6bGVSZXdhcmRBc3NldElkAwkAAAIFDGJhbGFuY2VBZnRlcgUMYmFsYW5jZUFmdGVyBAVkZWx0YQkAZQIFDGJhbGFuY2VBZnRlcgUNYmFsYW5jZUJlZm9yZQMJAAACBQVkZWx0YQUFZGVsdGEEBnJld2FyZAkAawMFBWRlbHRhBQ9yZWZlcnJlclBlcmNlbnQAZAQDcmVzCQD8BwQFCWNvbGxlY3RvcgITY2xhaW1SZWZlcnJlclJld2FyZAkAzAgCBQZyZXdhcmQJAMwIAgUUcHV6emxlUmV3YXJkQXNzZXRTdHIFA25pbAUDbmlsAwkAAAIFA3JlcwUDcmVzCQDNCAIFBnJlc3VsdAkBDlNjcmlwdFRyYW5zZmVyAwUPcmVmZXJyZXJBZGRyZXNzBQZyZXdhcmQFE3B1enpsZVJld2FyZEFzc2V0SWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNpbnYBC2FkZFJlZmVycmVyAwxyZWZlcnJlck5hbWUOcmVmZXJlckFkZHJlc3MHcGVyY2VudAQHYWRkcmVzcwkBE3BhcnNlQWRkcmVzc09yVGhyb3cBBQ5yZWZlcmVyQWRkcmVzcwMDCQBmAgAABQdwZXJjZW50BgkAZgIFB3BlcmNlbnQAZAkAAgECFkluY29ycmVjdCBwZXJjZW50IHJhdGUDCQAAAgkAsQIBBQxyZWZlcnJlck5hbWUAAAkAAgECFVJlZmVycmVyIG5hbWUgaW52YWxpZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUEdGhpcwkAzAgCBQljb2xsZWN0b3IFA25pbAgFA2ludgZjYWxsZXIJAAIBAitvbmx5IHNlbGYgY2FsbHMgb3IgYnkgY29sbGVjdG9yIGFyZSBhbGxvd2VkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAglyZWZlcnJlci0FDHJlZmVycmVyTmFtZQIILWFkZHJlc3MFDnJlZmVyZXJBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIJcmVmZXJyZXItBQxyZWZlcnJlck5hbWUCCC1wZXJjZW50BQdwZXJjZW50BQNuaWwBAnR4AQZ2ZXJpZnkABAttYXliZU9yYWNsZQkApggBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMCBk9yYWNsZQIABA5tYXliZUFkbWluS2V5cwMJAQlpc0RlZmluZWQBBQttYXliZU9yYWNsZQkAnQgCCQEFdmFsdWUBBQttYXliZU9yYWNsZQIJQWRtaW5LZXlzBQR1bml0BAckbWF0Y2gwBQ5tYXliZUFkbWluS2V5cwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEDGFkbWluS2V5c1N0cgUHJG1hdGNoMAQJYWRtaW5LZXlzBApzdHJpbmdLZXlzCQC1CQIFDGFkbWluS2V5c1N0cgIBLAkAzAgCCQDZBAEJAJEDAgUKc3RyaW5nS2V5cwAACQDMCAIJANkEAQkAkQMCBQpzdHJpbmdLZXlzAAEJAMwIAgkA2QQBCQCRAwIFCnN0cmluZ0tleXMAAgUDbmlsCgEPdmVyaWZ5QnlBbGxLZXlzAQVwcm9vZgMJAPQDAwgFAnR4CWJvZHlCeXRlcwUFcHJvb2YJAJEDAgUJYWRtaW5LZXlzAAAAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwUFcHJvb2YJAJEDAgUJYWRtaW5LZXlzAAEACgMJAPQDAwgFAnR4CWJvZHlCeXRlcwUFcHJvb2YJAJEDAgUJYWRtaW5LZXlzAAIAZAAACQEPY29udGFpbnNFbGVtZW50AgkAzAgCAG4JAMwIAgBlCQDMCAIACwUDbmlsCQBkAgkBD3ZlcmlmeUJ5QWxsS2V5cwEJAJEDAggFAnR4BnByb29mcwAACQEPdmVyaWZ5QnlBbGxLZXlzAQkAkQMCCAUCdHgGcHJvb2ZzAAEJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXmqaOzJ", "height": 3577980, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6PkNEyMhwoXcGVyLZ2s5QRX4LXSj3h7rVY3W6WZBtxvd Next: D68n4uT8fKVVzxhcM7pBUVeotsUkuw4oXTPBXQeyTnyD Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
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)))
246246 then splitResults
247247 else {
248248 let splitInv = Invocation([AttachedPayment(pmt.assetId, amountsIn[index])], inv.caller, inv.callerPublicKey, inv.transactionId, inv.fee, inv.feeAssetId, inv.originCaller, inv.originCallerPublicKey)
249- let splitAddresses = split(addresses[index], "_")
250- let splitAssets = split(assetsToReceive[index], "_")
249+ let splitAddresses = split_4C(addresses[index], "_")
250+ let splitAssets = split_4C(assetsToReceive[index], "_")
251251 func mapIntOrThrow (result,maybeInt) = (result :+ parseIntOrThrow(maybeInt))
252252
253253 let splitEstReceived = {
254- let $l = split(estReceived[index], "_")
254+ let $l = split_4C(estReceived[index], "_")
255255 let $s = size($l)
256256 let $acc0 = nil
257257 func $f0_1 ($a,$i) = if (($i >= $s))
290290 then inv.payments[0]
291291 else throw("Single payment required")
292292 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
293- let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
293+ let lastAssetIdKey = (split_4C(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
294294 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
295295 let assetFinalId = getAssetId(assetFinal)
296296 let balanceBefore = getBalance(assetFinalId)
303303 if ((balanceAfter == balanceAfter))
304304 then {
305305 let delta = (balanceAfter - balanceBefore)
306- let $t01075210804 = deductFee(delta, feeRate)
307- let resultAfterFee = $t01075210804._1
308- let fee = $t01075210804._2
306+ let $t01076410816 = deductFee(delta, feeRate)
307+ let resultAfterFee = $t01076410816._1
308+ let fee = $t01076410816._2
309309 if ((0 >= delta))
310310 then throw((("Swap result " + toString(delta)) + " must be positive"))
311311 else if ((minAmountToReceive > resultAfterFee))
324324 let pmt = if ((size(inv.payments) == 1))
325325 then inv.payments[0]
326326 else throw("Single payment required")
327- let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
327+ let assetIdFinal = split_4C(routesStr, ",")[(size(split_4C(routesStr, ",")) - 1)]
328328 let assetId = getAssetId(assetIdFinal)
329329 let balanceBefore = getBalance(assetId)
330330 if ((balanceBefore == balanceBefore))
353353 let pmt = if ((size(inv.payments) == 1))
354354 then inv.payments[0]
355355 else throw("Single payment required")
356- let $t01218112235 = getSwapOptions(options)
357- let deadline = $t01218112235._1
358- let referrerName = $t01218112235._2
356+ let $t01219912253 = getSwapOptions(options)
357+ let deadline = $t01219912253._1
358+ let referrerName = $t01219912253._2
359359 let isValidTimestamp = validateBlockTimestamp(deadline)
360360 if ((isValidTimestamp == isValidTimestamp))
361361 then {
362- let $t01230312383 = getReferrerDataOrThrow(referrerName)
363- if (($t01230312383 == $t01230312383))
362+ let $t01232112401 = getReferrerDataOrThrow(referrerName)
363+ if (($t01232112401 == $t01232112401))
364364 then {
365- let referrerPercent = $t01230312383._2
366- let referrerAddress = $t01230312383._1
365+ let referrerPercent = $t01232112401._2
366+ let referrerAddress = $t01232112401._1
367367 let splits = if (if (if ((size(amountsIn) != size(addresses)))
368368 then true
369369 else (size(addresses) != size(assetsToReceive)))
420420 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
421421 }
422422 let assetId = amountsOut[0].assetId
423- let $t01383313903 = deductFee(totalAmountOut, feeRatio(splits))
424- let amountMinusFee = $t01383313903._1
425- let fee = $t01383313903._2
423+ let $t01385113921 = deductFee(totalAmountOut, feeRatio(splits))
424+ let amountMinusFee = $t01385113921._1
425+ let fee = $t01385113921._2
426426 let referrerReward = fraction(fee, referrerPercent, 100)
427427 let collectorReward = (fee - referrerReward)
428428 let transfers = [ScriptTransfer(inv.caller, amountMinusFee, assetId), ScriptTransfer(collector, collectorReward, assetId)]
445445
446446 @Callable(inv)
447447 func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
448- let $t01470214756 = getSwapOptions(options)
449- let deadline = $t01470214756._1
450- let referrerName = $t01470214756._2
448+ let $t01472014774 = getSwapOptions(options)
449+ let deadline = $t01472014774._1
450+ let referrerName = $t01472014774._2
451451 let isValidTimestamp = validateBlockTimestamp(deadline)
452452 if ((isValidTimestamp == isValidTimestamp))
453453 then {
454- let $t01482414904 = getReferrerDataOrThrow(referrerName)
455- if (($t01482414904 == $t01482414904))
454+ let $t01484214922 = getReferrerDataOrThrow(referrerName)
455+ if (($t01484214922 == $t01484214922))
456456 then {
457- let referrerPercent = $t01482414904._2
458- let referrerAddress = $t01482414904._1
457+ let referrerPercent = $t01484214922._2
458+ let referrerAddress = $t01484214922._1
459459 let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
460460 if ((result == result))
461461 then if ((referrerPercent > 0))
462462 then {
463463 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
464- let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
464+ let lastAssetIdKey = (split_4C(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
465465 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
466466 let assetId = getAssetId(assetFinal)
467467 let collectorFee = result[1].amount
480480
481481 @Callable(inv)
482482 func puzzleSwap (routesStr,minToReceive,options) = {
483- let $t01597416028 = getSwapOptions(options)
484- let deadline = $t01597416028._1
485- let referrerName = $t01597416028._2
483+ let $t01599516049 = getSwapOptions(options)
484+ let deadline = $t01599516049._1
485+ let referrerName = $t01599516049._2
486486 let isValidTimestamp = validateBlockTimestamp(deadline)
487487 if ((isValidTimestamp == isValidTimestamp))
488488 then {
489- let $t01609616176 = getReferrerDataOrThrow(referrerName)
490- if (($t01609616176 == $t01609616176))
489+ let $t01611716197 = getReferrerDataOrThrow(referrerName)
490+ if (($t01611716197 == $t01611716197))
491491 then {
492- let referrerPercent = $t01609616176._2
493- let referrerAddress = $t01609616176._1
492+ let referrerPercent = $t01611716197._2
493+ let referrerAddress = $t01611716197._1
494494 if ((size(routesStr) == 0))
495495 then throw("Invalid routing")
496496 else if ((0 >= minToReceive))
503503 if ((result == result))
504504 then if ((referrerPercent > 0))
505505 then {
506- let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
506+ let assetIdFinal = split_4C(routesStr, ",")[(size(split_4C(routesStr, ",")) - 1)]
507507 let assetId = getAssetId(assetIdFinal)
508508 let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
509509 if ((balanceAfter == balanceAfter))
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringOrThrow (address,key) = valueOrErrorMessage(getString(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
55
66
77 func getIntegerOrThrow (address,key) = valueOrErrorMessage(getInteger(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
88
99
1010 func parseAddressOrThrow (maybeAddress) = valueOrErrorMessage(addressFromString(maybeAddress), (("Can't parse address from '" + maybeAddress) + "'"))
1111
1212
1313 func parseIntOrDefault (maybeInt,default) = valueOrElse(parseInt(maybeInt), default)
1414
1515
1616 func parseIntOrThrow (maybeInt) = valueOrErrorMessage(parseInt(maybeInt), (("Can't parse integer from '" + maybeInt) + "'"))
1717
1818
1919 func getAssetId (asset) = if ((asset == "WAVES"))
2020 then unit
2121 else fromBase58String(asset)
2222
2323
2424 let collector = parseAddressOrThrow(getStringOrThrow(this, "collector"))
2525
2626 let feeRate = getIntegerOrThrow(this, "fee-rate")
2727
2828 let feeGrades = split(getStringOrThrow(this, "fee-grades"), "__")
2929
3030 let swopfiOracle = parseAddressOrThrow(getStringOrThrow(this, "oracle"))
3131
3232 let swopfiRouting = parseAddressOrThrow(getStringOrThrow(swopfiOracle, "routing_address"))
3333
3434 func isSwopfiPool (address) = isDefined(getString(swopfiOracle, ("pool_" + address)))
3535
3636
3737 let wxFactory = parseAddressOrThrow(getStringOrThrow(this, "wx-factory"))
3838
3939 let wxSwap = parseAddressOrThrow(getStringOrThrow(wxFactory, "%s__swapContract"))
4040
4141 func isWxPool (address) = isDefined(getString(wxFactory, (("%s%s%s__" + address) + "__mappings__poolContract2PoolAssets")))
4242
4343
4444 let puzzleRouting = parseAddressOrThrow(getStringOrThrow(this, "puzzle-routing"))
4545
4646 let puzzleRewardAssetStr = getStringOrThrow(this, "puzzle-reward-token")
4747
4848 let puzzleRewardAssetId = getAssetId(puzzleRewardAssetStr)
4949
5050 let puzzleRefKey = "keeper"
5151
5252 let percentRate = getIntegerOrThrow(this, "percent-rate")
5353
5454 func assetIdToString (assetId) = match assetId {
5555 case asset: ByteVector =>
5656 toBase58String(asset)
5757 case waves: Unit =>
5858 "WAVES"
5959 case _ =>
6060 throw("Match error")
6161 }
6262
6363
6464 func getBalance (assetId) = match assetId {
6565 case asset: ByteVector =>
6666 assetBalance(this, asset)
6767 case waves: Unit =>
6868 wavesBalance(this).available
6969 case _ =>
7070 throw("Match error")
7171 }
7272
7373
7474 func getBalanceByAddress (address,assetId) = match assetId {
7575 case asset: ByteVector =>
7676 assetBalance(address, asset)
7777 case waves: Unit =>
7878 wavesBalance(address).available
7979 case _ =>
8080 throw("Match error")
8181 }
8282
8383
8484 func feeRatio (splits) = if ((splits > size(feeGrades)))
8585 then parseIntOrThrow(feeGrades[(size(feeGrades) - 1)])
8686 else parseIntOrThrow(feeGrades[(splits - 1)])
8787
8888
8989 func deductFee (amount,ratio) = {
9090 let fee = fraction(amount, 1, ratio)
9191 $Tuple2((amount - fee), fee)
9292 }
9393
9494
9595 func getReferrerDataOrThrow (referrerName) = if ((size(referrerName) == 0))
9696 then $Tuple2(collector, 0)
9797 else {
9898 let refAddress = parseAddressOrThrow(valueOrErrorMessage(getString(this, (("referrer-" + referrerName) + "-address")), (("referrer with name " + referrerName) + " not found")))
9999 let refPercent = valueOrElse(getInteger(this, (("referrer-" + referrerName) + "-percent")), percentRate)
100100 if (if ((0 > refPercent))
101101 then true
102102 else (refPercent > 100))
103103 then throw("Incorrect percent rate")
104104 else $Tuple2(refAddress, refPercent)
105105 }
106106
107107
108108 func getSwapOptions (options) = {
109109 func foldArguments (acc,index) = if ((index >= size(options)))
110110 then (acc :+ "")
111111 else (acc :+ options[index])
112112
113113 let indices = [0, 1]
114114 let arguments = {
115115 let $l = indices
116116 let $s = size($l)
117117 let $acc0 = nil
118118 func $f0_1 ($a,$i) = if (($i >= $s))
119119 then $a
120120 else foldArguments($a, $l[$i])
121121
122122 func $f0_2 ($a,$i) = if (($i >= $s))
123123 then $a
124124 else throw("List size exceeds 2")
125125
126126 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
127127 }
128128 let deadline = parseIntOrDefault(arguments[0], 0)
129129 let referrerName = arguments[1]
130130 $Tuple2(deadline, referrerName)
131131 }
132132
133133
134134 func validateBlockTimestamp (deadline) = if (if ((deadline > 0))
135135 then (lastBlock.timestamp > deadline)
136136 else false)
137137 then throw(((("This swap expired at timestamp " + toString(deadline)) + ". Current: ") + toString(lastBlock.timestamp)))
138138 else true
139139
140140
141141 func doSwap (pool,payment,assetReceived,estAmountToReceive,slippageTolerance) = {
142142 let poolAddress = parseAddressOrThrow(pool)
143143 let versionMajor = parseIntOrThrow(split(getStringOrThrow(poolAddress, "version"), ".")[0])
144144 let assetReceivedId = getAssetId(assetReceived)
145145 let $t044676329 = if ((0 > estAmountToReceive))
146146 then throw("estAmountToReceive must be positive")
147147 else if (isSwopfiPool(pool))
148148 then {
149149 let poolAssetA = getStringOrThrow(poolAddress, "A_asset_id")
150150 let poolAssetB = getStringOrThrow(poolAddress, "B_asset_id")
151151 let poolAssetIdA = getAssetId(poolAssetA)
152152 let poolAssetIdB = getAssetId(poolAssetB)
153153 let $t048655209 = if (if ((payment.assetId == poolAssetIdA))
154154 then (assetReceivedId == poolAssetIdB)
155155 else false)
156156 then $Tuple2(poolAssetIdA, poolAssetIdB)
157157 else if (if ((assetReceivedId == poolAssetIdA))
158158 then (payment.assetId == poolAssetIdB)
159159 else false)
160160 then $Tuple2(poolAssetIdB, poolAssetIdA)
161161 else throw("Unsupported assets pair")
162162 let assetIn = $t048655209._1
163163 let assetOut = $t048655209._2
164164 if ((versionMajor == 1))
165165 then $Tuple3(poolAddress, "callFunction", ["exchange", ["1"]])
166166 else if ((versionMajor == 2))
167167 then if ((0 >= estAmountToReceive))
168168 then throw("estAmountToReceive must be positive")
169169 else {
170170 let minAmount = (estAmountToReceive - fraction(estAmountToReceive, slippageTolerance, 1000))
171171 $Tuple3(poolAddress, "exchange", [estAmountToReceive, if ((minAmount > 0))
172172 then minAmount
173173 else 1])
174174 }
175175 else throw((("Unknown pool version '" + toString(versionMajor)) + "', but 1 or 2 expected"))
176176 }
177177 else if (isWxPool(pool))
178178 then $Tuple3(wxSwap, "swap", [1, assetReceived, toString(this)])
179179 else $Tuple3(poolAddress, "swap", [assetReceived, 0])
180180 let dApp = $t044676329._1
181181 let function = $t044676329._2
182182 let args = $t044676329._3
183183 let balanceBefore = getBalance(assetReceivedId)
184184 if ((balanceBefore == balanceBefore))
185185 then {
186186 let result = invoke(dApp, function, args, [payment])
187187 if ((result == result))
188188 then {
189189 let received = (getBalance(assetReceivedId) - balanceBefore)
190190 if ((received == received))
191191 then if ((0 >= received))
192192 then throw("Received amount from pool must be positive")
193193 else received
194194 else throw("Strict value is not equal to itself.")
195195 }
196196 else throw("Strict value is not equal to itself.")
197197 }
198198 else throw("Strict value is not equal to itself.")
199199 }
200200
201201
202202 func swapSingleRoute (inv,addresses,assetsToReceive,estReceived,slippageTolerance) = {
203203 let pmt = if ((size(inv.payments) == 1))
204204 then inv.payments[0]
205205 else throw("Single payment required")
206206 func foldSwap (previousReceived,index) = if ((index >= size(addresses)))
207207 then previousReceived
208208 else {
209209 let assetReceived = assetsToReceive[index]
210210 let assetReceivedId = getAssetId(assetReceived)
211211 match doSwap(addresses[index], previousReceived, assetReceived, estReceived[index], slippageTolerance) {
212212 case income: Int =>
213213 AttachedPayment(assetReceivedId, income)
214214 case _ =>
215215 throw("Can't handle swap result")
216216 }
217217 }
218218
219219 let received = if ((size(addresses) > 0))
220220 then {
221221 let $l = [0, 1, 2, 3, 4]
222222 let $s = size($l)
223223 let $acc0 = pmt
224224 func $f0_1 ($a,$i) = if (($i >= $s))
225225 then $a
226226 else foldSwap($a, $l[$i])
227227
228228 func $f0_2 ($a,$i) = if (($i >= $s))
229229 then $a
230230 else throw("List size exceeds 5")
231231
232232 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
233233 }
234234 else throw("Path cannot be empty")
235235 if ((0 >= received.amount))
236236 then throw((("Swap result " + toString(received.amount)) + " must be positive"))
237237 else received
238238 }
239239
240240
241241 func swapMultipleRoutes (inv,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance) = {
242242 let pmt = if ((size(inv.payments) == 1))
243243 then inv.payments[0]
244244 else throw("Single payment required")
245245 func foldSplit (splitResults,index) = if ((index >= size(addresses)))
246246 then splitResults
247247 else {
248248 let splitInv = Invocation([AttachedPayment(pmt.assetId, amountsIn[index])], inv.caller, inv.callerPublicKey, inv.transactionId, inv.fee, inv.feeAssetId, inv.originCaller, inv.originCallerPublicKey)
249- let splitAddresses = split(addresses[index], "_")
250- let splitAssets = split(assetsToReceive[index], "_")
249+ let splitAddresses = split_4C(addresses[index], "_")
250+ let splitAssets = split_4C(assetsToReceive[index], "_")
251251 func mapIntOrThrow (result,maybeInt) = (result :+ parseIntOrThrow(maybeInt))
252252
253253 let splitEstReceived = {
254- let $l = split(estReceived[index], "_")
254+ let $l = split_4C(estReceived[index], "_")
255255 let $s = size($l)
256256 let $acc0 = nil
257257 func $f0_1 ($a,$i) = if (($i >= $s))
258258 then $a
259259 else mapIntOrThrow($a, $l[$i])
260260
261261 func $f0_2 ($a,$i) = if (($i >= $s))
262262 then $a
263263 else throw("List size exceeds 5")
264264
265265 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
266266 }
267267 let result = swapSingleRoute(splitInv, splitAddresses, splitAssets, splitEstReceived, slippageTolerance)
268268 if ((result == result))
269269 then (splitResults :+ result)
270270 else throw("Strict value is not equal to itself.")
271271 }
272272
273273 let $l = [0, 1, 2]
274274 let $s = size($l)
275275 let $acc0 = nil
276276 func $f0_1 ($a,$i) = if (($i >= $s))
277277 then $a
278278 else foldSplit($a, $l[$i])
279279
280280 func $f0_2 ($a,$i) = if (($i >= $s))
281281 then $a
282282 else throw("List size exceeds 3")
283283
284284 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
285285 }
286286
287287
288288 func wrapSwopfiSwap (inv,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = {
289289 let pmt = if ((size(inv.payments) == 1))
290290 then inv.payments[0]
291291 else throw("Single payment required")
292292 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
293- let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
293+ let lastAssetIdKey = (split_4C(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
294294 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
295295 let assetFinalId = getAssetId(assetFinal)
296296 let balanceBefore = getBalance(assetFinalId)
297297 if ((balanceBefore == balanceBefore))
298298 then {
299299 let result = invoke(swopfiRouting, "routingTrade", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive], [pmt])
300300 if ((result == result))
301301 then {
302302 let balanceAfter = getBalance(assetFinalId)
303303 if ((balanceAfter == balanceAfter))
304304 then {
305305 let delta = (balanceAfter - balanceBefore)
306- let $t01075210804 = deductFee(delta, feeRate)
307- let resultAfterFee = $t01075210804._1
308- let fee = $t01075210804._2
306+ let $t01076410816 = deductFee(delta, feeRate)
307+ let resultAfterFee = $t01076410816._1
308+ let fee = $t01076410816._2
309309 if ((0 >= delta))
310310 then throw((("Swap result " + toString(delta)) + " must be positive"))
311311 else if ((minAmountToReceive > resultAfterFee))
312312 then throw(((("Swap result " + toString(resultAfterFee)) + " is less then expected ") + toString(minAmountToReceive)))
313313 else [ScriptTransfer(inv.caller, resultAfterFee, assetFinalId), ScriptTransfer(collector, fee, assetFinalId)]
314314 }
315315 else throw("Strict value is not equal to itself.")
316316 }
317317 else throw("Strict value is not equal to itself.")
318318 }
319319 else throw("Strict value is not equal to itself.")
320320 }
321321
322322
323323 func wrapPuzzleSwap (inv,routesStr,minToReceive) = {
324324 let pmt = if ((size(inv.payments) == 1))
325325 then inv.payments[0]
326326 else throw("Single payment required")
327- let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
327+ let assetIdFinal = split_4C(routesStr, ",")[(size(split_4C(routesStr, ",")) - 1)]
328328 let assetId = getAssetId(assetIdFinal)
329329 let balanceBefore = getBalance(assetId)
330330 if ((balanceBefore == balanceBefore))
331331 then {
332332 let result = invoke(puzzleRouting, "swapWithReferral", [routesStr, minToReceive, puzzleRefKey], [pmt])
333333 if ((result == result))
334334 then {
335335 let balanceAfter = getBalance(assetId)
336336 if ((balanceAfter == balanceAfter))
337337 then {
338338 let deltaProxy = (balanceAfter - balanceBefore)
339339 if ((deltaProxy == deltaProxy))
340340 then [ScriptTransfer(inv.caller, deltaProxy, assetId)]
341341 else throw("Strict value is not equal to itself.")
342342 }
343343 else throw("Strict value is not equal to itself.")
344344 }
345345 else throw("Strict value is not equal to itself.")
346346 }
347347 else throw("Strict value is not equal to itself.")
348348 }
349349
350350
351351 @Callable(inv)
352352 func swap (amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
353353 let pmt = if ((size(inv.payments) == 1))
354354 then inv.payments[0]
355355 else throw("Single payment required")
356- let $t01218112235 = getSwapOptions(options)
357- let deadline = $t01218112235._1
358- let referrerName = $t01218112235._2
356+ let $t01219912253 = getSwapOptions(options)
357+ let deadline = $t01219912253._1
358+ let referrerName = $t01219912253._2
359359 let isValidTimestamp = validateBlockTimestamp(deadline)
360360 if ((isValidTimestamp == isValidTimestamp))
361361 then {
362- let $t01230312383 = getReferrerDataOrThrow(referrerName)
363- if (($t01230312383 == $t01230312383))
362+ let $t01232112401 = getReferrerDataOrThrow(referrerName)
363+ if (($t01232112401 == $t01232112401))
364364 then {
365- let referrerPercent = $t01230312383._2
366- let referrerAddress = $t01230312383._1
365+ let referrerPercent = $t01232112401._2
366+ let referrerAddress = $t01232112401._1
367367 let splits = if (if (if ((size(amountsIn) != size(addresses)))
368368 then true
369369 else (size(addresses) != size(assetsToReceive)))
370370 then true
371371 else (size(assetsToReceive) != size(estReceived)))
372372 then throw("Swap arguments must be the same size")
373373 else if (if ((1 > size(amountsIn)))
374374 then true
375375 else (size(amountsIn) > 3))
376376 then throw("Supported swap of 1 to 3 splits")
377377 else size(amountsIn)
378378 if ((splits == splits))
379379 then {
380380 let validSlippageTolerance = if (if ((0 > slippageTolerance))
381381 then true
382382 else (slippageTolerance > 1000))
383383 then throw("Slippage tolerance must be non-negative and less than or equal to 1000")
384384 else slippageTolerance
385385 func sumIn (accum,next) = (accum + next)
386386
387387 let totalAmountIn = {
388388 let $l = amountsIn
389389 let $s = size($l)
390390 let $acc0 = 0
391391 func $f0_1 ($a,$i) = if (($i >= $s))
392392 then $a
393393 else sumIn($a, $l[$i])
394394
395395 func $f0_2 ($a,$i) = if (($i >= $s))
396396 then $a
397397 else throw("List size exceeds 3")
398398
399399 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
400400 }
401401 let amountsOut = if ((pmt.amount != totalAmountIn))
402402 then throw(((("Total amount after split " + toString(totalAmountIn)) + " is not equal original payment amount ") + toString(pmt.amount)))
403403 else swapMultipleRoutes(inv, amountsIn, addresses, assetsToReceive, estReceived, validSlippageTolerance)
404404 if ((amountsOut == amountsOut))
405405 then {
406406 func sumOut (total,next) = (total + next.amount)
407407
408408 let totalAmountOut = {
409409 let $l = amountsOut
410410 let $s = size($l)
411411 let $acc0 = 0
412412 func $f1_1 ($a,$i) = if (($i >= $s))
413413 then $a
414414 else sumOut($a, $l[$i])
415415
416416 func $f1_2 ($a,$i) = if (($i >= $s))
417417 then $a
418418 else throw("List size exceeds 3")
419419
420420 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
421421 }
422422 let assetId = amountsOut[0].assetId
423- let $t01383313903 = deductFee(totalAmountOut, feeRatio(splits))
424- let amountMinusFee = $t01383313903._1
425- let fee = $t01383313903._2
423+ let $t01385113921 = deductFee(totalAmountOut, feeRatio(splits))
424+ let amountMinusFee = $t01385113921._1
425+ let fee = $t01385113921._2
426426 let referrerReward = fraction(fee, referrerPercent, 100)
427427 let collectorReward = (fee - referrerReward)
428428 let transfers = [ScriptTransfer(inv.caller, amountMinusFee, assetId), ScriptTransfer(collector, collectorReward, assetId)]
429429 if ((minReceived > amountMinusFee))
430430 then throw(((("Swap result " + toString(amountMinusFee)) + " is less then expected ") + toString(minReceived)))
431431 else if ((referrerReward == 0))
432432 then transfers
433433 else (transfers :+ ScriptTransfer(referrerAddress, referrerReward, assetId))
434434 }
435435 else throw("Strict value is not equal to itself.")
436436 }
437437 else throw("Strict value is not equal to itself.")
438438 }
439439 else throw("Strict value is not equal to itself.")
440440 }
441441 else throw("Strict value is not equal to itself.")
442442 }
443443
444444
445445
446446 @Callable(inv)
447447 func swopfiSwap (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
448- let $t01470214756 = getSwapOptions(options)
449- let deadline = $t01470214756._1
450- let referrerName = $t01470214756._2
448+ let $t01472014774 = getSwapOptions(options)
449+ let deadline = $t01472014774._1
450+ let referrerName = $t01472014774._2
451451 let isValidTimestamp = validateBlockTimestamp(deadline)
452452 if ((isValidTimestamp == isValidTimestamp))
453453 then {
454- let $t01482414904 = getReferrerDataOrThrow(referrerName)
455- if (($t01482414904 == $t01482414904))
454+ let $t01484214922 = getReferrerDataOrThrow(referrerName)
455+ if (($t01484214922 == $t01484214922))
456456 then {
457- let referrerPercent = $t01482414904._2
458- let referrerAddress = $t01482414904._1
457+ let referrerPercent = $t01484214922._2
458+ let referrerAddress = $t01484214922._1
459459 let result = wrapSwopfiSwap(inv, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive)
460460 if ((result == result))
461461 then if ((referrerPercent > 0))
462462 then {
463463 let lastExchanger = valueOrErrorMessage(addressFromString(exchangers[(size(exchangers) - 1)]), "Can't parse last exchanger swopfi address")
464- let lastAssetIdKey = (split(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
464+ let lastAssetIdKey = (split_4C(routingAssetsKeys[(size(routingAssetsKeys) - 1)], "_")[0] + "_asset_id")
465465 let assetFinal = valueOrErrorMessage(getString(lastExchanger, lastAssetIdKey), ((("Can't read parameter '" + lastAssetIdKey) + "' for exchanger ") + toString(lastExchanger)))
466466 let assetId = getAssetId(assetFinal)
467467 let collectorFee = result[1].amount
468468 let referrerReward = fraction(collectorFee, referrerPercent, 100)
469469 [result[0], ScriptTransfer(collector, (collectorFee - referrerReward), assetId), ScriptTransfer(referrerAddress, referrerReward, assetId)]
470470 }
471471 else result
472472 else throw("Strict value is not equal to itself.")
473473 }
474474 else throw("Strict value is not equal to itself.")
475475 }
476476 else throw("Strict value is not equal to itself.")
477477 }
478478
479479
480480
481481 @Callable(inv)
482482 func puzzleSwap (routesStr,minToReceive,options) = {
483- let $t01597416028 = getSwapOptions(options)
484- let deadline = $t01597416028._1
485- let referrerName = $t01597416028._2
483+ let $t01599516049 = getSwapOptions(options)
484+ let deadline = $t01599516049._1
485+ let referrerName = $t01599516049._2
486486 let isValidTimestamp = validateBlockTimestamp(deadline)
487487 if ((isValidTimestamp == isValidTimestamp))
488488 then {
489- let $t01609616176 = getReferrerDataOrThrow(referrerName)
490- if (($t01609616176 == $t01609616176))
489+ let $t01611716197 = getReferrerDataOrThrow(referrerName)
490+ if (($t01611716197 == $t01611716197))
491491 then {
492- let referrerPercent = $t01609616176._2
493- let referrerAddress = $t01609616176._1
492+ let referrerPercent = $t01611716197._2
493+ let referrerAddress = $t01611716197._1
494494 if ((size(routesStr) == 0))
495495 then throw("Invalid routing")
496496 else if ((0 >= minToReceive))
497497 then throw("Sum to receive is to low")
498498 else {
499499 let balanceBefore = getBalanceByAddress(collector, puzzleRewardAssetId)
500500 if ((balanceBefore == balanceBefore))
501501 then {
502502 let result = wrapPuzzleSwap(inv, routesStr, minToReceive)
503503 if ((result == result))
504504 then if ((referrerPercent > 0))
505505 then {
506- let assetIdFinal = split(routesStr, ",")[(size(split(routesStr, ",")) - 1)]
506+ let assetIdFinal = split_4C(routesStr, ",")[(size(split_4C(routesStr, ",")) - 1)]
507507 let assetId = getAssetId(assetIdFinal)
508508 let balanceAfter = getBalanceByAddress(collector, puzzleRewardAssetId)
509509 if ((balanceAfter == balanceAfter))
510510 then {
511511 let delta = (balanceAfter - balanceBefore)
512512 if ((delta == delta))
513513 then {
514514 let reward = fraction(delta, referrerPercent, 100)
515515 let res = invoke(collector, "claimReferrerReward", [reward, puzzleRewardAssetStr], nil)
516516 if ((res == res))
517517 then (result :+ ScriptTransfer(referrerAddress, reward, puzzleRewardAssetId))
518518 else throw("Strict value is not equal to itself.")
519519 }
520520 else throw("Strict value is not equal to itself.")
521521 }
522522 else throw("Strict value is not equal to itself.")
523523 }
524524 else result
525525 else throw("Strict value is not equal to itself.")
526526 }
527527 else throw("Strict value is not equal to itself.")
528528 }
529529 }
530530 else throw("Strict value is not equal to itself.")
531531 }
532532 else throw("Strict value is not equal to itself.")
533533 }
534534
535535
536536
537537 @Callable(inv)
538538 func addReferrer (referrerName,refererAddress,percent) = {
539539 let address = parseAddressOrThrow(refererAddress)
540540 if (if ((0 > percent))
541541 then true
542542 else (percent > 100))
543543 then throw("Incorrect percent rate")
544544 else if ((size(referrerName) == 0))
545545 then throw("Referrer name invalid")
546546 else if (!(containsElement([this, collector], inv.caller)))
547547 then throw("only self calls or by collector are allowed")
548548 else [StringEntry((("referrer-" + referrerName) + "-address"), refererAddress), IntegerEntry((("referrer-" + referrerName) + "-percent"), percent)]
549549 }
550550
551551
552552 @Verifier(tx)
553553 func verify () = {
554554 let maybeOracle = addressFromString(valueOrElse(getString(this, "Oracle"), ""))
555555 let maybeAdminKeys = if (isDefined(maybeOracle))
556556 then getString(value(maybeOracle), "AdminKeys")
557557 else unit
558558 match maybeAdminKeys {
559559 case adminKeysStr: String =>
560560 let adminKeys = {
561561 let stringKeys = split(adminKeysStr, ",")
562562 [fromBase58String(stringKeys[0]), fromBase58String(stringKeys[1]), fromBase58String(stringKeys[2])]
563563 }
564564 func verifyByAllKeys (proof) = if (sigVerify(tx.bodyBytes, proof, adminKeys[0]))
565565 then 1
566566 else if (sigVerify(tx.bodyBytes, proof, adminKeys[1]))
567567 then 10
568568 else if (sigVerify(tx.bodyBytes, proof, adminKeys[2]))
569569 then 100
570570 else 0
571571
572572 containsElement([110, 101, 11], (verifyByAllKeys(tx.proofs[0]) + verifyByAllKeys(tx.proofs[1])))
573573 case _ =>
574574 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
575575 }
576576 }
577577

github/deemru/w8io/3ef1775 
91.98 ms