tx · AWZ1s9C91zXx6iUqgtuPL2iKUyM4HeRG6emYFdc1hQnq

3PANnmCGrufT8SZY5u6BZUgZq4QTh5XdPMa:  -0.01300000 Waves

2024.03.11 14:53 [4079179] smart account 3PANnmCGrufT8SZY5u6BZUgZq4QTh5XdPMa > SELF 0.00000000 Waves

{ "type": 13, "id": "AWZ1s9C91zXx6iUqgtuPL2iKUyM4HeRG6emYFdc1hQnq", "fee": 1300000, "feeAssetId": null, "timestamp": 1710155749213, "version": 2, "chainId": 87, "sender": "3PANnmCGrufT8SZY5u6BZUgZq4QTh5XdPMa", "senderPublicKey": "EfRKQWb1FWaWmo9fkorRwMA4BrSzUWNAVhXqB9vLmv7g", "proofs": [ "3iiPPtGpcpMm4LWasLx8TjV5u9HRSQt9Yf7j16upu6RH69sTMuqZn6fH8RogT1ULCAAZdhX6romYJF5W7pbmoeia" ], "script": "base64:BgIQCAISABIDCgEIEgASAwoBCCwADGNvbnRyYWN0RmlsZQIObDJtcF9zd2FwLnJpZGUAA1NFUAICX18ABnNjYWxlOACAwtcvAQd3cmFwRXJyAQNtc2cJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cBCHRocm93RXJyAQNtc2cJAAIBCQEHd3JhcEVycgEFA21zZwAMa2V5QXNzZXRJbklkCQC5CQIJAMwIAgICJXMJAMwIAgIJYXNzZXRJbklkBQNuaWwFA1NFUAANa2V5QXNzZXRPdXRJZAkAuQkCCQDMCAICAiVzCQDMCAICCmFzc2V0T3V0SWQFA25pbAUDU0VQABBrZXlBc3NldE91dFByaWNlCQC5CQIJAMwIAgICJXMJAMwIAgINYXNzZXRPdXRQcmljZQUDbmlsBQNTRVAAEWtleVN0YWtpbmdBZGRyZXNzCQC5CQIJAMwIAgICJXMJAMwIAgIOc3Rha2luZ0FkZHJlc3MFA25pbAUDU0VQAA9rZXlTdGF0c1RvdGFsSW4JALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICB3RvdGFsSW4FA25pbAUDU0VQABBrZXlTdGF0c1RvdGFsT3V0CQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAgh0b3RhbE91dAUDbmlsBQNTRVAAEWtleUFsbG93ZWRBZGRyZXNzCQC5CQIJAMwIAgICJXMJAMwIAgIOYWxsb3dlZEFkZHJlc3MFA25pbAUDU0VQARhrZXlTdGF0c1RvdGFsSW5CeUFkZHJlc3MBB2FkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIFc3RhdHMJAMwIAgIHdG90YWxJbgkAzAgCCQClCAEFB2FkZHJlc3MFA25pbAUDU0VQARlrZXlTdGF0c1RvdGFsT3V0QnlBZGRyZXNzAQdhZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICBXN0YXRzCQDMCAICCHRvdGFsT3V0CQDMCAIJAKUIAQUHYWRkcmVzcwUDbmlsBQNTRVABCmtleUhpc3RvcnkCB2FkZHJlc3MEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdoaXN0b3J5CQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCCQDYBAEFBHR4SWQFA25pbAUDU0VQAQ1mb3JtYXRIaXN0b3J5BAhhbW91bnRJbglhbW91bnRPdXQFc3Rha2ULc3Rha2luZ05vZGUJALkJAgkAzAgCAgglZCVkJWIlcwkAzAgCCQCkAwEFCGFtb3VudEluCQDMCAIJAKQDAQUJYW1vdW50T3V0CQDMCAIJAKUDAQUFc3Rha2UJAMwIAgULc3Rha2luZ05vZGUFA25pbAUDU0VQAAlhc3NldEluSWQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFDGtleUFzc2V0SW5JZAkBB3dyYXBFcnIBAhFpbnZhbGlkIGFzc2V0SW5JZAALYXNzZXRJbkluZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQlhc3NldEluSWQJAQd3cmFwRXJyAQITaW52YWxpZCBhc3NldEluSW5mbwAKYXNzZXRPdXRJZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUNa2V5QXNzZXRPdXRJZAkBB3dyYXBFcnIBAhFpbnZhbGlkIGFzc2V0SW5JZAAMYXNzZXRPdXRJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUKYXNzZXRPdXRJZAkBB3dyYXBFcnIBAhRpbnZhbGlkIGFzc2V0T3V0SW5mbwANYXNzZXRPdXRQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFEGtleUFzc2V0T3V0UHJpY2UJAQd3cmFwRXJyAQIVaW52YWxpZCBhc3NldE91dFByaWNlABRzdGFraW5nQWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQR0aGlzBRFrZXlTdGFraW5nQWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IADnN0YWtpbmdBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIFFHN0YWtpbmdBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECFmludmFsaWQgc3Rha2luZ0FkZHJlc3MAFGFsbG93ZWRBZGRyZXNzT3B0aW9uBAckbWF0Y2gwCQCdCAIFBHRoaXMFEWtleUFsbG93ZWRBZGRyZXNzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAOYWxsb3dlZEFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUUYWxsb3dlZEFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIWaW52YWxpZCBhbGxvd2VkQWRkcmVzcwEOaXNWYWxpZEFkZHJlc3MBDWFkZHJlc3NTdHJpbmcEByRtYXRjaDAJAKYIAQUNYWRkcmVzc1N0cmluZwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAF0BQckbWF0Y2gwBgcAD0FETUlOX0xJU1RfU0laRQAFAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwBDWlzSW5BZG1pbkxpc3QBB2FkZHJlc3MJAQ9jb250YWluc0VsZW1lbnQCCQENZ2V0QWRtaW5zTGlzdAAFB2FkZHJlc3MBEmdlblZvdGVzS2V5c0hlbHBlcgIBYQxhZG1pbkFkZHJlc3MECyR0MDM0ODYzNTEwBQFhBAZyZXN1bHQIBQskdDAzNDg2MzUxMAJfMQQGcHJlZml4CAULJHQwMzQ4NjM1MTACXzIJAJQKAgkAzQgCBQZyZXN1bHQJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQxhZG1pbkFkZHJlc3MFBnByZWZpeAEMZ2VuVm90ZXNLZXlzAQlrZXlQcmVmaXgECWFkbWluTGlzdAkBE2tleUFkbWluQWRkcmVzc0xpc3QABAskdDAzNjU3Mzc0MQoAAiRsCQENZ2V0QWRtaW5zTGlzdAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAZyZXN1bHQIBQskdDAzNjU3Mzc0MQJfMQQGcHJlZml4CAULJHQwMzY1NzM3NDECXzIFBnJlc3VsdAEQY291bnRWb3Rlc0hlbHBlcgIGcmVzdWx0B3ZvdGVLZXkJAGQCBQZyZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQpjb3VudFZvdGVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjb3VudFZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEQY2xlYXJWb3Rlc0hlbHBlcgIGcmVzdWx0A2tleQkAzQgCBQZyZXN1bHQJAQtEZWxldGVFbnRyeQEFA2tleQETZ2V0Q2xlYXJWb3RlRW50cmllcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2xlYXJWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDmdldFN3YXBBY3Rpb25zAgFpC3N0YWtpbmdOb2RlBAt1c2VyQWRkcmVzcwgFAWkMb3JpZ2luQ2FsbGVyBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEDWFzc2V0SW5BbW91bnQIBQdwYXltZW50BmFtb3VudAQOYXNzZXRPdXRBbW91bnQJAGsDBQ1hc3NldEluQW1vdW50BQZzY2FsZTgFDWFzc2V0T3V0UHJpY2UEBXN0YWtlAwkBDmlzVmFsaWRBZGRyZXNzAQULc3Rha2luZ05vZGUGBwQGY2hlY2tzCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIVaW52YWxpZCBwYXltZW50cyBzaXplCQDMCAIDCQAAAggFB3BheW1lbnQHYXNzZXRJZAUJYXNzZXRJbklkBgkBCHRocm93RXJyAQIXaW52YWxpZCBwYXltZW50IGFzc2V0SWQJAMwIAgMJAGYCBQ1hc3NldE91dFByaWNlAAAGCQEIdGhyb3dFcnIBAhVpbnZhbGlkIGFzc2V0T3V0UHJpY2UJAMwIAgMJAGYCBQ5hc3NldE91dEFtb3VudAAABgkBCHRocm93RXJyAQIWaW52YWxpZCBhc3NldE91dEFtb3VudAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAtzdGFrZUFjdGlvbgMJAQEhAQUFc3Rha2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFDmFzc2V0T3V0QW1vdW50BQphc3NldE91dElkBQNuaWwEC3N0YWtlSW52b2tlCQD8BwQFDnN0YWtpbmdBZGRyZXNzAg5sZWFzZUJ5QWRkcmVzcwkAzAgCBQtzdGFraW5nTm9kZQkAzAgCCQClCAEFC3VzZXJBZGRyZXNzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCmFzc2V0T3V0SWQFDmFzc2V0T3V0QW1vdW50BQNuaWwDCQAAAgULc3Rha2VJbnZva2UFC3N0YWtlSW52b2tlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlTdGF0c1RvdGFsSW4JAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD2tleVN0YXRzVG90YWxJbgAABQ1hc3NldEluQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlTdGF0c1RvdGFsT3V0CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRBrZXlTdGF0c1RvdGFsT3V0AAAFDmFzc2V0T3V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5U3RhdHNUb3RhbEluQnlBZGRyZXNzAQULdXNlckFkZHJlc3MJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARhrZXlTdGF0c1RvdGFsSW5CeUFkZHJlc3MBBQt1c2VyQWRkcmVzcwAABQ1hc3NldEluQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZa2V5U3RhdHNUb3RhbE91dEJ5QWRkcmVzcwEFC3VzZXJBZGRyZXNzCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEZa2V5U3RhdHNUb3RhbE91dEJ5QWRkcmVzcwEFC3VzZXJBZGRyZXNzAAAFDmFzc2V0T3V0QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlIaXN0b3J5AgULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQJAQ1mb3JtYXRIaXN0b3J5BAUNYXNzZXRJbkFtb3VudAUOYXNzZXRPdXRBbW91bnQFBXN0YWtlBQtzdGFraW5nTm9kZQUDbmlsBQtzdGFrZUFjdGlvbgUOYXNzZXRPdXRBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAWkBBHN3YXAACQEOZ2V0U3dhcEFjdGlvbnMCBQFpAgROVUxMAWkBDHN3YXBBbmRTdGFrZQELc3Rha2luZ05vZGUEBWNoZWNrCQDMCAIDAwkBDmlzVmFsaWRBZGRyZXNzAQULc3Rha2luZ05vZGUGCQAAAgULc3Rha2luZ05vZGUCAAYJAQh0aHJvd0VycgECIHN0YWtpbmcgbm9kZSBhZGRyZXNzIGlzIG5vIHZhbGlkBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBARub2RlAwkAAAIFC3N0YWtpbmdOb2RlAgACBE5VTEwFC3N0YWtpbmdOb2RlCQEOZ2V0U3dhcEFjdGlvbnMCBQFpBQRub2RlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAAQLY2hlY2tDYWxsZXIDCQAAAggFAWkGY2FsbGVyBQ5hbGxvd2VkQWRkcmVzcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDmFsbG93ZWRBZGRyZXNzCQDwBwIFBHRoaXMFCWFzc2V0SW5JZAUJYXNzZXRJbklkBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELdm90ZUZvclR4SWQBBHR4SWQEE2NhbGxlckFkZHJlc3NTdHJpbmcJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJa2V5UHJlZml4CQEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQUEdHhJZAQGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBbGxvd2VkVHhJZAAFBHR4SWQFA25pbAQRYWxsb3dlZFR4SWRPcHRpb24JAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAQDZXJyCQDMCAIDCQAAAgkAyAEBCQDZBAEFBHR4SWQFEVRYSURfQllURVNfTEVOR1RIBgkBCHRocm93RXJyAQkArAICBQR0eElkAhIgaXMgbm90IHZhbGlkIHR4SWQJAMwIAgMDCQAAAgURYWxsb3dlZFR4SWRPcHRpb24FBHVuaXQGCQECIT0CCQEFdmFsdWUBBRFhbGxvd2VkVHhJZE9wdGlvbgUEdHhJZAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAITIGlzIGFscmVhZHkgYWxsb3dlZAUDbmlsAwkAAAIFA2VycgUDZXJyCQEMdm90ZUlOVEVSTkFMBAUTY2FsbGVyQWRkcmVzc1N0cmluZwUJa2V5UHJlZml4BQZRVU9SVU0FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAECGJ5QWRtaW5zCQAAAggFAnR4AmlkCQDZBAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAIABAdieU93bmVyAwkAZwIJAJADAQkBDWdldEFkbWluc0xpc3QABQZRVU9SVU0HCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5AwUIYnlBZG1pbnMGBQdieU93bmVyAbnWmQ==", "height": 4079179, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9AS2V8cZDiHN884tuntATqWNhKirdzVVCYhK8eGCB85c Next: 854KK492bggS3QfkMQ1iQBGHCwMXyUTT3tiyPJtg14GG Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let contractFile = "l2mp_swap.ride"
5+
6+let SEP = "__"
7+
8+let scale8 = 100000000
9+
10+func wrapErr (msg) = ((contractFile + ": ") + msg)
11+
12+
13+func throwErr (msg) = throw(wrapErr(msg))
14+
15+
16+let keyAssetInId = makeString(["%s", "assetInId"], SEP)
17+
18+let keyAssetOutId = makeString(["%s", "assetOutId"], SEP)
19+
20+let keyAssetOutPrice = makeString(["%s", "assetOutPrice"], SEP)
21+
22+let keyStakingAddress = makeString(["%s", "stakingAddress"], SEP)
23+
24+let keyStatsTotalIn = makeString(["%s%s", "stats", "totalIn"], SEP)
25+
26+let keyStatsTotalOut = makeString(["%s%s", "stats", "totalOut"], SEP)
27+
28+let keyAllowedAddress = makeString(["%s", "allowedAddress"], SEP)
29+
30+func keyStatsTotalInByAddress (address) = makeString(["%s%s%s", "stats", "totalIn", toString(address)], SEP)
31+
32+
33+func keyStatsTotalOutByAddress (address) = makeString(["%s%s%s", "stats", "totalOut", toString(address)], SEP)
34+
35+
36+func keyHistory (address,txId) = makeString(["%s%s%s", "history", toString(address), toBase58String(txId)], SEP)
37+
38+
39+func formatHistory (amountIn,amountOut,stake,stakingNode) = makeString(["%d%d%b%s", toString(amountIn), toString(amountOut), toString(stake), stakingNode], SEP)
40+
41+
42+let assetInId = fromBase58String(valueOrErrorMessage(getString(this, keyAssetInId), wrapErr("invalid assetInId")))
43+
44+let assetInInfo = valueOrErrorMessage(assetInfo(assetInId), wrapErr("invalid assetInInfo"))
45+
46+let assetOutId = fromBase58String(valueOrErrorMessage(getString(this, keyAssetOutId), wrapErr("invalid assetInId")))
47+
48+let assetOutInfo = valueOrErrorMessage(assetInfo(assetOutId), wrapErr("invalid assetOutInfo"))
49+
50+let assetOutPrice = valueOrErrorMessage(getInteger(this, keyAssetOutPrice), wrapErr("invalid assetOutPrice"))
51+
52+let stakingAddressOption = match getString(this, keyStakingAddress) {
53+ case s: String =>
54+ addressFromString(s)
55+ case _: Unit =>
56+ unit
57+ case _ =>
58+ throw("Match error")
59+}
60+
61+let stakingAddress = valueOrErrorMessage(stakingAddressOption, wrapErr("invalid stakingAddress"))
62+
63+let allowedAddressOption = match getString(this, keyAllowedAddress) {
64+ case s: String =>
65+ addressFromString(s)
66+ case _: Unit =>
67+ unit
68+ case _ =>
69+ throw("Match error")
70+}
71+
72+let allowedAddress = valueOrErrorMessage(allowedAddressOption, wrapErr("invalid allowedAddress"))
73+
74+func isValidAddress (addressString) = match addressFromString(addressString) {
75+ case t: Address =>
76+ true
77+ case _ =>
78+ false
79+}
80+
81+
82+let ADMIN_LIST_SIZE = 5
83+
84+let QUORUM = 3
85+
86+let TXID_BYTES_LENGTH = 32
87+
88+func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
89+
90+
91+func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
92+
93+
94+func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
95+
96+
97+func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
98+
99+
100+func getAdminVote (prefix,admin) = {
101+ let voteKey = keyFullAdminVote(prefix, admin)
102+ valueOrElse(getInteger(voteKey), 0)
103+ }
104+
105+
106+func getAdminsList () = match getString(this, keyAdminAddressList()) {
107+ case s: String =>
108+ split(s, SEP)
109+ case _ =>
110+ nil
111+}
112+
113+
114+func isInAdminList (address) = containsElement(getAdminsList(), address)
115+
116+
117+func genVotesKeysHelper (a,adminAddress) = {
118+ let $t034863510 = a
119+ let result = $t034863510._1
120+ let prefix = $t034863510._2
121+ $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
122+ }
123+
124+
125+func genVotesKeys (keyPrefix) = {
126+ let adminList = keyAdminAddressList()
127+ let $t036573741 = {
128+ let $l = getAdminsList()
129+ let $s = size($l)
130+ let $acc0 = $Tuple2(nil, keyPrefix)
131+ func $f0_1 ($a,$i) = if (($i >= $s))
132+ then $a
133+ else genVotesKeysHelper($a, $l[$i])
134+
135+ func $f0_2 ($a,$i) = if (($i >= $s))
136+ then $a
137+ else throw("List size exceeds 5")
138+
139+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
140+ }
141+ let result = $t036573741._1
142+ let prefix = $t036573741._2
143+ result
144+ }
145+
146+
147+func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
148+
149+
150+func countVotes (prefix) = {
151+ let votes = genVotesKeys(prefix)
152+ let $l = votes
153+ let $s = size($l)
154+ let $acc0 = 0
155+ func $f0_1 ($a,$i) = if (($i >= $s))
156+ then $a
157+ else countVotesHelper($a, $l[$i])
158+
159+ func $f0_2 ($a,$i) = if (($i >= $s))
160+ then $a
161+ else throw("List size exceeds 5")
162+
163+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
164+ }
165+
166+
167+func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
168+
169+
170+func getClearVoteEntries (prefix) = {
171+ let votes = genVotesKeys(prefix)
172+ let $l = votes
173+ let $s = size($l)
174+ let $acc0 = nil
175+ func $f0_1 ($a,$i) = if (($i >= $s))
176+ then $a
177+ else clearVotesHelper($a, $l[$i])
178+
179+ func $f0_2 ($a,$i) = if (($i >= $s))
180+ then $a
181+ else throw("List size exceeds 5")
182+
183+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
184+ }
185+
186+
187+func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
188+ let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
189+ let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
190+ let err = if (!(isInAdminList(callerAddressString)))
191+ then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
192+ else if ((adminCurrentVote == 1))
193+ then throwErr((voteKey + " you already voted"))
194+ else unit
195+ if ((err == err))
196+ then {
197+ let votes = countVotes(keyPrefix)
198+ if (((votes + 1) >= minVotes))
199+ then {
200+ let clearVoteEntries = getClearVoteEntries(keyPrefix)
201+ (clearVoteEntries ++ voteResult)
202+ }
203+ else [IntegerEntry(voteKey, 1)]
204+ }
205+ else throw("Strict value is not equal to itself.")
206+ }
207+
208+
209+func getSwapActions (i,stakingNode) = {
210+ let userAddress = i.originCaller
211+ let payment = i.payments[0]
212+ let assetInAmount = payment.amount
213+ let assetOutAmount = fraction(assetInAmount, scale8, assetOutPrice)
214+ let stake = if (isValidAddress(stakingNode))
215+ then true
216+ else false
217+ let checks = [if ((size(i.payments) == 1))
218+ then true
219+ else throwErr("invalid payments size"), if ((payment.assetId == assetInId))
220+ then true
221+ else throwErr("invalid payment assetId"), if ((assetOutPrice > 0))
222+ then true
223+ else throwErr("invalid assetOutPrice"), if ((assetOutAmount > 0))
224+ then true
225+ else throwErr("invalid assetOutAmount")]
226+ if ((checks == checks))
227+ then {
228+ let stakeAction = if (!(stake))
229+ then [ScriptTransfer(userAddress, assetOutAmount, assetOutId)]
230+ else {
231+ let stakeInvoke = invoke(stakingAddress, "leaseByAddress", [stakingNode, toString(userAddress)], [AttachedPayment(assetOutId, assetOutAmount)])
232+ if ((stakeInvoke == stakeInvoke))
233+ then nil
234+ else throw("Strict value is not equal to itself.")
235+ }
236+ $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)
237+ }
238+ else throw("Strict value is not equal to itself.")
239+ }
240+
241+
242+@Callable(i)
243+func swap () = getSwapActions(i, "NULL")
244+
245+
246+
247+@Callable(i)
248+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))
255+ then {
256+ let node = if ((stakingNode == ""))
257+ then "NULL"
258+ else stakingNode
259+ getSwapActions(i, node)
260+ }
261+ else throw("Strict value is not equal to itself.")
262+ }
263+
264+
265+
266+@Callable(i)
267+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)
273+ else throw("Strict value is not equal to itself.")
274+ }
275+
276+
277+
278+@Callable(i)
279+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)
293+ else throw("Strict value is not equal to itself.")
294+ }
295+
296+
297+@Verifier(tx)
298+func verify () = {
299+ let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
300+ let byOwner = if ((size(getAdminsList()) >= QUORUM))
301+ then false
302+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
303+ if (byAdmins)
304+ then true
305+ else byOwner
306+ }
307+

github/deemru/w8io/6500d08 
25.07 ms