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