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:
OldNewDifferences
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/3ef1775 
25.58 ms