2024.04.24 09:56 [3076586] smart account 3MyXFjhxofZUKbHj3p8TUgZwDEPNzq7YNo3 > SELF 0.00000000 Waves

{ "type": 13, "id": "CPpzo1XspHbkSqUVes88kBVNj3KSN8PDBS4nVAviEjdi", "fee": 1300000, "feeAssetId": null, "timestamp": 1713941860584, "version": 2, "chainId": 84, "sender": "3MyXFjhxofZUKbHj3p8TUgZwDEPNzq7YNo3", "senderPublicKey": "GMSDsb2uuChLYT3PeuzaUNyxyxCVWUKaV6Y5dP7xWxUV", "proofs": [ "jPPxA7gKgcYzrnEFXSHz7oHzx3w6dq5sppCaRwKgPwAMLdn9rAgQXNBxVqq8efEikcvAChE5rDdYUJmAUEN2Dm4" ], "script": "base64:BgIQCAISABIDCgEIEgASAwoBCC0ADGNvbnRyYWN0RmlsZQIObDJtcF9zd2FwLnJpZGUAA1NFUAICX18ABnNjYWxlOACAwtcvAQd3cmFwRXJyAQNtc2cJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cBCHRocm93RXJyAQNtc2cJAAIBCQEHd3JhcEVycgEFA21zZwAMa2V5QXNzZXRJbklkCQC5CQIJAMwIAgICJXMJAMwIAgIJYXNzZXRJbklkBQNuaWwFA1NFUAANa2V5QXNzZXRPdXRJZAkAuQkCCQDMCAICAiVzCQDMCAICCmFzc2V0T3V0SWQFA25pbAUDU0VQABBrZXlBc3NldE91dFByaWNlCQC5CQIJAMwIAgICJXMJAMwIAgINYXNzZXRPdXRQcmljZQUDbmlsBQNTRVAAEWtleVN0YWtpbmdBZGRyZXNzCQC5CQIJAMwIAgICJXMJAMwIAgIOc3Rha2luZ0FkZHJlc3MFA25pbAUDU0VQAA9rZXlTdGF0c1RvdGFsSW4JALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICB3RvdGFsSW4FA25pbAUDU0VQABBrZXlTdGF0c1RvdGFsT3V0CQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAgh0b3RhbE91dAUDbmlsBQNTRVAAEWtleUFsbG93ZWRBZGRyZXNzCQC5CQIJAMwIAgICJXMJAMwIAgIOYWxsb3dlZEFkZHJlc3MFA25pbAUDU0VQARhrZXlTdGF0c1RvdGFsSW5CeUFkZHJlc3MBB2FkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIFc3RhdHMJAMwIAgIHdG90YWxJbgkAzAgCCQClCAEFB2FkZHJlc3MFA25pbAUDU0VQARlrZXlTdGF0c1RvdGFsT3V0QnlBZGRyZXNzAQdhZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICBXN0YXRzCQDMCAICCHRvdGFsT3V0CQDMCAIJAKUIAQUHYWRkcmVzcwUDbmlsBQNTRVABCmtleUhpc3RvcnkCB2FkZHJlc3MEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdoaXN0b3J5CQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCCQDYBAEFBHR4SWQFA25pbAUDU0VQAQ1mb3JtYXRIaXN0b3J5BAhhbW91bnRJbglhbW91bnRPdXQFc3Rha2ULc3Rha2luZ05vZGUJALkJAgkAzAgCAgglZCVkJWIlcwkAzAgCCQCkAwEFCGFtb3VudEluCQDMCAIJAKQDAQUJYW1vdW50T3V0CQDMCAIJAKUDAQUFc3Rha2UJAMwIAgULc3Rha2luZ05vZGUFA25pbAUDU0VQAAlhc3NldEluSWQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFDGtleUFzc2V0SW5JZAkBB3dyYXBFcnIBAhFpbnZhbGlkIGFzc2V0SW5JZAALYXNzZXRJbkluZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQlhc3NldEluSWQJAQd3cmFwRXJyAQITaW52YWxpZCBhc3NldEluSW5mbwAKYXNzZXRPdXRJZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUNa2V5QXNzZXRPdXRJZAkBB3dyYXBFcnIBAhFpbnZhbGlkIGFzc2V0SW5JZAAMYXNzZXRPdXRJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUKYXNzZXRPdXRJZAkBB3dyYXBFcnIBAhRpbnZhbGlkIGFzc2V0T3V0SW5mbwANYXNzZXRPdXRQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFEGtleUFzc2V0T3V0UHJpY2UJAQd3cmFwRXJyAQIVaW52YWxpZCBhc3NldE91dFByaWNlABRzdGFraW5nQWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQR0aGlzBRFrZXlTdGFraW5nQWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IADnN0YWtpbmdBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIFFHN0YWtpbmdBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECFmludmFsaWQgc3Rha2luZ0FkZHJlc3MAFGFsbG93ZWRBZGRyZXNzT3B0aW9uBAckbWF0Y2gwCQCdCAIFBHRoaXMFEWtleUFsbG93ZWRBZGRyZXNzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAOYWxsb3dlZEFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUUYWxsb3dlZEFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIWaW52YWxpZCBhbGxvd2VkQWRkcmVzcwEOaXNWYWxpZEFkZHJlc3MBDWFkZHJlc3NTdHJpbmcEByRtYXRjaDAJAKYIAQUNYWRkcmVzc1N0cmluZwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAF0BQckbWF0Y2gwBgcAD0FETUlOX0xJU1RfU0laRQAFAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwBDWlzSW5BZG1pbkxpc3QBB2FkZHJlc3MJAQ9jb250YWluc0VsZW1lbnQCCQENZ2V0QWRtaW5zTGlzdAAFB2FkZHJlc3MBEmdlblZvdGVzS2V5c0hlbHBlcgIBYQxhZG1pbkFkZHJlc3MECyR0MDM0ODYzNTEwBQFhBAZyZXN1bHQIBQskdDAzNDg2MzUxMAJfMQQGcHJlZml4CAULJHQwMzQ4NjM1MTACXzIJAJQKAgkAzQgCBQZyZXN1bHQJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQxhZG1pbkFkZHJlc3MFBnByZWZpeAEMZ2VuVm90ZXNLZXlzAQlrZXlQcmVmaXgECWFkbWluTGlzdAkBE2tleUFkbWluQWRkcmVzc0xpc3QABAskdDAzNjU3Mzc0MQoAAiRsCQENZ2V0QWRtaW5zTGlzdAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAZyZXN1bHQIBQskdDAzNjU3Mzc0MQJfMQQGcHJlZml4CAULJHQwMzY1NzM3NDECXzIFBnJlc3VsdAEQY291bnRWb3Rlc0hlbHBlcgIGcmVzdWx0B3ZvdGVLZXkJAGQCBQZyZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQpjb3VudFZvdGVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjb3VudFZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEQY2xlYXJWb3Rlc0hlbHBlcgIGcmVzdWx0A2tleQkAzQgCBQZyZXN1bHQJAQtEZWxldGVFbnRyeQEFA2tleQETZ2V0Q2xlYXJWb3RlRW50cmllcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2xlYXJWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDmdldFN3YXBBY3Rpb25zAgFpC3N0YWtpbmdOb2RlBAt1c2VyQWRkcmVzcwgFAWkMb3JpZ2luQ2FsbGVyBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEDWFzc2V0SW5BbW91bnQIBQdwYXltZW50BmFtb3VudAQOYXNzZXRPdXRBbW91bnQJAGsDBQ1hc3NldEluQW1vdW50BQZzY2FsZTgFDWFzc2V0T3V0UHJpY2UEBXN0YWtlAwkBDmlzVmFsaWRBZGRyZXNzAQULc3Rha2luZ05vZGUGBwQGY2hlY2tzCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIVaW52YWxpZCBwYXltZW50cyBzaXplCQDMCAIDCQAAAggFB3BheW1lbnQHYXNzZXRJZAUJYXNzZXRJbklkBgkBCHRocm93RXJyAQIXaW52YWxpZCBwYXltZW50IGFzc2V0SWQJAMwIAgMJAGYCBQ1hc3NldE91dFByaWNlAAAGCQEIdGhyb3dFcnIBAhVpbnZhbGlkIGFzc2V0T3V0UHJpY2UJAMwIAgMJAGYCBQ5hc3NldE91dEFtb3VudAAABgkBCHRocm93RXJyAQIWaW52YWxpZCBhc3NldE91dEFtb3VudAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAtzdGFrZUFjdGlvbgMJAQEhAQUFc3Rha2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFDmFzc2V0T3V0QW1vdW50BQphc3NldE91dElkBQNuaWwEC3N0YWtlSW52b2tlCQD8BwQFDnN0YWtpbmdBZGRyZXNzAg5sZWFzZUJ5QWRkcmVzcwkAzAgCBQtzdGFraW5nTm9kZQkAzAgCCQClCAEFC3VzZXJBZGRyZXNzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCmFzc2V0T3V0SWQFDmFzc2V0T3V0QW1vdW50BQNuaWwDCQAAAgULc3Rha2VJbnZva2UFC3N0YWtlSW52b2tlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlTdGF0c1RvdGFsSW4JAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD2tleVN0YXRzVG90YWxJbgAABQ1hc3NldEluQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlTdGF0c1RvdGFsT3V0CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRBrZXlTdGF0c1RvdGFsT3V0AAAFDmFzc2V0T3V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5U3RhdHNUb3RhbEluQnlBZGRyZXNzAQULdXNlckFkZHJlc3MJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARhrZXlTdGF0c1RvdGFsSW5CeUFkZHJlc3MBBQt1c2VyQWRkcmVzcwAABQ1hc3NldEluQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZa2V5U3RhdHNUb3RhbE91dEJ5QWRkcmVzcwEFC3VzZXJBZGRyZXNzCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEZa2V5U3RhdHNUb3RhbE91dEJ5QWRkcmVzcwEFC3VzZXJBZGRyZXNzAAAFDmFzc2V0T3V0QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlIaXN0b3J5AgULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQJAQ1mb3JtYXRIaXN0b3J5BAUNYXNzZXRJbkFtb3VudAUOYXNzZXRPdXRBbW91bnQFBXN0YWtlBQtzdGFraW5nTm9kZQUDbmlsBQtzdGFrZUFjdGlvbgUOYXNzZXRPdXRBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDmlzRm9yY2VTdG9wcGVkAAQUa2V5Rm9yY2VTdG9wQ29udHJhY3QJALkJAgkAzAgCAgIlcwkAzAgCAhFmb3JjZVN0b3BDb250cmFjdAUDbmlsBQNTRVAEFmZvcmNlU3RvcEFkZHJlc3NTdHJpbmcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUUa2V5Rm9yY2VTdG9wQ29udHJhY3QCAAQQZm9yY2VTdG9wQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkApggBBRZmb3JjZVN0b3BBZGRyZXNzU3RyaW5nBQR0aGlzBBFrZXlEaXNhYmxlZFN0YXR1cwkAuQkCCQDMCAICBCVzJXMJAMwIAgIIZGlzYWJsZWQJAMwIAgkApQgBBQR0aGlzBQNuaWwFA1NFUAQOZGlzYWJsZWRTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUQZm9yY2VTdG9wQWRkcmVzcwURa2V5RGlzYWJsZWRTdGF0dXMHAwkAAAIFDmRpc2FibGVkU3RhdHVzBgkAAgECDUZvcmNlIHN0b3BwZWQHBAFpAQRzd2FwAAQOY2hlY2tGb3JjZVN0b3AJAQ5pc0ZvcmNlU3RvcHBlZAADCQAAAgUOY2hlY2tGb3JjZVN0b3AFDmNoZWNrRm9yY2VTdG9wCQEOZ2V0U3dhcEFjdGlvbnMCBQFpAgROVUxMCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHN3YXBBbmRTdGFrZQELc3Rha2luZ05vZGUEDmNoZWNrRm9yY2VTdG9wCQEOaXNGb3JjZVN0b3BwZWQAAwkAAAIFDmNoZWNrRm9yY2VTdG9wBQ5jaGVja0ZvcmNlU3RvcAQFY2hlY2sJAMwIAgMDCQEOaXNWYWxpZEFkZHJlc3MBBQtzdGFraW5nTm9kZQYJAAACBQtzdGFraW5nTm9kZQIABgkBCHRocm93RXJyAQIgc3Rha2luZyBub2RlIGFkZHJlc3MgaXMgbm8gdmFsaWQFA25pbAMJAAACBQVjaGVjawUFY2hlY2sEBG5vZGUDCQAAAgULc3Rha2luZ05vZGUCAAIETlVMTAULc3Rha2luZ05vZGUJAQ5nZXRTd2FwQWN0aW9ucwIFAWkFBG5vZGUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFY2xhaW0ABA5jaGVja0ZvcmNlU3RvcAkBDmlzRm9yY2VTdG9wcGVkAAMJAAACBQ5jaGVja0ZvcmNlU3RvcAUOY2hlY2tGb3JjZVN0b3AEC2NoZWNrQ2FsbGVyAwkAAAIIBQFpBmNhbGxlcgUOYWxsb3dlZEFkZHJlc3MGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5hbGxvd2VkQWRkcmVzcwkA8AcCBQR0aGlzBQlhc3NldEluSWQFCWFzc2V0SW5JZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3ZvdGVGb3JUeElkAQR0eElkBA5jaGVja0ZvcmNlU3RvcAkBDmlzRm9yY2VTdG9wcGVkAAMJAAACBQ5jaGVja0ZvcmNlU3RvcAUOY2hlY2tGb3JjZVN0b3AEE2NhbGxlckFkZHJlc3NTdHJpbmcJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJa2V5UHJlZml4CQEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQUEdHhJZAQGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBbGxvd2VkVHhJZAAFBHR4SWQFA25pbAQRYWxsb3dlZFR4SWRPcHRpb24JAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAQDZXJyCQDMCAIDCQAAAgkAyAEBCQDZBAEFBHR4SWQFEVRYSURfQllURVNfTEVOR1RIBgkBCHRocm93RXJyAQkArAICBQR0eElkAhIgaXMgbm90IHZhbGlkIHR4SWQJAMwIAgMDCQAAAgURYWxsb3dlZFR4SWRPcHRpb24FBHVuaXQGCQECIT0CCQEFdmFsdWUBBRFhbGxvd2VkVHhJZE9wdGlvbgUEdHhJZAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAITIGlzIGFscmVhZHkgYWxsb3dlZAUDbmlsAwkAAAIFA2VycgUDZXJyCQEMdm90ZUlOVEVSTkFMBAUTY2FsbGVyQWRkcmVzc1N0cmluZwUJa2V5UHJlZml4BQZRVU9SVU0FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAECGJ5QWRtaW5zCQAAAggFAnR4AmlkCQDZBAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAIABAdieU93bmVyAwkAZwIJAJADAQkBDWdldEFkbWluc0xpc3QABQZRVU9SVU0HCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5AwUIYnlBZG1pbnMGBQdieU93bmVym6dcSg==", "height": 3076586, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EMjng6By6CxZ3meuRLsThgt77qSuYwmVgReQNktqac6w Next: Gu5uQEFq2nJEQoEUnEL4Fyxcuurwr8CssSdES9ExStz7 Diff:
OldNewDifferences
239239 }
240240
241241
242+func isForceStopped () = {
243+ let keyForceStopContract = makeString(["%s", "forceStopContract"], SEP)
244+ let forceStopAddressString = valueOrElse(getString(this, keyForceStopContract), "")
245+ let forceStopAddress = valueOrElse(addressFromString(forceStopAddressString), this)
246+ let keyDisabledStatus = makeString(["%s%s", "disabled", toString(this)], SEP)
247+ let disabledStatus = valueOrElse(getBoolean(forceStopAddress, keyDisabledStatus), false)
248+ if ((disabledStatus == true))
249+ then throw("Force stopped")
250+ else false
251+ }
252+
253+
242254 @Callable(i)
243-func swap () = getSwapActions(i, "NULL")
255+func swap () = {
256+ let checkForceStop = isForceStopped()
257+ if ((checkForceStop == checkForceStop))
258+ then getSwapActions(i, "NULL")
259+ else throw("Strict value is not equal to itself.")
260+ }
244261
245262
246263
247264 @Callable(i)
248265 func swapAndStake (stakingNode) = {
249- let check = [if (if (isValidAddress(stakingNode))
250- then true
251- else (stakingNode == ""))
252- then true
253- else throwErr("staking node address is no valid")]
254- if ((check == check))
266+ let checkForceStop = isForceStopped()
267+ if ((checkForceStop == checkForceStop))
255268 then {
256- let node = if ((stakingNode == ""))
257- then "NULL"
258- else stakingNode
259- getSwapActions(i, node)
269+ let check = [if (if (isValidAddress(stakingNode))
270+ then true
271+ else (stakingNode == ""))
272+ then true
273+ else throwErr("staking node address is no valid")]
274+ if ((check == check))
275+ then {
276+ let node = if ((stakingNode == ""))
277+ then "NULL"
278+ else stakingNode
279+ getSwapActions(i, node)
280+ }
281+ else throw("Strict value is not equal to itself.")
260282 }
261283 else throw("Strict value is not equal to itself.")
262284 }
265287
266288 @Callable(i)
267289 func claim () = {
268- let checkCaller = if ((i.caller == allowedAddress))
269- then true
270- else throwErr("permission denied")
271- if ((checkCaller == checkCaller))
272- then $Tuple2([ScriptTransfer(allowedAddress, assetBalance(this, assetInId), assetInId)], unit)
290+ let checkForceStop = isForceStopped()
291+ if ((checkForceStop == checkForceStop))
292+ then {
293+ let checkCaller = if ((i.caller == allowedAddress))
294+ then true
295+ else throwErr("permission denied")
296+ if ((checkCaller == checkCaller))
297+ then $Tuple2([ScriptTransfer(allowedAddress, assetBalance(this, assetInId), assetInId)], unit)
298+ else throw("Strict value is not equal to itself.")
299+ }
273300 else throw("Strict value is not equal to itself.")
274301 }
275302
277304
278305 @Callable(i)
279306 func voteForTxId (txId) = {
280- let callerAddressString = toBase58String(i.caller.bytes)
281- let keyPrefix = keyAllowedTxIdVotePrefix(txId)
282- let result = [StringEntry(keyAllowedTxId(), txId)]
283- let allowedTxIdOption = getString(this, keyAllowedTxId())
284- let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
285- then true
286- else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
287- then true
288- else (value(allowedTxIdOption) != txId))
289- then true
290- else throwErr((txId + " is already allowed"))]
291- if ((err == err))
292- then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
307+ let checkForceStop = isForceStopped()
308+ if ((checkForceStop == checkForceStop))
309+ then {
310+ let callerAddressString = toBase58String(i.caller.bytes)
311+ let keyPrefix = keyAllowedTxIdVotePrefix(txId)
312+ let result = [StringEntry(keyAllowedTxId(), txId)]
313+ let allowedTxIdOption = getString(this, keyAllowedTxId())
314+ let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
315+ then true
316+ else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
317+ then true
318+ else (value(allowedTxIdOption) != txId))
319+ then true
320+ else throwErr((txId + " is already allowed"))]
321+ if ((err == err))
322+ then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
323+ else throw("Strict value is not equal to itself.")
324+ }
293325 else throw("Strict value is not equal to itself.")
294326 }
295327
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFile = "l2mp_swap.ride"
55
66 let SEP = "__"
77
88 let scale8 = 100000000
99
1010 func wrapErr (msg) = ((contractFile + ": ") + msg)
1111
1212
1313 func throwErr (msg) = throw(wrapErr(msg))
1414
1515
1616 let keyAssetInId = makeString(["%s", "assetInId"], SEP)
1717
1818 let keyAssetOutId = makeString(["%s", "assetOutId"], SEP)
1919
2020 let keyAssetOutPrice = makeString(["%s", "assetOutPrice"], SEP)
2121
2222 let keyStakingAddress = makeString(["%s", "stakingAddress"], SEP)
2323
2424 let keyStatsTotalIn = makeString(["%s%s", "stats", "totalIn"], SEP)
2525
2626 let keyStatsTotalOut = makeString(["%s%s", "stats", "totalOut"], SEP)
2727
2828 let keyAllowedAddress = makeString(["%s", "allowedAddress"], SEP)
2929
3030 func keyStatsTotalInByAddress (address) = makeString(["%s%s%s", "stats", "totalIn", toString(address)], SEP)
3131
3232
3333 func keyStatsTotalOutByAddress (address) = makeString(["%s%s%s", "stats", "totalOut", toString(address)], SEP)
3434
3535
3636 func keyHistory (address,txId) = makeString(["%s%s%s", "history", toString(address), toBase58String(txId)], SEP)
3737
3838
3939 func formatHistory (amountIn,amountOut,stake,stakingNode) = makeString(["%d%d%b%s", toString(amountIn), toString(amountOut), toString(stake), stakingNode], SEP)
4040
4141
4242 let assetInId = fromBase58String(valueOrErrorMessage(getString(this, keyAssetInId), wrapErr("invalid assetInId")))
4343
4444 let assetInInfo = valueOrErrorMessage(assetInfo(assetInId), wrapErr("invalid assetInInfo"))
4545
4646 let assetOutId = fromBase58String(valueOrErrorMessage(getString(this, keyAssetOutId), wrapErr("invalid assetInId")))
4747
4848 let assetOutInfo = valueOrErrorMessage(assetInfo(assetOutId), wrapErr("invalid assetOutInfo"))
4949
5050 let assetOutPrice = valueOrErrorMessage(getInteger(this, keyAssetOutPrice), wrapErr("invalid assetOutPrice"))
5151
5252 let stakingAddressOption = match getString(this, keyStakingAddress) {
5353 case s: String =>
5454 addressFromString(s)
5555 case _: Unit =>
5656 unit
5757 case _ =>
5858 throw("Match error")
5959 }
6060
6161 let stakingAddress = valueOrErrorMessage(stakingAddressOption, wrapErr("invalid stakingAddress"))
6262
6363 let allowedAddressOption = match getString(this, keyAllowedAddress) {
6464 case s: String =>
6565 addressFromString(s)
6666 case _: Unit =>
6767 unit
6868 case _ =>
6969 throw("Match error")
7070 }
7171
7272 let allowedAddress = valueOrErrorMessage(allowedAddressOption, wrapErr("invalid allowedAddress"))
7373
7474 func isValidAddress (addressString) = match addressFromString(addressString) {
7575 case t: Address =>
7676 true
7777 case _ =>
7878 false
7979 }
8080
8181
8282 let ADMIN_LIST_SIZE = 5
8383
8484 let QUORUM = 3
8585
8686 let TXID_BYTES_LENGTH = 32
8787
8888 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
8989
9090
9191 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
9292
9393
9494 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
9595
9696
9797 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
9898
9999
100100 func getAdminVote (prefix,admin) = {
101101 let voteKey = keyFullAdminVote(prefix, admin)
102102 valueOrElse(getInteger(voteKey), 0)
103103 }
104104
105105
106106 func getAdminsList () = match getString(this, keyAdminAddressList()) {
107107 case s: String =>
108108 split(s, SEP)
109109 case _ =>
110110 nil
111111 }
112112
113113
114114 func isInAdminList (address) = containsElement(getAdminsList(), address)
115115
116116
117117 func genVotesKeysHelper (a,adminAddress) = {
118118 let $t034863510 = a
119119 let result = $t034863510._1
120120 let prefix = $t034863510._2
121121 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
122122 }
123123
124124
125125 func genVotesKeys (keyPrefix) = {
126126 let adminList = keyAdminAddressList()
127127 let $t036573741 = {
128128 let $l = getAdminsList()
129129 let $s = size($l)
130130 let $acc0 = $Tuple2(nil, keyPrefix)
131131 func $f0_1 ($a,$i) = if (($i >= $s))
132132 then $a
133133 else genVotesKeysHelper($a, $l[$i])
134134
135135 func $f0_2 ($a,$i) = if (($i >= $s))
136136 then $a
137137 else throw("List size exceeds 5")
138138
139139 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
140140 }
141141 let result = $t036573741._1
142142 let prefix = $t036573741._2
143143 result
144144 }
145145
146146
147147 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
148148
149149
150150 func countVotes (prefix) = {
151151 let votes = genVotesKeys(prefix)
152152 let $l = votes
153153 let $s = size($l)
154154 let $acc0 = 0
155155 func $f0_1 ($a,$i) = if (($i >= $s))
156156 then $a
157157 else countVotesHelper($a, $l[$i])
158158
159159 func $f0_2 ($a,$i) = if (($i >= $s))
160160 then $a
161161 else throw("List size exceeds 5")
162162
163163 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
164164 }
165165
166166
167167 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
168168
169169
170170 func getClearVoteEntries (prefix) = {
171171 let votes = genVotesKeys(prefix)
172172 let $l = votes
173173 let $s = size($l)
174174 let $acc0 = nil
175175 func $f0_1 ($a,$i) = if (($i >= $s))
176176 then $a
177177 else clearVotesHelper($a, $l[$i])
178178
179179 func $f0_2 ($a,$i) = if (($i >= $s))
180180 then $a
181181 else throw("List size exceeds 5")
182182
183183 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
184184 }
185185
186186
187187 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
188188 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
189189 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
190190 let err = if (!(isInAdminList(callerAddressString)))
191191 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
192192 else if ((adminCurrentVote == 1))
193193 then throwErr((voteKey + " you already voted"))
194194 else unit
195195 if ((err == err))
196196 then {
197197 let votes = countVotes(keyPrefix)
198198 if (((votes + 1) >= minVotes))
199199 then {
200200 let clearVoteEntries = getClearVoteEntries(keyPrefix)
201201 (clearVoteEntries ++ voteResult)
202202 }
203203 else [IntegerEntry(voteKey, 1)]
204204 }
205205 else throw("Strict value is not equal to itself.")
206206 }
207207
208208
209209 func getSwapActions (i,stakingNode) = {
210210 let userAddress = i.originCaller
211211 let payment = i.payments[0]
212212 let assetInAmount = payment.amount
213213 let assetOutAmount = fraction(assetInAmount, scale8, assetOutPrice)
214214 let stake = if (isValidAddress(stakingNode))
215215 then true
216216 else false
217217 let checks = [if ((size(i.payments) == 1))
218218 then true
219219 else throwErr("invalid payments size"), if ((payment.assetId == assetInId))
220220 then true
221221 else throwErr("invalid payment assetId"), if ((assetOutPrice > 0))
222222 then true
223223 else throwErr("invalid assetOutPrice"), if ((assetOutAmount > 0))
224224 then true
225225 else throwErr("invalid assetOutAmount")]
226226 if ((checks == checks))
227227 then {
228228 let stakeAction = if (!(stake))
229229 then [ScriptTransfer(userAddress, assetOutAmount, assetOutId)]
230230 else {
231231 let stakeInvoke = invoke(stakingAddress, "leaseByAddress", [stakingNode, toString(userAddress)], [AttachedPayment(assetOutId, assetOutAmount)])
232232 if ((stakeInvoke == stakeInvoke))
233233 then nil
234234 else throw("Strict value is not equal to itself.")
235235 }
236236 $Tuple2(([IntegerEntry(keyStatsTotalIn, (valueOrElse(getInteger(this, keyStatsTotalIn), 0) + assetInAmount)), IntegerEntry(keyStatsTotalOut, (valueOrElse(getInteger(this, keyStatsTotalOut), 0) + assetOutAmount)), IntegerEntry(keyStatsTotalInByAddress(userAddress), (valueOrElse(getInteger(this, keyStatsTotalInByAddress(userAddress)), 0) + assetInAmount)), IntegerEntry(keyStatsTotalOutByAddress(userAddress), (valueOrElse(getInteger(this, keyStatsTotalOutByAddress(userAddress)), 0) + assetOutAmount)), StringEntry(keyHistory(userAddress, i.transactionId), formatHistory(assetInAmount, assetOutAmount, stake, stakingNode))] ++ stakeAction), assetOutAmount)
237237 }
238238 else throw("Strict value is not equal to itself.")
239239 }
240240
241241
242+func isForceStopped () = {
243+ let keyForceStopContract = makeString(["%s", "forceStopContract"], SEP)
244+ let forceStopAddressString = valueOrElse(getString(this, keyForceStopContract), "")
245+ let forceStopAddress = valueOrElse(addressFromString(forceStopAddressString), this)
246+ let keyDisabledStatus = makeString(["%s%s", "disabled", toString(this)], SEP)
247+ let disabledStatus = valueOrElse(getBoolean(forceStopAddress, keyDisabledStatus), false)
248+ if ((disabledStatus == true))
249+ then throw("Force stopped")
250+ else false
251+ }
252+
253+
242254 @Callable(i)
243-func swap () = getSwapActions(i, "NULL")
255+func swap () = {
256+ let checkForceStop = isForceStopped()
257+ if ((checkForceStop == checkForceStop))
258+ then getSwapActions(i, "NULL")
259+ else throw("Strict value is not equal to itself.")
260+ }
244261
245262
246263
247264 @Callable(i)
248265 func swapAndStake (stakingNode) = {
249- let check = [if (if (isValidAddress(stakingNode))
250- then true
251- else (stakingNode == ""))
252- then true
253- else throwErr("staking node address is no valid")]
254- if ((check == check))
266+ let checkForceStop = isForceStopped()
267+ if ((checkForceStop == checkForceStop))
255268 then {
256- let node = if ((stakingNode == ""))
257- then "NULL"
258- else stakingNode
259- getSwapActions(i, node)
269+ let check = [if (if (isValidAddress(stakingNode))
270+ then true
271+ else (stakingNode == ""))
272+ then true
273+ else throwErr("staking node address is no valid")]
274+ if ((check == check))
275+ then {
276+ let node = if ((stakingNode == ""))
277+ then "NULL"
278+ else stakingNode
279+ getSwapActions(i, node)
280+ }
281+ else throw("Strict value is not equal to itself.")
260282 }
261283 else throw("Strict value is not equal to itself.")
262284 }
263285
264286
265287
266288 @Callable(i)
267289 func claim () = {
268- let checkCaller = if ((i.caller == allowedAddress))
269- then true
270- else throwErr("permission denied")
271- if ((checkCaller == checkCaller))
272- then $Tuple2([ScriptTransfer(allowedAddress, assetBalance(this, assetInId), assetInId)], unit)
290+ let checkForceStop = isForceStopped()
291+ if ((checkForceStop == checkForceStop))
292+ then {
293+ let checkCaller = if ((i.caller == allowedAddress))
294+ then true
295+ else throwErr("permission denied")
296+ if ((checkCaller == checkCaller))
297+ then $Tuple2([ScriptTransfer(allowedAddress, assetBalance(this, assetInId), assetInId)], unit)
298+ else throw("Strict value is not equal to itself.")
299+ }
273300 else throw("Strict value is not equal to itself.")
274301 }
275302
276303
277304
278305 @Callable(i)
279306 func voteForTxId (txId) = {
280- let callerAddressString = toBase58String(i.caller.bytes)
281- let keyPrefix = keyAllowedTxIdVotePrefix(txId)
282- let result = [StringEntry(keyAllowedTxId(), txId)]
283- let allowedTxIdOption = getString(this, keyAllowedTxId())
284- let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
285- then true
286- else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
287- then true
288- else (value(allowedTxIdOption) != txId))
289- then true
290- else throwErr((txId + " is already allowed"))]
291- if ((err == err))
292- then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
307+ let checkForceStop = isForceStopped()
308+ if ((checkForceStop == checkForceStop))
309+ then {
310+ let callerAddressString = toBase58String(i.caller.bytes)
311+ let keyPrefix = keyAllowedTxIdVotePrefix(txId)
312+ let result = [StringEntry(keyAllowedTxId(), txId)]
313+ let allowedTxIdOption = getString(this, keyAllowedTxId())
314+ let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
315+ then true
316+ else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
317+ then true
318+ else (value(allowedTxIdOption) != txId))
319+ then true
320+ else throwErr((txId + " is already allowed"))]
321+ if ((err == err))
322+ then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
323+ else throw("Strict value is not equal to itself.")
324+ }
293325 else throw("Strict value is not equal to itself.")
294326 }
295327
296328
297329 @Verifier(tx)
298330 func verify () = {
299331 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
300332 let byOwner = if ((size(getAdminsList()) >= QUORUM))
301333 then false
302334 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
303335 if (byAdmins)
304336 then true
305337 else byOwner
306338 }
307339

github/deemru/w8io/786bc32 
47.24 ms