tx · Ft4BXU6nZvD2hkWzrLKP1VtwL7AboWAbaWGSoaVBmQ5Q

3M4zFBytTRKsbv4WFDX8wnHhxyEESEwRdz3:  -0.03000000 Waves

2025.12.03 10:16 [784613] smart account 3M4zFBytTRKsbv4WFDX8wnHhxyEESEwRdz3 > SELF 0.00000000 Waves

{ "type": 13, "id": "Ft4BXU6nZvD2hkWzrLKP1VtwL7AboWAbaWGSoaVBmQ5Q", "fee": 3000000, "feeAssetId": null, "timestamp": 1764746196527, "version": 2, "chainId": 82, "sender": "3M4zFBytTRKsbv4WFDX8wnHhxyEESEwRdz3", "senderPublicKey": "DPzo5U1QhAV66qNm5UZNrivbsB1uA38uJHQ9UUH7J5KN", "proofs": [ "3CXm8FHctZLUizkhBgN7Whuwb8LUsATNApTnq6k4zM2Ppmt1PPFPR9uhT5QQX1629QpzqnDZLL4vyUqdXuwrQFxq" ], "script": "base64:BgIaCAISBAoCCAESAwoBCBIFCgMICAESBAoCCAgJAAljb25maWdTdHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwINY29uZmlnQWRkcmVzcwIjM1BNb0VpYmRMZVdxY1VSUTgzNTFYaGFXd3lhY0RjN0c0ZTUADkNPTkZJR19BRERSRVNTAwkAAAIFCWNvbmZpZ1N0cgIABQR0aGlzCQEHQWRkcmVzcwEJANkEAQUJY29uZmlnU3RyAAphZ2dyZWdhdG9yCQELdmFsdWVPckVsc2UCCQCdCAIFDkNPTkZJR19BRERSRVNTAhNBR0dSRUdBVE9SX0NPTlRSQUNUAiMzUEdGSHpWR1Q0TlRpZ3dDS1AxTmN3b1hrb2RWWnd2QnV1VQAPcHJveHlBZGRyZXNzU3RyCQELdmFsdWVPckVsc2UCCQCdCAIFDkNPTkZJR19BRERSRVNTAgxwcm94eUFkZHJlc3MCIzNQTWNNaU1FczZ3NTZOUkdhY2tzWHRGRzV6Uzdkb0U5ZnBMAQx0cnlHZXRTdHJpbmcBA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFiBQckbWF0Y2gwBQFiAgABDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDmdldEFzc2V0U3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgIFV0FWRVMBDWdldEFzc2V0Qnl0ZXMBCmFzc2V0SWRTdHIDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMFBHVuaXQJANkEAQUKYXNzZXRJZFN0cgEOZ2V0RGFwcEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQQBaQELY3JlYXRlT3JkZXICBmFzc2V0MQdhbW91bnQxBA9uZXdPcmRlcnNBbW91bnQJAGQCCQENdHJ5R2V0SW50ZWdlcgECE2dsb2JhbF9vcmRlcnNBbW91bnQAAQQHb3JkZXJJZAkApAMBBQ9uZXdPcmRlcnNBbW91bnQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhtZb3UgaGF2ZSB0byBwcm92aWRlIHBheW1lbnQDCQBnAgAABQdhbW91bnQxCQACAQIiQW1vdW50MSBjYW5ub3QgYmUgbGVzcyBvciBlcXVhbHMgMAQGYXNzZXQwCQEOZ2V0QXNzZXRTdHJpbmcBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEB2Ftb3VudDAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAp1c2VyT3JkZXJzCQEMdHJ5R2V0U3RyaW5nAQkArAICCQCsAgICBXVzZXJfCQClCAEIBQFpBmNhbGxlcgIHX29yZGVycwQNbmV3VXNlck9yZGVycwQHJG1hdGNoMAUKdXNlck9yZGVycwMJAAACAgAFByRtYXRjaDAFB29yZGVySWQJAKwCAgkArAICBQp1c2VyT3JkZXJzAgEsBQdvcmRlcklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhNnbG9iYWxfb3JkZXJzQW1vdW50BQ9uZXdPcmRlcnNBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3Rva2VuMAUGYXNzZXQwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAghfYW1vdW50MAUHYW1vdW50MAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIIX2Ftb3VudDEFB2Ftb3VudDEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3Rva2VuMQUGYXNzZXQxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgtfZnVsZmlsbGVkMAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgtfZnVsZmlsbGVkMQAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCBl9vd25lcgkApQgBCAUBaQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3N0YXR1cwIGYWN0aXZlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgpfdGltZXN0YW1wCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgVfdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgV1c2VyXwkApQgBCAUBaQZjYWxsZXICB19vcmRlcnMFDW5ld1VzZXJPcmRlcnMFA25pbAFpAQxmdWxmaWxsT3JkZXIBB29yZGVySWQECm9yZGVyT3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgZfb3duZXICF0Nhbm5vdCBmaW5kIG9yZGVyIG93bmVyBAtvcmRlclN0YXR1cwkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgdfc3RhdHVzBAtvcmRlckFzc2V0MAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCB190b2tlbjACEkNhbm5vdCBmaW5kIHRva2VuMAQMb3JkZXJBbW91bnQwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIIX2Ftb3VudDACE0Nhbm5vdCBmaW5kIGFtb3VudDAED29yZGVyRnVsZmlsbGVkMAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCC19mdWxmaWxsZWQwAhZDYW5ub3QgZmluZCBmdWxmaWxsZWQwBBBvcmRlckFtb3VudDBMZWZ0CQBlAgUMb3JkZXJBbW91bnQwBQ9vcmRlckZ1bGZpbGxlZDAEC29yZGVyQXNzZXQxCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3Rva2VuMQISQ2Fubm90IGZpbmQgdG9rZW4xBAxvcmRlckFtb3VudDEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAghfYW1vdW50MQITQ2Fubm90IGZpbmQgYW1vdW50MQQPb3JkZXJGdWxmaWxsZWQxCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAILX2Z1bGZpbGxlZDECFkNhbm5vdCBmaW5kIGZ1bGZpbGxlZDEEEG9yZGVyQW1vdW50MUxlZnQJAGUCBQxvcmRlckFtb3VudDEFD29yZGVyRnVsZmlsbGVkMQMJAQIhPQIFC29yZGVyU3RhdHVzAgZhY3RpdmUJAAIBAiBPcmRlciBhbHJlYWR5IGNsb3NlZCBvciBjYW5jZWxlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECG1lvdSBoYXZlIHRvIHByb3ZpZGUgcGF5bWVudAQNY2FsbGVyQWRkcmVzcwgFAWkGY2FsbGVyBAxvd25lckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCm9yZGVyT3duZXIEDXBheW1lbnRBc3NldDEJAQ5nZXRBc3NldFN0cmluZwEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQOcGF5bWVudEFtb3VudDEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AwkBAiE9AgUNcGF5bWVudEFzc2V0MQULb3JkZXJBc3NldDEJAAIBAhNXcm9uZyBwYXltZW50IGFzc2V0AwkAZwIFDnBheW1lbnRBbW91bnQxBRBvcmRlckFtb3VudDFMZWZ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDWNhbGxlckFkZHJlc3MJAGUCBQ5wYXltZW50QW1vdW50MQUQb3JkZXJBbW91bnQxTGVmdAkBDWdldEFzc2V0Qnl0ZXMBBQtvcmRlckFzc2V0MQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ1jYWxsZXJBZGRyZXNzBRBvcmRlckFtb3VudDBMZWZ0CQENZ2V0QXNzZXRCeXRlcwEFC29yZGVyQXNzZXQwCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDG93bmVyQWRkcmVzcwUQb3JkZXJBbW91bnQxTGVmdAkBDWdldEFzc2V0Qnl0ZXMBBQ1wYXltZW50QXNzZXQxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgtfZnVsZmlsbGVkMAkAZAIFD29yZGVyRnVsZmlsbGVkMAUQb3JkZXJBbW91bnQwTGVmdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAILX2Z1bGZpbGxlZDEJAGQCBQ9vcmRlckZ1bGZpbGxlZDEFEG9yZGVyQW1vdW50MUxlZnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3N0YXR1cwIGY2xvc2VkBQNuaWwEB2Ftb3VudDAJAG4EBQxvcmRlckFtb3VudDAFDnBheW1lbnRBbW91bnQxBQxvcmRlckFtb3VudDEFBUZMT09SCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDG93bmVyQWRkcmVzcwUOcGF5bWVudEFtb3VudDEJAQ1nZXRBc3NldEJ5dGVzAQUNcGF5bWVudEFzc2V0MQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ1jYWxsZXJBZGRyZXNzBQdhbW91bnQwCQENZ2V0QXNzZXRCeXRlcwEFC29yZGVyQXNzZXQwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgtfZnVsZmlsbGVkMAkAZAIFD29yZGVyRnVsZmlsbGVkMAUHYW1vdW50MAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAILX2Z1bGZpbGxlZDEJAGQCBQ9vcmRlckZ1bGZpbGxlZDEFDnBheW1lbnRBbW91bnQxBQNuaWwBaQEbZnVsZmlsbE9yZGVyQW5kU3dhcENhc2hiYWNrAwdvcmRlcklkBnBhcmFtcwxtaW5Ub1JlY2VpdmUECm9yZGVyT3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgZfb3duZXICF0Nhbm5vdCBmaW5kIG9yZGVyIG93bmVyBAtvcmRlclN0YXR1cwkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgdfc3RhdHVzBAtvcmRlckFzc2V0MAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCB190b2tlbjACEkNhbm5vdCBmaW5kIHRva2VuMAQMb3JkZXJBbW91bnQwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIIX2Ftb3VudDACE0Nhbm5vdCBmaW5kIGFtb3VudDAED29yZGVyRnVsZmlsbGVkMAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCC19mdWxmaWxsZWQwAhZDYW5ub3QgZmluZCBmdWxmaWxsZWQwBBBvcmRlckFtb3VudDBMZWZ0CQBlAgUMb3JkZXJBbW91bnQwBQ9vcmRlckZ1bGZpbGxlZDAEC29yZGVyQXNzZXQxCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3Rva2VuMQISQ2Fubm90IGZpbmQgdG9rZW4xBAxvcmRlckFtb3VudDEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAghfYW1vdW50MQITQ2Fubm90IGZpbmQgYW1vdW50MQQPb3JkZXJGdWxmaWxsZWQxCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAILX2Z1bGZpbGxlZDECFkNhbm5vdCBmaW5kIGZ1bGZpbGxlZDEEEG9yZGVyQW1vdW50MUxlZnQJAGUCBQxvcmRlckFtb3VudDEFD29yZGVyRnVsZmlsbGVkMQMJAQIhPQIFC29yZGVyU3RhdHVzAgZhY3RpdmUJAAIBAiBPcmRlciBhbHJlYWR5IGNsb3NlZCBvciBjYW5jZWxlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECG1lvdSBoYXZlIHRvIHByb3ZpZGUgcGF5bWVudAQNY2FsbGVyQWRkcmVzcwgFAWkGY2FsbGVyBAxvd25lckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCm9yZGVyT3duZXIEDXBheW1lbnRBc3NldDEJAQ5nZXRBc3NldFN0cmluZwEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQOcGF5bWVudEFtb3VudDEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AwkBAiE9AgUNcGF5bWVudEFzc2V0MQULb3JkZXJBc3NldDEJAAIBAhNXcm9uZyBwYXltZW50IGFzc2V0AwkAZgIFEG9yZGVyQW1vdW50MUxlZnQFDnBheW1lbnRBbW91bnQxCQACAQJKV2hlbiB5b3UgdXNlIHRoaXMgZnVuYyBwYXJ0aWFseSBmdWxsZmlsbCBkaXNhYmxlZCwgcGxlYXNlIHVzZSBmdWxmaWxsT3JkZXIEEWFnZ3JlZ2F0b3JBZGRyZXNzCQEHQWRkcmVzcwEJANkEAQUKYWdncmVnYXRvcgQOY2FzaGJhY2tBbW91bnQJAGUCBQ5wYXltZW50QW1vdW50MQUQb3JkZXJBbW91bnQxTGVmdAQNYmFsYW5jZUJlZm9yZQkBDmdldERhcHBCYWxhbmNlAQkBDWdldEFzc2V0Qnl0ZXMBBQtvcmRlckFzc2V0MAMJAAACBQ1iYWxhbmNlQmVmb3JlBQ1iYWxhbmNlQmVmb3JlBAZzd2FwVHgJAPwHBAURYWdncmVnYXRvckFkZHJlc3MCBHN3YXAJAMwIAgUGcGFyYW1zCQDMCAIFDG1pblRvUmVjZWl2ZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQENZ2V0QXNzZXRCeXRlcwEFC29yZGVyQXNzZXQxBQ5jYXNoYmFja0Ftb3VudAUDbmlsAwkAAAIFBnN3YXBUeAUGc3dhcFR4BAxiYWxhbmNlQWZ0ZXIJAQ5nZXREYXBwQmFsYW5jZQEJAQ1nZXRBc3NldEJ5dGVzAQULb3JkZXJBc3NldDADCQAAAgUMYmFsYW5jZUFmdGVyBQxiYWxhbmNlQWZ0ZXIECGNhc2hiYWNrCQBlAgUMYmFsYW5jZUFmdGVyBQ1iYWxhbmNlQmVmb3JlAwkAAAIFCGNhc2hiYWNrBQhjYXNoYmFjawkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ1jYWxsZXJBZGRyZXNzBRBvcmRlckFtb3VudDBMZWZ0CQENZ2V0QXNzZXRCeXRlcwEFC29yZGVyQXNzZXQwCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDWNhbGxlckFkZHJlc3MFCGNhc2hiYWNrCQENZ2V0QXNzZXRCeXRlcwEFC29yZGVyQXNzZXQwCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDG93bmVyQWRkcmVzcwUQb3JkZXJBbW91bnQxTGVmdAkBDWdldEFzc2V0Qnl0ZXMBBQ1wYXltZW50QXNzZXQxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgtfZnVsZmlsbGVkMAkAZAIFD29yZGVyRnVsZmlsbGVkMAUQb3JkZXJBbW91bnQwTGVmdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAILX2Z1bGZpbGxlZDEJAGQCBQ9vcmRlckZ1bGZpbGxlZDEFEG9yZGVyQW1vdW50MUxlZnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIHX3N0YXR1cwIGY2xvc2VkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELY2FuY2VsT3JkZXICB29yZGVySWQLcHJveHlDYWxsZXIECm9yZGVyT3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgZfb3duZXICF0Nhbm5vdCBmaW5kIG9yZGVyIG93bmVyBAtvcmRlclN0YXR1cwkAoggBCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgdfc3RhdHVzBAtvcmRlckFzc2V0MAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCB190b2tlbjACEkNhbm5vdCBmaW5kIHRva2VuMAQMb3JkZXJBbW91bnQwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICBm9yZGVyXwUHb3JkZXJJZAIIX2Ftb3VudDACE0Nhbm5vdCBmaW5kIGFtb3VudDAED29yZGVyRnVsZmlsbGVkMAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAKwCAgkArAICAgZvcmRlcl8FB29yZGVySWQCC19mdWxmaWxsZWQwAhZDYW5ub3QgZmluZCBmdWxmaWxsZWQwBBBvcmRlckFtb3VudDBMZWZ0CQBlAgUMb3JkZXJBbW91bnQwBQ9vcmRlckZ1bGZpbGxlZDADAwkBAiE9AgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBQpvcmRlck93bmVyCQECIT0CCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMFD3Byb3h5QWRkcmVzc1N0cgcJAAIBAhdZb3UgY2Fubm90IGNhbmNlbCBvcmRlcgMJAQIhPQIFC29yZGVyU3RhdHVzAgZhY3RpdmUJAAIBAhtvcmRlciBpcyBjbG9zZWQgb3IgY2FuY2VsZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUKb3JkZXJPd25lcgUQb3JkZXJBbW91bnQwTGVmdAkBDWdldEFzc2V0Qnl0ZXMBBQtvcmRlckFzc2V0MAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGb3JkZXJfBQdvcmRlcklkAgdfc3RhdHVzAghjYW5jZWxlZAUDbmlsAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleVBhRHo=", "height": 784613, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
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
21.34 ms