2023.01.25 16:07 [3486051] smart account 3P2RkFDTHJCB82HcVvJNU2eMEfUo82ZFagV > SELF 0.00000000 Waves

{ "type": 13, "id": "CpGb6BSHdeDv4EyNgoevpFmRXCrzMJ8YHX29revmded4", "fee": 1700000, "feeAssetId": null, "timestamp": 1674652034683, "version": 1, "sender": "3P2RkFDTHJCB82HcVvJNU2eMEfUo82ZFagV", "senderPublicKey": "Sx5vS5cxVcvs6Du84y8pwr1FKn6m2UH7jUsHVTBdnQT", "proofs": [ "3Jx7vUozUGZKFMYXLKgntVCUrh8vNsCheo1h6mpieqd3K7Y4yPBLd7LZHQCE2AXLqoWjamqF9Tf862ZvLkrezM5t" ], "script": "base64:BgIxCAISBAoCCAgSAwoBCBIHCgUICAgBARIHCgUICAgIARIFCgMICAESABIAEgMKAQgSACYAC2NvbmZpZ1N0b3JlAgZjb25maWcACnN0YXJ0ZWRLZXkCB3N0YXJ0ZWQBD3N5bmNIZWlnaHRTdG9yZQEHcmVzZXJ2ZQkArAICBQdyZXNlcnZlAgtfc3luY0hlaWdodAEKc3BlZWRTdG9yZQIHcmVzZXJ2ZQZhY3Rpb24JAKwCAgkArAICBQdyZXNlcnZlAgdfc3BlZWRfBQZhY3Rpb24BC3Jld2FyZFN0b3JlAgdyZXNlcnZlBmFjdGlvbgkArAICCQCsAgIFB3Jlc2VydmUCCF9yZXdhcmRfBQZhY3Rpb24BEHVzZXJDbGFpbWVkU3RvcmUCB3Jlc2VydmUEdXNlcgkArAICCQCsAgIFB3Jlc2VydmUCCV9jbGFpbWVkXwUEdXNlcgESdXNlclJld2FyZEFkalN0b3JlAwdyZXNlcnZlBmFjdGlvbgR1c2VyCQCsAgIJAKwCAgkArAICCQCsAgIFB3Jlc2VydmUCD191c2VyUmV3YXJkQWRqXwUGYWN0aW9uAgFfBQR1c2VyAQVwb3cxMAEBbgMJAAACBQFuAAYAwIQ9AwkAAAIFAW4ACACAwtcvCQACAQkArAICAg5iYWQgZGVjaW1hbHM6IAkApAMBBQFuARB3cml0ZUNvbnN0U3RyaW5nAgNrZXkFdmFsdWUDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMFA2tleQkBC1N0cmluZ0VudHJ5AgUDa2V5BQV2YWx1ZQkAAgEJAKwCAgIVYWxyZWFkeSBpbml0aWFsaXplZDogBQNrZXkADWNvbmZpZ0FkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwULY29uZmlnU3RvcmUCI3ZpcmVzLWRpc3RyaWJ1dG9yOiBubyBjb25maWdBZGRyZXNzAhZpbnZhbGlkIGNvbmZpZyBhZGRyZXNzAAt2aXJlc01pbnRlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAgx2aXJlc19taW50ZXICIXZpcmVzLWRpc3RyaWJ1dG9yOiBubyB2aXJlc01pbnRlcgITaW52YWxpZCB2aXJlc01pbnRlcgARcmV3YXJkUmVzZXJ2ZXNTdHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhNyZXdhcmRhYmxlX3Jlc2VydmVzAjN2aXJlcy1kaXN0cmlidXRvcjogbm8gcmV3YXJkYWJsZV9yZXNlcnZlcyBpbiBjb25maWcAFXplcm9SZXdhcmRSZXNlcnZlc1N0cgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhh6ZXJvX3Jld2FyZGFibGVfcmVzZXJ2ZXMCAAAOcmV3YXJkUmVzZXJ2ZXMJALwJAgURcmV3YXJkUmVzZXJ2ZXNTdHICAXwACnZpcmVzSWRTdHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQt2aXJlc01pbnRlcgIHYXNzZXRJZAIndmlyZXMtZGlzdHJpYnV0b3I6IG5vIHZpcmVzQXNzZXRJZFN0b3JlAAx2aXJlc0Fzc2V0SWQJANkEAQUKdmlyZXNJZFN0cgANYWN0aW9uRGVwb3NpdAIHZGVwb3NpdAAMYWN0aW9uQm9ycm93AgZib3Jyb3cBC3ZhbGlkQWN0aW9uAQZhY3Rpb24DAwkBAiE9AgUGYWN0aW9uBQ1hY3Rpb25EZXBvc2l0CQECIT0CBQZhY3Rpb24FDGFjdGlvbkJvcnJvdwcJAAIBCQCsAgICEGludmFsaWQgYWN0aW9uOiAFBmFjdGlvbgYBCG1haW5Pbmx5AQFpAwkBCGNvbnRhaW5zAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNY29uZmlnQWRkcmVzcwIEbWFpbgkApQgBCAUBaQZjYWxsZXIGCQACAQIQb25seSBtYWluIGNhbiBkbwAHc3RhcnRlZAkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwUKc3RhcnRlZEtleQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIZd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAEGYXNJbnQ0AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIUKEludCwgSW50LCBJbnQsIEludCkEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAhp3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50NAEGYXNJbnQ2AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIeKEludCwgSW50LCBJbnQsIEludCwgSW50LCBJbnQpBAF4BQckbWF0Y2gwBQF4BAF0BQckbWF0Y2gwCQACAQIad3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludDQBEWFzVXNlckJhbGFuY2VEYXRhAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIiKEludCwgSW50LCBJbnQsIEludCwgSW50LCBCb29sZWFuKQQBeAUHJG1hdGNoMAUBeAQBdAUHJG1hdGNoMAkAAgECIndyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQ1JkJvb2xlYW4ABmNvbmZpZwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwULY29uZmlnU3RvcmUAC2ZhY3RvcnNCYXNlAOgHARRkZXBvc2l0VG9Cb3Jyb3dSYXRpbwEHcmVzZXJ2ZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBmNvbmZpZwkArAICBQdyZXNlcnZlAhVfZGVwb3NpdFRvQm9ycm93UmF0aW8JAKwCAgkArAICAhlkZXBvc2l0VG9Cb3Jyb3dSYXRpbyBmb3IgBQdyZXNlcnZlAgggbm90IHNldAASbWF5YmVPcmFjbGVBZGRyZXNzBAckbWF0Y2gwCQCdCAIFBmNvbmZpZwIOb3JhY2xlX2FkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMFBHVuaXQBC29yYWNsZVByaWNlAQdhc3NldElkBAckbWF0Y2gwCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUSbWF5YmVPcmFjbGVBZGRyZXNzAglubyBvcmFjbGUCBXByaWNlCQDMCAIFB2Fzc2V0SWQFA25pbAUDbmlsAwkAAQIFByRtYXRjaDACA0ludAQBaQUHJG1hdGNoMAUBaQkAAgECD2JhZCBvcmFjbGUgZGF0YQAGSEVJR0hUBQZoZWlnaHQBBmFzSW50MgEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACCihJbnQsIEludCkEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAhp3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50MgEJb3BBbGxvd2VkAQJvcAQHJG1hdGNoMAkA/AcEBQ1jb25maWdBZGRyZXNzAglvcEFsbG93ZWQJAMwIAgUKdmlyZXNJZFN0cgkAzAgCBQJvcAUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAMFAWIGCQACAQILbm90IGFsbG93ZWQJAAIBAiFvcEFsbG93ZWQ6IHVuZXhwZWN0ZWQgcmVzdWx0IHR5cGUBFGN1cnJlbnRSZXNlcnZlUmV3YXJkAgdyZXNlcnZlBmFjdGlvbgQBaAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPc3luY0hlaWdodFN0b3JlAQUHcmVzZXJ2ZQUGSEVJR0hUBAxzdG9yZWRSZXdhcmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBC3Jld2FyZFN0b3JlAgUHcmVzZXJ2ZQUGYWN0aW9uAAADCQAAAgUBaAUGSEVJR0hUBQxzdG9yZWRSZXdhcmQEBXNwZWVkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQpzcGVlZFN0b3JlAgUHcmVzZXJ2ZQUGYWN0aW9uAAAEEWFjY3VtdWxhdGVkUmV3YXJkCQBoAgkAZQIFBkhFSUdIVAUBaAUFc3BlZWQJAGQCBQxzdG9yZWRSZXdhcmQFEWFjY3VtdWxhdGVkUmV3YXJkARpjdXJyZW50UmVzZXJ2ZVJld2FyZHNTcGVlZAAKAQVmb2xkMgIBbAdyZXNlcnZlCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQFsBQdyZXNlcnZlAgFfBQ1hY3Rpb25EZXBvc2l0AgE9CQCkAwEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBCnNwZWVkU3RvcmUCBQdyZXNlcnZlBQ1hY3Rpb25EZXBvc2l0AAACAiwgBQdyZXNlcnZlAgFfBQxhY3Rpb25Cb3Jyb3cCAT0JAKQDAQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEKc3BlZWRTdG9yZQIFB3Jlc2VydmUFDGFjdGlvbkJvcnJvdwAAAgIsIAoAAiRsBQ5yZXdhcmRSZXNlcnZlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFZm9sZDICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAERdXNlclJld2FyZEJhbGFuY2UCB3Jlc2VydmUEdXNlcgQLJHQwNDc4NTQ5MjUJAQZhc0ludDQBCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3Jlc2VydmUCEGdldEN1cnJlbnRUb3RhbHMJAMwIAgUEdXNlcgUDbmlsBQNuaWwED2N1clRvdGFsRGVwb3NpdAgFCyR0MDQ3ODU0OTI1Al8xBAxjdXJUb3RhbERlYnQIBQskdDA0Nzg1NDkyNQJfMgQLdXNlckRlcG9zaXQIBQskdDA0Nzg1NDkyNQJfMwQIdXNlckRlYnQIBQskdDA0Nzg1NDkyNQJfNAQSdG90YWxEZXBvc2l0UmV3YXJkCQEUY3VycmVudFJlc2VydmVSZXdhcmQCBQdyZXNlcnZlBQ1hY3Rpb25EZXBvc2l0BBF0b3RhbEJvcnJvd1Jld2FyZAkBFGN1cnJlbnRSZXNlcnZlUmV3YXJkAgUHcmVzZXJ2ZQUMYWN0aW9uQm9ycm93BA51c2VyRGVwb3NpdEFkagkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQESdXNlclJld2FyZEFkalN0b3JlAwUHcmVzZXJ2ZQUNYWN0aW9uRGVwb3NpdAUEdXNlcgAABA11c2VyQm9ycm93QWRqCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARJ1c2VyUmV3YXJkQWRqU3RvcmUDBQdyZXNlcnZlBQxhY3Rpb25Cb3Jyb3cFBHVzZXIAAAQKYWNjRGVwb3NpdAkAZAIFDnVzZXJEZXBvc2l0QWRqAwkAAAIFD2N1clRvdGFsRGVwb3NpdAAAAAAJAGsDBRJ0b3RhbERlcG9zaXRSZXdhcmQFC3VzZXJEZXBvc2l0BQ9jdXJUb3RhbERlcG9zaXQECWFjY0JvcnJvdwkAZAIFDXVzZXJCb3Jyb3dBZGoDCQAAAgUMY3VyVG90YWxEZWJ0AAAAAAkAawMFEXRvdGFsQm9ycm93UmV3YXJkBQh1c2VyRGVidAUMY3VyVG90YWxEZWJ0BAdjbGFpbWVkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARB1c2VyQ2xhaW1lZFN0b3JlAgUHcmVzZXJ2ZQUEdXNlcgAACQCVCgMFCmFjY0RlcG9zaXQFCWFjY0JvcnJvdwUHY2xhaW1lZAEIZXZhbFVzZXICB3Jlc2VydmUEdXNlcgQLJHQwNTc0OTU4MjAJARF1c2VyUmV3YXJkQmFsYW5jZQIFB3Jlc2VydmUFBHVzZXIECmFjY0RlcG9zaXQIBQskdDA1NzQ5NTgyMAJfMQQJYWNjQm9ycm93CAULJHQwNTc0OTU4MjACXzIEB2NsYWltZWQIBQskdDA1NzQ5NTgyMAJfMwkArAICCQCsAgIJAKwCAgkArAICCQCsAgICFWFjY3VtdWxhdGVkX2RlcG9zaXQ6IAkApAMBBQphY2NEZXBvc2l0AhYsIGFjY3VtdWxhdGVkX2JvcnJvdzogCQCkAwEFCWFjY0JvcnJvdwILLCBjbGFpbWVkOiAJAKQDAQUHY2xhaW1lZAEbYm9ycm93ZWRWYWx1ZUFuZFRvdGFsQm9ycm93AAoBBGZvbGQCA2FjYwFhBAdhZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUBYQkArAICAgxiYWQgYWRkcmVzcyAFAWEEDGFzc2V0RGVidFVzZAMJAQhjb250YWlucwIFFXplcm9SZXdhcmRSZXNlcnZlc1N0cgUBYQAABAdhc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwIHYXNzZXRJZAkArAICAh1hc3NldElkIG5vdCBmb3VuZCBpbiByZXNlcnZlIAUBYQQNYXNzZXREZWNpbWFscwMJAAACBQdhc3NldElkAgVXQVZFUwAICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUHYWRkcmVzcwIOYVRva2VuRGVjaW1hbHMJAKwCAgIkYVRva2VuRGVjaW1hbHMgbm90IGZvdW5kIGluIHJlc2VydmUgBQFhBAlhc3NldERlYnQICQEGYXNJbnQyAQkA/AcEBQdhZGRyZXNzAhNzdG9yZWREZXBvc2l0Qm9ycm93BQNuaWwFA25pbAJfMgkAawMFCWFzc2V0RGVidAkBC29yYWNsZVByaWNlAQUHYXNzZXRJZAkBBXBvdzEwAQUNYXNzZXREZWNpbWFscwQLJHQwNjcwNjY3MjYFA2FjYwQDbHN0CAULJHQwNjcwNjY3MjYCXzEEA2FnZwgFCyR0MDY3MDY2NzI2Al8yCQCUCgIJAM4IAgUDbHN0CQDMCAIFDGFzc2V0RGVidFVzZAUDbmlsCQBkAgUDYWdnBQxhc3NldERlYnRVc2QKAAIkbAUOcmV3YXJkUmVzZXJ2ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQJAWkBCmFkdmlzZVVzZXICB3Jlc2VydmUEdXNlcgQLJHQwNjg5NzY5NjgJARF1c2VyUmV3YXJkQmFsYW5jZQIFB3Jlc2VydmUFBHVzZXIECmFjY0RlcG9zaXQIBQskdDA2ODk3Njk2OAJfMQQJYWNjQm9ycm93CAULJHQwNjg5NzY5NjgCXzIEB2NsYWltZWQIBQskdDA2ODk3Njk2OAJfMwQXdG90YWxSZXdhcmRzQWNjdW11bGF0ZWQJAJYDAQkAzAgCAAAJAMwIAgkAZAIFCmFjY0RlcG9zaXQFCWFjY0JvcnJvdwUDbmlsBBByZXdhcmRzQXZhaWxhYmxlCQCWAwEJAMwIAgAACQDMCAIJAGUCBRd0b3RhbFJld2FyZHNBY2N1bXVsYXRlZAUHY2xhaW1lZAUDbmlsCQCUCgIFA25pbAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICFHJld2FyZHNBY2N1bXVsYXRlZDogCQCkAwEFF3RvdGFsUmV3YXJkc0FjY3VtdWxhdGVkAhQsIHJld2FyZHNBdmFpbGFibGU6IAkApAMBBRByZXdhcmRzQXZhaWxhYmxlAhIsIHJld2FyZHNDbGFpbWVkOiAJAKQDAQUHY2xhaW1lZAFpAQpzeW5jSGVpZ2h0AQdyZXNlcnZlAwkBASEBBQdzdGFydGVkBQNuaWwDCQAAAgUGSEVJR0hUCQCfCAEJAQ9zeW5jSGVpZ2h0U3RvcmUBBQdyZXNlcnZlBQNuaWwEFGN1cnJlbnREZXBvc2l0UmV3YXJkCQEUY3VycmVudFJlc2VydmVSZXdhcmQCBQdyZXNlcnZlBQ1hY3Rpb25EZXBvc2l0BBNjdXJyZW50Qm9ycm93UmV3YXJkCQEUY3VycmVudFJlc2VydmVSZXdhcmQCBQdyZXNlcnZlBQxhY3Rpb25Cb3Jyb3cJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtyZXdhcmRTdG9yZQIFB3Jlc2VydmUFDWFjdGlvbkRlcG9zaXQFFGN1cnJlbnREZXBvc2l0UmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQELcmV3YXJkU3RvcmUCBQdyZXNlcnZlBQxhY3Rpb25Cb3Jyb3cFE2N1cnJlbnRCb3Jyb3dSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9zeW5jSGVpZ2h0U3RvcmUBBQdyZXNlcnZlBQZIRUlHSFQFA25pbAFpAQhvbkFjdGlvbgUHcmVzZXJ2ZQZhY3Rpb24EdXNlcgp1c2VyQ2hhbmdlDHN0cmVhbUNoYW5nZQMJAQEhAQUHc3RhcnRlZAUDbmlsBAZjaGVja3MDCQEIbWFpbk9ubHkBBQFpCQELdmFsaWRBY3Rpb24BBQZhY3Rpb24HAwkAAAIFBmNoZWNrcwUGY2hlY2tzAwkBASEBCQEJaXNEZWZpbmVkAQkAzwgCBQ5yZXdhcmRSZXNlcnZlcwUHcmVzZXJ2ZQUDbmlsAwkBAiE9AgkBEUBleHRyTmF0aXZlKDEwNTUpAQkBD3N5bmNIZWlnaHRTdG9yZQEFB3Jlc2VydmUFBkhFSUdIVAkAAgECHmRpc3RyaWJ1dG9yOiBoZWlnaHQgbm90IHN5bmNlZAQLJHQwODI3Njg0MTYJAQZhc0ludDQBCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3Jlc2VydmUCEGdldEN1cnJlbnRUb3RhbHMJAMwIAgUEdXNlcgUDbmlsBQNuaWwED2N1clRvdGFsRGVwb3NpdAgFCyR0MDgyNzY4NDE2Al8xBAxjdXJUb3RhbERlYnQIBQskdDA4Mjc2ODQxNgJfMgQLdXNlckRlcG9zaXQIBQskdDA4Mjc2ODQxNgJfMwQIdXNlckRlYnQIBQskdDA4Mjc2ODQxNgJfNAQIbmV3VG90YWwDCQAAAgUGYWN0aW9uBQ1hY3Rpb25EZXBvc2l0BQ9jdXJUb3RhbERlcG9zaXQFDGN1clRvdGFsRGVidAQHbmV3VXNlcgMJAAACBQZhY3Rpb24FDWFjdGlvbkRlcG9zaXQFC3VzZXJEZXBvc2l0BQh1c2VyRGVidAQJcHJldlRvdGFsCQBlAgUIbmV3VG90YWwFDHN0cmVhbUNoYW5nZQQIcHJldlVzZXIJAGUCBQduZXdVc2VyBQp1c2VyQ2hhbmdlBBFwcmV2UmVzZXJ2ZVJld2FyZAkBFGN1cnJlbnRSZXNlcnZlUmV3YXJkAgUHcmVzZXJ2ZQUGYWN0aW9uBAtwcmV2VXNlckFkagkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQESdXNlclJld2FyZEFkalN0b3JlAwUHcmVzZXJ2ZQUGYWN0aW9uBQR1c2VyAAAEEG5ld1Jlc2VydmVSZXdhcmQDCQAAAgUJcHJldlRvdGFsAAAFEXByZXZSZXNlcnZlUmV3YXJkCQBrAwURcHJldlJlc2VydmVSZXdhcmQFCG5ld1RvdGFsBQlwcmV2VG90YWwEEG5ld1VzZXJSZXdhcmRBZGoDCQAAAgUIbmV3VG90YWwAAAkAZAIFC3ByZXZVc2VyQWRqBRFwcmV2UmVzZXJ2ZVJld2FyZAkAZQIFC3ByZXZVc2VyQWRqCQBrAwUQbmV3UmVzZXJ2ZVJld2FyZAUKdXNlckNoYW5nZQUIbmV3VG90YWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtyZXdhcmRTdG9yZQIFB3Jlc2VydmUFBmFjdGlvbgUQbmV3UmVzZXJ2ZVJld2FyZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEnVzZXJSZXdhcmRBZGpTdG9yZQMFB3Jlc2VydmUFBmFjdGlvbgUEdXNlcgUQbmV3VXNlclJld2FyZEFkagUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBG1vdmUFB3Jlc2VydmUGYWN0aW9uBGZyb20CdG8GYW1vdW50AwkBASEBBQdzdGFydGVkBQNuaWwEBmNoZWNrcwMJAQhtYWluT25seQEFAWkJAQt2YWxpZEFjdGlvbgEFBmFjdGlvbgcDCQAAAgUGY2hlY2tzBQZjaGVja3MDCQEBIQEJAQlpc0RlZmluZWQBCQDPCAIFDnJld2FyZFJlc2VydmVzBQdyZXNlcnZlBQNuaWwDCQECIT0CCQERQGV4dHJOYXRpdmUoMTA1NSkBCQEPc3luY0hlaWdodFN0b3JlAQUHcmVzZXJ2ZQUGSEVJR0hUCQACAQIeZGlzdHJpYnV0b3I6IGhlaWdodCBub3Qgc3luY2VkBAskdDA5NzM5OTkyNwkBBmFzSW50NgEJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcmVzZXJ2ZQIRZ2V0Q3VycmVudFRvdGFsczIJAMwIAgUEZnJvbQkAzAgCBQJ0bwUDbmlsBQNuaWwED2N1clRvdGFsRGVwb3NpdAgFCyR0MDk3Mzk5OTI3Al8xBAxjdXJUb3RhbERlYnQIBQskdDA5NzM5OTkyNwJfMgQPdXNlckRlcG9zaXRGcm9tCAULJHQwOTczOTk5MjcCXzMEDHVzZXJEZWJ0RnJvbQgFCyR0MDk3Mzk5OTI3Al80BA11c2VyRGVwb3NpdFRvCAULJHQwOTczOTk5MjcCXzUECnVzZXJEZWJ0VG8IBQskdDA5NzM5OTkyNwJfNgQFdG90YWwDCQAAAgUGYWN0aW9uBQ1hY3Rpb25EZXBvc2l0BQ9jdXJUb3RhbERlcG9zaXQFDGN1clRvdGFsRGVidAQHbmV3RnJvbQMJAAACBQZhY3Rpb24FDWFjdGlvbkRlcG9zaXQFD3VzZXJEZXBvc2l0RnJvbQUMdXNlckRlYnRGcm9tBAVuZXdUbwMJAAACBQZhY3Rpb24FDWFjdGlvbkRlcG9zaXQFDXVzZXJEZXBvc2l0VG8FCnVzZXJEZWJ0VG8EDXJlc2VydmVSZXdhcmQJARRjdXJyZW50UmVzZXJ2ZVJld2FyZAIFB3Jlc2VydmUFBmFjdGlvbgQRZnJvbVVzZXJSZXdhcmRBZGoJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEnVzZXJSZXdhcmRBZGpTdG9yZQMFB3Jlc2VydmUFBmFjdGlvbgUEZnJvbQAABA90b1VzZXJSZXdhcmRBZGoJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEnVzZXJSZXdhcmRBZGpTdG9yZQMFB3Jlc2VydmUFBmFjdGlvbgUCdG8AAAQUbmV3RnJvbVVzZXJSZXdhcmRBZGoJAGUCBRFmcm9tVXNlclJld2FyZEFkagkAawMFDXJlc2VydmVSZXdhcmQJAQEtAQUGYW1vdW50BQV0b3RhbAQSbmV3VG9Vc2VyUmV3YXJkQWRqCQBlAgUPdG9Vc2VyUmV3YXJkQWRqCQBrAwUNcmVzZXJ2ZVJld2FyZAUGYW1vdW50BQV0b3RhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEnVzZXJSZXdhcmRBZGpTdG9yZQMFB3Jlc2VydmUFBmFjdGlvbgUEZnJvbQUUbmV3RnJvbVVzZXJSZXdhcmRBZGoJAMwIAgkBDEludGVnZXJFbnRyeQIJARJ1c2VyUmV3YXJkQWRqU3RvcmUDBQdyZXNlcnZlBQZhY3Rpb24FAnRvBRJuZXdUb1VzZXJSZXdhcmRBZGoFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jbGFpbVJld2FyZEZvcgMHcmVzZXJ2ZQR1c2VyBmFtb3VudAMJAQIhPQIFBmFtb3VudAD///////////8BCQACAQIbZGlzdHJpYnV0b3I6IGNsYWltIGFsbCBvbmx5AwkBASEBBQdzdGFydGVkBQNuaWwEBmNoZWNrcwMJAQhtYWluT25seQEFAWkJAQlvcEFsbG93ZWQBAhhjbGFpbV92aXJlc19kaXN0cmlidXRpb24HAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA0kdDAxMTEwMTExMTcyCQERdXNlclJld2FyZEJhbGFuY2UCBQdyZXNlcnZlBQR1c2VyBAphY2NEZXBvc2l0CAUNJHQwMTExMDExMTE3MgJfMQQJYWNjQm9ycm93CAUNJHQwMTExMDExMTE3MgJfMgQHY2xhaW1lZAgFDSR0MDExMTAxMTExNzICXzMEC2FjY3VtdWxhdGVkCQBkAgUKYWNjRGVwb3NpdAUJYWNjQm9ycm93BAlhdmFpbGFibGUJAGUCBQthY2N1bXVsYXRlZAUHY2xhaW1lZAMJAGcCAAAFCWF2YWlsYWJsZQkAlAoCBQNuaWwAAAQEbWludAkA/AcEBQt2aXJlc01pbnRlcgIPZGlzdHJpYnV0b3JNaW50CQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFCWF2YWlsYWJsZQUDbmlsBQNuaWwDCQAAAgUEbWludAUEbWludAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQdXNlckNsYWltZWRTdG9yZQIFB3Jlc2VydmUFBHVzZXIJAGQCBQdjbGFpbWVkBQlhdmFpbGFibGUFA25pbAUJYXZhaWxhYmxlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3JlYWxsb2MAAwkBASEBCQEJb3BBbGxvd2VkAQIHcmVhbGxvYwkAAgECDnJlYWxsb2MgcGF1c2VkAwkBASEBBQdzdGFydGVkBQNuaWwECnRvdGFsU3BlZWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQZjb25maWcCC3RvdGFsX3NwZWVkAhlubyB0b3RhbCBhbGxvY2F0aW9uIHNwZWVkBA10b3RhbFJlc2VydmVzCQCQAwEFDnJld2FyZFJlc2VydmVzBA0kdDAxMTc4MTExODUxCQEbYm9ycm93ZWRWYWx1ZUFuZFRvdGFsQm9ycm93AAQUYm9ycm93ZWRWYWx1ZUJ5SW5kZXgIBQ0kdDAxMTc4MTExODUxAl8xBAt0b3RhbEJvcnJvdwgFDSR0MDExNzgxMTE4NTECXzIKAQRmb2xkAgFsBWluZGV4AwkAZwIFBWluZGV4BQ10b3RhbFJlc2VydmVzBQFsBAdyZXNlcnZlCQCRAwIFDnJld2FyZFJlc2VydmVzBQVpbmRleAQKYXNzZXRTcGVlZAMJAAACBQt0b3RhbEJvcnJvdwAAAAAJAGsDBQp0b3RhbFNwZWVkCQCRAwIFFGJvcnJvd2VkVmFsdWVCeUluZGV4BQVpbmRleAULdG90YWxCb3Jyb3cED25ld0RlcG9zaXRTcGVlZAkAawMFCmFzc2V0U3BlZWQJARRkZXBvc2l0VG9Cb3Jyb3dSYXRpbwEFB3Jlc2VydmUFC2ZhY3RvcnNCYXNlBA5uZXdCb3Jyb3dTcGVlZAkAZQIFCmFzc2V0U3BlZWQFD25ld0RlcG9zaXRTcGVlZAQUY3VycmVudERlcG9zaXRSZXdhcmQJARRjdXJyZW50UmVzZXJ2ZVJld2FyZAIFB3Jlc2VydmUFDWFjdGlvbkRlcG9zaXQEE2N1cnJlbnRCb3Jyb3dSZXdhcmQJARRjdXJyZW50UmVzZXJ2ZVJld2FyZAIFB3Jlc2VydmUFDGFjdGlvbkJvcnJvdwkAzggCBQFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKc3BlZWRTdG9yZQIFB3Jlc2VydmUFDWFjdGlvbkRlcG9zaXQFD25ld0RlcG9zaXRTcGVlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBC3Jld2FyZFN0b3JlAgUHcmVzZXJ2ZQUNYWN0aW9uRGVwb3NpdAUUY3VycmVudERlcG9zaXRSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQpzcGVlZFN0b3JlAgUHcmVzZXJ2ZQUMYWN0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YWRtaW5TdG9yZQMJAQIhPQIIBQFpBmNhbGxlcgUFYWRtaW4JAAIBAhFvbmx5IGFkbWluIGNhbiBkbwMFB3N0YXJ0ZWQJAAIBAg9hbHJlYWR5IHN0YXJ0ZWQKAQRmb2xkAgFsB3Jlc2VydmUJAM4IAgUBbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCnNwZWVkU3RvcmUCBQdyZXNlcnZlBQ1hY3Rpb25EZXBvc2l0AAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtyZXdhcmRTdG9yZQIFB3Jlc2VydmUFDWFjdGlvbkRlcG9zaXQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCnNwZWVkU3RvcmUCBQdyZXNlcnZlBQxhY3Rpb25Cb3Jyb3cAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBC3Jld2FyZFN0b3JlAgUHcmVzZXJ2ZQUMYWN0aW9uQm9ycm93AAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9zeW5jSGVpZ2h0U3RvcmUBBQdyZXNlcnZlBQZIRUlHSFQFA25pbAoAAiRsBQ5yZXdhcmRSZXNlcnZlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAMwIAgkBDEludGVnZXJFbnRyeQIFCnN0YXJ0ZWRLZXkFBkhFSUdIVAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQBAnR4AQZ2ZXJpZnkABARCQVNFAOgHBAtxdW9ydW1SYXRpbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFXByb3Bvc2FsX3F1b3J1bV9yYXRpbwIicHJvcG9zYWxRdW9ydW1SYXRpbyBpcyBub3QgZGVmaW5lZAQLcGFzc2VkUmF0aW8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzAhVwcm9wb3NhbF9wYXNzZWRfcmF0aW8CJXByb3Bvc2FsVGhyZXNob2xkUmF0aW8gaXMgbm90IGRlZmluZWQEDmdWaXJlc0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kc19jb250cmFjdAIVbm8gZGl2aWRlbmRzX2NvbnRyYWN0AhppbnZhbGlkIGRpdmlkZW5kc19jb250cmFjdAQOdm90aW5nQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIPdm90aW5nX2NvbnRyYWN0AhJubyB2b3RpbmdfY29udHJhY3QCF2ludmFsaWQgdm90aW5nX2NvbnRyYWN0BAJpZAkA2AQBCAUCdHgCaWQECHZvdGVzWWVzCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICDXByb3Bvc2FsX3llc18FAmlkAAAEB3ZvdGVzTm8JAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIMcHJvcG9zYWxfbm9fBQJpZAAABA5wcm9wb3NhbEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICEHByb3Bvc2FsX2hlaWdodF8FAmlkAhdwcm9wb3NhbCBub3QgcmVnaXN0ZXJlZAQKYXBwbHlTdGFydAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhRwcm9wb3NhbF9hcHBseXN0YXJ0XwUCaWQAAAQIYXBwbHlFbmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIScHJvcG9zYWxfYXBwbHllbmRfBQJpZAAABAt0b3RhbEdWaXJlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhBwcm9wb3NhbF9ndmlyZXNfBQJpZAAABAdlbmFibGVkCQELdmFsdWVPckVsc2UCCQCbCAIFDWNvbmZpZ0FkZHJlc3MCHW9wX2dvdmVybmFuY2VfYXBwbHlfdHhfcGF1c2VkBwQHdm90ZVllcwUIdm90ZXNZZXMEBnZvdGVObwUHdm90ZXNObwQKdG90YWxWb3RlcwkAZAIFB3ZvdGVZZXMFBnZvdGVObwQJaGFzUXVvcnVtCQBnAgkAaQIJAGgCBQp0b3RhbFZvdGVzBQRCQVNFBQt0b3RhbEdWaXJlcwULcXVvcnVtUmF0aW8ECWhhc1Bhc3NlZAkAZwIJAGkCCQBoAgUHdm90ZVllcwUEQkFTRQUKdG90YWxWb3RlcwULcGFzc2VkUmF0aW8ECHRvb0Vhcmx5CQBnAgUKYXBwbHlTdGFydAUGSEVJR0hUBAd0b29MYXRlCQBnAgUGSEVJR0hUBQhhcHBseUVuZAQJdGltZURlYnVnCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEXByb3Bvc2FsSGVpZ2h0ID0gCQCkAwEFDnByb3Bvc2FsSGVpZ2h0Ag8sIGFwcGx5U3RhcnQgPSAJAKQDAQUKYXBwbHlTdGFydAINLCBhcHBseUVuZCA9IAkApAMBBQhhcHBseUVuZAILLCBIRUlHSFQgPSAJAKQDAQUGSEVJR0hUBAhieVZvdGluZwMJAQEhAQUHZW5hYmxlZAkAAgECK3R4IGFwcGxpY2F0aW9uIHRocm93IGdvdmVybmFuY2Ugbm90IGVuYWJsZWQDBQh0b29FYXJseQkAAgEJAKwCAgIucHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gZWFybHk6IAUJdGltZURlYnVnAwUHdG9vTGF0ZQkAAgEJAKwCAgIscHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gbGF0ZToFCXRpbWVEZWJ1ZwMJAQEhAQUJaGFzUXVvcnVtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgILbm8gcXVvcnVtOiACDHRvdGFsVm90ZXM6IAkApAMBBQp0b3RhbFZvdGVzAg8sIHRvdGFsR1ZpcmVzOiAJAKQDAQULdG90YWxHVmlyZXMCDywgcXVvcnVtUmF0aW86IAkApAMBBQtxdW9ydW1SYXRpbwMJAQEhAQUJaGFzUGFzc2VkCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIXbm8gdGhyZXNob2xkIGFjaGlldmVkOiACCXZvdGVZZXM6IAkApAMBBQd2b3RlWWVzAgosIHZvdGVObzogCQCkAwEFBnZvdGVObwIPLCBwYXNzZWRSYXRpbzogCQCkAwEFC3Bhc3NlZFJhdGlvBgMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkGBQhieVZvdGluZ20ZXy0=", "chainId": 87, "height": 3486051, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7Ndu9yamK52Ez7yLYe7LVmncH5eob6PtHikyiuHtZxD3 Next: none Diff:
OldNewDifferences
473473 }
474474
475475
476+@Verifier(tx)
477+func verify () = {
478+ let BASE = 1000
479+ let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
480+ let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
481+ let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
482+ let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
483+ let id = toBase58String(tx.id)
484+ let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
485+ let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
486+ let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
487+ let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
488+ let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
489+ let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
490+ let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
491+ let voteYes = votesYes
492+ let voteNo = votesNo
493+ let totalVotes = (voteYes + voteNo)
494+ let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
495+ let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
496+ let tooEarly = (applyStart >= HEIGHT)
497+ let tooLate = (HEIGHT >= applyEnd)
498+ let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
499+ let byVoting = if (!(enabled))
500+ then throw("tx application throw governance not enabled")
501+ else if (tooEarly)
502+ then throw(("proposal can't be executed as it's too early: " + timeDebug))
503+ else if (tooLate)
504+ then throw(("proposal can't be executed as it's too late:" + timeDebug))
505+ else if (!(hasQuorum))
506+ then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
507+ else if (!(hasPassed))
508+ then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
509+ else true
510+ if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
511+ then true
512+ else byVoting
513+ }
514+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let configStore = "config"
55
66 let startedKey = "started"
77
88 func syncHeightStore (reserve) = (reserve + "_syncHeight")
99
1010
1111 func speedStore (reserve,action) = ((reserve + "_speed_") + action)
1212
1313
1414 func rewardStore (reserve,action) = ((reserve + "_reward_") + action)
1515
1616
1717 func userClaimedStore (reserve,user) = ((reserve + "_claimed_") + user)
1818
1919
2020 func userRewardAdjStore (reserve,action,user) = ((((reserve + "_userRewardAdj_") + action) + "_") + user)
2121
2222
2323 func pow10 (n) = if ((n == 6))
2424 then 1000000
2525 else if ((n == 8))
2626 then 100000000
2727 else throw(("bad decimals: " + toString(n)))
2828
2929
3030 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
3131 then StringEntry(key, value)
3232 else throw(("already initialized: " + key))
3333
3434
3535 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "vires-distributor: no configAddress")), "invalid config address")
3636
3737 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_minter"), "vires-distributor: no viresMinter")), "invalid viresMinter")
3838
3939 let rewardReservesStr = valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "vires-distributor: no rewardable_reserves in config")
4040
4141 let zeroRewardReservesStr = valueOrElse(getString(configAddress, "zero_rewardable_reserves"), "")
4242
4343 let rewardReserves = split_4C(rewardReservesStr, "|")
4444
4545 let viresIdStr = valueOrErrorMessage(getString(viresMinter, "assetId"), "vires-distributor: no viresAssetIdStore")
4646
4747 let viresAssetId = fromBase58String(viresIdStr)
4848
4949 let actionDeposit = "deposit"
5050
5151 let actionBorrow = "borrow"
5252
5353 func validAction (action) = if (if ((action != actionDeposit))
5454 then (action != actionBorrow)
5555 else false)
5656 then throw(("invalid action: " + action))
5757 else true
5858
5959
6060 func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
6161 then true
6262 else throw("only main can do")
6363
6464
6565 let started = isDefined(getInteger(this, startedKey))
6666
6767 func asInt (value) = match value {
6868 case int: Int =>
6969 int
7070 case _ =>
7171 throw("wrong type, expected: Int")
7272 }
7373
7474
7575 func asInt4 (value) = match value {
7676 case x: (Int, Int, Int, Int) =>
7777 x
7878 case t =>
7979 throw("wrong type, expected: Int4")
8080 }
8181
8282
8383 func asInt6 (value) = match value {
8484 case x: (Int, Int, Int, Int, Int, Int) =>
8585 x
8686 case t =>
8787 throw("wrong type, expected: Int4")
8888 }
8989
9090
9191 func asUserBalanceData (value) = match value {
9292 case x: (Int, Int, Int, Int, Int, Boolean) =>
9393 x
9494 case t =>
9595 throw("wrong type, expected: Int5&Boolean")
9696 }
9797
9898
9999 let config = addressFromStringValue(getStringValue(this, configStore))
100100
101101 let factorsBase = 1000
102102
103103 func depositToBorrowRatio (reserve) = valueOrErrorMessage(getInteger(config, (reserve + "_depositToBorrowRatio")), (("depositToBorrowRatio for " + reserve) + " not set"))
104104
105105
106106 let maybeOracleAddress = match getString(config, "oracle_address") {
107107 case s: String =>
108108 addressFromString(s)
109109 case _ =>
110110 unit
111111 }
112112
113113 func oraclePrice (assetId) = match invoke(valueOrErrorMessage(maybeOracleAddress, "no oracle"), "price", [assetId], nil) {
114114 case i: Int =>
115115 i
116116 case _ =>
117117 throw("bad oracle data")
118118 }
119119
120120
121121 let HEIGHT = height
122122
123123 func asInt2 (value) = match value {
124124 case x: (Int, Int) =>
125125 x
126126 case t =>
127127 throw("wrong type, expected: Int2")
128128 }
129129
130130
131131 func opAllowed (op) = match invoke(configAddress, "opAllowed", [viresIdStr, op], nil) {
132132 case b: Boolean =>
133133 if (b)
134134 then true
135135 else throw("not allowed")
136136 case _ =>
137137 throw("opAllowed: unexpected result type")
138138 }
139139
140140
141141 func currentReserveReward (reserve,action) = {
142142 let h = valueOrElse(getInteger(this, syncHeightStore(reserve)), HEIGHT)
143143 let storedReward = valueOrElse(getInteger(this, rewardStore(reserve, action)), 0)
144144 if ((h == HEIGHT))
145145 then storedReward
146146 else {
147147 let speed = valueOrElse(getInteger(this, speedStore(reserve, action)), 0)
148148 let accumulatedReward = ((HEIGHT - h) * speed)
149149 (storedReward + accumulatedReward)
150150 }
151151 }
152152
153153
154154 func currentReserveRewardsSpeed () = {
155155 func fold2 (l,reserve) = ((((((((((((l + reserve) + "_") + actionDeposit) + "=") + toString(valueOrElse(getInteger(this, speedStore(reserve, actionDeposit)), 0))) + ", ") + reserve) + "_") + actionBorrow) + "=") + toString(valueOrElse(getInteger(this, speedStore(reserve, actionBorrow)), 0))) + ", ")
156156
157157 let $l = rewardReserves
158158 let $s = size($l)
159159 let $acc0 = ""
160160 func $f0_1 ($a,$i) = if (($i >= $s))
161161 then $a
162162 else fold2($a, $l[$i])
163163
164164 func $f0_2 ($a,$i) = if (($i >= $s))
165165 then $a
166166 else throw("List size exceeds 20")
167167
168168 $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)
169169 }
170170
171171
172172 func userRewardBalance (reserve,user) = {
173173 let $t047854925 = asInt4(invoke(addressFromStringValue(reserve), "getCurrentTotals", [user], nil))
174174 let curTotalDeposit = $t047854925._1
175175 let curTotalDebt = $t047854925._2
176176 let userDeposit = $t047854925._3
177177 let userDebt = $t047854925._4
178178 let totalDepositReward = currentReserveReward(reserve, actionDeposit)
179179 let totalBorrowReward = currentReserveReward(reserve, actionBorrow)
180180 let userDepositAdj = valueOrElse(getInteger(this, userRewardAdjStore(reserve, actionDeposit, user)), 0)
181181 let userBorrowAdj = valueOrElse(getInteger(this, userRewardAdjStore(reserve, actionBorrow, user)), 0)
182182 let accDeposit = (userDepositAdj + (if ((curTotalDeposit == 0))
183183 then 0
184184 else fraction(totalDepositReward, userDeposit, curTotalDeposit)))
185185 let accBorrow = (userBorrowAdj + (if ((curTotalDebt == 0))
186186 then 0
187187 else fraction(totalBorrowReward, userDebt, curTotalDebt)))
188188 let claimed = valueOrElse(getInteger(this, userClaimedStore(reserve, user)), 0)
189189 $Tuple3(accDeposit, accBorrow, claimed)
190190 }
191191
192192
193193 func evalUser (reserve,user) = {
194194 let $t057495820 = userRewardBalance(reserve, user)
195195 let accDeposit = $t057495820._1
196196 let accBorrow = $t057495820._2
197197 let claimed = $t057495820._3
198198 ((((("accumulated_deposit: " + toString(accDeposit)) + ", accumulated_borrow: ") + toString(accBorrow)) + ", claimed: ") + toString(claimed))
199199 }
200200
201201
202202 func borrowedValueAndTotalBorrow () = {
203203 func fold (acc,a) = {
204204 let address = valueOrErrorMessage(addressFromString(a), ("bad address " + a))
205205 let assetDebtUsd = if (contains(zeroRewardReservesStr, a))
206206 then 0
207207 else {
208208 let assetId = valueOrErrorMessage(getString(address, "assetId"), ("assetId not found in reserve " + a))
209209 let assetDecimals = if ((assetId == "WAVES"))
210210 then 8
211211 else valueOrErrorMessage(getInteger(address, "aTokenDecimals"), ("aTokenDecimals not found in reserve " + a))
212212 let assetDebt = asInt2(invoke(address, "storedDepositBorrow", nil, nil))._2
213213 fraction(assetDebt, oraclePrice(assetId), pow10(assetDecimals))
214214 }
215215 let $t067066726 = acc
216216 let lst = $t067066726._1
217217 let agg = $t067066726._2
218218 $Tuple2((lst ++ [assetDebtUsd]), (agg + assetDebtUsd))
219219 }
220220
221221 let $l = rewardReserves
222222 let $s = size($l)
223223 let $acc0 = $Tuple2(nil, 0)
224224 func $f0_1 ($a,$i) = if (($i >= $s))
225225 then $a
226226 else fold($a, $l[$i])
227227
228228 func $f0_2 ($a,$i) = if (($i >= $s))
229229 then $a
230230 else throw("List size exceeds 20")
231231
232232 $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)
233233 }
234234
235235
236236 @Callable(i)
237237 func adviseUser (reserve,user) = {
238238 let $t068976968 = userRewardBalance(reserve, user)
239239 let accDeposit = $t068976968._1
240240 let accBorrow = $t068976968._2
241241 let claimed = $t068976968._3
242242 let totalRewardsAccumulated = max([0, (accDeposit + accBorrow)])
243243 let rewardsAvailable = max([0, (totalRewardsAccumulated - claimed)])
244244 $Tuple2(nil, ((((("rewardsAccumulated: " + toString(totalRewardsAccumulated)) + ", rewardsAvailable: ") + toString(rewardsAvailable)) + ", rewardsClaimed: ") + toString(claimed)))
245245 }
246246
247247
248248
249249 @Callable(i)
250250 func syncHeight (reserve) = if (!(started))
251251 then nil
252252 else if ((HEIGHT == getInteger(syncHeightStore(reserve))))
253253 then nil
254254 else {
255255 let currentDepositReward = currentReserveReward(reserve, actionDeposit)
256256 let currentBorrowReward = currentReserveReward(reserve, actionBorrow)
257257 [IntegerEntry(rewardStore(reserve, actionDeposit), currentDepositReward), IntegerEntry(rewardStore(reserve, actionBorrow), currentBorrowReward), IntegerEntry(syncHeightStore(reserve), HEIGHT)]
258258 }
259259
260260
261261
262262 @Callable(i)
263263 func onAction (reserve,action,user,userChange,streamChange) = if (!(started))
264264 then nil
265265 else {
266266 let checks = if (mainOnly(i))
267267 then validAction(action)
268268 else false
269269 if ((checks == checks))
270270 then if (!(isDefined(indexOf(rewardReserves, reserve))))
271271 then nil
272272 else if ((getIntegerValue(syncHeightStore(reserve)) != HEIGHT))
273273 then throw("distributor: height not synced")
274274 else {
275275 let $t082768416 = asInt4(invoke(addressFromStringValue(reserve), "getCurrentTotals", [user], nil))
276276 let curTotalDeposit = $t082768416._1
277277 let curTotalDebt = $t082768416._2
278278 let userDeposit = $t082768416._3
279279 let userDebt = $t082768416._4
280280 let newTotal = if ((action == actionDeposit))
281281 then curTotalDeposit
282282 else curTotalDebt
283283 let newUser = if ((action == actionDeposit))
284284 then userDeposit
285285 else userDebt
286286 let prevTotal = (newTotal - streamChange)
287287 let prevUser = (newUser - userChange)
288288 let prevReserveReward = currentReserveReward(reserve, action)
289289 let prevUserAdj = valueOrElse(getInteger(this, userRewardAdjStore(reserve, action, user)), 0)
290290 let newReserveReward = if ((prevTotal == 0))
291291 then prevReserveReward
292292 else fraction(prevReserveReward, newTotal, prevTotal)
293293 let newUserRewardAdj = if ((newTotal == 0))
294294 then (prevUserAdj + prevReserveReward)
295295 else (prevUserAdj - fraction(newReserveReward, userChange, newTotal))
296296 [IntegerEntry(rewardStore(reserve, action), newReserveReward), IntegerEntry(userRewardAdjStore(reserve, action, user), newUserRewardAdj)]
297297 }
298298 else throw("Strict value is not equal to itself.")
299299 }
300300
301301
302302
303303 @Callable(i)
304304 func move (reserve,action,from,to,amount) = if (!(started))
305305 then nil
306306 else {
307307 let checks = if (mainOnly(i))
308308 then validAction(action)
309309 else false
310310 if ((checks == checks))
311311 then if (!(isDefined(indexOf(rewardReserves, reserve))))
312312 then nil
313313 else if ((getIntegerValue(syncHeightStore(reserve)) != HEIGHT))
314314 then throw("distributor: height not synced")
315315 else {
316316 let $t097399927 = asInt6(invoke(addressFromStringValue(reserve), "getCurrentTotals2", [from, to], nil))
317317 let curTotalDeposit = $t097399927._1
318318 let curTotalDebt = $t097399927._2
319319 let userDepositFrom = $t097399927._3
320320 let userDebtFrom = $t097399927._4
321321 let userDepositTo = $t097399927._5
322322 let userDebtTo = $t097399927._6
323323 let total = if ((action == actionDeposit))
324324 then curTotalDeposit
325325 else curTotalDebt
326326 let newFrom = if ((action == actionDeposit))
327327 then userDepositFrom
328328 else userDebtFrom
329329 let newTo = if ((action == actionDeposit))
330330 then userDepositTo
331331 else userDebtTo
332332 let reserveReward = currentReserveReward(reserve, action)
333333 let fromUserRewardAdj = valueOrElse(getInteger(this, userRewardAdjStore(reserve, action, from)), 0)
334334 let toUserRewardAdj = valueOrElse(getInteger(this, userRewardAdjStore(reserve, action, to)), 0)
335335 let newFromUserRewardAdj = (fromUserRewardAdj - fraction(reserveReward, -(amount), total))
336336 let newToUserRewardAdj = (toUserRewardAdj - fraction(reserveReward, amount, total))
337337 [IntegerEntry(userRewardAdjStore(reserve, action, from), newFromUserRewardAdj), IntegerEntry(userRewardAdjStore(reserve, action, to), newToUserRewardAdj)]
338338 }
339339 else throw("Strict value is not equal to itself.")
340340 }
341341
342342
343343
344344 @Callable(i)
345345 func claimRewardFor (reserve,user,amount) = if ((amount != -1))
346346 then throw("distributor: claim all only")
347347 else if (!(started))
348348 then nil
349349 else {
350350 let checks = if (mainOnly(i))
351351 then opAllowed("claim_vires_distribution")
352352 else false
353353 if ((checks == checks))
354354 then {
355355 let $t01110111172 = userRewardBalance(reserve, user)
356356 let accDeposit = $t01110111172._1
357357 let accBorrow = $t01110111172._2
358358 let claimed = $t01110111172._3
359359 let accumulated = (accDeposit + accBorrow)
360360 let available = (accumulated - claimed)
361361 if ((0 >= available))
362362 then $Tuple2(nil, 0)
363363 else {
364364 let mint = invoke(viresMinter, "distributorMint", [toString(i.caller), available], nil)
365365 if ((mint == mint))
366366 then $Tuple2([IntegerEntry(userClaimedStore(reserve, user), (claimed + available))], available)
367367 else throw("Strict value is not equal to itself.")
368368 }
369369 }
370370 else throw("Strict value is not equal to itself.")
371371 }
372372
373373
374374
375375 @Callable(i)
376376 func realloc () = if (!(opAllowed("realloc")))
377377 then throw("realloc paused")
378378 else if (!(started))
379379 then nil
380380 else {
381381 let totalSpeed = valueOrErrorMessage(getInteger(config, "total_speed"), "no total allocation speed")
382382 let totalReserves = size(rewardReserves)
383383 let $t01178111851 = borrowedValueAndTotalBorrow()
384384 let borrowedValueByIndex = $t01178111851._1
385385 let totalBorrow = $t01178111851._2
386386 func fold (l,index) = if ((index >= totalReserves))
387387 then l
388388 else {
389389 let reserve = rewardReserves[index]
390390 let assetSpeed = if ((totalBorrow == 0))
391391 then 0
392392 else fraction(totalSpeed, borrowedValueByIndex[index], totalBorrow)
393393 let newDepositSpeed = fraction(assetSpeed, depositToBorrowRatio(reserve), factorsBase)
394394 let newBorrowSpeed = (assetSpeed - newDepositSpeed)
395395 let currentDepositReward = currentReserveReward(reserve, actionDeposit)
396396 let currentBorrowReward = currentReserveReward(reserve, actionBorrow)
397397 (l ++ [IntegerEntry(speedStore(reserve, actionDeposit), newDepositSpeed), IntegerEntry(rewardStore(reserve, actionDeposit), currentDepositReward), IntegerEntry(speedStore(reserve, actionBorrow), newBorrowSpeed), IntegerEntry(rewardStore(reserve, actionBorrow), currentBorrowReward), IntegerEntry(syncHeightStore(reserve), HEIGHT)])
398398 }
399399
400400 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
401401 let $s = size($l)
402402 let $acc0 = nil
403403 func $f0_1 ($a,$i) = if (($i >= $s))
404404 then $a
405405 else fold($a, $l[$i])
406406
407407 func $f0_2 ($a,$i) = if (($i >= $s))
408408 then $a
409409 else throw("List size exceeds 20")
410410
411411 $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)
412412 }
413413
414414
415415
416416 @Callable(i)
417417 func advise () = {
418418 let totalReserves = size(rewardReserves)
419419 func fold (l,index) = if ((index >= totalReserves))
420420 then l
421421 else {
422422 let reserve = rewardReserves[index]
423423 ((((((((l + ", [ ") + "reserveAddress: ") + reserve) + ", depositRewardSpeed: ") + toString(getIntegerValue(this, speedStore(reserve, actionDeposit)))) + ", borrowRewardSpeed: ") + toString(getIntegerValue(this, speedStore(reserve, actionBorrow)))) + " ] ")
424424 }
425425
426426 $Tuple2(nil, {
427427 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
428428 let $s = size($l)
429429 let $acc0 = ""
430430 func $f0_1 ($a,$i) = if (($i >= $s))
431431 then $a
432432 else fold($a, $l[$i])
433433
434434 func $f0_2 ($a,$i) = if (($i >= $s))
435435 then $a
436436 else throw("List size exceeds 20")
437437
438438 $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)
439439 })
440440 }
441441
442442
443443
444444 @Callable(i)
445445 func init (configAddress) = [writeConstString(configStore, configAddress)]
446446
447447
448448
449449 @Callable(i)
450450 func start () = {
451451 let adminStore = "admin"
452452 let admin = addressFromStringValue(getStringValue(config, adminStore))
453453 if ((i.caller != admin))
454454 then throw("only admin can do")
455455 else if (started)
456456 then throw("already started")
457457 else {
458458 func fold (l,reserve) = (l ++ [IntegerEntry(speedStore(reserve, actionDeposit), 0), IntegerEntry(rewardStore(reserve, actionDeposit), 0), IntegerEntry(speedStore(reserve, actionBorrow), 0), IntegerEntry(rewardStore(reserve, actionBorrow), 0), IntegerEntry(syncHeightStore(reserve), HEIGHT)])
459459
460460 let $l = rewardReserves
461461 let $s = size($l)
462462 let $acc0 = [IntegerEntry(startedKey, HEIGHT)]
463463 func $f0_1 ($a,$i) = if (($i >= $s))
464464 then $a
465465 else fold($a, $l[$i])
466466
467467 func $f0_2 ($a,$i) = if (($i >= $s))
468468 then $a
469469 else throw("List size exceeds 20")
470470
471471 $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)
472472 }
473473 }
474474
475475
476+@Verifier(tx)
477+func verify () = {
478+ let BASE = 1000
479+ let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
480+ let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
481+ let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
482+ let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
483+ let id = toBase58String(tx.id)
484+ let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
485+ let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
486+ let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
487+ let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
488+ let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
489+ let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
490+ let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
491+ let voteYes = votesYes
492+ let voteNo = votesNo
493+ let totalVotes = (voteYes + voteNo)
494+ let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
495+ let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
496+ let tooEarly = (applyStart >= HEIGHT)
497+ let tooLate = (HEIGHT >= applyEnd)
498+ let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
499+ let byVoting = if (!(enabled))
500+ then throw("tx application throw governance not enabled")
501+ else if (tooEarly)
502+ then throw(("proposal can't be executed as it's too early: " + timeDebug))
503+ else if (tooLate)
504+ then throw(("proposal can't be executed as it's too late:" + timeDebug))
505+ else if (!(hasQuorum))
506+ then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
507+ else if (!(hasPassed))
508+ then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
509+ else true
510+ if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
511+ then true
512+ else byVoting
513+ }
514+

github/deemru/w8io/786bc32 
83.49 ms