tx · 2zhLDdgkUJedH3EUp11sSv7VXQDMvWErLDjTFbpkpkjt

3MsgzbtRg8NEkbTcHBywtwTdCe9BRxMQo5T:  -0.00800000 Waves

2024.11.18 11:58 [3376685] smart account 3MsgzbtRg8NEkbTcHBywtwTdCe9BRxMQo5T > SELF 0.00000000 Waves

{ "type": 13, "id": "2zhLDdgkUJedH3EUp11sSv7VXQDMvWErLDjTFbpkpkjt", "fee": 800000, "feeAssetId": null, "timestamp": 1731920310972, "version": 2, "chainId": 84, "sender": "3MsgzbtRg8NEkbTcHBywtwTdCe9BRxMQo5T", "senderPublicKey": "iTiQR3Kvxn7i8PFgEbZn36n5iFLxFwkTA6M3wi846Vx", "proofs": [ "3oUUtkjb3RcGFccutqu6Fg8x5KD2RME5kWKFrPnLEm9nbYcTLUPSC95f2SkKkHE3ZqYk1LbswVGqz78N82t3LE8" ], "script": "base64:BwJbCAISAwoBCBIECgIICBIECgIIARIECgIIBBIECgIIAhIDCgEIEgUKAwIBBBIECgICARIFCgMCAQISBQoDAhIREgQKAgIBEgQKAggYEgQKAggYEgMKAQESAwoBCCMAA1NFUAICX18AC3dhdmVzU3RyaW5nAgVXQVZFUwAQY29udHJhY3RGaWxlbmFtZQIUbWVtZV9pbV9mYWN0b3J5LnJpZGUAC2tQcmljZUFzc2V0AgxwcmljZV9fYXNzZXQACWtTaHV0ZG93bgIOc2h1dGRvd25fX2ZsYWcACHNodXRkb3duCQELdmFsdWVPckVsc2UCCQCgCAEFCWtTaHV0ZG93bgcBB3dyYXBFcnIBAXMJAKwCAgkArAICBRBjb250cmFjdEZpbGVuYW1lAgI6IAUBcwEIdGhyb3dFcnIBAXMJAAIBCQEHd3JhcEVycgEFAXMAD0FETUlOX0xJU1RfU0laRQAKAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwACWFkbWluTGlzdAkBDWdldEFkbWluc0xpc3QAAQ1pc0luQWRtaW5MaXN0AQdhZGRyZXNzCQEPY29udGFpbnNFbGVtZW50AgUJYWRtaW5MaXN0BQdhZGRyZXNzARJnZW5Wb3Rlc0tleXNIZWxwZXICAWEMYWRtaW5BZGRyZXNzBAskdDAxNTAyMTUyNgUBYQQGcmVzdWx0CAULJHQwMTUwMjE1MjYCXzEEBnByZWZpeAgFCyR0MDE1MDIxNTI2Al8yCQCUCgIJAM0IAgUGcmVzdWx0CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUMYWRtaW5BZGRyZXNzBQZwcmVmaXgBDGdlblZvdGVzS2V5cwEJa2V5UHJlZml4BAskdDAxNjM3MTcxNgoAAiRsBQlhZG1pbkxpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEBnJlc3VsdAgFCyR0MDE2MzcxNzE2Al8xBAZwcmVmaXgIBQskdDAxNjM3MTcxNgJfMgUGcmVzdWx0ARBjb3VudFZvdGVzSGVscGVyAgZyZXN1bHQHdm90ZUtleQkAZAIFBnJlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABCmNvdW50Vm90ZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNvdW50Vm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEGNsZWFyVm90ZXNIZWxwZXICBnJlc3VsdANrZXkJAM0IAgUGcmVzdWx0CQELRGVsZXRlRW50cnkBBQNrZXkBE2dldENsZWFyVm90ZUVudHJpZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNsZWFyVm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD3ZhbGlkYXRlQWRkcmVzcwEHYWRkcmVzcwkBCWlzRGVmaW5lZAEJAKYIAQUHYWRkcmVzcwASa0NhbGN1bGF0b3JBZGRyZXNzAhNjYWxjdWxhdG9yX19hZGRyZXNzABdjYWxjdWxhdG9yQWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQR0aGlzBRJrQ2FsY3VsYXRvckFkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABFjYWxjdWxhdG9yQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRdjYWxjdWxhdG9yQWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAhppbnZhbGlkIGNhbGN1bGF0b3IgYWRkcmVzcwELbXVzdEFkZHJlc3MCAWkHYWRkcmVzcwMJAAACCAUBaQZjYWxsZXIFB2FkZHJlc3MGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAEIbXVzdFRoaXMBAWkJAQttdXN0QWRkcmVzcwIFAWkFBHRoaXMBDm11c3RDYWxjdWxhdG9yAQFpCQELbXVzdEFkZHJlc3MCBQFpBRFjYWxjdWxhdG9yQWRkcmVzcwEMcGFyc2VBc3NldElkAQVpbnB1dAMJAAACBQVpbnB1dAULd2F2ZXNTdHJpbmcFBHVuaXQJANkEAQUFaW5wdXQBD2Fzc2V0SWRUb1N0cmluZwEFaW5wdXQDCQAAAgUFaW5wdXQFBHVuaXQFC3dhdmVzU3RyaW5nCQDYBAEJAQV2YWx1ZQEFBWlucHV0DwFpAQRpbml0ARRjYWxjdWxhdG9yQWRkcmVzc1N0cgQLY2hlY2tDYWxsZXIJAQhtdXN0VGhpcwEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUSa0NhbGN1bGF0b3JBZGRyZXNzBRRjYWxjdWxhdG9yQWRkcmVzc1N0cgkAzAgCCQELU3RyaW5nRW50cnkCBQtrUHJpY2VBc3NldAULd2F2ZXNTdHJpbmcFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzdHJpbmdFbnRyeQIDa2V5A3ZhbAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwFA2tleQkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQEMaW50ZWdlckVudHJ5AgNrZXkDdmFsAwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFA2tleQUDdmFsBQNuaWwFA2tleQkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQEMYm9vbGVhbkVudHJ5AgNrZXkDdmFsAwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIFA2tleQUDdmFsBQNuaWwFA2tleQkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQELYmluYXJ5RW50cnkCA2tleQN2YWwDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQELQmluYXJ5RW50cnkCBQNrZXkFA3ZhbAUDbmlsBQNrZXkJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBC2RlbGV0ZUVudHJ5AQNrZXkDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBBQNrZXkFA25pbAUDa2V5CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQdyZWlzc3VlAwdhc3NldElkBmFtb3VudApyZWlzc3VhYmxlAwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBB1JlaXNzdWUDBQdhc3NldElkBQZhbW91bnQFCnJlaXNzdWFibGUFA25pbAUGYW1vdW50CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQRidXJuAgdhc3NldElkBmFtb3VudAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQRCdXJuAgUHYXNzZXRJZAUGYW1vdW50BQNuaWwFBmFtb3VudAkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQENdHJhbnNmZXJBc3NldAMOcmVjaXBpZW50Qnl0ZXMGYW1vdW50B2Fzc2V0SWQDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEFDnJlY2lwaWVudEJ5dGVzBQZhbW91bnQFB2Fzc2V0SWQFA25pbAUGYW1vdW50CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQ50cmFuc2ZlckFzc2V0cwMOcmVjaXBpZW50Qnl0ZXMKYXNzZXRzTGlzdAthbW91bnRzTGlzdAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwoBDmFkZE5ld1RyYW5zZmVyAgNhY2MLbmV4dEFzc2V0SWQECyR0MDU5Nzk2MDAzBQNhY2MECXRyYW5zZmVycwgFCyR0MDU5Nzk2MDAzAl8xBAFqCAULJHQwNTk3OTYwMDMCXzIEC25ld1RyYW5zZmVyCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEFDnJlY2lwaWVudEJ5dGVzCQCRAwIFC2Ftb3VudHNMaXN0BQFqCQCRAwIFCmFzc2V0c0xpc3QFAWoEEHVwZGF0ZWRUcmFuc2ZlcnMJAM0IAgUJdHJhbnNmZXJzBQtuZXdUcmFuc2ZlcgkAlAoCBRB1cGRhdGVkVHJhbnNmZXJzCQBkAgUBagABBAskdDA2MjQwNjMyMQoAAiRsBQphc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEOYWRkTmV3VHJhbnNmZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoED2Fzc2V0c1RyYW5zZmVycwgFCyR0MDYyNDA2MzIxAl8xBApfbGFzdEluZGV4CAULJHQwNjI0MDYzMjECXzIJAJQKAgUPYXNzZXRzVHJhbnNmZXJzBQR1bml0CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQ10cmFuc2ZlcldhdmVzAg5yZWNpcGllbnRCeXRlcwZhbW91bnQDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEFDnJlY2lwaWVudEJ5dGVzBQZhbW91bnQFBHVuaXQFA25pbAUGYW1vdW50CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQRjYWxsAghmdW5jdGlvbgRhcmdzBA1jbGVhblBheW1lbnRzAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFA25pbAgFAWkIcGF5bWVudHMEBnJlc3VsdAkA/QcEBRFjYWxjdWxhdG9yQWRkcmVzcwUIZnVuY3Rpb24JAMwIAggFAWkPY2FsbGVyUHVibGljS2V5CQDMCAIFBGFyZ3MFA25pbAUNY2xlYW5QYXltZW50cwkAlAoCBQNuaWwFBnJlc3VsdAFpAQ5pbml0UG9vbEludm9rZQIRcG9vbEFkZHJlc3NTdHJpbmcEYXJncwMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwQNY29udmVydGVkQXJncwkAzAgCCQCRAwIFBGFyZ3MAAAkAzAgCCQCRAwIFBGFyZ3MAAQkAzAgCCQCRAwIFBGFyZ3MAAgkAzAgCCQCRAwIFBGFyZ3MAAwkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwAEBQNuaWwJAJQKAgUDbmlsCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEXBvb2xBZGRyZXNzU3RyaW5nAgRpbml0BQ1jb252ZXJ0ZWRBcmdzCAUBaQhwYXltZW50cwkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQESbm90aWZ5U3RhdHVzVXBkYXRlAQZzdGF0dXMEBnJlc3VsdAkA/QcEBRFjYWxjdWxhdG9yQWRkcmVzcwISbm90aWZ5U3RhdHVzVXBkYXRlCQDMCAIIBQFpD2NhbGxlclB1YmxpY0tleQkAzAgCCQDMCAIJAKQDAQUGc3RhdHVzBQNuaWwFA25pbAUDbmlsCQCUCgIFA25pbAUGcmVzdWx0AWkBC3ZvdGVGb3JUeElkAQR0eElkBBNjYWxsZXJBZGRyZXNzU3RyaW5nCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMECWtleVByZWZpeAkBGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEFBHR4SWQEBnJlc3VsdAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5QWxsb3dlZFR4SWQABQR0eElkBQNuaWwEEWFsbG93ZWRUeElkT3B0aW9uCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAAEA2VycgkAzAgCAwkAAAIJAMgBAQkA2QQBBQR0eElkBRFUWElEX0JZVEVTX0xFTkdUSAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAISIGlzIG5vdCB2YWxpZCB0eElkCQDMCAIDAwkAAAIFEWFsbG93ZWRUeElkT3B0aW9uBQR1bml0BgkBAiE9AgkBBXZhbHVlAQURYWxsb3dlZFR4SWRPcHRpb24FBHR4SWQGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEyBpcyBhbHJlYWR5IGFsbG93ZWQFA25pbAMJAAACBQNlcnIFA2VycgkBDHZvdGVJTlRFUk5BTAQFE2NhbGxlckFkZHJlc3NTdHJpbmcFCWtleVByZWZpeAUGUVVPUlVNBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4A5Nmu7g==", "height": 3376685, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FH2e5hPUf8o7CfbdQuY44NEafiWXezNwYUQfsnmsaUa4 Next: 4QTuVspwQvaP834z8rbWSSMf1pkmhnzSauW6EFpiJKW2 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let separator = "__"
4+let SEP = "__"
55
66 let wavesString = "WAVES"
77
1717
1818
1919 func throwErr (s) = throw(wrapErr(s))
20+
21+
22+let ADMIN_LIST_SIZE = 10
23+
24+let QUORUM = 3
25+
26+let TXID_BYTES_LENGTH = 32
27+
28+func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
29+
30+
31+func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
32+
33+
34+func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
35+
36+
37+func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
38+
39+
40+func getAdminVote (prefix,admin) = {
41+ let voteKey = keyFullAdminVote(prefix, admin)
42+ valueOrElse(getInteger(voteKey), 0)
43+ }
44+
45+
46+func getAdminsList () = match getString(this, keyAdminAddressList()) {
47+ case s: String =>
48+ split(s, SEP)
49+ case _ =>
50+ nil
51+}
52+
53+
54+let adminList = getAdminsList()
55+
56+func isInAdminList (address) = containsElement(adminList, address)
57+
58+
59+func genVotesKeysHelper (a,adminAddress) = {
60+ let $t015021526 = a
61+ let result = $t015021526._1
62+ let prefix = $t015021526._2
63+ $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
64+ }
65+
66+
67+func genVotesKeys (keyPrefix) = {
68+ let $t016371716 = {
69+ let $l = adminList
70+ let $s = size($l)
71+ let $acc0 = $Tuple2(nil, keyPrefix)
72+ func $f0_1 ($a,$i) = if (($i >= $s))
73+ then $a
74+ else genVotesKeysHelper($a, $l[$i])
75+
76+ func $f0_2 ($a,$i) = if (($i >= $s))
77+ then $a
78+ else throw("List size exceeds 10")
79+
80+ $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)
81+ }
82+ let result = $t016371716._1
83+ let prefix = $t016371716._2
84+ result
85+ }
86+
87+
88+func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
89+
90+
91+func countVotes (prefix) = {
92+ let votes = genVotesKeys(prefix)
93+ let $l = votes
94+ let $s = size($l)
95+ let $acc0 = 0
96+ func $f0_1 ($a,$i) = if (($i >= $s))
97+ then $a
98+ else countVotesHelper($a, $l[$i])
99+
100+ func $f0_2 ($a,$i) = if (($i >= $s))
101+ then $a
102+ else throw("List size exceeds 10")
103+
104+ $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)
105+ }
106+
107+
108+func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
109+
110+
111+func getClearVoteEntries (prefix) = {
112+ let votes = genVotesKeys(prefix)
113+ let $l = votes
114+ let $s = size($l)
115+ let $acc0 = nil
116+ func $f0_1 ($a,$i) = if (($i >= $s))
117+ then $a
118+ else clearVotesHelper($a, $l[$i])
119+
120+ func $f0_2 ($a,$i) = if (($i >= $s))
121+ then $a
122+ else throw("List size exceeds 10")
123+
124+ $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)
125+ }
126+
127+
128+func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
129+ let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
130+ let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
131+ let err = if (!(isInAdminList(callerAddressString)))
132+ then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
133+ else if ((adminCurrentVote == 1))
134+ then throwErr((voteKey + " you already voted"))
135+ else unit
136+ if ((err == err))
137+ then {
138+ let votes = countVotes(keyPrefix)
139+ if (((votes + 1) >= minVotes))
140+ then {
141+ let clearVoteEntries = getClearVoteEntries(keyPrefix)
142+ (clearVoteEntries ++ voteResult)
143+ }
144+ else [IntegerEntry(voteKey, 1)]
145+ }
146+ else throw("Strict value is not equal to itself.")
147+ }
20148
21149
22150 func validateAddress (address) = isDefined(addressFromString(address))
144272 else false)
145273 then {
146274 func addNewTransfer (acc,nextAssetId) = {
147- let $t032873311 = acc
148- let transfers = $t032873311._1
149- let j = $t032873311._2
275+ let $t059796003 = acc
276+ let transfers = $t059796003._1
277+ let j = $t059796003._2
150278 let newTransfer = ScriptTransfer(Address(recipientBytes), amountsList[j], assetsList[j])
151279 let updatedTransfers = (transfers :+ newTransfer)
152280 $Tuple2(updatedTransfers, (j + 1))
153281 }
154282
155- let $t035483629 = {
283+ let $t062406321 = {
156284 let $l = assetsList
157285 let $s = size($l)
158286 let $acc0 = $Tuple2(nil, 0)
166294
167295 $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)
168296 }
169- let assetsTransfers = $t035483629._1
170- let _lastIndex = $t035483629._2
297+ let assetsTransfers = $t062406321._1
298+ let _lastIndex = $t062406321._2
171299 $Tuple2(assetsTransfers, unit)
172300 }
173301 else throwErr("not allowed")
213341 }
214342
215343
344+
345+@Callable(i)
346+func voteForTxId (txId) = {
347+ let callerAddressString = toBase58String(i.caller.bytes)
348+ let keyPrefix = keyAllowedTxIdVotePrefix(txId)
349+ let result = [StringEntry(keyAllowedTxId(), txId)]
350+ let allowedTxIdOption = getString(this, keyAllowedTxId())
351+ let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
352+ then true
353+ else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
354+ then true
355+ else (value(allowedTxIdOption) != txId))
356+ then true
357+ else throwErr((txId + " is already allowed"))]
358+ if ((err == err))
359+ then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
360+ else throw("Strict value is not equal to itself.")
361+ }
362+
363+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let separator = "__"
4+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))
20+
21+
22+let ADMIN_LIST_SIZE = 10
23+
24+let QUORUM = 3
25+
26+let TXID_BYTES_LENGTH = 32
27+
28+func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
29+
30+
31+func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
32+
33+
34+func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
35+
36+
37+func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
38+
39+
40+func getAdminVote (prefix,admin) = {
41+ let voteKey = keyFullAdminVote(prefix, admin)
42+ valueOrElse(getInteger(voteKey), 0)
43+ }
44+
45+
46+func getAdminsList () = match getString(this, keyAdminAddressList()) {
47+ case s: String =>
48+ split(s, SEP)
49+ case _ =>
50+ nil
51+}
52+
53+
54+let adminList = getAdminsList()
55+
56+func isInAdminList (address) = containsElement(adminList, address)
57+
58+
59+func genVotesKeysHelper (a,adminAddress) = {
60+ let $t015021526 = a
61+ let result = $t015021526._1
62+ let prefix = $t015021526._2
63+ $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
64+ }
65+
66+
67+func genVotesKeys (keyPrefix) = {
68+ let $t016371716 = {
69+ let $l = adminList
70+ let $s = size($l)
71+ let $acc0 = $Tuple2(nil, keyPrefix)
72+ func $f0_1 ($a,$i) = if (($i >= $s))
73+ then $a
74+ else genVotesKeysHelper($a, $l[$i])
75+
76+ func $f0_2 ($a,$i) = if (($i >= $s))
77+ then $a
78+ else throw("List size exceeds 10")
79+
80+ $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)
81+ }
82+ let result = $t016371716._1
83+ let prefix = $t016371716._2
84+ result
85+ }
86+
87+
88+func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
89+
90+
91+func countVotes (prefix) = {
92+ let votes = genVotesKeys(prefix)
93+ let $l = votes
94+ let $s = size($l)
95+ let $acc0 = 0
96+ func $f0_1 ($a,$i) = if (($i >= $s))
97+ then $a
98+ else countVotesHelper($a, $l[$i])
99+
100+ func $f0_2 ($a,$i) = if (($i >= $s))
101+ then $a
102+ else throw("List size exceeds 10")
103+
104+ $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)
105+ }
106+
107+
108+func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
109+
110+
111+func getClearVoteEntries (prefix) = {
112+ let votes = genVotesKeys(prefix)
113+ let $l = votes
114+ let $s = size($l)
115+ let $acc0 = nil
116+ func $f0_1 ($a,$i) = if (($i >= $s))
117+ then $a
118+ else clearVotesHelper($a, $l[$i])
119+
120+ func $f0_2 ($a,$i) = if (($i >= $s))
121+ then $a
122+ else throw("List size exceeds 10")
123+
124+ $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)
125+ }
126+
127+
128+func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
129+ let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
130+ let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
131+ let err = if (!(isInAdminList(callerAddressString)))
132+ then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
133+ else if ((adminCurrentVote == 1))
134+ then throwErr((voteKey + " you already voted"))
135+ else unit
136+ if ((err == err))
137+ then {
138+ let votes = countVotes(keyPrefix)
139+ if (((votes + 1) >= minVotes))
140+ then {
141+ let clearVoteEntries = getClearVoteEntries(keyPrefix)
142+ (clearVoteEntries ++ voteResult)
143+ }
144+ else [IntegerEntry(voteKey, 1)]
145+ }
146+ else throw("Strict value is not equal to itself.")
147+ }
20148
21149
22150 func validateAddress (address) = isDefined(addressFromString(address))
23151
24152
25153 let kCalculatorAddress = "calculator__address"
26154
27155 let calculatorAddressOption = match getString(this, kCalculatorAddress) {
28156 case s: String =>
29157 addressFromString(s)
30158 case _: Unit =>
31159 unit
32160 case _ =>
33161 throw("Match error")
34162 }
35163
36164 let calculatorAddress = valueOrErrorMessage(calculatorAddressOption, wrapErr("invalid calculator address"))
37165
38166 func mustAddress (i,address) = if ((i.caller == address))
39167 then true
40168 else throwErr("permission denied")
41169
42170
43171 func mustThis (i) = mustAddress(i, this)
44172
45173
46174 func mustCalculator (i) = mustAddress(i, calculatorAddress)
47175
48176
49177 func parseAssetId (input) = if ((input == wavesString))
50178 then unit
51179 else fromBase58String(input)
52180
53181
54182 func assetIdToString (input) = if ((input == unit))
55183 then wavesString
56184 else toBase58String(value(input))
57185
58186
59187 @Callable(i)
60188 func init (calculatorAddressStr) = {
61189 let checkCaller = mustThis(i)
62190 if ((checkCaller == checkCaller))
63191 then $Tuple2([StringEntry(kCalculatorAddress, calculatorAddressStr), StringEntry(kPriceAsset, wavesString)], unit)
64192 else throw("Strict value is not equal to itself.")
65193 }
66194
67195
68196
69197 @Callable(i)
70198 func stringEntry (key,val) = if (if (!(shutdown))
71199 then mustCalculator(i)
72200 else false)
73201 then $Tuple2([StringEntry(key, val)], key)
74202 else throwErr("not allowed")
75203
76204
77205
78206 @Callable(i)
79207 func integerEntry (key,val) = if (if (!(shutdown))
80208 then mustCalculator(i)
81209 else false)
82210 then $Tuple2([IntegerEntry(key, val)], key)
83211 else throwErr("not allowed")
84212
85213
86214
87215 @Callable(i)
88216 func booleanEntry (key,val) = if (if (!(shutdown))
89217 then mustCalculator(i)
90218 else false)
91219 then $Tuple2([BooleanEntry(key, val)], key)
92220 else throwErr("not allowed")
93221
94222
95223
96224 @Callable(i)
97225 func binaryEntry (key,val) = if (if (!(shutdown))
98226 then mustCalculator(i)
99227 else false)
100228 then $Tuple2([BinaryEntry(key, val)], key)
101229 else throwErr("not allowed")
102230
103231
104232
105233 @Callable(i)
106234 func deleteEntry (key) = if (if (!(shutdown))
107235 then mustCalculator(i)
108236 else false)
109237 then $Tuple2([DeleteEntry(key)], key)
110238 else throwErr("not allowed")
111239
112240
113241
114242 @Callable(i)
115243 func reissue (assetId,amount,reissuable) = if (if (!(shutdown))
116244 then mustCalculator(i)
117245 else false)
118246 then $Tuple2([Reissue(assetId, amount, reissuable)], amount)
119247 else throwErr("not allowed")
120248
121249
122250
123251 @Callable(i)
124252 func burn (assetId,amount) = if (if (!(shutdown))
125253 then mustCalculator(i)
126254 else false)
127255 then $Tuple2([Burn(assetId, amount)], amount)
128256 else throwErr("not allowed")
129257
130258
131259
132260 @Callable(i)
133261 func transferAsset (recipientBytes,amount,assetId) = if (if (!(shutdown))
134262 then mustCalculator(i)
135263 else false)
136264 then $Tuple2([ScriptTransfer(Address(recipientBytes), amount, assetId)], amount)
137265 else throwErr("not allowed")
138266
139267
140268
141269 @Callable(i)
142270 func transferAssets (recipientBytes,assetsList,amountsList) = if (if (!(shutdown))
143271 then mustCalculator(i)
144272 else false)
145273 then {
146274 func addNewTransfer (acc,nextAssetId) = {
147- let $t032873311 = acc
148- let transfers = $t032873311._1
149- let j = $t032873311._2
275+ let $t059796003 = acc
276+ let transfers = $t059796003._1
277+ let j = $t059796003._2
150278 let newTransfer = ScriptTransfer(Address(recipientBytes), amountsList[j], assetsList[j])
151279 let updatedTransfers = (transfers :+ newTransfer)
152280 $Tuple2(updatedTransfers, (j + 1))
153281 }
154282
155- let $t035483629 = {
283+ let $t062406321 = {
156284 let $l = assetsList
157285 let $s = size($l)
158286 let $acc0 = $Tuple2(nil, 0)
159287 func $f0_1 ($a,$i) = if (($i >= $s))
160288 then $a
161289 else addNewTransfer($a, $l[$i])
162290
163291 func $f0_2 ($a,$i) = if (($i >= $s))
164292 then $a
165293 else throw("List size exceeds 10")
166294
167295 $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)
168296 }
169- let assetsTransfers = $t035483629._1
170- let _lastIndex = $t035483629._2
297+ let assetsTransfers = $t062406321._1
298+ let _lastIndex = $t062406321._2
171299 $Tuple2(assetsTransfers, unit)
172300 }
173301 else throwErr("not allowed")
174302
175303
176304
177305 @Callable(i)
178306 func transferWaves (recipientBytes,amount) = if (if (!(shutdown))
179307 then mustCalculator(i)
180308 else false)
181309 then $Tuple2([ScriptTransfer(Address(recipientBytes), amount, unit)], amount)
182310 else throwErr("not allowed")
183311
184312
185313
186314 @Callable(i)
187315 func call (function,args) = {
188316 let cleanPayments = if ((i.callerPublicKey == base58'11111111111111111111111111111111'))
189317 then nil
190318 else i.payments
191319 let result = reentrantInvoke(calculatorAddress, function, [i.callerPublicKey, args], cleanPayments)
192320 $Tuple2(nil, result)
193321 }
194322
195323
196324
197325 @Callable(i)
198326 func initPoolInvoke (poolAddressString,args) = if (if (!(shutdown))
199327 then mustCalculator(i)
200328 else false)
201329 then {
202330 let convertedArgs = [args[0], args[1], args[2], args[3], parseIntValue(args[4])]
203331 $Tuple2(nil, invoke(addressFromStringValue(poolAddressString), "init", convertedArgs, i.payments))
204332 }
205333 else throwErr("not allowed")
206334
207335
208336
209337 @Callable(i)
210338 func notifyStatusUpdate (status) = {
211339 let result = reentrantInvoke(calculatorAddress, "notifyStatusUpdate", [i.callerPublicKey, [toString(status)]], nil)
212340 $Tuple2(nil, result)
213341 }
214342
215343
344+
345+@Callable(i)
346+func voteForTxId (txId) = {
347+ let callerAddressString = toBase58String(i.caller.bytes)
348+ let keyPrefix = keyAllowedTxIdVotePrefix(txId)
349+ let result = [StringEntry(keyAllowedTxId(), txId)]
350+ let allowedTxIdOption = getString(this, keyAllowedTxId())
351+ let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
352+ then true
353+ else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
354+ then true
355+ else (value(allowedTxIdOption) != txId))
356+ then true
357+ else throwErr((txId + " is already allowed"))]
358+ if ((err == err))
359+ then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
360+ else throw("Strict value is not equal to itself.")
361+ }
362+
363+

github/deemru/w8io/169f3d6 
59.13 ms