tx · D3Gyz4Q38xTo5JbNBrAUYwvBYqZ4qbS2gGqaFFFc9VPV 3MLBzBdXKrwSnVGdqW1jJLEYf5iNdU7LyX5: -0.01000000 Waves 2025.12.03 00:55 [781240] smart account 3MLBzBdXKrwSnVGdqW1jJLEYf5iNdU7LyX5 > SELF 0.00000000 Waves
{ "type": 13, "id": "D3Gyz4Q38xTo5JbNBrAUYwvBYqZ4qbS2gGqaFFFc9VPV", "fee": 1000000, "feeAssetId": null, "timestamp": 1764712510588, "version": 2, "chainId": 82, "sender": "3MLBzBdXKrwSnVGdqW1jJLEYf5iNdU7LyX5", "senderPublicKey": "HDggA94jFsL54zpCVmmsEV52tqqvgjet5m4KGFpsczU1", "proofs": [ "5nkWEQs2CNQCm3DE9zVjq9XCZc2HiFSfoVKDUaZW4z2BY1SEreGMdDNX11Q6tWUS1VujniEERUGuArKLX9tsuVVX" ], "script": "base64:BgIaCAISBAoCCAESAwoBCBIFCgMICAESBAoCCAgJAAljb25maWdTdHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwINY29uZmlnQWRkcmVzcwIjM1BNb0VpYmRMZVdxY1VSUTgzNTFYaGFXd3lhY0RjN0c0ZTUADkNPTkZJR19BRERSRVNTAwkAAAIFCWNvbmZpZ1N0cgIABQR0aGlzCQEHQWRkcmVzcwEJANkEAQUJY29uZmlnU3RyAAphZ2dyZWdhdG9yCQELdmFsdWVPckVsc2UCCQCdCAIFDkNPTkZJR19BRERSRVNTAhNBR0dSRUdBVE9SX0NPTlRSQUNUAiMzUEdGSHpWR1Q0TlRpZ3dDS1AxTmN3b1hrb2RWWnd2QnV1VQAPcHJveHlBZGRyZXNzU3RyCQELdmFsdWVPckVsc2UCCQCdCAIFDkNPTkZJR19BRERSRVNTAgxwcm94eUFkZHJlc3MCIzNQTWNNaU1FczZ3NTZOUkdhY2tzWHRGRzV6Uzdkb0U5ZnBMAQx0cnlHZXRTdHJpbmcBA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFiBQckbWF0Y2gwBQFiAgABDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDmdldEFzc2V0U3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgIFV0FWRVMBDWdldEFzc2V0Qnl0ZXMBCmFzc2V0SWRTdHIDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMFBHVuaXQJANkEAQUKYXNzZXRJZFN0cgEOZ2V0RGFwcEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQQBaQELY3JlYXRlT3JkZXICBmFzc2V0MQdhbW91bnQxBA9uZXdPcmRlcnNBbW91bnQJAGQCCQENdHJ5R2V0SW50ZWdlcgECE2dsb2JhbF9vcmRlcnNBbW91bnQAAQQHb3JkZXJJZAkApAMBBQ9uZXdPcmRlcnNBbW91bnQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhtZb3UgaGF2ZSB0byBwcm92aWRlIHBheW1lbnQDCQBnAgAABQdhbW91bnQxCQACAQIiQW1vdW50MSBjYW5ub3QgYmUgbGVzcyBvciBlcXVhbHMgMAQGYXNzZXQwCQEOZ2V0QXNzZXRTdHJpbmcBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEB2Ftb3VudDAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAp1c2VyT3JkZXJzCQEMdHJ5R2V0U3RyaW5nAQkArAICCQCsAgICBXVzZXJfCQClCAEIBQFpBmNhbGxlcgIHX29yZGVycwQNbmV3VXNlck9yZGVycwQHJG1hdGNoMAUKdXNlck9yZGVycwMJAAACAgAFByRtYXRjaDAFB29yZGVySWQJAKwCAgkArAICBQp1c2VyT3JkZXJzAgEsBQdvcmRlcklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhNnbG9iYWxfb3JkZXJzQW1vdW50BQ9uZXdPcmRlcnNBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3Rva2VuMAUGYXNzZXQwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAghfYW1vdW50MAUHYW1vdW50MAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIIX2Ftb3VudDEFB2Ftb3VudDEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3Rva2VuMQUGYXNzZXQxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgtfZnVsZmlsbGVkMAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgtfZnVsZmlsbGVkMQAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCBl9vd25lcgkApQgBCAUBaQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3N0YXR1cwIGYWN0aXZlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgpfdGltZXN0YW1wCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgVfdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgV1c2VyXwkApQgBCAUBaQZjYWxsZXICB19vcmRlcnMFDW5ld1VzZXJPcmRlcnMFA25pbAFpAQxmdWxmaWxsT3JkZXIBB29yZGVySWQECm9yZGVyT3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgZfb3duZXICF0Nhbm5vdCBmaW5kIG9yZGVyIG93bmVyBAtvcmRlclN0YXR1cwkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgdfc3RhdHVzBAtvcmRlckFzc2V0MAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCB190b2tlbjACEkNhbm5vdCBmaW5kIHRva2VuMAQMb3JkZXJBbW91bnQwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIIX2Ftb3VudDACE0Nhbm5vdCBmaW5kIGFtb3VudDAED29yZGVyRnVsZmlsbGVkMAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCC19mdWxmaWxsZWQwAhZDYW5ub3QgZmluZCBmdWxmaWxsZWQwBBBvcmRlckFtb3VudDBMZWZ0CQBlAgUMb3JkZXJBbW91bnQwBQ9vcmRlckZ1bGZpbGxlZDAEC29yZGVyQXNzZXQxCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3Rva2VuMQISQ2Fubm90IGZpbmQgdG9rZW4xBAxvcmRlckFtb3VudDEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAghfYW1vdW50MQITQ2Fubm90IGZpbmQgYW1vdW50MQQPb3JkZXJGdWxmaWxsZWQxCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAILX2Z1bGZpbGxlZDECFkNhbm5vdCBmaW5kIGZ1bGZpbGxlZDEEEG9yZGVyQW1vdW50MUxlZnQJAGUCBQxvcmRlckFtb3VudDEFD29yZGVyRnVsZmlsbGVkMQMJAQIhPQIFC29yZGVyU3RhdHVzAgZhY3RpdmUJAAIBAiBPcmRlciBhbHJlYWR5IGNsb3NlZCBvciBjYW5jZWxlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECG1lvdSBoYXZlIHRvIHByb3ZpZGUgcGF5bWVudAQNY2FsbGVyQWRkcmVzcwgFAWkGY2FsbGVyBAxvd25lckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCm9yZGVyT3duZXIEDXBheW1lbnRBc3NldDEJAQ5nZXRBc3NldFN0cmluZwEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQOcGF5bWVudEFtb3VudDEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AwkBAiE9AgUNcGF5bWVudEFzc2V0MQULb3JkZXJBc3NldDEJAAIBAhNXcm9uZyBwYXltZW50IGFzc2V0AwkAZwIFDnBheW1lbnRBbW91bnQxBRBvcmRlckFtb3VudDFMZWZ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDWNhbGxlckFkZHJlc3MJAGUCBQ5wYXltZW50QW1vdW50MQUQb3JkZXJBbW91bnQxTGVmdAkBDWdldEFzc2V0Qnl0ZXMBBQtvcmRlckFzc2V0MQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ1jYWxsZXJBZGRyZXNzBRBvcmRlckFtb3VudDBMZWZ0CQENZ2V0QXNzZXRCeXRlcwEFC29yZGVyQXNzZXQwCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDG93bmVyQWRkcmVzcwUQb3JkZXJBbW91bnQxTGVmdAkBDWdldEFzc2V0Qnl0ZXMBBQ1wYXltZW50QXNzZXQxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgtfZnVsZmlsbGVkMAkAZAIFD29yZGVyRnVsZmlsbGVkMAUQb3JkZXJBbW91bnQwTGVmdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAILX2Z1bGZpbGxlZDEJAGQCBQ9vcmRlckZ1bGZpbGxlZDEFEG9yZGVyQW1vdW50MUxlZnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3N0YXR1cwIGY2xvc2VkBQNuaWwEB2Ftb3VudDAJAG4EBQxvcmRlckFtb3VudDAFDnBheW1lbnRBbW91bnQxBQxvcmRlckFtb3VudDEFBUZMT09SCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDG93bmVyQWRkcmVzcwUOcGF5bWVudEFtb3VudDEJAQ1nZXRBc3NldEJ5dGVzAQUNcGF5bWVudEFzc2V0MQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ1jYWxsZXJBZGRyZXNzBQdhbW91bnQwCQENZ2V0QXNzZXRCeXRlcwEFC29yZGVyQXNzZXQwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgtfZnVsZmlsbGVkMAkAZAIFD29yZGVyRnVsZmlsbGVkMAUHYW1vdW50MAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAILX2Z1bGZpbGxlZDEJAGQCBQ9vcmRlckZ1bGZpbGxlZDEFDnBheW1lbnRBbW91bnQxBQNuaWwBaQEbZnVsZmlsbE9yZGVyQW5kU3dhcENhc2hiYWNrAwdvcmRlcklkBnBhcmFtcwxtaW5Ub1JlY2VpdmUECm9yZGVyT3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgZfb3duZXICF0Nhbm5vdCBmaW5kIG9yZGVyIG93bmVyBAtvcmRlclN0YXR1cwkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgdfc3RhdHVzBAtvcmRlckFzc2V0MAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCB190b2tlbjACEkNhbm5vdCBmaW5kIHRva2VuMAQMb3JkZXJBbW91bnQwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIIX2Ftb3VudDACE0Nhbm5vdCBmaW5kIGFtb3VudDAED29yZGVyRnVsZmlsbGVkMAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCC19mdWxmaWxsZWQwAhZDYW5ub3QgZmluZCBmdWxmaWxsZWQwBBBvcmRlckFtb3VudDBMZWZ0CQBlAgUMb3JkZXJBbW91bnQwBQ9vcmRlckZ1bGZpbGxlZDAEC29yZGVyQXNzZXQxCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3Rva2VuMQISQ2Fubm90IGZpbmQgdG9rZW4xBAxvcmRlckFtb3VudDEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAghfYW1vdW50MQITQ2Fubm90IGZpbmQgYW1vdW50MQQPb3JkZXJGdWxmaWxsZWQxCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAILX2Z1bGZpbGxlZDECFkNhbm5vdCBmaW5kIGZ1bGZpbGxlZDEEEG9yZGVyQW1vdW50MUxlZnQJAGUCBQxvcmRlckFtb3VudDEFD29yZGVyRnVsZmlsbGVkMQMJAQIhPQIFC29yZGVyU3RhdHVzAgZhY3RpdmUJAAIBAiBPcmRlciBhbHJlYWR5IGNsb3NlZCBvciBjYW5jZWxlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECG1lvdSBoYXZlIHRvIHByb3ZpZGUgcGF5bWVudAQNY2FsbGVyQWRkcmVzcwgFAWkGY2FsbGVyBAxvd25lckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCm9yZGVyT3duZXIEDXBheW1lbnRBc3NldDEJAQ5nZXRBc3NldFN0cmluZwEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQOcGF5bWVudEFtb3VudDEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AwkBAiE9AgUNcGF5bWVudEFzc2V0MQULb3JkZXJBc3NldDEJAAIBAhNXcm9uZyBwYXltZW50IGFzc2V0AwkAZgIFEG9yZGVyQW1vdW50MUxlZnQFDnBheW1lbnRBbW91bnQxCQACAQJKV2hlbiB5b3UgdXNlIHRoaXMgZnVuYyBwYXJ0aWFseSBmdWxsZmlsbCBkaXNhYmxlZCwgcGxlYXNlIHVzZSBmdWxmaWxsT3JkZXIEEWFnZ3JlZ2F0b3JBZGRyZXNzCQEHQWRkcmVzcwEJANkEAQUKYWdncmVnYXRvcgQOY2FzaGJhY2tBbW91bnQJAGUCBQ5wYXltZW50QW1vdW50MQUQb3JkZXJBbW91bnQxTGVmdAQNYmFsYW5jZUJlZm9yZQkBDmdldERhcHBCYWxhbmNlAQkBDWdldEFzc2V0Qnl0ZXMBBQtvcmRlckFzc2V0MAMJAAACBQ1iYWxhbmNlQmVmb3JlBQ1iYWxhbmNlQmVmb3JlBAZzd2FwVHgJAPwHBAURYWdncmVnYXRvckFkZHJlc3MCBHN3YXAJAMwIAgUGcGFyYW1zCQDMCAIFDG1pblRvUmVjZWl2ZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQENZ2V0QXNzZXRCeXRlcwEFC29yZGVyQXNzZXQxBQ5jYXNoYmFja0Ftb3VudAUDbmlsAwkAAAIFBnN3YXBUeAUGc3dhcFR4BAxiYWxhbmNlQWZ0ZXIJAQ5nZXREYXBwQmFsYW5jZQEJAQ1nZXRBc3NldEJ5dGVzAQULb3JkZXJBc3NldDADCQAAAgUMYmFsYW5jZUFmdGVyBQxiYWxhbmNlQWZ0ZXIECGNhc2hiYWNrCQBlAgUMYmFsYW5jZUFmdGVyBQ1iYWxhbmNlQmVmb3JlAwkAAAIFCGNhc2hiYWNrBQhjYXNoYmFjawkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ1jYWxsZXJBZGRyZXNzBRBvcmRlckFtb3VudDBMZWZ0CQENZ2V0QXNzZXRCeXRlcwEFC29yZGVyQXNzZXQwCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDWNhbGxlckFkZHJlc3MFCGNhc2hiYWNrCQENZ2V0QXNzZXRCeXRlcwEFC29yZGVyQXNzZXQwCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDG93bmVyQWRkcmVzcwUQb3JkZXJBbW91bnQxTGVmdAkBDWdldEFzc2V0Qnl0ZXMBBQ1wYXltZW50QXNzZXQxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgtfZnVsZmlsbGVkMAkAZAIFD29yZGVyRnVsZmlsbGVkMAUQb3JkZXJBbW91bnQwTGVmdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAILX2Z1bGZpbGxlZDEJAGQCBQ9vcmRlckZ1bGZpbGxlZDEFEG9yZGVyQW1vdW50MUxlZnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3N0YXR1cwIGY2xvc2VkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELY2FuY2VsT3JkZXICB29yZGVySWQLcHJveHlDYWxsZXIECm9yZGVyT3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgZfb3duZXICF0Nhbm5vdCBmaW5kIG9yZGVyIG93bmVyBAtvcmRlclN0YXR1cwkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgdfc3RhdHVzBAtvcmRlckFzc2V0MAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCB190b2tlbjACEkNhbm5vdCBmaW5kIHRva2VuMAQMb3JkZXJBbW91bnQwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIIX2Ftb3VudDACE0Nhbm5vdCBmaW5kIGFtb3VudDAED29yZGVyRnVsZmlsbGVkMAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCC19mdWxmaWxsZWQwAhZDYW5ub3QgZmluZCBmdWxmaWxsZWQwBBBvcmRlckFtb3VudDBMZWZ0CQBlAgUMb3JkZXJBbW91bnQwBQ9vcmRlckZ1bGZpbGxlZDADAwkBAiE9AgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBQpvcmRlck93bmVyCQECIT0CCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMFD3Byb3h5QWRkcmVzc1N0cgcJAAIBAhdZb3UgY2Fubm90IGNhbmNlbCBvcmRlcgMJAQIhPQIFC29yZGVyU3RhdHVzAgZhY3RpdmUJAAIBAhtvcmRlciBpcyBjbG9zZWQgb3IgY2FuY2VsZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUKb3JkZXJPd25lcgUQb3JkZXJBbW91bnQwTGVmdAkBDWdldEFzc2V0Qnl0ZXMBBQtvcmRlckFzc2V0MAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgdfc3RhdHVzAghjYW5jZWxlZAUDbmlsAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleVBhRHo=", "height": 781240, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
| Old | New | Differences | |
|---|---|---|---|
| 1 | - | # no script | |
| 1 | + | {-# STDLIB_VERSION 6 #-} | |
| 2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
| 3 | + | {-# CONTENT_TYPE DAPP #-} | |
| 4 | + | let configStr = valueOrElse(getString(this, "configAddress"), "3PMoEibdLeWqcURQ8351XhaWwyacDc7G4e5") | |
| 5 | + | ||
| 6 | + | let CONFIG_ADDRESS = if ((configStr == "")) | |
| 7 | + | then this | |
| 8 | + | else Address(fromBase58String(configStr)) | |
| 9 | + | ||
| 10 | + | let aggregator = valueOrElse(getString(CONFIG_ADDRESS, "AGGREGATOR_CONTRACT"), "3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU") | |
| 11 | + | ||
| 12 | + | let proxyAddressStr = valueOrElse(getString(CONFIG_ADDRESS, "proxyAddress"), "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL") | |
| 13 | + | ||
| 14 | + | func tryGetString (key) = match getString(this, key) { | |
| 15 | + | case b: String => | |
| 16 | + | b | |
| 17 | + | case _ => | |
| 18 | + | "" | |
| 19 | + | } | |
| 20 | + | ||
| 21 | + | ||
| 22 | + | func tryGetInteger (key) = match getInteger(this, key) { | |
| 23 | + | case b: Int => | |
| 24 | + | b | |
| 25 | + | case _ => | |
| 26 | + | 0 | |
| 27 | + | } | |
| 28 | + | ||
| 29 | + | ||
| 30 | + | func getAssetString (assetId) = match assetId { | |
| 31 | + | case b: ByteVector => | |
| 32 | + | toBase58String(b) | |
| 33 | + | case _ => | |
| 34 | + | "WAVES" | |
| 35 | + | } | |
| 36 | + | ||
| 37 | + | ||
| 38 | + | func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES")) | |
| 39 | + | then unit | |
| 40 | + | else fromBase58String(assetIdStr) | |
| 41 | + | ||
| 42 | + | ||
| 43 | + | func getDappBalance (assetId) = match assetId { | |
| 44 | + | case b: ByteVector => | |
| 45 | + | assetBalance(this, b) | |
| 46 | + | case _ => | |
| 47 | + | wavesBalance(this).available | |
| 48 | + | } | |
| 49 | + | ||
| 50 | + | ||
| 51 | + | @Callable(i) | |
| 52 | + | func createOrder (asset1,amount1) = { | |
| 53 | + | let newOrdersAmount = (tryGetInteger("global_ordersAmount") + 1) | |
| 54 | + | let orderId = toString(newOrdersAmount) | |
| 55 | + | if ((size(i.payments) != 1)) | |
| 56 | + | then throw("You have to provide payment") | |
| 57 | + | else if ((0 >= amount1)) | |
| 58 | + | then throw("Amount1 cannot be less or equals 0") | |
| 59 | + | else { | |
| 60 | + | let asset0 = getAssetString(i.payments[0].assetId) | |
| 61 | + | let amount0 = i.payments[0].amount | |
| 62 | + | let userOrders = tryGetString((("user_" + toString(i.caller)) + "_orders")) | |
| 63 | + | let newUserOrders = match userOrders { | |
| 64 | + | case _ => | |
| 65 | + | if (("" == $match0)) | |
| 66 | + | then orderId | |
| 67 | + | else ((userOrders + ",") + orderId) | |
| 68 | + | } | |
| 69 | + | [IntegerEntry("global_ordersAmount", newOrdersAmount), StringEntry((("order_" + orderId) + "_token0"), asset0), IntegerEntry((("order_" + orderId) + "_amount0"), amount0), IntegerEntry((("order_" + orderId) + "_amount1"), amount1), StringEntry((("order_" + orderId) + "_token1"), asset1), IntegerEntry((("order_" + orderId) + "_fulfilled0"), 0), IntegerEntry((("order_" + orderId) + "_fulfilled1"), 0), StringEntry((("order_" + orderId) + "_owner"), toString(i.caller)), StringEntry((("order_" + orderId) + "_status"), "active"), IntegerEntry((("order_" + orderId) + "_timestamp"), lastBlock.timestamp), StringEntry((("order_" + orderId) + "_txId"), toBase58String(i.transactionId)), StringEntry((("user_" + toString(i.caller)) + "_orders"), newUserOrders)] | |
| 70 | + | } | |
| 71 | + | } | |
| 72 | + | ||
| 73 | + | ||
| 74 | + | ||
| 75 | + | @Callable(i) | |
| 76 | + | func fulfillOrder (orderId) = { | |
| 77 | + | let orderOwner = valueOrErrorMessage(getString((("order_" + orderId) + "_owner")), "Cannot find order owner") | |
| 78 | + | let orderStatus = getString((("order_" + orderId) + "_status")) | |
| 79 | + | let orderAsset0 = valueOrErrorMessage(getString((("order_" + orderId) + "_token0")), "Cannot find token0") | |
| 80 | + | let orderAmount0 = valueOrErrorMessage(getInteger((("order_" + orderId) + "_amount0")), "Cannot find amount0") | |
| 81 | + | let orderFulfilled0 = valueOrErrorMessage(getInteger((("order_" + orderId) + "_fulfilled0")), "Cannot find fulfilled0") | |
| 82 | + | let orderAmount0Left = (orderAmount0 - orderFulfilled0) | |
| 83 | + | let orderAsset1 = valueOrErrorMessage(getString((("order_" + orderId) + "_token1")), "Cannot find token1") | |
| 84 | + | let orderAmount1 = valueOrErrorMessage(getInteger((("order_" + orderId) + "_amount1")), "Cannot find amount1") | |
| 85 | + | let orderFulfilled1 = valueOrErrorMessage(getInteger((("order_" + orderId) + "_fulfilled1")), "Cannot find fulfilled1") | |
| 86 | + | let orderAmount1Left = (orderAmount1 - orderFulfilled1) | |
| 87 | + | if ((orderStatus != "active")) | |
| 88 | + | then throw("Order already closed or canceled") | |
| 89 | + | else if ((size(i.payments) != 1)) | |
| 90 | + | then throw("You have to provide payment") | |
| 91 | + | else { | |
| 92 | + | let callerAddress = i.caller | |
| 93 | + | let ownerAddress = addressFromStringValue(orderOwner) | |
| 94 | + | let paymentAsset1 = getAssetString(i.payments[0].assetId) | |
| 95 | + | let paymentAmount1 = i.payments[0].amount | |
| 96 | + | if ((paymentAsset1 != orderAsset1)) | |
| 97 | + | then throw("Wrong payment asset") | |
| 98 | + | else if ((paymentAmount1 >= orderAmount1Left)) | |
| 99 | + | then [ScriptTransfer(callerAddress, (paymentAmount1 - orderAmount1Left), getAssetBytes(orderAsset1)), ScriptTransfer(callerAddress, orderAmount0Left, getAssetBytes(orderAsset0)), ScriptTransfer(ownerAddress, orderAmount1Left, getAssetBytes(paymentAsset1)), IntegerEntry((("order_" + orderId) + "_fulfilled0"), (orderFulfilled0 + orderAmount0Left)), IntegerEntry((("order_" + orderId) + "_fulfilled1"), (orderFulfilled1 + orderAmount1Left)), StringEntry((("order_" + orderId) + "_status"), "closed")] | |
| 100 | + | else { | |
| 101 | + | let amount0 = fraction(orderAmount0, paymentAmount1, orderAmount1, FLOOR) | |
| 102 | + | [ScriptTransfer(ownerAddress, paymentAmount1, getAssetBytes(paymentAsset1)), ScriptTransfer(callerAddress, amount0, getAssetBytes(orderAsset0)), IntegerEntry((("order_" + orderId) + "_fulfilled0"), (orderFulfilled0 + amount0)), IntegerEntry((("order_" + orderId) + "_fulfilled1"), (orderFulfilled1 + paymentAmount1))] | |
| 103 | + | } | |
| 104 | + | } | |
| 105 | + | } | |
| 106 | + | ||
| 107 | + | ||
| 108 | + | ||
| 109 | + | @Callable(i) | |
| 110 | + | func fulfillOrderAndSwapCashback (orderId,params,minToReceive) = { | |
| 111 | + | let orderOwner = valueOrErrorMessage(getString((("order_" + orderId) + "_owner")), "Cannot find order owner") | |
| 112 | + | let orderStatus = getString((("order_" + orderId) + "_status")) | |
| 113 | + | let orderAsset0 = valueOrErrorMessage(getString((("order_" + orderId) + "_token0")), "Cannot find token0") | |
| 114 | + | let orderAmount0 = valueOrErrorMessage(getInteger((("order_" + orderId) + "_amount0")), "Cannot find amount0") | |
| 115 | + | let orderFulfilled0 = valueOrErrorMessage(getInteger((("order_" + orderId) + "_fulfilled0")), "Cannot find fulfilled0") | |
| 116 | + | let orderAmount0Left = (orderAmount0 - orderFulfilled0) | |
| 117 | + | let orderAsset1 = valueOrErrorMessage(getString((("order_" + orderId) + "_token1")), "Cannot find token1") | |
| 118 | + | let orderAmount1 = valueOrErrorMessage(getInteger((("order_" + orderId) + "_amount1")), "Cannot find amount1") | |
| 119 | + | let orderFulfilled1 = valueOrErrorMessage(getInteger((("order_" + orderId) + "_fulfilled1")), "Cannot find fulfilled1") | |
| 120 | + | let orderAmount1Left = (orderAmount1 - orderFulfilled1) | |
| 121 | + | if ((orderStatus != "active")) | |
| 122 | + | then throw("Order already closed or canceled") | |
| 123 | + | else if ((size(i.payments) != 1)) | |
| 124 | + | then throw("You have to provide payment") | |
| 125 | + | else { | |
| 126 | + | let callerAddress = i.caller | |
| 127 | + | let ownerAddress = addressFromStringValue(orderOwner) | |
| 128 | + | let paymentAsset1 = getAssetString(i.payments[0].assetId) | |
| 129 | + | let paymentAmount1 = i.payments[0].amount | |
| 130 | + | if ((paymentAsset1 != orderAsset1)) | |
| 131 | + | then throw("Wrong payment asset") | |
| 132 | + | else if ((orderAmount1Left > paymentAmount1)) | |
| 133 | + | then throw("When you use this func partialy fullfill disabled, please use fulfillOrder") | |
| 134 | + | else { | |
| 135 | + | let aggregatorAddress = Address(fromBase58String(aggregator)) | |
| 136 | + | let cashbackAmount = (paymentAmount1 - orderAmount1Left) | |
| 137 | + | let balanceBefore = getDappBalance(getAssetBytes(orderAsset0)) | |
| 138 | + | if ((balanceBefore == balanceBefore)) | |
| 139 | + | then { | |
| 140 | + | let swapTx = invoke(aggregatorAddress, "swap", [params, minToReceive], [AttachedPayment(getAssetBytes(orderAsset1), cashbackAmount)]) | |
| 141 | + | if ((swapTx == swapTx)) | |
| 142 | + | then { | |
| 143 | + | let balanceAfter = getDappBalance(getAssetBytes(orderAsset0)) | |
| 144 | + | if ((balanceAfter == balanceAfter)) | |
| 145 | + | then { | |
| 146 | + | let cashback = (balanceAfter - balanceBefore) | |
| 147 | + | if ((cashback == cashback)) | |
| 148 | + | then [ScriptTransfer(callerAddress, orderAmount0Left, getAssetBytes(orderAsset0)), ScriptTransfer(callerAddress, cashback, getAssetBytes(orderAsset0)), ScriptTransfer(ownerAddress, orderAmount1Left, getAssetBytes(paymentAsset1)), IntegerEntry((("order_" + orderId) + "_fulfilled0"), (orderFulfilled0 + orderAmount0Left)), IntegerEntry((("order_" + orderId) + "_fulfilled1"), (orderFulfilled1 + orderAmount1Left)), StringEntry((("order_" + orderId) + "_status"), "closed")] | |
| 149 | + | else throw("Strict value is not equal to itself.") | |
| 150 | + | } | |
| 151 | + | else throw("Strict value is not equal to itself.") | |
| 152 | + | } | |
| 153 | + | else throw("Strict value is not equal to itself.") | |
| 154 | + | } | |
| 155 | + | else throw("Strict value is not equal to itself.") | |
| 156 | + | } | |
| 157 | + | } | |
| 158 | + | } | |
| 159 | + | ||
| 160 | + | ||
| 161 | + | ||
| 162 | + | @Callable(i) | |
| 163 | + | func cancelOrder (orderId,proxyCaller) = { | |
| 164 | + | let orderOwner = valueOrErrorMessage(getString((("order_" + orderId) + "_owner")), "Cannot find order owner") | |
| 165 | + | let orderStatus = getString((("order_" + orderId) + "_status")) | |
| 166 | + | let orderAsset0 = valueOrErrorMessage(getString((("order_" + orderId) + "_token0")), "Cannot find token0") | |
| 167 | + | let orderAmount0 = valueOrErrorMessage(getInteger((("order_" + orderId) + "_amount0")), "Cannot find amount0") | |
| 168 | + | let orderFulfilled0 = valueOrErrorMessage(getInteger((("order_" + orderId) + "_fulfilled0")), "Cannot find fulfilled0") | |
| 169 | + | let orderAmount0Left = (orderAmount0 - orderFulfilled0) | |
| 170 | + | if (if ((toBase58String(i.caller.bytes) != orderOwner)) | |
| 171 | + | then (toBase58String(i.caller.bytes) != proxyAddressStr) | |
| 172 | + | else false) | |
| 173 | + | then throw("You cannot cancel order") | |
| 174 | + | else if ((orderStatus != "active")) | |
| 175 | + | then throw("order is closed or canceled") | |
| 176 | + | else [ScriptTransfer(addressFromStringValue(orderOwner), orderAmount0Left, getAssetBytes(orderAsset0)), StringEntry((("order_" + orderId) + "_status"), "canceled")] | |
| 177 | + | } | |
| 178 | + | ||
| 179 | + | ||
| 180 | + | @Verifier(tx) | |
| 181 | + | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
| 182 | + |
github/deemru/w8io 25.78 ms ◑