tx · 5W6WDJEqTG3cmyyFyAqruNvqRYXxRbJ1ptt2gTja8L4V

3MsgzbtRg8NEkbTcHBywtwTdCe9BRxMQo5T:  -0.01300000 Waves

2024.12.23 10:19 [3426860] smart account 3MsgzbtRg8NEkbTcHBywtwTdCe9BRxMQo5T > SELF 0.00000000 Waves

{ "type": 13, "id": "5W6WDJEqTG3cmyyFyAqruNvqRYXxRbJ1ptt2gTja8L4V", "fee": 1300000, "feeAssetId": null, "timestamp": 1734938392445, "version": 2, "chainId": 84, "sender": "3MsgzbtRg8NEkbTcHBywtwTdCe9BRxMQo5T", "senderPublicKey": "iTiQR3Kvxn7i8PFgEbZn36n5iFLxFwkTA6M3wi846Vx", "proofs": [ "3RNGQwYkBDNX3U4xrtGC4a2mjsrSFPCTMNf8vM5Jby25qZwg8mnbkDXCZv6gcqmhTz1iJudQcLVnARoEYLwYewy3" ], "script": "base64:BwJxCAISAwoBCBIECgIICBIECgIIARIECgIIBBIECgIIAhIDCgEIEgUKAwIBBBIECgICARIFCgMCAQISBQoDAhIREgQKAgIBEgQKAggYEgQKAggYEgMKAQISAwoBARIHCgUCCAEIARIGCgQCCAgEEgMKAQgjAANTRVACAl9fAAt3YXZlc1N0cmluZwIFV0FWRVMAEGNvbnRyYWN0RmlsZW5hbWUCFG1lbWVfaW1fZmFjdG9yeS5yaWRlAAtrUHJpY2VBc3NldAIMcHJpY2VfX2Fzc2V0AAlrU2h1dGRvd24CDnNodXRkb3duX19mbGFnAAhzaHV0ZG93bgkBC3ZhbHVlT3JFbHNlAgkAoAgBBQlrU2h1dGRvd24HAQd3cmFwRXJyAQFzCQCsAgIJAKwCAgUQY29udHJhY3RGaWxlbmFtZQICOiAFAXMBCHRocm93RXJyAQFzCQACAQkBB3dyYXBFcnIBBQFzAA9BRE1JTl9MSVNUX1NJWkUACgAGUVVPUlVNAAMAEVRYSURfQllURVNfTEVOR1RIACABGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAglhbGxvd1R4SWQJAMwIAgUEdHhJZAUDbmlsBQNTRVABEGtleUZ1bGxBZG1pblZvdGUCBnByZWZpeAxhZG1pbkFkZHJlc3MJALkJAgkAzAgCBQZwcmVmaXgJAMwIAgUMYWRtaW5BZGRyZXNzBQNuaWwFA1NFUAETa2V5QWRtaW5BZGRyZXNzTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhBhZG1pbkFkZHJlc3NMaXN0BQNuaWwFA1NFUAEOa2V5QWxsb3dlZFR4SWQACQC5CQIJAMwIAgICJXMJAMwIAgIEdHhJZAUDbmlsBQNTRVABDGdldEFkbWluVm90ZQIGcHJlZml4BWFkbWluBAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQ1nZXRBZG1pbnNMaXN0AAQHJG1hdGNoMAkAnQgCBQR0aGlzCQETa2V5QWRtaW5BZGRyZXNzTGlzdAADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQC1CQIFAXMFA1NFUAUDbmlsAAlhZG1pbkxpc3QJAQ1nZXRBZG1pbnNMaXN0AAENaXNJbkFkbWluTGlzdAEHYWRkcmVzcwkBD2NvbnRhaW5zRWxlbWVudAIFCWFkbWluTGlzdAUHYWRkcmVzcwESZ2VuVm90ZXNLZXlzSGVscGVyAgFhDGFkbWluQWRkcmVzcwQLJHQwMTUwMjE1MjYFAWEEBnJlc3VsdAgFCyR0MDE1MDIxNTI2Al8xBAZwcmVmaXgIBQskdDAxNTAyMTUyNgJfMgkAlAoCCQDNCAIFBnJlc3VsdAkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFDGFkbWluQWRkcmVzcwUGcHJlZml4AQxnZW5Wb3Rlc0tleXMBCWtleVByZWZpeAQLJHQwMTYzNzE3MTYKAAIkbAUJYWRtaW5MaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFCWtleVByZWZpeAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQESZ2VuVm90ZXNLZXlzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAZyZXN1bHQIBQskdDAxNjM3MTcxNgJfMQQGcHJlZml4CAULJHQwMTYzNzE3MTYCXzIFBnJlc3VsdAEQY291bnRWb3Rlc0hlbHBlcgIGcmVzdWx0B3ZvdGVLZXkJAGQCBQZyZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQpjb3VudFZvdGVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjb3VudFZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARBjbGVhclZvdGVzSGVscGVyAgZyZXN1bHQDa2V5CQDNCAIFBnJlc3VsdAkBC0RlbGV0ZUVudHJ5AQUDa2V5ARNnZXRDbGVhclZvdGVFbnRyaWVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjbGVhclZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAQx2b3RlSU5URVJOQUwEE2NhbGxlckFkZHJlc3NTdHJpbmcJa2V5UHJlZml4CG1pblZvdGVzCnZvdGVSZXN1bHQEB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBBBhZG1pbkN1cnJlbnRWb3RlCQEMZ2V0QWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBANlcnIDCQEBIQEJAQ1pc0luQWRtaW5MaXN0AQUTY2FsbGVyQWRkcmVzc1N0cmluZwkBCHRocm93RXJyAQkArAICCQCsAgICCUFkZHJlc3M6IAUTY2FsbGVyQWRkcmVzc1N0cmluZwISIG5vdCBpbiBBZG1pbiBsaXN0AwkAAAIFEGFkbWluQ3VycmVudFZvdGUAAQkBCHRocm93RXJyAQkArAICBQd2b3RlS2V5AhIgeW91IGFscmVhZHkgdm90ZWQFBHVuaXQDCQAAAgUDZXJyBQNlcnIEBXZvdGVzCQEKY291bnRWb3RlcwEFCWtleVByZWZpeAMJAGcCCQBkAgUFdm90ZXMAAQUIbWluVm90ZXMEEGNsZWFyVm90ZUVudHJpZXMJARNnZXRDbGVhclZvdGVFbnRyaWVzAQUJa2V5UHJlZml4CQDOCAIFEGNsZWFyVm90ZUVudHJpZXMFCnZvdGVSZXN1bHQJAMwIAgkBDEludGVnZXJFbnRyeQIFB3ZvdGVLZXkAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ92YWxpZGF0ZUFkZHJlc3MBB2FkZHJlc3MJAQlpc0RlZmluZWQBCQCmCAEFB2FkZHJlc3MAEmtDYWxjdWxhdG9yQWRkcmVzcwITY2FsY3VsYXRvcl9fYWRkcmVzcwAXY2FsY3VsYXRvckFkZHJlc3NPcHRpb24EByRtYXRjaDAJAJ0IAgUEdGhpcwUSa0NhbGN1bGF0b3JBZGRyZXNzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgARY2FsY3VsYXRvckFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUXY2FsY3VsYXRvckFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIaaW52YWxpZCBjYWxjdWxhdG9yIGFkZHJlc3MBC211c3RBZGRyZXNzAgFpB2FkZHJlc3MDCQAAAggFAWkGY2FsbGVyBQdhZGRyZXNzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQBCG11c3RUaGlzAQFpCQELbXVzdEFkZHJlc3MCBQFpBQR0aGlzAQ5tdXN0Q2FsY3VsYXRvcgEBaQkBC211c3RBZGRyZXNzAgUBaQURY2FsY3VsYXRvckFkZHJlc3MBDHBhcnNlQXNzZXRJZAEFaW5wdXQDCQAAAgUFaW5wdXQFC3dhdmVzU3RyaW5nBQR1bml0CQDZBAEFBWlucHV0AQ9hc3NldElkVG9TdHJpbmcBBWlucHV0AwkAAAIFBWlucHV0BQR1bml0BQt3YXZlc1N0cmluZwkA2AQBCQEFdmFsdWUBBQVpbnB1dBIBaQEEaW5pdAEUY2FsY3VsYXRvckFkZHJlc3NTdHIEC2NoZWNrQ2FsbGVyCQEIbXVzdFRoaXMBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFEmtDYWxjdWxhdG9yQWRkcmVzcwUUY2FsY3VsYXRvckFkZHJlc3NTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa1ByaWNlQXNzZXQFC3dhdmVzU3RyaW5nBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc3RyaW5nRW50cnkCA2tleQN2YWwDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsBQNrZXkJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBDGludGVnZXJFbnRyeQIDa2V5A3ZhbAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQNrZXkFA3ZhbAUDbmlsBQNrZXkJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBDGJvb2xlYW5FbnRyeQIDa2V5A3ZhbAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQxCb29sZWFuRW50cnkCBQNrZXkFA3ZhbAUDbmlsBQNrZXkJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBC2JpbmFyeUVudHJ5AgNrZXkDdmFsAwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBC0JpbmFyeUVudHJ5AgUDa2V5BQN2YWwFA25pbAUDa2V5CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQtkZWxldGVFbnRyeQEDa2V5AwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQUDa2V5BQNuaWwFA2tleQkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQEHcmVpc3N1ZQMHYXNzZXRJZAZhbW91bnQKcmVpc3N1YWJsZQMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQdSZWlzc3VlAwUHYXNzZXRJZAUGYW1vdW50BQpyZWlzc3VhYmxlBQNuaWwFBmFtb3VudAkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQEEYnVybgIHYXNzZXRJZAZhbW91bnQDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQEEQnVybgIFB2Fzc2V0SWQFBmFtb3VudAUDbmlsBQZhbW91bnQJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBDXRyYW5zZmVyQXNzZXQDDnJlY2lwaWVudEJ5dGVzBmFtb3VudAdhc3NldElkAwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBBQ5yZWNpcGllbnRCeXRlcwUGYW1vdW50BQdhc3NldElkBQNuaWwFBmFtb3VudAkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQEOdHJhbnNmZXJBc3NldHMDDnJlY2lwaWVudEJ5dGVzCmFzc2V0c0xpc3QLYW1vdW50c0xpc3QDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcKAQ5hZGROZXdUcmFuc2ZlcgIDYWNjC25leHRBc3NldElkBAskdDA1OTc5NjAwMwUDYWNjBAl0cmFuc2ZlcnMIBQskdDA1OTc5NjAwMwJfMQQBaggFCyR0MDU5Nzk2MDAzAl8yBAtuZXdUcmFuc2ZlcgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBBQ5yZWNpcGllbnRCeXRlcwkAkQMCBQthbW91bnRzTGlzdAUBagkAkQMCBQphc3NldHNMaXN0BQFqBBB1cGRhdGVkVHJhbnNmZXJzCQDNCAIFCXRyYW5zZmVycwULbmV3VHJhbnNmZXIJAJQKAgUQdXBkYXRlZFRyYW5zZmVycwkAZAIFAWoAAQQLJHQwNjI0MDYzMjEKAAIkbAUKYXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDmFkZE5ld1RyYW5zZmVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA9hc3NldHNUcmFuc2ZlcnMIBQskdDA2MjQwNjMyMQJfMQQKX2xhc3RJbmRleAgFCyR0MDYyNDA2MzIxAl8yCQCUCgIFD2Fzc2V0c1RyYW5zZmVycwUEdW5pdAkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQENdHJhbnNmZXJXYXZlcwIOcmVjaXBpZW50Qnl0ZXMGYW1vdW50AwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBBQ5yZWNpcGllbnRCeXRlcwUGYW1vdW50BQR1bml0BQNuaWwFBmFtb3VudAkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQEEY2FsbAIIZnVuY3Rpb24EYXJncwQNY2xlYW5QYXltZW50cwMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkBIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQNuaWwIBQFpCHBheW1lbnRzBAZyZXN1bHQJAP0HBAURY2FsY3VsYXRvckFkZHJlc3MFCGZ1bmN0aW9uCQDMCAIIBQFpD2NhbGxlclB1YmxpY0tleQkAzAgCBQRhcmdzBQNuaWwFDWNsZWFuUGF5bWVudHMJAJQKAgUDbmlsBQZyZXN1bHQBaQEOaW5pdFBvb2xJbnZva2UCEXBvb2xBZGRyZXNzU3RyaW5nBGFyZ3MDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcEDWNvbnZlcnRlZEFyZ3MJAMwIAgkAkQMCBQRhcmdzAAAJAMwIAgkAkQMCBQRhcmdzAAEJAMwIAgkAkQMCBQRhcmdzAAIJAMwIAgkAkQMCBQRhcmdzAAMJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MABAUDbmlsCQCUCgIFA25pbAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBRFwb29sQWRkcmVzc1N0cmluZwIEaW5pdAUNY29udmVydGVkQXJncwgFAWkIcGF5bWVudHMJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBGXdpdGhkcmF3TGlxdWlkaXR5RnJvbVBvb2wBC3Bvb2xBZGRyZXNzAwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIFA25pbAkA/AcECQEHQWRkcmVzcwEFC3Bvb2xBZGRyZXNzAhl3aXRoZHJhd0xpcXVpZGl0eUF0VGFyZ2V0BQNuaWwFA25pbAkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQESbm90aWZ5U3RhdHVzVXBkYXRlAQZzdGF0dXMKARVrUG9vbEluZGV4RnJvbUFkZHJlc3MBB2FkZHJlc3MJALkJAgkAzAgCAgRwb29sCQDMCAIJAKUIAQUHYWRkcmVzcwUDbmlsBQNTRVAKAQtrUG9vbFN0YXR1cwEFaW5kZXgJALkJAgkAzAgCAgRwb29sCQDMCAICBnN0YXR1cwkAzAgCCQCkAwEFBWluZGV4BQNuaWwFA1NFUAQLcG9vbEFkZHJlc3MIBQFpBmNhbGxlcgQJcG9vbEluZGV4CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEVa1Bvb2xJbmRleEZyb21BZGRyZXNzAQULcG9vbEFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtrUG9vbFN0YXR1cwEFCXBvb2xJbmRleAUGc3RhdHVzBQNuaWwBaQEMY3JlYXRlV3hQb29sBQl1c2VyUG9vbHMIYXNzZXQxSWQMYXNzZXQxQW1vdW50CGFzc2V0MklkDGFzc2V0MkFtb3VudAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCBQNuaWwJAPwHBAkBB0FkZHJlc3MBBQl1c2VyUG9vbHMCBmNyZWF0ZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEMcGFyc2VBc3NldElkAQUIYXNzZXQxSWQFDGFzc2V0MUFtb3VudAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDHBhcnNlQXNzZXRJZAEFCGFzc2V0MklkBQxhc3NldDJBbW91bnQFA25pbAkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQENcmVnaXN0ZXJBc3NldAQKYXNzZXRTdG9yZQdhc3NldElkBGxvZ28IdmVyaWZpZWQDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgUDbmlsCQD8BwQJAQdBZGRyZXNzAQUKYXNzZXRTdG9yZQIOY3JlYXRlT3JVcGRhdGUJAMwIAgUHYXNzZXRJZAkAzAgCBQRsb2dvCQDMCAIFCHZlcmlmaWVkBQNuaWwFA25pbAkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQELdm90ZUZvclR4SWQBBHR4SWQEE2NhbGxlckFkZHJlc3NTdHJpbmcJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJa2V5UHJlZml4CQEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQUEdHhJZAQGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBbGxvd2VkVHhJZAAFBHR4SWQFA25pbAQRYWxsb3dlZFR4SWRPcHRpb24JAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAQDZXJyCQDMCAIDCQAAAgkAyAEBCQDZBAEFBHR4SWQFEVRYSURfQllURVNfTEVOR1RIBgkBCHRocm93RXJyAQkArAICBQR0eElkAhIgaXMgbm90IHZhbGlkIHR4SWQJAMwIAgMDCQAAAgURYWxsb3dlZFR4SWRPcHRpb24FBHVuaXQGCQECIT0CCQEFdmFsdWUBBRFhbGxvd2VkVHhJZE9wdGlvbgUEdHhJZAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAITIGlzIGFscmVhZHkgYWxsb3dlZAUDbmlsAwkAAAIFA2VycgUDZXJyCQEMdm90ZUlOVEVSTkFMBAUTY2FsbGVyQWRkcmVzc1N0cmluZwUJa2V5UHJlZml4BQZRVU9SVU0FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAECGJ5QWRtaW5zCQAAAgkA2AQBCAUCdHgCaWQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAIABAdieU93bmVyAwkAZwIJAJADAQUJYWRtaW5MaXN0BQZRVU9SVU0HCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5AwUIYnlBZG1pbnMGBQdieU93bmVyslsyfQ==", "height": 3426860, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 87yZfKeZoEqKcFwSsUh9ekLx25bX4ap94NoKX812fydN Next: none Diff:
OldNewDifferences
338338 func withdrawLiquidityFromPool (poolAddress) = if (if (!(shutdown))
339339 then mustCalculator(i)
340340 else false)
341- then $Tuple2(nil, reentrantInvoke(Address(poolAddress), "withdrawLiquidityAtTarget", nil, nil))
341+ then $Tuple2(nil, invoke(Address(poolAddress), "withdrawLiquidityAtTarget", nil, nil))
342342 else throwErr("not allowed")
343343
344344
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 withdrawLiquidityFromPool (poolAddress) = if (if (!(shutdown))
339339 then mustCalculator(i)
340340 else false)
341- then $Tuple2(nil, reentrantInvoke(Address(poolAddress), "withdrawLiquidityAtTarget", nil, nil))
341+ then $Tuple2(nil, invoke(Address(poolAddress), "withdrawLiquidityAtTarget", nil, nil))
342342 else throwErr("not allowed")
343343
344344
345345
346346 @Callable(i)
347347 func notifyStatusUpdate (status) = {
348348 func kPoolIndexFromAddress (address) = makeString(["pool", toString(address)], SEP)
349349
350350 func kPoolStatus (index) = makeString(["pool", "status", toString(index)], SEP)
351351
352352 let poolAddress = i.caller
353353 let poolIndex = getIntegerValue(this, kPoolIndexFromAddress(poolAddress))
354354 [IntegerEntry(kPoolStatus(poolIndex), status)]
355355 }
356356
357357
358358
359359 @Callable(i)
360360 func createWxPool (userPools,asset1Id,asset1Amount,asset2Id,asset2Amount) = if (if (!(shutdown))
361361 then mustCalculator(i)
362362 else false)
363363 then $Tuple2(nil, invoke(Address(userPools), "create", nil, [AttachedPayment(parseAssetId(asset1Id), asset1Amount), AttachedPayment(parseAssetId(asset2Id), asset2Amount)]))
364364 else throwErr("not allowed")
365365
366366
367367
368368 @Callable(i)
369369 func registerAsset (assetStore,assetId,logo,verified) = if (if (!(shutdown))
370370 then mustCalculator(i)
371371 else false)
372372 then $Tuple2(nil, invoke(Address(assetStore), "createOrUpdate", [assetId, logo, verified], nil))
373373 else throwErr("not allowed")
374374
375375
376376
377377 @Callable(i)
378378 func voteForTxId (txId) = {
379379 let callerAddressString = toBase58String(i.caller.bytes)
380380 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
381381 let result = [StringEntry(keyAllowedTxId(), txId)]
382382 let allowedTxIdOption = getString(this, keyAllowedTxId())
383383 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
384384 then true
385385 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
386386 then true
387387 else (value(allowedTxIdOption) != txId))
388388 then true
389389 else throwErr((txId + " is already allowed"))]
390390 if ((err == err))
391391 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
392392 else throw("Strict value is not equal to itself.")
393393 }
394394
395395
396396 @Verifier(tx)
397397 func verify () = {
398398 let byAdmins = (toBase58String(tx.id) == valueOrElse(getString(this, keyAllowedTxId()), ""))
399399 let byOwner = if ((size(adminList) >= QUORUM))
400400 then false
401401 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
402402 if (byAdmins)
403403 then true
404404 else byOwner
405405 }
406406

github/deemru/w8io/169f3d6 
61.84 ms