tx · FBemPusAV1nUpgAL19nXcadPw4BeHXjf6cbbAhAbiXTG

3MyXFjhxofZUKbHj3p8TUgZwDEPNzq7YNo3:  -0.01200000 Waves

2024.03.06 10:33 [3005883] smart account 3MyXFjhxofZUKbHj3p8TUgZwDEPNzq7YNo3 > SELF 0.00000000 Waves

{ "type": 13, "id": "FBemPusAV1nUpgAL19nXcadPw4BeHXjf6cbbAhAbiXTG", "fee": 1200000, "feeAssetId": null, "timestamp": 1709710413178, "version": 2, "chainId": 84, "sender": "3MyXFjhxofZUKbHj3p8TUgZwDEPNzq7YNo3", "senderPublicKey": "GMSDsb2uuChLYT3PeuzaUNyxyxCVWUKaV6Y5dP7xWxUV", "proofs": [ "tLs9ZWb3JztiWYSiCm9vmGUcBBzWciANAz5j8vLvJw8iGMnCKXHTCaYWVxRyqhH7jiEDjfTMiJZeFcqqGyXaTzi" ], "script": "base64:BgIQCAISABIDCgEIEgASAwoBCCwADGNvbnRyYWN0RmlsZQIObDJtcF9zd2FwLnJpZGUAA1NFUAICX18ABnNjYWxlOACAwtcvAQd3cmFwRXJyAQNtc2cJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cBCHRocm93RXJyAQNtc2cJAAIBCQEHd3JhcEVycgEFA21zZwAMa2V5QXNzZXRJbklkCQC5CQIJAMwIAgICJXMJAMwIAgIJYXNzZXRJbklkBQNuaWwFA1NFUAANa2V5QXNzZXRPdXRJZAkAuQkCCQDMCAICAiVzCQDMCAICCmFzc2V0T3V0SWQFA25pbAUDU0VQABBrZXlBc3NldE91dFByaWNlCQC5CQIJAMwIAgICJXMJAMwIAgINYXNzZXRPdXRQcmljZQUDbmlsBQNTRVAAEWtleVN0YWtpbmdBZGRyZXNzCQC5CQIJAMwIAgICJXMJAMwIAgIOc3Rha2luZ0FkZHJlc3MFA25pbAUDU0VQAA9rZXlTdGF0c1RvdGFsSW4JALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICB3RvdGFsSW4FA25pbAUDU0VQABBrZXlTdGF0c1RvdGFsT3V0CQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAgh0b3RhbE91dAUDbmlsBQNTRVAAEWtleUFsbG93ZWRBZGRyZXNzCQC5CQIJAMwIAgICJXMJAMwIAgIOYWxsb3dlZEFkZHJlc3MFA25pbAUDU0VQARhrZXlTdGF0c1RvdGFsSW5CeUFkZHJlc3MBB2FkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIFc3RhdHMJAMwIAgIHdG90YWxJbgkAzAgCCQClCAEFB2FkZHJlc3MFA25pbAUDU0VQARlrZXlTdGF0c1RvdGFsT3V0QnlBZGRyZXNzAQdhZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICBXN0YXRzCQDMCAICCHRvdGFsT3V0CQDMCAIJAKUIAQUHYWRkcmVzcwUDbmlsBQNTRVABCmtleUhpc3RvcnkCB2FkZHJlc3MEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdoaXN0b3J5CQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCCQDYBAEFBHR4SWQFA25pbAUDU0VQAQ1mb3JtYXRIaXN0b3J5BAhhbW91bnRJbglhbW91bnRPdXQFc3Rha2ULc3Rha2luZ05vZGUJALkJAgkAzAgCAgglZCVkJWIlcwkAzAgCCQCkAwEFCGFtb3VudEluCQDMCAIJAKQDAQUJYW1vdW50T3V0CQDMCAIJAKUDAQUFc3Rha2UJAMwIAgULc3Rha2luZ05vZGUFA25pbAUDU0VQAAlhc3NldEluSWQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFDGtleUFzc2V0SW5JZAkBB3dyYXBFcnIBAhFpbnZhbGlkIGFzc2V0SW5JZAALYXNzZXRJbkluZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQlhc3NldEluSWQJAQd3cmFwRXJyAQITaW52YWxpZCBhc3NldEluSW5mbwAKYXNzZXRPdXRJZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUNa2V5QXNzZXRPdXRJZAkBB3dyYXBFcnIBAhFpbnZhbGlkIGFzc2V0SW5JZAAMYXNzZXRPdXRJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUKYXNzZXRPdXRJZAkBB3dyYXBFcnIBAhRpbnZhbGlkIGFzc2V0T3V0SW5mbwANYXNzZXRPdXRQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFEGtleUFzc2V0T3V0UHJpY2UJAQd3cmFwRXJyAQIVaW52YWxpZCBhc3NldE91dFByaWNlABRzdGFraW5nQWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQR0aGlzBRFrZXlTdGFraW5nQWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IADnN0YWtpbmdBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIFFHN0YWtpbmdBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECFmludmFsaWQgc3Rha2luZ0FkZHJlc3MAFGFsbG93ZWRBZGRyZXNzT3B0aW9uBAckbWF0Y2gwCQCdCAIFBHRoaXMFEWtleUFsbG93ZWRBZGRyZXNzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAOYWxsb3dlZEFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUUYWxsb3dlZEFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIWaW52YWxpZCBhbGxvd2VkQWRkcmVzcwEOaXNWYWxpZEFkZHJlc3MBDWFkZHJlc3NTdHJpbmcEByRtYXRjaDAJAKYIAQUNYWRkcmVzc1N0cmluZwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAF0BQckbWF0Y2gwBgcAD0FETUlOX0xJU1RfU0laRQAFAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwBDWlzSW5BZG1pbkxpc3QBB2FkZHJlc3MJAQ9jb250YWluc0VsZW1lbnQCCQENZ2V0QWRtaW5zTGlzdAAFB2FkZHJlc3MBEmdlblZvdGVzS2V5c0hlbHBlcgIBYQxhZG1pbkFkZHJlc3MECyR0MDM0ODYzNTEwBQFhBAZyZXN1bHQIBQskdDAzNDg2MzUxMAJfMQQGcHJlZml4CAULJHQwMzQ4NjM1MTACXzIJAJQKAgkAzQgCBQZyZXN1bHQJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQxhZG1pbkFkZHJlc3MFBnByZWZpeAEMZ2VuVm90ZXNLZXlzAQlrZXlQcmVmaXgECWFkbWluTGlzdAkBE2tleUFkbWluQWRkcmVzc0xpc3QABAskdDAzNjU3Mzc0MQoAAiRsCQENZ2V0QWRtaW5zTGlzdAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAZyZXN1bHQIBQskdDAzNjU3Mzc0MQJfMQQGcHJlZml4CAULJHQwMzY1NzM3NDECXzIFBnJlc3VsdAEQY291bnRWb3Rlc0hlbHBlcgIGcmVzdWx0B3ZvdGVLZXkJAGQCBQZyZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQpjb3VudFZvdGVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjb3VudFZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEQY2xlYXJWb3Rlc0hlbHBlcgIGcmVzdWx0A2tleQkAzQgCBQZyZXN1bHQJAQtEZWxldGVFbnRyeQEFA2tleQETZ2V0Q2xlYXJWb3RlRW50cmllcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2xlYXJWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDmdldFN3YXBBY3Rpb25zAgFpC3N0YWtpbmdOb2RlBAt1c2VyQWRkcmVzcwgFAWkMb3JpZ2luQ2FsbGVyBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEDWFzc2V0SW5BbW91bnQIBQdwYXltZW50BmFtb3VudAQOYXNzZXRPdXRBbW91bnQJAGsDBQ1hc3NldEluQW1vdW50BQZzY2FsZTgFDWFzc2V0T3V0UHJpY2UEBXN0YWtlAwkBDmlzVmFsaWRBZGRyZXNzAQULc3Rha2luZ05vZGUGBwQGY2hlY2tzCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIVaW52YWxpZCBwYXltZW50cyBzaXplCQDMCAIDCQAAAggFB3BheW1lbnQHYXNzZXRJZAUJYXNzZXRJbklkBgkBCHRocm93RXJyAQIXaW52YWxpZCBwYXltZW50IGFzc2V0SWQJAMwIAgMJAGYCBQ1hc3NldE91dFByaWNlAAAGCQEIdGhyb3dFcnIBAhVpbnZhbGlkIGFzc2V0T3V0UHJpY2UJAMwIAgMJAGYCBQ5hc3NldE91dEFtb3VudAAABgkBCHRocm93RXJyAQIWaW52YWxpZCBhc3NldE91dEFtb3VudAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAtzdGFrZUFjdGlvbgMJAQEhAQUFc3Rha2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFDmFzc2V0T3V0QW1vdW50BQphc3NldE91dElkBQNuaWwEC3N0YWtlSW52b2tlCQD8BwQFDnN0YWtpbmdBZGRyZXNzAg5sZWFzZUJ5QWRkcmVzcwkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAIFC3N0YWtpbmdOb2RlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCmFzc2V0T3V0SWQFDmFzc2V0T3V0QW1vdW50BQNuaWwDCQAAAgULc3Rha2VJbnZva2UFC3N0YWtlSW52b2tlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlTdGF0c1RvdGFsSW4JAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD2tleVN0YXRzVG90YWxJbgAABQ1hc3NldEluQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlTdGF0c1RvdGFsT3V0CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRBrZXlTdGF0c1RvdGFsT3V0AAAFDmFzc2V0T3V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5U3RhdHNUb3RhbEluQnlBZGRyZXNzAQULdXNlckFkZHJlc3MJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARhrZXlTdGF0c1RvdGFsSW5CeUFkZHJlc3MBBQt1c2VyQWRkcmVzcwAABQ1hc3NldEluQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZa2V5U3RhdHNUb3RhbE91dEJ5QWRkcmVzcwEFC3VzZXJBZGRyZXNzCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEZa2V5U3RhdHNUb3RhbE91dEJ5QWRkcmVzcwEFC3VzZXJBZGRyZXNzAAAFDmFzc2V0T3V0QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlIaXN0b3J5AgULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQJAQ1mb3JtYXRIaXN0b3J5BAUNYXNzZXRJbkFtb3VudAUOYXNzZXRPdXRBbW91bnQFBXN0YWtlBQtzdGFraW5nTm9kZQUDbmlsBQtzdGFrZUFjdGlvbgUOYXNzZXRPdXRBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAWkBBHN3YXAACQEOZ2V0U3dhcEFjdGlvbnMCBQFpAgROVUxMAWkBDHN3YXBBbmRTdGFrZQELc3Rha2luZ05vZGUEBWNoZWNrCQDMCAIDAwkBDmlzVmFsaWRBZGRyZXNzAQULc3Rha2luZ05vZGUGCQAAAgULc3Rha2luZ05vZGUCAAYJAQh0aHJvd0VycgECIHN0YWtpbmcgbm9kZSBhZGRyZXNzIGlzIG5vIHZhbGlkBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBARub2RlAwkAAAIFC3N0YWtpbmdOb2RlAgACBE5VTEwFC3N0YWtpbmdOb2RlCQEOZ2V0U3dhcEFjdGlvbnMCBQFpBQRub2RlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAAQLY2hlY2tDYWxsZXIDCQAAAggFAWkGY2FsbGVyBQ5hbGxvd2VkQWRkcmVzcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDmFsbG93ZWRBZGRyZXNzCQDwBwIFBHRoaXMFCWFzc2V0SW5JZAUJYXNzZXRJbklkBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELdm90ZUZvclR4SWQBBHR4SWQEE2NhbGxlckFkZHJlc3NTdHJpbmcJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJa2V5UHJlZml4CQEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQUEdHhJZAQGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBbGxvd2VkVHhJZAAFBHR4SWQFA25pbAQRYWxsb3dlZFR4SWRPcHRpb24JAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAQDZXJyCQDMCAIDCQAAAgkAyAEBCQDZBAEFBHR4SWQFEVRYSURfQllURVNfTEVOR1RIBgkBCHRocm93RXJyAQkArAICBQR0eElkAhIgaXMgbm90IHZhbGlkIHR4SWQJAMwIAgMDCQAAAgURYWxsb3dlZFR4SWRPcHRpb24FBHVuaXQGCQECIT0CCQEFdmFsdWUBBRFhbGxvd2VkVHhJZE9wdGlvbgUEdHhJZAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAITIGlzIGFscmVhZHkgYWxsb3dlZAUDbmlsAwkAAAIFA2VycgUDZXJyCQEMdm90ZUlOVEVSTkFMBAUTY2FsbGVyQWRkcmVzc1N0cmluZwUJa2V5UHJlZml4BQZRVU9SVU0FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAECGJ5QWRtaW5zCQAAAggFAnR4AmlkCQDZBAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAIABAdieU93bmVyAwkAZwIJAJADAQkBDWdldEFkbWluc0xpc3QABQZRVU9SVU0HCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5AwUIYnlBZG1pbnMGBQdieU93bmVy/higDw==", "height": 3005883, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GdH4e7EB2vMEqHGY6Lp9E7RyUF1d8MsQ37HCQaXn3vCw Next: 5fAo4Mwzbd4RkUo4XFpy2L5REPKT3Xr489baAix1rnp1 Diff:
OldNewDifferences
66 let SEP = "__"
77
88 let scale8 = 100000000
9-
10-let scale18 = 1000000000000000000
11-
12-let ADDRESS_BYTES_SIZE = 26
13-
14-let BLOCKS_IN_DAY = 1440
159
1610 func wrapErr (msg) = ((contractFile + ": ") + msg)
1711
4236 func keyHistory (address,txId) = makeString(["%s%s%s", "history", toString(address), toBase58String(txId)], SEP)
4337
4438
45-func formatHistory (amountIn,amountOut,stake) = makeString(["%d%d%d", toString(amountIn), toString(amountOut), toString(stake)], SEP)
39+func formatHistory (amountIn,amountOut,stake,stakingNode) = makeString(["%d%d%b%s", toString(amountIn), toString(amountOut), toString(stake), stakingNode], SEP)
4640
4741
4842 let assetInId = fromBase58String(valueOrErrorMessage(getString(this, keyAssetInId), wrapErr("invalid assetInId")))
7670 }
7771
7872 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+
7981
8082 let ADMIN_LIST_SIZE = 5
8183
113115
114116
115117 func genVotesKeysHelper (a,adminAddress) = {
116- let $t033223346 = a
117- let result = $t033223346._1
118- let prefix = $t033223346._2
118+ let $t034863510 = a
119+ let result = $t034863510._1
120+ let prefix = $t034863510._2
119121 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
120122 }
121123
122124
123125 func genVotesKeys (keyPrefix) = {
124126 let adminList = keyAdminAddressList()
125- let $t034933577 = {
127+ let $t036573741 = {
126128 let $l = getAdminsList()
127129 let $s = size($l)
128130 let $acc0 = $Tuple2(nil, keyPrefix)
136138
137139 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
138140 }
139- let result = $t034933577._1
140- let prefix = $t034933577._2
141+ let result = $t036573741._1
142+ let prefix = $t036573741._2
141143 result
142144 }
143145
204206 }
205207
206208
207-func getSwapActions (i,stake,stakingNode) = {
208- let userAddress = i.caller
209- let paymentSizeExpected = 1
210- if ((size(i.payments) != paymentSizeExpected))
211- then throwErr("invalid payments")
212- else {
213- let payment = i.payments[0]
214- if ((payment.assetId != assetInId))
215- then throwErr("invalid payment assetId")
216- else if ((assetOutPrice == 0))
217- then throwErr("invalid assetOutPrice")
218- else {
219- let assetInAmount = payment.amount
220- let assetOutAmount = fraction(assetInAmount, scale8, assetOutPrice)
221- if ((assetOutAmount == 0))
222- then throwErr("invalid assetOutAmount")
223- else {
224- let stakeInv = if (stake)
225- then invoke(stakingAddress, "stakeForSwapHELPER", [toString(userAddress), stakingNode], [AttachedPayment(assetOutId, assetOutAmount)])
226- else unit
227- if ((stakeInv == stakeInv))
228- then $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))] ++ (if (stake)
229- then nil
230- else [ScriptTransfer(userAddress, assetOutAmount, assetOutId)])), assetOutAmount)
231- else throw("Strict value is not equal to itself.")
232- }
233- }
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", [toString(userAddress), stakingNode], [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)
234237 }
238+ else throw("Strict value is not equal to itself.")
235239 }
236240
237241
238242 @Callable(i)
239-func swap (stake) = getSwapActions(i, stake, "")
243+func swap () = getSwapActions(i, "NULL")
240244
241245
242246
243247 @Callable(i)
244-func swapAndSetStakingNode (stake,stakingNode) = getSwapActions(i, stake, stakingNode)
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+ }
245263
246264
247265
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
9-
10-let scale18 = 1000000000000000000
11-
12-let ADDRESS_BYTES_SIZE = 26
13-
14-let BLOCKS_IN_DAY = 1440
159
1610 func wrapErr (msg) = ((contractFile + ": ") + msg)
1711
1812
1913 func throwErr (msg) = throw(wrapErr(msg))
2014
2115
2216 let keyAssetInId = makeString(["%s", "assetInId"], SEP)
2317
2418 let keyAssetOutId = makeString(["%s", "assetOutId"], SEP)
2519
2620 let keyAssetOutPrice = makeString(["%s", "assetOutPrice"], SEP)
2721
2822 let keyStakingAddress = makeString(["%s", "stakingAddress"], SEP)
2923
3024 let keyStatsTotalIn = makeString(["%s%s", "stats", "totalIn"], SEP)
3125
3226 let keyStatsTotalOut = makeString(["%s%s", "stats", "totalOut"], SEP)
3327
3428 let keyAllowedAddress = makeString(["%s", "allowedAddress"], SEP)
3529
3630 func keyStatsTotalInByAddress (address) = makeString(["%s%s%s", "stats", "totalIn", toString(address)], SEP)
3731
3832
3933 func keyStatsTotalOutByAddress (address) = makeString(["%s%s%s", "stats", "totalOut", toString(address)], SEP)
4034
4135
4236 func keyHistory (address,txId) = makeString(["%s%s%s", "history", toString(address), toBase58String(txId)], SEP)
4337
4438
45-func formatHistory (amountIn,amountOut,stake) = makeString(["%d%d%d", toString(amountIn), toString(amountOut), toString(stake)], SEP)
39+func formatHistory (amountIn,amountOut,stake,stakingNode) = makeString(["%d%d%b%s", toString(amountIn), toString(amountOut), toString(stake), stakingNode], SEP)
4640
4741
4842 let assetInId = fromBase58String(valueOrErrorMessage(getString(this, keyAssetInId), wrapErr("invalid assetInId")))
4943
5044 let assetInInfo = valueOrErrorMessage(assetInfo(assetInId), wrapErr("invalid assetInInfo"))
5145
5246 let assetOutId = fromBase58String(valueOrErrorMessage(getString(this, keyAssetOutId), wrapErr("invalid assetInId")))
5347
5448 let assetOutInfo = valueOrErrorMessage(assetInfo(assetOutId), wrapErr("invalid assetOutInfo"))
5549
5650 let assetOutPrice = valueOrErrorMessage(getInteger(this, keyAssetOutPrice), wrapErr("invalid assetOutPrice"))
5751
5852 let stakingAddressOption = match getString(this, keyStakingAddress) {
5953 case s: String =>
6054 addressFromString(s)
6155 case _: Unit =>
6256 unit
6357 case _ =>
6458 throw("Match error")
6559 }
6660
6761 let stakingAddress = valueOrErrorMessage(stakingAddressOption, wrapErr("invalid stakingAddress"))
6862
6963 let allowedAddressOption = match getString(this, keyAllowedAddress) {
7064 case s: String =>
7165 addressFromString(s)
7266 case _: Unit =>
7367 unit
7468 case _ =>
7569 throw("Match error")
7670 }
7771
7872 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+
7981
8082 let ADMIN_LIST_SIZE = 5
8183
8284 let QUORUM = 3
8385
8486 let TXID_BYTES_LENGTH = 32
8587
8688 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
8789
8890
8991 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
9092
9193
9294 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
9395
9496
9597 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
9698
9799
98100 func getAdminVote (prefix,admin) = {
99101 let voteKey = keyFullAdminVote(prefix, admin)
100102 valueOrElse(getInteger(voteKey), 0)
101103 }
102104
103105
104106 func getAdminsList () = match getString(this, keyAdminAddressList()) {
105107 case s: String =>
106108 split(s, SEP)
107109 case _ =>
108110 nil
109111 }
110112
111113
112114 func isInAdminList (address) = containsElement(getAdminsList(), address)
113115
114116
115117 func genVotesKeysHelper (a,adminAddress) = {
116- let $t033223346 = a
117- let result = $t033223346._1
118- let prefix = $t033223346._2
118+ let $t034863510 = a
119+ let result = $t034863510._1
120+ let prefix = $t034863510._2
119121 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
120122 }
121123
122124
123125 func genVotesKeys (keyPrefix) = {
124126 let adminList = keyAdminAddressList()
125- let $t034933577 = {
127+ let $t036573741 = {
126128 let $l = getAdminsList()
127129 let $s = size($l)
128130 let $acc0 = $Tuple2(nil, keyPrefix)
129131 func $f0_1 ($a,$i) = if (($i >= $s))
130132 then $a
131133 else genVotesKeysHelper($a, $l[$i])
132134
133135 func $f0_2 ($a,$i) = if (($i >= $s))
134136 then $a
135137 else throw("List size exceeds 5")
136138
137139 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
138140 }
139- let result = $t034933577._1
140- let prefix = $t034933577._2
141+ let result = $t036573741._1
142+ let prefix = $t036573741._2
141143 result
142144 }
143145
144146
145147 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
146148
147149
148150 func countVotes (prefix) = {
149151 let votes = genVotesKeys(prefix)
150152 let $l = votes
151153 let $s = size($l)
152154 let $acc0 = 0
153155 func $f0_1 ($a,$i) = if (($i >= $s))
154156 then $a
155157 else countVotesHelper($a, $l[$i])
156158
157159 func $f0_2 ($a,$i) = if (($i >= $s))
158160 then $a
159161 else throw("List size exceeds 5")
160162
161163 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
162164 }
163165
164166
165167 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
166168
167169
168170 func getClearVoteEntries (prefix) = {
169171 let votes = genVotesKeys(prefix)
170172 let $l = votes
171173 let $s = size($l)
172174 let $acc0 = nil
173175 func $f0_1 ($a,$i) = if (($i >= $s))
174176 then $a
175177 else clearVotesHelper($a, $l[$i])
176178
177179 func $f0_2 ($a,$i) = if (($i >= $s))
178180 then $a
179181 else throw("List size exceeds 5")
180182
181183 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
182184 }
183185
184186
185187 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
186188 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
187189 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
188190 let err = if (!(isInAdminList(callerAddressString)))
189191 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
190192 else if ((adminCurrentVote == 1))
191193 then throwErr((voteKey + " you already voted"))
192194 else unit
193195 if ((err == err))
194196 then {
195197 let votes = countVotes(keyPrefix)
196198 if (((votes + 1) >= minVotes))
197199 then {
198200 let clearVoteEntries = getClearVoteEntries(keyPrefix)
199201 (clearVoteEntries ++ voteResult)
200202 }
201203 else [IntegerEntry(voteKey, 1)]
202204 }
203205 else throw("Strict value is not equal to itself.")
204206 }
205207
206208
207-func getSwapActions (i,stake,stakingNode) = {
208- let userAddress = i.caller
209- let paymentSizeExpected = 1
210- if ((size(i.payments) != paymentSizeExpected))
211- then throwErr("invalid payments")
212- else {
213- let payment = i.payments[0]
214- if ((payment.assetId != assetInId))
215- then throwErr("invalid payment assetId")
216- else if ((assetOutPrice == 0))
217- then throwErr("invalid assetOutPrice")
218- else {
219- let assetInAmount = payment.amount
220- let assetOutAmount = fraction(assetInAmount, scale8, assetOutPrice)
221- if ((assetOutAmount == 0))
222- then throwErr("invalid assetOutAmount")
223- else {
224- let stakeInv = if (stake)
225- then invoke(stakingAddress, "stakeForSwapHELPER", [toString(userAddress), stakingNode], [AttachedPayment(assetOutId, assetOutAmount)])
226- else unit
227- if ((stakeInv == stakeInv))
228- then $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))] ++ (if (stake)
229- then nil
230- else [ScriptTransfer(userAddress, assetOutAmount, assetOutId)])), assetOutAmount)
231- else throw("Strict value is not equal to itself.")
232- }
233- }
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", [toString(userAddress), stakingNode], [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)
234237 }
238+ else throw("Strict value is not equal to itself.")
235239 }
236240
237241
238242 @Callable(i)
239-func swap (stake) = getSwapActions(i, stake, "")
243+func swap () = getSwapActions(i, "NULL")
240244
241245
242246
243247 @Callable(i)
244-func swapAndSetStakingNode (stake,stakingNode) = getSwapActions(i, stake, stakingNode)
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+ }
245263
246264
247265
248266 @Callable(i)
249267 func claim () = {
250268 let checkCaller = if ((i.caller == allowedAddress))
251269 then true
252270 else throwErr("permission denied")
253271 if ((checkCaller == checkCaller))
254272 then $Tuple2([ScriptTransfer(allowedAddress, assetBalance(this, assetInId), assetInId)], unit)
255273 else throw("Strict value is not equal to itself.")
256274 }
257275
258276
259277
260278 @Callable(i)
261279 func voteForTxId (txId) = {
262280 let callerAddressString = toBase58String(i.caller.bytes)
263281 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
264282 let result = [StringEntry(keyAllowedTxId(), txId)]
265283 let allowedTxIdOption = getString(this, keyAllowedTxId())
266284 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
267285 then true
268286 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
269287 then true
270288 else (value(allowedTxIdOption) != txId))
271289 then true
272290 else throwErr((txId + " is already allowed"))]
273291 if ((err == err))
274292 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
275293 else throw("Strict value is not equal to itself.")
276294 }
277295
278296
279297 @Verifier(tx)
280298 func verify () = {
281299 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
282300 let byOwner = if ((size(getAdminsList()) >= QUORUM))
283301 then false
284302 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
285303 if (byAdmins)
286304 then true
287305 else byOwner
288306 }
289307

github/deemru/w8io/6500d08 
53.03 ms