tx · DtN8YFe4AwWo2cJjPJWuWumjSoD4ATAWEWki4kdAc3ao

3P3NVrhiyHBc4oUWNhtZRnJA5uLX9n39TK9:  -0.00900000 Waves

2023.01.25 14:54 [3485978] smart account 3P3NVrhiyHBc4oUWNhtZRnJA5uLX9n39TK9 > SELF 0.00000000 Waves

{ "type": 13, "id": "DtN8YFe4AwWo2cJjPJWuWumjSoD4ATAWEWki4kdAc3ao", "fee": 900000, "feeAssetId": null, "timestamp": 1674647638234, "version": 1, "sender": "3P3NVrhiyHBc4oUWNhtZRnJA5uLX9n39TK9", "senderPublicKey": "GeY4VJBhADH72vNVpDy6WUGW2rM2e2TjfnK8d4Kxzz59", "proofs": [ "4Sn1H1xp683RsZGzVvnjKWjcsrHZKCk3jtAk34ASLqdrGRTEeR8DJainuZCBtVz2BziLdybP84xnWtsiJtYZDeNR" ], "script": "base64:BgIiCAISAwoBCBIDCgEIEgMKAQgSAwoBCBIDCgEIEgUKAwgBBBkBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIEbTM6MQEGYXNJbnQyAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQBeAUHJG1hdGNoMAUBeAQBdAUHJG1hdGNoMAkAAgECGndyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQyAAtjb25maWdTdG9yZQIGY29uZmlnAA1jb25maWdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQtjb25maWdTdG9yZQAGbG9ja2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCCWxwX2xvY2tlcgIebm8gbHBfbG9ja2VyIGFkZHJlc3MgaW4gY29uZmlnAh9iYWQgbHBfbG9ja2VyIGFkZHJlc3MgaW4gY29uZmlnAAtyZXNlcnZlc1N0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCE3Jld2FyZGFibGVfcmVzZXJ2ZXMCIW5vIHJld2FyZGFibGVfcmVzZXJ2ZXMgcmVnaXN0ZXJlZAAIcmVzZXJ2ZXMJALwJAgULcmVzZXJ2ZXNTdHICAXwAA21WRAQHJG1hdGNoMAkAnQgCBQ1jb25maWdBZGRyZXNzAhF2aXJlc19kaXN0cmlidXRvcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWQFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWQFBHVuaXQAAlZECQETdmFsdWVPckVycm9yTWVzc2FnZQIFA21WRAIIbm8gZGlzdHIAAmRDCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kc19jb250cmFjdAIVbm8gZGl2aWRlbmRzX2NvbnRyYWN0AgdiYWQgZGl2AAt2aXJlc01pbnRlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAgx2aXJlc19taW50ZXICFG1haW46IG5vIHZpcmVzTWludGVyAgpiYWQgbWludGVyABFtYXliZVZpcmVzQXNzZXRJZAkAnQgCBQt2aXJlc01pbnRlcgIHYXNzZXRJZAAMdmlyZXNBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRFtYXliZVZpcmVzQXNzZXRJZAILbm8gdmlyZXMgaWQCEGludmFsaWQgdmlyZXMgaWQBCXJlc2VydmVCeQIFc3RvcmUFdmFsdWUKAQRmb2xkAgFhAXIEByRtYXRjaDAFAWEDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQFZm91bmQFByRtYXRjaDAFBWZvdW5kBANyc3IJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQFyAg9yc3IgYmFkIGFkZHJlc3MDCQAAAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFA3JzcgUFc3RvcmUJAKwCAgILcnNyIGhhcyBubyAFBXN0b3JlBQV2YWx1ZQUDcnNyBQR1bml0BAckbWF0Y2gwCgACJGwFCHJlc2VydmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUEdW5pdAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEBWZvdW5kBQckbWF0Y2gwBQVmb3VuZAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgh1bmtub3duIAUFc3RvcmUCBGZvciAFBXZhbHVlAgQgaW4gBQtyZXNlcnZlc1N0cgEDdmxSAQFyAwkBCGNvbnRhaW5zAgULcmVzZXJ2ZXNTdHIFAXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQFyAg1tYWluOiBiYWQgcnNyCQACAQkArAICAgx1bmtub3duIHJzcjoFAXIADm1heWJlUHJvdGVjdGVkBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEXByb3RlY3RlZF9yZXNlcnZlAwkAAQIFByRtYXRjaDACBlN0cmluZwQDcGRzBQckbWF0Y2gwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUDcGRzAg1iYWQgcHJvdGVjdGVkBQR1bml0ABBwcm90ZWN0ZWRSZXNlcnZlCQETdmFsdWVPckVycm9yTWVzc2FnZQIFDm1heWJlUHJvdGVjdGVkAhBubyBwcm90ZWN0ZWQgcnNyARFlbnN1cmVOb1Byb3RlY3RlZAEEdXNlcgQDaGFzBAckbWF0Y2gwBQ5tYXliZVByb3RlY3RlZAMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAJwYQUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJwYQkArAICAhVwcm90ZWN0ZWRfY29sbGF0ZXJhbF8FBHVzZXIHBwMFA2hhcwkAAgECCmRpc2FsbG93ZWQFBHVuaXQABWFUSWRTAghhVG9rZW5JZAEMbG9ja09yUGF5b3V0AwlyZWNpcGllbnQDYW10BGxvY2sDCQEBIQEFBGxvY2sJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUJcmVjaXBpZW50BQNhbXQFDHZpcmVzQXNzZXRJZAUDbmlsBAZkb0xvY2sJAPwHBAUCZEMCB2xvY2tGb3IJAMwIAgkApQgBBQlyZWNpcGllbnQJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHZpcmVzQXNzZXRJZAUDYW10BQNuaWwDCQAAAgUGZG9Mb2NrBQZkb0xvY2sFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECc1IBA3JzcgQHJG1hdGNoMAUDbVZEAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAJAPwHBAUBYQIKc3luY0hlaWdodAkAzAgCBQNyc3IFA25pbAUDbmlsBQR1bml0AQJ1UwUDcnNyBmFjdGlvbgR1c2VyCnVzZXJDaGFuZ2UMc3RyZWFtQ2hhbmdlBAckbWF0Y2gwBQNtVkQDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAkA/AcEBQFhAghvbkFjdGlvbgkAzAgCBQNyc3IJAMwIAgUGYWN0aW9uCQDMCAIFBHVzZXIJAMwIAgUKdXNlckNoYW5nZQkAzAgCBQxzdHJlYW1DaGFuZ2UFA25pbAUDbmlsBQR1bml0AAdsaW1pdGVyBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCB2xpbWl0ZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFkBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFkBQR1bml0AQtlbnN1cmVMaW1pdAQGYWN0aW9uA3JzcgR1c2VyBmFtb3VudAQHJG1hdGNoMAUHbGltaXRlcgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFsBQckbWF0Y2gwCQEFYXNJbnQBCQD8BwQFAWwCDXZhbGlkYXRlTGltaXQJAMwIAgUGYWN0aW9uCQDMCAIJAKUIAQUDcnNyCQDMCAIFBHVzZXIJAMwIAgUGYW1vdW50BQNuaWwFA25pbAYGAWkBCmluaXRpYWxpemUBAmNhCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgULY29uZmlnU3RvcmUFAmNhBQNuaWwBaQEYd2l0aGRyYXdVbmxvY2tlZExQVG9rZW5zAQhhVG9rZW5JZAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEBmNoZWNrcwkBCXJlc2VydmVCeQIFBWFUSWRTBQhhVG9rZW5JZAMJAAACBQZjaGVja3MFBmNoZWNrcwQBYwkA/AcEBQZsb2NrZXICFmNsZWFuVXBEaXN0cmlidXRpb25Gb3IJAMwIAgUEdXNlcgkAzAgCBQhhVG9rZW5JZAUDbmlsBQNuaWwDCQAAAgUBYwUBYwQCd2QJAQVhc0ludAEJAPwHBAUGbG9ja2VyAgh3aXRoZHJhdwkAzAgCBQR1c2VyCQDMCAIFCGFUb2tlbklkCQDMCAIFBHVzZXIFA25pbAUDbmlsAwkAAAIFAndkBQJ3ZAkAlAoCBQNuaWwFAndkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHXdpdGhkcmF3U2xhc2hlZExvY2tlZExQVG9rZW5zAQhhVG9rZW5JZAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEBmNoZWNrcwkBCXJlc2VydmVCeQIFBWFUSWRTBQhhVG9rZW5JZAMJAAACBQZjaGVja3MFBmNoZWNrcwQLJHQwNDQzODQ1ODUJAQZhc0ludDIBCQD8BwQFBmxvY2tlcgIPd2l0aGRyYXdTbGFzaGVkCQDMCAIFBHVzZXIJAMwIAgUIYVRva2VuSWQJAMwIAgUEdXNlcgUDbmlsBQNuaWwDCQAAAgULJHQwNDQzODQ1ODUFCyR0MDQ0Mzg0NTg1BAdzbGFzaGVkCAULJHQwNDQzODQ1ODUCXzIEAndkCAULJHQwNDQzODQ1ODUCXzEECHRyZWFzdXJ5CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIMZGFvX3RyZWFzdXJ5AhZubyB0cmVhc3VyeSBjb25maWd1cmVkCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdHJlYXN1cnkFB3NsYXNoZWQJANkEAQUIYVRva2VuSWQFA25pbAUCd2QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEWc3VwcGx5VW5sb2NrZWRMUFRva2VucwEIYVRva2VuSWQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBANyc3IJAQlyZXNlcnZlQnkCBQVhVElkUwUIYVRva2VuSWQDCQAAAgUDcnNyBQNyc3IEAWMJAPwHBAUGbG9ja2VyAhZjbGVhblVwRGlzdHJpYnV0aW9uRm9yCQDMCAIFBHVzZXIJAMwIAgUIYVRva2VuSWQFA25pbAUDbmlsAwkAAAIFAWMFAWMEAndkCQEFYXNJbnQBCQD8BwQFBmxvY2tlcgIId2l0aGRyYXcJAMwIAgUEdXNlcgkAzAgCBQhhVG9rZW5JZAkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAAIFAndkBQJ3ZAQGY2hlY2tzCQERZW5zdXJlTm9Qcm90ZWN0ZWQBBQR1c2VyAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAJzaAkBAnNSAQkApQgBBQNyc3IDCQAAAgUCc2gFAnNoBAxyZXBsZW5pc2hBbXQJAQVhc0ludAEJAPwHBAUDcnNyAh5yZXBsZW5pc0ZvclVubG9ja1dpdGhBdG9rZW5Gb3IJAMwIAgUEdXNlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFCGFUb2tlbklkBQJ3ZAUDbmlsAwkAAAIFDHJlcGxlbmlzaEFtdAUMcmVwbGVuaXNoQW10BANwUncJAQJ1UwUJAKUIAQUDcnNyAgdkZXBvc2l0BQR1c2VyBQxyZXBsZW5pc2hBbXQAAAMJAAACBQNwUncFA3BSdwkAlAoCBQNuaWwFAndkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFnJlZGVlbVVubG9ja2VkTFBUb2tlbnMBCGFUb2tlbklkBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQDcnNyCQEJcmVzZXJ2ZUJ5AgUFYVRJZFMFCGFUb2tlbklkAwkAAAIFA3JzcgUDcnNyBAFjCQD8BwQFBmxvY2tlcgIWY2xlYW5VcERpc3RyaWJ1dGlvbkZvcgkAzAgCBQR1c2VyCQDMCAIFCGFUb2tlbklkBQNuaWwFA25pbAMJAAACBQFjBQFjBAJ3ZAkBBWFzSW50AQkA/AcEBQZsb2NrZXICCHdpdGhkcmF3CQDMCAIFBHVzZXIJAMwIAgUIYVRva2VuSWQJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAACBQJ3ZAUCd2QEAnNoCQECc1IBCQClCAEFA3JzcgMJAAACBQJzaAUCc2gEA2FtdAkBBWFzSW50AQkA/AcEBQNyc3ICEHJlZGVlbUF0b2tlbnNGb3IJAMwIAgUEdXNlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFCGFUb2tlbklkBQJ3ZAUDbmlsAwkAAAIFA2FtdAUDYW10BAFlCQELZW5zdXJlTGltaXQEAgh3aXRoZHJhdwUDcnNyBQR1c2VyBQNhbXQDCQAAAgUBZQUBZQQDcFJ3CQECdVMFCQClCAEFA3JzcgIHZGVwb3NpdAUEdXNlcgAACQEBLQEFA2FtdAMJAAACBQNwUncFA3BSdwkAlAoCBQNuaWwFAndkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWNsYWltTHBSZXdhcmQDA3JzcgNhbXQEbG9jawQBdgkBA3ZsUgEFA3JzcgMJAAACBQF2BQF2BAhhVG9rZW5JZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFAXYFBWFUSWRTAhZubyBhVG9rZW5JZCBpbiByZXNlcnZlBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBYwkBBWFzSW50AQkA/AcEBQZsb2NrZXICEGNsYWltTHBSZXdhcmRGb3IJAMwIAgUEdXNlcgkAzAgCBQhhVG9rZW5JZAkAzAgCBQNhbXQFA25pbAUDbmlsAwkAAAIFAWMFAWMJAQxsb2NrT3JQYXlvdXQDCAUBaQZjYWxsZXIFAWMFBGxvY2sJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABBJtYXliZU9yYWNsZUFkZHJlc3MEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIOb3JhY2xlX2FkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMFBHVuaXQEBkhFSUdIVAUGaGVpZ2h0BARCQVNFAOgHBAtxdW9ydW1SYXRpbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFXByb3Bvc2FsX3F1b3J1bV9yYXRpbwIicHJvcG9zYWxRdW9ydW1SYXRpbyBpcyBub3QgZGVmaW5lZAQLcGFzc2VkUmF0aW8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzAhVwcm9wb3NhbF9wYXNzZWRfcmF0aW8CJXByb3Bvc2FsVGhyZXNob2xkUmF0aW8gaXMgbm90IGRlZmluZWQEDmdWaXJlc0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kc19jb250cmFjdAIVbm8gZGl2aWRlbmRzX2NvbnRyYWN0AhppbnZhbGlkIGRpdmlkZW5kc19jb250cmFjdAQOdm90aW5nQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIPdm90aW5nX2NvbnRyYWN0AhJubyB2b3RpbmdfY29udHJhY3QCF2ludmFsaWQgdm90aW5nX2NvbnRyYWN0BAJpZAkA2AQBCAUCdHgCaWQECHZvdGVzWWVzCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICDXByb3Bvc2FsX3llc18FAmlkAAAEB3ZvdGVzTm8JAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIMcHJvcG9zYWxfbm9fBQJpZAAABA5wcm9wb3NhbEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICEHByb3Bvc2FsX2hlaWdodF8FAmlkAhdwcm9wb3NhbCBub3QgcmVnaXN0ZXJlZAQKYXBwbHlTdGFydAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhRwcm9wb3NhbF9hcHBseXN0YXJ0XwUCaWQAAAQIYXBwbHlFbmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIScHJvcG9zYWxfYXBwbHllbmRfBQJpZAAABAt0b3RhbEdWaXJlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhBwcm9wb3NhbF9ndmlyZXNfBQJpZAAABAdlbmFibGVkCQELdmFsdWVPckVsc2UCCQCbCAIFDWNvbmZpZ0FkZHJlc3MCHW9wX2dvdmVybmFuY2VfYXBwbHlfdHhfcGF1c2VkBwQHdm90ZVllcwUIdm90ZXNZZXMEBnZvdGVObwUHdm90ZXNObwQKdG90YWxWb3RlcwkAZAIFB3ZvdGVZZXMFBnZvdGVObwQJaGFzUXVvcnVtCQBnAgkAaQIJAGgCBQp0b3RhbFZvdGVzBQRCQVNFBQt0b3RhbEdWaXJlcwULcXVvcnVtUmF0aW8ECWhhc1Bhc3NlZAkAZwIJAGkCCQBoAgUHdm90ZVllcwUEQkFTRQUKdG90YWxWb3RlcwULcGFzc2VkUmF0aW8ECHRvb0Vhcmx5CQBnAgUKYXBwbHlTdGFydAUGSEVJR0hUBAd0b29MYXRlCQBnAgUGSEVJR0hUBQhhcHBseUVuZAQJdGltZURlYnVnCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEXByb3Bvc2FsSGVpZ2h0ID0gCQCkAwEFDnByb3Bvc2FsSGVpZ2h0Ag8sIGFwcGx5U3RhcnQgPSAJAKQDAQUKYXBwbHlTdGFydAINLCBhcHBseUVuZCA9IAkApAMBBQhhcHBseUVuZAILLCBIRUlHSFQgPSAJAKQDAQUGSEVJR0hUBAhieVZvdGluZwMJAQEhAQUHZW5hYmxlZAkAAgECK3R4IGFwcGxpY2F0aW9uIHRocm93IGdvdmVybmFuY2Ugbm90IGVuYWJsZWQDBQh0b29FYXJseQkAAgEJAKwCAgIucHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gZWFybHk6IAUJdGltZURlYnVnAwUHdG9vTGF0ZQkAAgEJAKwCAgIscHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gbGF0ZToFCXRpbWVEZWJ1ZwMJAQEhAQUJaGFzUXVvcnVtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgILbm8gcXVvcnVtOiACDHRvdGFsVm90ZXM6IAkApAMBBQp0b3RhbFZvdGVzAg8sIHRvdGFsR1ZpcmVzOiAJAKQDAQULdG90YWxHVmlyZXMCDywgcXVvcnVtUmF0aW86IAkApAMBBQtxdW9ydW1SYXRpbwMJAQEhAQUJaGFzUGFzc2VkCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIXbm8gdGhyZXNob2xkIGFjaGlldmVkOiACCXZvdGVZZXM6IAkApAMBBQd2b3RlWWVzAgosIHZvdGVObzogCQCkAwEFBnZvdGVObwIPLCBwYXNzZWRSYXRpbzogCQCkAwEFC3Bhc3NlZFJhdGlvBgMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkGBQhieVZvdGluZzTcdcs=", "chainId": 87, "height": 3485978, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9BFYqEW5dHfR9dGVg5x3NuvPdncZFBW51HBEYoxKmWDu Next: none Diff:
OldNewDifferences
7575 case found: Address =>
7676 found
7777 case _ =>
78- throw(("unknown " + store))
78+ throw(((((("unknown " + store) + "for ") + value) + " in ") + reservesStr))
7979 }
8080 }
8181
182182 let checks = reserveBy(aTIdS, aTokenId)
183183 if ((checks == checks))
184184 then {
185- let $t043984545 = asInt2(invoke(locker, "withdrawSlashed", [user, aTokenId, user], nil))
186- if (($t043984545 == $t043984545))
185+ let $t044384585 = asInt2(invoke(locker, "withdrawSlashed", [user, aTokenId, user], nil))
186+ if (($t044384585 == $t044384585))
187187 then {
188- let slashed = $t043984545._2
189- let wd = $t043984545._1
188+ let slashed = $t044384585._2
189+ let wd = $t044384585._1
190190 let treasury = addressFromStringValue(valueOrErrorMessage(getString(configAddress, "dao_treasury"), "no treasury configured"))
191191 $Tuple2([ScriptTransfer(treasury, slashed, fromBase58String(aTokenId))], wd)
192192 }
295295 }
296296
297297
298+@Verifier(tx)
299+func verify () = {
300+ let maybeOracleAddress = match getString(configAddress, "oracle_address") {
301+ case s: String =>
302+ addressFromString(s)
303+ case _ =>
304+ unit
305+ }
306+ let HEIGHT = height
307+ let BASE = 1000
308+ let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
309+ let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
310+ let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
311+ let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
312+ let id = toBase58String(tx.id)
313+ let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
314+ let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
315+ let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
316+ let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
317+ let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
318+ let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
319+ let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
320+ let voteYes = votesYes
321+ let voteNo = votesNo
322+ let totalVotes = (voteYes + voteNo)
323+ let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
324+ let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
325+ let tooEarly = (applyStart >= HEIGHT)
326+ let tooLate = (HEIGHT >= applyEnd)
327+ let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
328+ let byVoting = if (!(enabled))
329+ then throw("tx application throw governance not enabled")
330+ else if (tooEarly)
331+ then throw(("proposal can't be executed as it's too early: " + timeDebug))
332+ else if (tooLate)
333+ then throw(("proposal can't be executed as it's too late:" + timeDebug))
334+ else if (!(hasQuorum))
335+ then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
336+ else if (!(hasPassed))
337+ then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
338+ else true
339+ if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
340+ then true
341+ else byVoting
342+ }
343+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
55 then StringEntry(key, value)
66 else throw(("already initialized: " + key))
77
88
99 func asInt (value) = match value {
1010 case int: Int =>
1111 int
1212 case _ =>
1313 throw("m3:1")
1414 }
1515
1616
1717 func asInt2 (value) = match value {
1818 case x: (Int, Int) =>
1919 x
2020 case t =>
2121 throw("wrong type, expected: Int2")
2222 }
2323
2424
2525 let configStore = "config"
2626
2727 let configAddress = addressFromStringValue(getStringValue(this, configStore))
2828
2929 let locker = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "lp_locker"), "no lp_locker address in config")), "bad lp_locker address in config")
3030
3131 let reservesStr = valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "no rewardable_reserves registered")
3232
3333 let reserves = split_4C(reservesStr, "|")
3434
3535 let mVD = match getString(configAddress, "vires_distributor") {
3636 case d: String =>
3737 addressFromStringValue(d)
3838 case _ =>
3939 unit
4040 }
4141
4242 let VD = valueOrErrorMessage(mVD, "no distr")
4343
4444 let dC = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "bad div")
4545
4646 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_minter"), "main: no viresMinter")), "bad minter")
4747
4848 let maybeViresAssetId = getString(viresMinter, "assetId")
4949
5050 let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(maybeViresAssetId, "no vires id")), "invalid vires id")
5151
5252 func reserveBy (store,value) = {
5353 func fold (a,r) = match a {
5454 case found: Address =>
5555 found
5656 case _ =>
5757 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
5858 if ((valueOrErrorMessage(getString(rsr, store), ("rsr has no " + store)) == value))
5959 then rsr
6060 else unit
6161 }
6262
6363 match let $l = reserves
6464 let $s = size($l)
6565 let $acc0 = unit
6666 func $f0_1 ($a,$i) = if (($i >= $s))
6767 then $a
6868 else fold($a, $l[$i])
6969
7070 func $f0_2 ($a,$i) = if (($i >= $s))
7171 then $a
7272 else throw("List size exceeds 20")
7373
7474 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) {
7575 case found: Address =>
7676 found
7777 case _ =>
78- throw(("unknown " + store))
78+ throw(((((("unknown " + store) + "for ") + value) + " in ") + reservesStr))
7979 }
8080 }
8181
8282
8383 func vlR (r) = if (contains(reservesStr, r))
8484 then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
8585 else throw(("unknown rsr:" + r))
8686
8787
8888 let maybeProtected = match getString(configAddress, "protected_reserve") {
8989 case pds: String =>
9090 valueOrErrorMessage(addressFromString(pds), "bad protected")
9191 case _ =>
9292 unit
9393 }
9494
9595 let protectedReserve = valueOrErrorMessage(maybeProtected, "no protected rsr")
9696
9797 func ensureNoProtected (user) = {
9898 let has = match maybeProtected {
9999 case pa: Address =>
100100 valueOrElse(getBoolean(pa, ("protected_collateral_" + user)), false)
101101 case _ =>
102102 false
103103 }
104104 if (has)
105105 then throw("disallowed")
106106 else unit
107107 }
108108
109109
110110 let aTIdS = "aTokenId"
111111
112112 func lockOrPayout (recipient,amt,lock) = if (!(lock))
113113 then [ScriptTransfer(recipient, amt, viresAssetId)]
114114 else {
115115 let doLock = invoke(dC, "lockFor", [toString(recipient), 1], [AttachedPayment(viresAssetId, amt)])
116116 if ((doLock == doLock))
117117 then nil
118118 else throw("Strict value is not equal to itself.")
119119 }
120120
121121
122122 func sR (rsr) = match mVD {
123123 case a: Address =>
124124 invoke(a, "syncHeight", [rsr], nil)
125125 case _ =>
126126 unit
127127 }
128128
129129
130130 func uS (rsr,action,user,userChange,streamChange) = match mVD {
131131 case a: Address =>
132132 invoke(a, "onAction", [rsr, action, user, userChange, streamChange], nil)
133133 case _ =>
134134 unit
135135 }
136136
137137
138138 let limiter = match getString(configAddress, "limiter") {
139139 case d: String =>
140140 addressFromStringValue(d)
141141 case _ =>
142142 unit
143143 }
144144
145145 func ensureLimit (action,rsr,user,amount) = match limiter {
146146 case l: Address =>
147147 asInt(invoke(l, "validateLimit", [action, toString(rsr), user, amount], nil))
148148 case _ =>
149149 true
150150 }
151151
152152
153153 @Callable(i)
154154 func initialize (ca) = [writeConstString(configStore, ca)]
155155
156156
157157
158158 @Callable(i)
159159 func withdrawUnlockedLPTokens (aTokenId) = {
160160 let user = toString(i.caller)
161161 let checks = reserveBy(aTIdS, aTokenId)
162162 if ((checks == checks))
163163 then {
164164 let c = invoke(locker, "cleanUpDistributionFor", [user, aTokenId], nil)
165165 if ((c == c))
166166 then {
167167 let wd = asInt(invoke(locker, "withdraw", [user, aTokenId, user], nil))
168168 if ((wd == wd))
169169 then $Tuple2(nil, wd)
170170 else throw("Strict value is not equal to itself.")
171171 }
172172 else throw("Strict value is not equal to itself.")
173173 }
174174 else throw("Strict value is not equal to itself.")
175175 }
176176
177177
178178
179179 @Callable(i)
180180 func withdrawSlashedLockedLPTokens (aTokenId) = {
181181 let user = toString(i.caller)
182182 let checks = reserveBy(aTIdS, aTokenId)
183183 if ((checks == checks))
184184 then {
185- let $t043984545 = asInt2(invoke(locker, "withdrawSlashed", [user, aTokenId, user], nil))
186- if (($t043984545 == $t043984545))
185+ let $t044384585 = asInt2(invoke(locker, "withdrawSlashed", [user, aTokenId, user], nil))
186+ if (($t044384585 == $t044384585))
187187 then {
188- let slashed = $t043984545._2
189- let wd = $t043984545._1
188+ let slashed = $t044384585._2
189+ let wd = $t044384585._1
190190 let treasury = addressFromStringValue(valueOrErrorMessage(getString(configAddress, "dao_treasury"), "no treasury configured"))
191191 $Tuple2([ScriptTransfer(treasury, slashed, fromBase58String(aTokenId))], wd)
192192 }
193193 else throw("Strict value is not equal to itself.")
194194 }
195195 else throw("Strict value is not equal to itself.")
196196 }
197197
198198
199199
200200 @Callable(i)
201201 func supplyUnlockedLPTokens (aTokenId) = {
202202 let user = toString(i.caller)
203203 let rsr = reserveBy(aTIdS, aTokenId)
204204 if ((rsr == rsr))
205205 then {
206206 let c = invoke(locker, "cleanUpDistributionFor", [user, aTokenId], nil)
207207 if ((c == c))
208208 then {
209209 let wd = asInt(invoke(locker, "withdraw", [user, aTokenId, toString(this)], nil))
210210 if ((wd == wd))
211211 then {
212212 let checks = ensureNoProtected(user)
213213 if ((checks == checks))
214214 then {
215215 let sh = sR(toString(rsr))
216216 if ((sh == sh))
217217 then {
218218 let replenishAmt = asInt(invoke(rsr, "replenisForUnlockWithAtokenFor", [user], [AttachedPayment(fromBase58String(aTokenId), wd)]))
219219 if ((replenishAmt == replenishAmt))
220220 then {
221221 let pRw = uS(toString(rsr), "deposit", user, replenishAmt, 0)
222222 if ((pRw == pRw))
223223 then $Tuple2(nil, wd)
224224 else throw("Strict value is not equal to itself.")
225225 }
226226 else throw("Strict value is not equal to itself.")
227227 }
228228 else throw("Strict value is not equal to itself.")
229229 }
230230 else throw("Strict value is not equal to itself.")
231231 }
232232 else throw("Strict value is not equal to itself.")
233233 }
234234 else throw("Strict value is not equal to itself.")
235235 }
236236 else throw("Strict value is not equal to itself.")
237237 }
238238
239239
240240
241241 @Callable(i)
242242 func redeemUnlockedLPTokens (aTokenId) = {
243243 let user = toString(i.caller)
244244 let rsr = reserveBy(aTIdS, aTokenId)
245245 if ((rsr == rsr))
246246 then {
247247 let c = invoke(locker, "cleanUpDistributionFor", [user, aTokenId], nil)
248248 if ((c == c))
249249 then {
250250 let wd = asInt(invoke(locker, "withdraw", [user, aTokenId, toString(this)], nil))
251251 if ((wd == wd))
252252 then {
253253 let sh = sR(toString(rsr))
254254 if ((sh == sh))
255255 then {
256256 let amt = asInt(invoke(rsr, "redeemAtokensFor", [user], [AttachedPayment(fromBase58String(aTokenId), wd)]))
257257 if ((amt == amt))
258258 then {
259259 let e = ensureLimit("withdraw", rsr, user, amt)
260260 if ((e == e))
261261 then {
262262 let pRw = uS(toString(rsr), "deposit", user, 0, -(amt))
263263 if ((pRw == pRw))
264264 then $Tuple2(nil, wd)
265265 else throw("Strict value is not equal to itself.")
266266 }
267267 else throw("Strict value is not equal to itself.")
268268 }
269269 else throw("Strict value is not equal to itself.")
270270 }
271271 else throw("Strict value is not equal to itself.")
272272 }
273273 else throw("Strict value is not equal to itself.")
274274 }
275275 else throw("Strict value is not equal to itself.")
276276 }
277277 else throw("Strict value is not equal to itself.")
278278 }
279279
280280
281281
282282 @Callable(i)
283283 func claimLpReward (rsr,amt,lock) = {
284284 let v = vlR(rsr)
285285 if ((v == v))
286286 then {
287287 let aTokenId = valueOrErrorMessage(getString(v, aTIdS), "no aTokenId in reserve")
288288 let user = toString(i.caller)
289289 let c = asInt(invoke(locker, "claimLpRewardFor", [user, aTokenId, amt], nil))
290290 if ((c == c))
291291 then lockOrPayout(i.caller, c, lock)
292292 else throw("Strict value is not equal to itself.")
293293 }
294294 else throw("Strict value is not equal to itself.")
295295 }
296296
297297
298+@Verifier(tx)
299+func verify () = {
300+ let maybeOracleAddress = match getString(configAddress, "oracle_address") {
301+ case s: String =>
302+ addressFromString(s)
303+ case _ =>
304+ unit
305+ }
306+ let HEIGHT = height
307+ let BASE = 1000
308+ let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
309+ let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
310+ let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
311+ let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
312+ let id = toBase58String(tx.id)
313+ let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
314+ let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
315+ let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
316+ let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
317+ let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
318+ let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
319+ let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
320+ let voteYes = votesYes
321+ let voteNo = votesNo
322+ let totalVotes = (voteYes + voteNo)
323+ let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
324+ let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
325+ let tooEarly = (applyStart >= HEIGHT)
326+ let tooLate = (HEIGHT >= applyEnd)
327+ let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
328+ let byVoting = if (!(enabled))
329+ then throw("tx application throw governance not enabled")
330+ else if (tooEarly)
331+ then throw(("proposal can't be executed as it's too early: " + timeDebug))
332+ else if (tooLate)
333+ then throw(("proposal can't be executed as it's too late:" + timeDebug))
334+ else if (!(hasQuorum))
335+ then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
336+ else if (!(hasPassed))
337+ then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
338+ else true
339+ if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
340+ then true
341+ else byVoting
342+ }
343+

github/deemru/w8io/3ef1775 
43.87 ms