tx · 4QTuVspwQvaP834z8rbWSSMf1pkmhnzSauW6EFpiJKW2

3MsgzbtRg8NEkbTcHBywtwTdCe9BRxMQo5T:  -0.00800000 Waves

2024.11.18 12:01 [3376687] smart account 3MsgzbtRg8NEkbTcHBywtwTdCe9BRxMQo5T > SELF 0.00000000 Waves

{ "type": 13, "id": "4QTuVspwQvaP834z8rbWSSMf1pkmhnzSauW6EFpiJKW2", "fee": 800000, "feeAssetId": null, "timestamp": 1731920489625, "version": 2, "chainId": 84, "sender": "3MsgzbtRg8NEkbTcHBywtwTdCe9BRxMQo5T", "senderPublicKey": "iTiQR3Kvxn7i8PFgEbZn36n5iFLxFwkTA6M3wi846Vx", "proofs": [ "7dUxP41BmhyagH4EGES2DAn4urqtQaedfN91pXotzLjFK2zh6YpgDKZcCNe5sSSshEWqKU6ziP7ZYYBmFqrK5qx" ], "script": "base64:BwJbCAISAwoBCBIECgIICBIECgIIARIECgIIBBIECgIIAhIDCgEIEgUKAwIBBBIECgICARIFCgMCAQISBQoDAhIREgQKAgIBEgQKAggYEgQKAggYEgMKAQESAwoBCCMAA1NFUAICX18AC3dhdmVzU3RyaW5nAgVXQVZFUwAQY29udHJhY3RGaWxlbmFtZQIUbWVtZV9pbV9mYWN0b3J5LnJpZGUAC2tQcmljZUFzc2V0AgxwcmljZV9fYXNzZXQACWtTaHV0ZG93bgIOc2h1dGRvd25fX2ZsYWcACHNodXRkb3duCQELdmFsdWVPckVsc2UCCQCgCAEFCWtTaHV0ZG93bgcBB3dyYXBFcnIBAXMJAKwCAgkArAICBRBjb250cmFjdEZpbGVuYW1lAgI6IAUBcwEIdGhyb3dFcnIBAXMJAAIBCQEHd3JhcEVycgEFAXMAD0FETUlOX0xJU1RfU0laRQAKAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwACWFkbWluTGlzdAkBDWdldEFkbWluc0xpc3QAAQ1pc0luQWRtaW5MaXN0AQdhZGRyZXNzCQEPY29udGFpbnNFbGVtZW50AgUJYWRtaW5MaXN0BQdhZGRyZXNzARJnZW5Wb3Rlc0tleXNIZWxwZXICAWEMYWRtaW5BZGRyZXNzBAskdDAxNTAyMTUyNgUBYQQGcmVzdWx0CAULJHQwMTUwMjE1MjYCXzEEBnByZWZpeAgFCyR0MDE1MDIxNTI2Al8yCQCUCgIJAM0IAgUGcmVzdWx0CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUMYWRtaW5BZGRyZXNzBQZwcmVmaXgBDGdlblZvdGVzS2V5cwEJa2V5UHJlZml4BAskdDAxNjM3MTcxNgoAAiRsBQlhZG1pbkxpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEBnJlc3VsdAgFCyR0MDE2MzcxNzE2Al8xBAZwcmVmaXgIBQskdDAxNjM3MTcxNgJfMgUGcmVzdWx0ARBjb3VudFZvdGVzSGVscGVyAgZyZXN1bHQHdm90ZUtleQkAZAIFBnJlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABCmNvdW50Vm90ZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNvdW50Vm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEGNsZWFyVm90ZXNIZWxwZXICBnJlc3VsdANrZXkJAM0IAgUGcmVzdWx0CQELRGVsZXRlRW50cnkBBQNrZXkBE2dldENsZWFyVm90ZUVudHJpZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNsZWFyVm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD3ZhbGlkYXRlQWRkcmVzcwEHYWRkcmVzcwkBCWlzRGVmaW5lZAEJAKYIAQUHYWRkcmVzcwASa0NhbGN1bGF0b3JBZGRyZXNzAhNjYWxjdWxhdG9yX19hZGRyZXNzABdjYWxjdWxhdG9yQWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQR0aGlzBRJrQ2FsY3VsYXRvckFkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABFjYWxjdWxhdG9yQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRdjYWxjdWxhdG9yQWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAhppbnZhbGlkIGNhbGN1bGF0b3IgYWRkcmVzcwELbXVzdEFkZHJlc3MCAWkHYWRkcmVzcwMJAAACCAUBaQZjYWxsZXIFB2FkZHJlc3MGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAEIbXVzdFRoaXMBAWkJAQttdXN0QWRkcmVzcwIFAWkFBHRoaXMBDm11c3RDYWxjdWxhdG9yAQFpCQELbXVzdEFkZHJlc3MCBQFpBRFjYWxjdWxhdG9yQWRkcmVzcwEMcGFyc2VBc3NldElkAQVpbnB1dAMJAAACBQVpbnB1dAULd2F2ZXNTdHJpbmcFBHVuaXQJANkEAQUFaW5wdXQBD2Fzc2V0SWRUb1N0cmluZwEFaW5wdXQDCQAAAgUFaW5wdXQFBHVuaXQFC3dhdmVzU3RyaW5nCQDYBAEJAQV2YWx1ZQEFBWlucHV0DwFpAQRpbml0ARRjYWxjdWxhdG9yQWRkcmVzc1N0cgQLY2hlY2tDYWxsZXIJAQhtdXN0VGhpcwEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUSa0NhbGN1bGF0b3JBZGRyZXNzBRRjYWxjdWxhdG9yQWRkcmVzc1N0cgkAzAgCCQELU3RyaW5nRW50cnkCBQtrUHJpY2VBc3NldAULd2F2ZXNTdHJpbmcFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzdHJpbmdFbnRyeQIDa2V5A3ZhbAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwFA2tleQkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQEMaW50ZWdlckVudHJ5AgNrZXkDdmFsAwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFA2tleQUDdmFsBQNuaWwFA2tleQkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQEMYm9vbGVhbkVudHJ5AgNrZXkDdmFsAwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIFA2tleQUDdmFsBQNuaWwFA2tleQkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQELYmluYXJ5RW50cnkCA2tleQN2YWwDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQELQmluYXJ5RW50cnkCBQNrZXkFA3ZhbAUDbmlsBQNrZXkJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBC2RlbGV0ZUVudHJ5AQNrZXkDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBBQNrZXkFA25pbAUDa2V5CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQdyZWlzc3VlAwdhc3NldElkBmFtb3VudApyZWlzc3VhYmxlAwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBB1JlaXNzdWUDBQdhc3NldElkBQZhbW91bnQFCnJlaXNzdWFibGUFA25pbAUGYW1vdW50CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQRidXJuAgdhc3NldElkBmFtb3VudAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQRCdXJuAgUHYXNzZXRJZAUGYW1vdW50BQNuaWwFBmFtb3VudAkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQENdHJhbnNmZXJBc3NldAMOcmVjaXBpZW50Qnl0ZXMGYW1vdW50B2Fzc2V0SWQDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEFDnJlY2lwaWVudEJ5dGVzBQZhbW91bnQFB2Fzc2V0SWQFA25pbAUGYW1vdW50CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQ50cmFuc2ZlckFzc2V0cwMOcmVjaXBpZW50Qnl0ZXMKYXNzZXRzTGlzdAthbW91bnRzTGlzdAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwoBDmFkZE5ld1RyYW5zZmVyAgNhY2MLbmV4dEFzc2V0SWQECyR0MDU5Nzk2MDAzBQNhY2MECXRyYW5zZmVycwgFCyR0MDU5Nzk2MDAzAl8xBAFqCAULJHQwNTk3OTYwMDMCXzIEC25ld1RyYW5zZmVyCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEFDnJlY2lwaWVudEJ5dGVzCQCRAwIFC2Ftb3VudHNMaXN0BQFqCQCRAwIFCmFzc2V0c0xpc3QFAWoEEHVwZGF0ZWRUcmFuc2ZlcnMJAM0IAgUJdHJhbnNmZXJzBQtuZXdUcmFuc2ZlcgkAlAoCBRB1cGRhdGVkVHJhbnNmZXJzCQBkAgUBagABBAskdDA2MjQwNjMyMQoAAiRsBQphc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEOYWRkTmV3VHJhbnNmZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoED2Fzc2V0c1RyYW5zZmVycwgFCyR0MDYyNDA2MzIxAl8xBApfbGFzdEluZGV4CAULJHQwNjI0MDYzMjECXzIJAJQKAgUPYXNzZXRzVHJhbnNmZXJzBQR1bml0CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQ10cmFuc2ZlcldhdmVzAg5yZWNpcGllbnRCeXRlcwZhbW91bnQDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEFDnJlY2lwaWVudEJ5dGVzBQZhbW91bnQFBHVuaXQFA25pbAUGYW1vdW50CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQRjYWxsAghmdW5jdGlvbgRhcmdzBA1jbGVhblBheW1lbnRzAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFA25pbAgFAWkIcGF5bWVudHMEBnJlc3VsdAkA/QcEBRFjYWxjdWxhdG9yQWRkcmVzcwUIZnVuY3Rpb24JAMwIAggFAWkPY2FsbGVyUHVibGljS2V5CQDMCAIFBGFyZ3MFA25pbAUNY2xlYW5QYXltZW50cwkAlAoCBQNuaWwFBnJlc3VsdAFpAQ5pbml0UG9vbEludm9rZQIRcG9vbEFkZHJlc3NTdHJpbmcEYXJncwMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwQNY29udmVydGVkQXJncwkAzAgCCQCRAwIFBGFyZ3MAAAkAzAgCCQCRAwIFBGFyZ3MAAQkAzAgCCQCRAwIFBGFyZ3MAAgkAzAgCCQCRAwIFBGFyZ3MAAwkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwAEBQNuaWwJAJQKAgUDbmlsCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEXBvb2xBZGRyZXNzU3RyaW5nAgRpbml0BQ1jb252ZXJ0ZWRBcmdzCAUBaQhwYXltZW50cwkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQESbm90aWZ5U3RhdHVzVXBkYXRlAQZzdGF0dXMEBnJlc3VsdAkA/QcEBRFjYWxjdWxhdG9yQWRkcmVzcwISbm90aWZ5U3RhdHVzVXBkYXRlCQDMCAIIBQFpD2NhbGxlclB1YmxpY0tleQkAzAgCCQDMCAIJAKQDAQUGc3RhdHVzBQNuaWwFA25pbAUDbmlsCQCUCgIFA25pbAUGcmVzdWx0AWkBC3ZvdGVGb3JUeElkAQR0eElkBBNjYWxsZXJBZGRyZXNzU3RyaW5nCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMECWtleVByZWZpeAkBGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEFBHR4SWQEBnJlc3VsdAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5QWxsb3dlZFR4SWQABQR0eElkBQNuaWwEEWFsbG93ZWRUeElkT3B0aW9uCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAAEA2VycgkAzAgCAwkAAAIJAMgBAQkA2QQBBQR0eElkBRFUWElEX0JZVEVTX0xFTkdUSAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAISIGlzIG5vdCB2YWxpZCB0eElkCQDMCAIDAwkAAAIFEWFsbG93ZWRUeElkT3B0aW9uBQR1bml0BgkBAiE9AgkBBXZhbHVlAQURYWxsb3dlZFR4SWRPcHRpb24FBHR4SWQGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEyBpcyBhbHJlYWR5IGFsbG93ZWQFA25pbAMJAAACBQNlcnIFA2VycgkBDHZvdGVJTlRFUk5BTAQFE2NhbGxlckFkZHJlc3NTdHJpbmcFCWtleVByZWZpeAUGUVVPUlVNBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAhieUFkbWlucwkAAAIJANgEAQgFAnR4AmlkCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAACAAQHYnlPd25lcgMJAGcCCQCQAwEFCWFkbWluTGlzdAUGUVVPUlVNBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQMFCGJ5QWRtaW5zBgUHYnlPd25lcjS6ndE=", "height": 3376687, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2zhLDdgkUJedH3EUp11sSv7VXQDMvWErLDjTFbpkpkjt Next: JxrJFsdokvQ6B4uC5FwJmiAxNEWG6BqRoUZTr4Tmvbh Diff:
OldNewDifferences
361361 }
362362
363363
364+@Verifier(tx)
365+func verify () = {
366+ let byAdmins = (toBase58String(tx.id) == valueOrElse(getString(this, keyAllowedTxId()), ""))
367+ let byOwner = if ((size(adminList) >= QUORUM))
368+ then false
369+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
370+ if (byAdmins)
371+ then true
372+ else byOwner
373+ }
374+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let wavesString = "WAVES"
77
88 let contractFilename = "meme_im_factory.ride"
99
1010 let kPriceAsset = "price__asset"
1111
1212 let kShutdown = "shutdown__flag"
1313
1414 let shutdown = valueOrElse(getBoolean(kShutdown), false)
1515
1616 func wrapErr (s) = ((contractFilename + ": ") + s)
1717
1818
1919 func throwErr (s) = throw(wrapErr(s))
2020
2121
2222 let ADMIN_LIST_SIZE = 10
2323
2424 let QUORUM = 3
2525
2626 let TXID_BYTES_LENGTH = 32
2727
2828 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
2929
3030
3131 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
3232
3333
3434 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
3535
3636
3737 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
3838
3939
4040 func getAdminVote (prefix,admin) = {
4141 let voteKey = keyFullAdminVote(prefix, admin)
4242 valueOrElse(getInteger(voteKey), 0)
4343 }
4444
4545
4646 func getAdminsList () = match getString(this, keyAdminAddressList()) {
4747 case s: String =>
4848 split(s, SEP)
4949 case _ =>
5050 nil
5151 }
5252
5353
5454 let adminList = getAdminsList()
5555
5656 func isInAdminList (address) = containsElement(adminList, address)
5757
5858
5959 func genVotesKeysHelper (a,adminAddress) = {
6060 let $t015021526 = a
6161 let result = $t015021526._1
6262 let prefix = $t015021526._2
6363 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
6464 }
6565
6666
6767 func genVotesKeys (keyPrefix) = {
6868 let $t016371716 = {
6969 let $l = adminList
7070 let $s = size($l)
7171 let $acc0 = $Tuple2(nil, keyPrefix)
7272 func $f0_1 ($a,$i) = if (($i >= $s))
7373 then $a
7474 else genVotesKeysHelper($a, $l[$i])
7575
7676 func $f0_2 ($a,$i) = if (($i >= $s))
7777 then $a
7878 else throw("List size exceeds 10")
7979
8080 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
8181 }
8282 let result = $t016371716._1
8383 let prefix = $t016371716._2
8484 result
8585 }
8686
8787
8888 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
8989
9090
9191 func countVotes (prefix) = {
9292 let votes = genVotesKeys(prefix)
9393 let $l = votes
9494 let $s = size($l)
9595 let $acc0 = 0
9696 func $f0_1 ($a,$i) = if (($i >= $s))
9797 then $a
9898 else countVotesHelper($a, $l[$i])
9999
100100 func $f0_2 ($a,$i) = if (($i >= $s))
101101 then $a
102102 else throw("List size exceeds 10")
103103
104104 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
105105 }
106106
107107
108108 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
109109
110110
111111 func getClearVoteEntries (prefix) = {
112112 let votes = genVotesKeys(prefix)
113113 let $l = votes
114114 let $s = size($l)
115115 let $acc0 = nil
116116 func $f0_1 ($a,$i) = if (($i >= $s))
117117 then $a
118118 else clearVotesHelper($a, $l[$i])
119119
120120 func $f0_2 ($a,$i) = if (($i >= $s))
121121 then $a
122122 else throw("List size exceeds 10")
123123
124124 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
125125 }
126126
127127
128128 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
129129 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
130130 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
131131 let err = if (!(isInAdminList(callerAddressString)))
132132 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
133133 else if ((adminCurrentVote == 1))
134134 then throwErr((voteKey + " you already voted"))
135135 else unit
136136 if ((err == err))
137137 then {
138138 let votes = countVotes(keyPrefix)
139139 if (((votes + 1) >= minVotes))
140140 then {
141141 let clearVoteEntries = getClearVoteEntries(keyPrefix)
142142 (clearVoteEntries ++ voteResult)
143143 }
144144 else [IntegerEntry(voteKey, 1)]
145145 }
146146 else throw("Strict value is not equal to itself.")
147147 }
148148
149149
150150 func validateAddress (address) = isDefined(addressFromString(address))
151151
152152
153153 let kCalculatorAddress = "calculator__address"
154154
155155 let calculatorAddressOption = match getString(this, kCalculatorAddress) {
156156 case s: String =>
157157 addressFromString(s)
158158 case _: Unit =>
159159 unit
160160 case _ =>
161161 throw("Match error")
162162 }
163163
164164 let calculatorAddress = valueOrErrorMessage(calculatorAddressOption, wrapErr("invalid calculator address"))
165165
166166 func mustAddress (i,address) = if ((i.caller == address))
167167 then true
168168 else throwErr("permission denied")
169169
170170
171171 func mustThis (i) = mustAddress(i, this)
172172
173173
174174 func mustCalculator (i) = mustAddress(i, calculatorAddress)
175175
176176
177177 func parseAssetId (input) = if ((input == wavesString))
178178 then unit
179179 else fromBase58String(input)
180180
181181
182182 func assetIdToString (input) = if ((input == unit))
183183 then wavesString
184184 else toBase58String(value(input))
185185
186186
187187 @Callable(i)
188188 func init (calculatorAddressStr) = {
189189 let checkCaller = mustThis(i)
190190 if ((checkCaller == checkCaller))
191191 then $Tuple2([StringEntry(kCalculatorAddress, calculatorAddressStr), StringEntry(kPriceAsset, wavesString)], unit)
192192 else throw("Strict value is not equal to itself.")
193193 }
194194
195195
196196
197197 @Callable(i)
198198 func stringEntry (key,val) = if (if (!(shutdown))
199199 then mustCalculator(i)
200200 else false)
201201 then $Tuple2([StringEntry(key, val)], key)
202202 else throwErr("not allowed")
203203
204204
205205
206206 @Callable(i)
207207 func integerEntry (key,val) = if (if (!(shutdown))
208208 then mustCalculator(i)
209209 else false)
210210 then $Tuple2([IntegerEntry(key, val)], key)
211211 else throwErr("not allowed")
212212
213213
214214
215215 @Callable(i)
216216 func booleanEntry (key,val) = if (if (!(shutdown))
217217 then mustCalculator(i)
218218 else false)
219219 then $Tuple2([BooleanEntry(key, val)], key)
220220 else throwErr("not allowed")
221221
222222
223223
224224 @Callable(i)
225225 func binaryEntry (key,val) = if (if (!(shutdown))
226226 then mustCalculator(i)
227227 else false)
228228 then $Tuple2([BinaryEntry(key, val)], key)
229229 else throwErr("not allowed")
230230
231231
232232
233233 @Callable(i)
234234 func deleteEntry (key) = if (if (!(shutdown))
235235 then mustCalculator(i)
236236 else false)
237237 then $Tuple2([DeleteEntry(key)], key)
238238 else throwErr("not allowed")
239239
240240
241241
242242 @Callable(i)
243243 func reissue (assetId,amount,reissuable) = if (if (!(shutdown))
244244 then mustCalculator(i)
245245 else false)
246246 then $Tuple2([Reissue(assetId, amount, reissuable)], amount)
247247 else throwErr("not allowed")
248248
249249
250250
251251 @Callable(i)
252252 func burn (assetId,amount) = if (if (!(shutdown))
253253 then mustCalculator(i)
254254 else false)
255255 then $Tuple2([Burn(assetId, amount)], amount)
256256 else throwErr("not allowed")
257257
258258
259259
260260 @Callable(i)
261261 func transferAsset (recipientBytes,amount,assetId) = if (if (!(shutdown))
262262 then mustCalculator(i)
263263 else false)
264264 then $Tuple2([ScriptTransfer(Address(recipientBytes), amount, assetId)], amount)
265265 else throwErr("not allowed")
266266
267267
268268
269269 @Callable(i)
270270 func transferAssets (recipientBytes,assetsList,amountsList) = if (if (!(shutdown))
271271 then mustCalculator(i)
272272 else false)
273273 then {
274274 func addNewTransfer (acc,nextAssetId) = {
275275 let $t059796003 = acc
276276 let transfers = $t059796003._1
277277 let j = $t059796003._2
278278 let newTransfer = ScriptTransfer(Address(recipientBytes), amountsList[j], assetsList[j])
279279 let updatedTransfers = (transfers :+ newTransfer)
280280 $Tuple2(updatedTransfers, (j + 1))
281281 }
282282
283283 let $t062406321 = {
284284 let $l = assetsList
285285 let $s = size($l)
286286 let $acc0 = $Tuple2(nil, 0)
287287 func $f0_1 ($a,$i) = if (($i >= $s))
288288 then $a
289289 else addNewTransfer($a, $l[$i])
290290
291291 func $f0_2 ($a,$i) = if (($i >= $s))
292292 then $a
293293 else throw("List size exceeds 10")
294294
295295 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
296296 }
297297 let assetsTransfers = $t062406321._1
298298 let _lastIndex = $t062406321._2
299299 $Tuple2(assetsTransfers, unit)
300300 }
301301 else throwErr("not allowed")
302302
303303
304304
305305 @Callable(i)
306306 func transferWaves (recipientBytes,amount) = if (if (!(shutdown))
307307 then mustCalculator(i)
308308 else false)
309309 then $Tuple2([ScriptTransfer(Address(recipientBytes), amount, unit)], amount)
310310 else throwErr("not allowed")
311311
312312
313313
314314 @Callable(i)
315315 func call (function,args) = {
316316 let cleanPayments = if ((i.callerPublicKey == base58'11111111111111111111111111111111'))
317317 then nil
318318 else i.payments
319319 let result = reentrantInvoke(calculatorAddress, function, [i.callerPublicKey, args], cleanPayments)
320320 $Tuple2(nil, result)
321321 }
322322
323323
324324
325325 @Callable(i)
326326 func initPoolInvoke (poolAddressString,args) = if (if (!(shutdown))
327327 then mustCalculator(i)
328328 else false)
329329 then {
330330 let convertedArgs = [args[0], args[1], args[2], args[3], parseIntValue(args[4])]
331331 $Tuple2(nil, invoke(addressFromStringValue(poolAddressString), "init", convertedArgs, i.payments))
332332 }
333333 else throwErr("not allowed")
334334
335335
336336
337337 @Callable(i)
338338 func notifyStatusUpdate (status) = {
339339 let result = reentrantInvoke(calculatorAddress, "notifyStatusUpdate", [i.callerPublicKey, [toString(status)]], nil)
340340 $Tuple2(nil, result)
341341 }
342342
343343
344344
345345 @Callable(i)
346346 func voteForTxId (txId) = {
347347 let callerAddressString = toBase58String(i.caller.bytes)
348348 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
349349 let result = [StringEntry(keyAllowedTxId(), txId)]
350350 let allowedTxIdOption = getString(this, keyAllowedTxId())
351351 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
352352 then true
353353 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
354354 then true
355355 else (value(allowedTxIdOption) != txId))
356356 then true
357357 else throwErr((txId + " is already allowed"))]
358358 if ((err == err))
359359 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
360360 else throw("Strict value is not equal to itself.")
361361 }
362362
363363
364+@Verifier(tx)
365+func verify () = {
366+ let byAdmins = (toBase58String(tx.id) == valueOrElse(getString(this, keyAllowedTxId()), ""))
367+ let byOwner = if ((size(adminList) >= QUORUM))
368+ then false
369+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
370+ if (byAdmins)
371+ then true
372+ else byOwner
373+ }
374+

github/deemru/w8io/169f3d6 
34.57 ms