tx · 5kig3UQyBqXAuNNrokWxkS13UtjRKtYo9Wb1kxx7NotR

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.02700000 Waves

2024.10.21 15:48 [3336628] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "5kig3UQyBqXAuNNrokWxkS13UtjRKtYo9Wb1kxx7NotR", "fee": 2700000, "feeAssetId": null, "timestamp": 1729514894849, "version": 1, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "47yg1wMNPaABADn3XH5NkemQTCAoUuVguAcvwkZBx6kBRyu33kmfsD9ajmphGvt5qFviCNNJzN8NL3QoLyEyAbKd" ], "script": "base64:BgJQCAISAwoBARIAEgMKAQQSAwoBBBIDCgEIEgQKAggIEgMKAQgSBAoCCAgSAwoBCBIECgIIARIECgIIARIDCgEBEgASAwoBCBIDCgEBEgMKAQhOAAxjb250cmFjdEZpbGUCEWwybXBfbGVhc2luZy5yaWRlAANTRVACAl9fABJCTE9DS1NfSU5fSU5URVJWQUwA6AcABnNjYWxlOACAwtcvAQh0aHJvd0VycgEDbXNnCQACAQkArAICCQCsAgIFDGNvbnRyYWN0RmlsZQICOiAFA21zZwAMa2V5TDJBc3NldElkCQC5CQIJAMwIAgICJXMJAMwIAgIHYXNzZXRJZAUDbmlsBQNTRVAADGtleUZvcmNlU3RvcAkAuQkCCQDMCAICAiVzCQDMCAICCWZvcmNlU3RvcAUDbmlsBQNTRVAAD2tleUZvcmNlT3V0U3RvcAkAuQkCCQDMCAICAiVzCQDMCAICDGZvcmNlT3V0U3RvcAUDbmlsBQNTRVAAD2tleVVuaXRzQXNzZXRJZAkAuQkCCQDMCAICAiVzCQDMCAICDHVuaXRzQXNzZXRJZAUDbmlsBQNTRVAAFmtleVVuaXRzUGVyQmxvY2tTY2FsZTgJALkJAgkAzAgCAgIlcwkAzAgCAg11bml0c1BlckJsb2NrBQNuaWwFA1NFUAARa2V5UGVyaW9kT2Zmc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAghvZmZzZXRJZAUDbmlsBQNTRVAAFWtleVBlcmlvZE9mZnNldEhlaWdodAkAuQkCCQDMCAICAiVzCQDMCAICDG9mZnNldEhlaWdodAUDbmlsBQNTRVAAD2tleVBlcmlvZExlbmd0aAkAuQkCCQDMCAICAiVzCQDMCAICDHBlcmlvZExlbmd0aAUDbmlsBQNTRVAAGGtleVVuaXRzQ2xhaW1TdGFydEhlaWdodAkAuQkCCQDMCAICAiVzCQDMCAICFXVuaXRzQ2xhaW1TdGFydEhlaWdodAUDbmlsBQNTRVAAFWtleVVuaXRzQ2xhaW1JbnRlcnZhbAkAuQkCCQDMCAICAiVzCQDMCAICEnVuaXRzQ2xhaW1JbnRlcnZhbAUDbmlsBQNTRVAADnBlcmlvZE9mZnNldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtleVBlcmlvZE9mZnNldElkAAAADHBlcmlvZExlbmd0aAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9rZXlQZXJpb2RMZW5ndGgAkE4AEnBlcmlvZE9mZnNldEhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRVrZXlQZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAPY3VycmVudFBlcmlvZElkAwMJAGYCBQZoZWlnaHQFEnBlcmlvZE9mZnNldEhlaWdodAkBAiE9AgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEHCQBkAgkAaQIJAGUCBQZoZWlnaHQFEnBlcmlvZE9mZnNldEhlaWdodAUMcGVyaW9kTGVuZ3RoBQ5wZXJpb2RPZmZzZXRJZAkAlgMBCQDMCAIAAAkAzAgCCQBlAgUOcGVyaW9kT2Zmc2V0SWQAAQUDbmlsABNjdXJyZW50UGVyaW9kSGVpZ2h0AwMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQYDCQAAAgUPY3VycmVudFBlcmlvZElkAAAJAGYCBRJwZXJpb2RPZmZzZXRIZWlnaHQFBmhlaWdodAcAAAkAZAIFEnBlcmlvZE9mZnNldEhlaWdodAkAaAIJAGUCBQ9jdXJyZW50UGVyaW9kSWQFDnBlcmlvZE9mZnNldElkBQxwZXJpb2RMZW5ndGgAEG5leHRQZXJpb2RIZWlnaHQDAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BBgMJAAACBQ9jdXJyZW50UGVyaW9kSWQAAAkAZgIFEnBlcmlvZE9mZnNldEhlaWdodAUGaGVpZ2h0BwAACQBkAgUTY3VycmVudFBlcmlvZEhlaWdodAUMcGVyaW9kTGVuZ3RoABV1bml0c0NsYWltU3RhcnRIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUYa2V5VW5pdHNDbGFpbVN0YXJ0SGVpZ2h0BQZoZWlnaHQAEnVuaXRzQ2xhaW1JbnRlcnZhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRVrZXlVbml0c0NsYWltSW50ZXJ2YWwAAAESa2V5TGVhc2luZ05vZGVEYXRhAQtub2RlQWRkcmVzcwkAuQkCCQDMCAICAiVzCQDMCAIFC25vZGVBZGRyZXNzBQNuaWwFA1NFUAEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQILdXNlckFkZHJlc3MLbm9kZUFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAIFC25vZGVBZGRyZXNzCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEOa2V5VXNlclRvQ2xhaW0BC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgd0b0NsYWltCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAESa2V5VXNlclRvdGFsTG9ja2VkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIPdXNlclRvdGFsTG9ja2VkCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEUa2V5VW5pdHNDbGFpbWVkQmxvY2sBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhF1bml0c0NsYWltZWRCbG9jawkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABEGtleVVubG9ja2VkVW5pdHMBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg11bmxvY2tlZFVuaXRzCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEUa2V5VG90YWxVbml0c0NsYWltZWQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhF0b3RhbFVuaXRzQ2xhaW1lZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABC2tleUwyVG9CdXJuAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIIbDJUb0J1cm4JAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARBrZXlMMkJ1cm5lZFRvdGFsAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgINbDJCdXJuZWRUb3RhbAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFmtleU5vZGVMZWFzaW5nQnlIZWlnaHQBC25vZGVBZGRyZXNzBAFoAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BAAAFBmhlaWdodAkAuQkCCQDMCAICBCVzJWQJAMwIAgULbm9kZUFkZHJlc3MJAMwIAgkApAMBBQFoBQNuaWwFA1NFUAEWa2V5VXNlckxlYXNpbmdCeUhlaWdodAILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEAWgDCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEAAAUGaGVpZ2h0CQC5CQIJAMwIAgIGJXMlcyVkCQDMCAIFC25vZGVBZGRyZXNzCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAKQDAQUBaAUDbmlsBQNTRVABEmFzc2V0U3RyaW5nVG9CeXRlcwENYXNzZXRJZFN0cmluZwMJAAACBQ1hc3NldElkU3RyaW5nAgVXQVZFUwUEdW5pdAkA2QQBBQ1hc3NldElkU3RyaW5nARJhc3NldEJ5dGVzVG9TdHJpbmcBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAkA2AQBBQFhAgVXQVZFUwAPbDJBc3NldElkU3RyaW5nCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFDGtleUwyQXNzZXRJZAIFV0FWRVMAEnVuaXRzQXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ9rZXlVbml0c0Fzc2V0SWQCBVdBVkVTAA5sMkFzc2V0SWRCeXRlcwkBEmFzc2V0U3RyaW5nVG9CeXRlcwEFD2wyQXNzZXRJZFN0cmluZwARdW5pdHNBc3NldElkQnl0ZXMJARJhc3NldFN0cmluZ1RvQnl0ZXMBBRJ1bml0c0Fzc2V0SWRTdHJpbmcAC2lzRm9yY2VTdG9wCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtleUZvcmNlU3RvcAcADmlzRm9yY2VPdXRTdG9wCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFD2tleUZvcmNlT3V0U3RvcAcBDmlzVmFsaWRBZGRyZXNzAQdhZGRyZXNzBAckbWF0Y2gwCQCmCAEFB2FkZHJlc3MDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYHAA9BRE1JTl9MSVNUX1NJWkUABQAGUVVPUlVNAAMAEVRYSURfQllURVNfTEVOR1RIACABGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAglhbGxvd1R4SWQJAMwIAgUEdHhJZAUDbmlsBQNTRVABEGtleUZ1bGxBZG1pblZvdGUCBnByZWZpeAxhZG1pbkFkZHJlc3MJALkJAgkAzAgCBQZwcmVmaXgJAMwIAgUMYWRtaW5BZGRyZXNzBQNuaWwFA1NFUAETa2V5QWRtaW5BZGRyZXNzTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhBhZG1pbkFkZHJlc3NMaXN0BQNuaWwFA1NFUAEOa2V5QWxsb3dlZFR4SWQACQC5CQIJAMwIAgICJXMJAMwIAgIEdHhJZAUDbmlsBQNTRVABDGdldEFkbWluVm90ZQIGcHJlZml4BWFkbWluBAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQ1nZXRBZG1pbnNMaXN0AAQHJG1hdGNoMAkAnQgCBQR0aGlzCQETa2V5QWRtaW5BZGRyZXNzTGlzdAADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQC1CQIFAXMFA1NFUAUDbmlsAQ1pc0luQWRtaW5MaXN0AQdhZGRyZXNzCQEPY29udGFpbnNFbGVtZW50AgkBDWdldEFkbWluc0xpc3QABQdhZGRyZXNzARJnZW5Wb3Rlc0tleXNIZWxwZXICAWEMYWRtaW5BZGRyZXNzBAskdDA1MTQ3NTE3MQUBYQQGcmVzdWx0CAULJHQwNTE0NzUxNzECXzEEBnByZWZpeAgFCyR0MDUxNDc1MTcxAl8yCQCUCgIJAM0IAgUGcmVzdWx0CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUMYWRtaW5BZGRyZXNzBQZwcmVmaXgBDGdlblZvdGVzS2V5cwEJa2V5UHJlZml4BAlhZG1pbkxpc3QJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAQLJHQwNTMxODU0MDIKAAIkbAkBDWdldEFkbWluc0xpc3QACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFCWtleVByZWZpeAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQESZ2VuVm90ZXNLZXlzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQGcmVzdWx0CAULJHQwNTMxODU0MDICXzEEBnByZWZpeAgFCyR0MDUzMTg1NDAyAl8yBQZyZXN1bHQBEGNvdW50Vm90ZXNIZWxwZXICBnJlc3VsdAd2b3RlS2V5CQBkAgUGcmVzdWx0CQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAEKY291bnRWb3RlcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY291bnRWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBEGNsZWFyVm90ZXNIZWxwZXICBnJlc3VsdANrZXkJAM0IAgUGcmVzdWx0CQELRGVsZXRlRW50cnkBBQNrZXkBE2dldENsZWFyVm90ZUVudHJpZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNsZWFyVm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAQx2b3RlSU5URVJOQUwEE2NhbGxlckFkZHJlc3NTdHJpbmcJa2V5UHJlZml4CG1pblZvdGVzCnZvdGVSZXN1bHQEB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBBBhZG1pbkN1cnJlbnRWb3RlCQEMZ2V0QWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBANlcnIDCQEBIQEJAQ1pc0luQWRtaW5MaXN0AQUTY2FsbGVyQWRkcmVzc1N0cmluZwkBCHRocm93RXJyAQkArAICCQCsAgICCUFkZHJlc3M6IAUTY2FsbGVyQWRkcmVzc1N0cmluZwISIG5vdCBpbiBBZG1pbiBsaXN0AwkAAAIFEGFkbWluQ3VycmVudFZvdGUAAQkBCHRocm93RXJyAQkArAICBQd2b3RlS2V5AhIgeW91IGFscmVhZHkgdm90ZWQFBHVuaXQDCQAAAgUDZXJyBQNlcnIEBXZvdGVzCQEKY291bnRWb3RlcwEFCWtleVByZWZpeAMJAGcCCQBkAgUFdm90ZXMAAQUIbWluVm90ZXMEEGNsZWFyVm90ZUVudHJpZXMJARNnZXRDbGVhclZvdGVFbnRyaWVzAQUJa2V5UHJlZml4CQDOCAIFEGNsZWFyVm90ZUVudHJpZXMFCnZvdGVSZXN1bHQJAMwIAgkBDEludGVnZXJFbnRyeQIFB3ZvdGVLZXkAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARNnZXRMZWFzaW5nTm9kZUVudHJ5Awtub2RlQWRkcmVzcw1jdXJyZW50TGVhc2VkCm5leHRMZWFzZWQEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgIIJWQlZCVkJWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUNY3VycmVudExlYXNlZAkAzAgCCQCkAwEFEG5leHRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBQpuZXh0TGVhc2VkBQNuaWwFA1NFUAkBC1N0cmluZ0VudHJ5AgkBEmtleUxlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBQt2YWx1ZVN0cmluZwESZ2V0TGVhc2luZ05vZGVEYXRhAQtub2RlQWRkcmVzcwQYbGVhc2luZ05vZGVEYXRhU3RyaW5nUmF3CQCdCAIFBHRoaXMJARJrZXlMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQHJG1hdGNoMAUYbGVhc2luZ05vZGVEYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEEW5vZGVDdXJyZW50UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAQQRbm9kZUN1cnJlbnRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAACBA5ub2RlTmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMEDm5vZGVOZXh0TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUObm9kZU5leHRQZXJpb2QFBmhlaWdodAYJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAlAoCBRFub2RlQ3VycmVudExlYXNlZAUObm9kZU5leHRMZWFzZWQJAJQKAgUObm9kZU5leHRMZWFzZWQFDm5vZGVOZXh0TGVhc2VkCQCUCgIAAAAAARNnZXRVc2VyTGVhc2luZ0VudHJ5BAtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcxF1c2VyQ3VycmVudExlYXNlZA51c2VyTmV4dExlYXNlZAQLdmFsdWVTdHJpbmcJALkJAgkAzAgCAgglZCVkJWQlZAkAzAgCCQCkAwEFE2N1cnJlbnRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBRF1c2VyQ3VycmVudExlYXNlZAkAzAgCCQCkAwEFEG5leHRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBQ51c2VyTmV4dExlYXNlZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIJARZrZXlVc2VyTGVhc2luZ05vZGVEYXRhAgULdXNlckFkZHJlc3MFC25vZGVBZGRyZXNzBQt2YWx1ZVN0cmluZwESZ2V0VXNlckxlYXNpbmdEYXRhAgtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwQYbGVhc2luZ1VzZXJEYXRhU3RyaW5nUmF3CQCdCAIFBHRoaXMJARZrZXlVc2VyTGVhc2luZ05vZGVEYXRhAgULdXNlckFkZHJlc3MFC25vZGVBZGRyZXNzBAckbWF0Y2gwBRhsZWFzaW5nVXNlckRhdGFTdHJpbmdSYXcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAJkcwUHJG1hdGNoMAQIZGF0YUxpc3QJALUJAgUCZHMFA1NFUAQRdXNlckN1cnJlbnRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAABBBF1c2VyQ3VycmVudExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAIEDnVzZXJOZXh0UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAwQOdXNlck5leHRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAAEAwMJAGYCBQ51c2VyTmV4dFBlcmlvZAUGaGVpZ2h0BgkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BCQCUCgIFEXVzZXJDdXJyZW50TGVhc2VkBQ51c2VyTmV4dExlYXNlZAkAlAoCBQ51c2VyTmV4dExlYXNlZAUOdXNlck5leHRMZWFzZWQJAJQKAgAAAAABE2dldFVzZXJUb0NsYWltRW50cnkDC3VzZXJBZGRyZXNzB3RvQ2xhaW0IdG9VbmxvY2sEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgIIJWQlZCVkJWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUHdG9DbGFpbQkAzAgCCQCkAwEFEG5leHRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBQh0b1VubG9jawUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIJAQ5rZXlVc2VyVG9DbGFpbQEFC3VzZXJBZGRyZXNzBQt2YWx1ZVN0cmluZwEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQt1c2VyQWRkcmVzcwQYdXNlclRvQ2xhaW1EYXRhU3RyaW5nUmF3CQCdCAIFBHRoaXMJAQ5rZXlVc2VyVG9DbGFpbQEFC3VzZXJBZGRyZXNzBAckbWF0Y2gwBRh1c2VyVG9DbGFpbURhdGFTdHJpbmdSYXcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAJkcwUHJG1hdGNoMAQIZGF0YUxpc3QJALUJAgUCZHMFA1NFUAQNY3VycmVudFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEEB3RvQ2xhaW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAACBApuZXh0UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAwQIdG9VbmxvY2sJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAAEAwMJAGYCBQpuZXh0UGVyaW9kBQZoZWlnaHQGCQAAAgUPY3VycmVudFBlcmlvZElkAAAJAJQKAgUHdG9DbGFpbQUIdG9VbmxvY2sJAJQKAgkAZAIFB3RvQ2xhaW0FCHRvVW5sb2NrAAAJAJQKAgAAAAABF2dldFVzZXJUb3RhbExvY2tlZEVudHJ5Agt1c2VyQWRkcmVzcw91c2VyVG90YWxMb2NrZWQJAQxJbnRlZ2VyRW50cnkCCQESa2V5VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MFD3VzZXJUb3RhbExvY2tlZAESZ2V0VXNlclRvdGFsTG9ja2VkAQt1c2VyQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQESa2V5VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MAAAEVY2FsY3VsYXRlVW5pdHNUb0NsYWltAQt1c2VyQWRkcmVzcwQPY2xhaW1lZEJsb2NrS2V5CQEUa2V5VW5pdHNDbGFpbWVkQmxvY2sBBQt1c2VyQWRkcmVzcwQMY2xhaW1lZEJsb2NrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD2NsYWltZWRCbG9ja0tleQUVdW5pdHNDbGFpbVN0YXJ0SGVpZ2h0BBN1bml0c1BlckJsb2NrU2NhbGU4CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFmtleVVuaXRzUGVyQmxvY2tTY2FsZTgAAAQMY3VycmVudEJsb2NrCQCXAwEJAMwIAgkAZAIFFXVuaXRzQ2xhaW1TdGFydEhlaWdodAUSdW5pdHNDbGFpbUludGVydmFsCQDMCAIFBmhlaWdodAUDbmlsBAxibG9ja3NQYXNzZWQJAGUCBQxjdXJyZW50QmxvY2sFDGNsYWltZWRCbG9jawQMYW1vdW50U3Rha2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MED3VuaXRzVG9DbGFpbU5vdwkAawMJAGgCBRN1bml0c1BlckJsb2NrU2NhbGU4BQxibG9ja3NQYXNzZWQFDGFtb3VudFN0YWtlZAUGc2NhbGU4BAhsMlRvQnVybgkAawMFDGFtb3VudFN0YWtlZAUMYmxvY2tzUGFzc2VkBRJ1bml0c0NsYWltSW50ZXJ2YWwJAJUKAwUPdW5pdHNUb0NsYWltTm93BQhsMlRvQnVybgUMY2xhaW1lZEJsb2NrARRnZXRVbmxvY2tVbml0c0FjdGlvbgELdXNlckFkZHJlc3MEDmtVbmxvY2tlZFVuaXRzCQEQa2V5VW5sb2NrZWRVbml0cwEFC3VzZXJBZGRyZXNzBA11bmxvY2tlZFVuaXRzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDmtVbmxvY2tlZFVuaXRzAAAECWtMMlRvQnVybgkBC2tleUwyVG9CdXJuAQULdXNlckFkZHJlc3MECGwyVG9CdXJuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCWtMMlRvQnVybgAABA0kdDAxMTM0MzExNDI4CQEVY2FsY3VsYXRlVW5pdHNUb0NsYWltAQULdXNlckFkZHJlc3MED3VuaXRzVG9DbGFpbU5vdwgFDSR0MDExMzQzMTE0MjgCXzEEC2wyVG9CdXJuTm93CAUNJHQwMTEzNDMxMTQyOAJfMgQMY2xhaW1lZEJsb2NrCAUNJHQwMTEzNDMxMTQyOAJfMwMJAGcCAAAFD3VuaXRzVG9DbGFpbU5vdwUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5VW5pdHNDbGFpbWVkQmxvY2sBBQt1c2VyQWRkcmVzcwUMY2xhaW1lZEJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrTDJUb0J1cm4JAGQCBQhsMlRvQnVybgULbDJUb0J1cm5Ob3cJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtVbmxvY2tlZFVuaXRzCQBkAgUNdW5sb2NrZWRVbml0cwUPdW5pdHNUb0NsYWltTm93BQNuaWwBEWdldFVuc3Rha2VBY3Rpb25zAwtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcw11bnN0YWtlQW1vdW50BA0kdDAxMTgyMzExODk2CQESZ2V0TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEEW5vZGVDdXJyZW50TGVhc2VkCAUNJHQwMTE4MjMxMTg5NgJfMQQObm9kZU5leHRMZWFzZWQIBQ0kdDAxMTgyMzExODk2Al8yBA0kdDAxMTkwMTExOTg3CQESZ2V0VXNlckxlYXNpbmdEYXRhAgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBBF1c2VyQ3VycmVudExlYXNlZAgFDSR0MDExOTAxMTE5ODcCXzEEDnVzZXJOZXh0TGVhc2VkCAUNJHQwMTE5MDExMTk4NwJfMgQGY2hlY2tzCQDMCAIDCQEBIQEFC2lzRm9yY2VTdG9wBgkBCHRocm93RXJyAQIdY29udHJhY3QgaXMgdGVtcG9yYXJ5IHN0b3BwZWQJAMwIAgMJAQEhAQUOaXNGb3JjZU91dFN0b3AGCQEIdGhyb3dFcnIBAh11bnN0YWtlIGlzIHRlbXBvcmFyeSBkaXNhYmxlZAkAzAgCAwkAZgIFDXVuc3Rha2VBbW91bnQAAAYJAQh0aHJvd0VycgECJ3Vuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAZwIFDnVzZXJOZXh0TGVhc2VkBQ11bnN0YWtlQW1vdW50BgkBCHRocm93RXJyAQI5dW5zdGFrZSBhbW91bnQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdXNlciBzdGFrZWQgYW1vdW50CQDMCAIDCQBnAgUObm9kZU5leHRMZWFzZWQFDXVuc3Rha2VBbW91bnQGCQEIdGhyb3dFcnIBAjl1bnN0YWtlIGFtb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCBub2RlIHN0YWtlZCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC25vZGVBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGm5vZGUgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC25vZGVBZGRyZXNzBQNuaWwCASAJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQQbmV3Tm9kZU5leHRMZWFzZQkAZQIFDm5vZGVOZXh0TGVhc2VkBQ11bnN0YWtlQW1vdW50BBFuZXdVc2VyTmV4dExlYXNlZAkAZQIFDnVzZXJOZXh0TGVhc2VkBQ11bnN0YWtlQW1vdW50BA0kdDAxMjg3MTEyOTMxCQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxMjg3MTEyOTMxAl8xBAh0b1VubG9jawgFDSR0MDEyODcxMTI5MzECXzIEC25ld1RvVW5sb2NrCQBkAgUIdG9VbmxvY2sFDXVuc3Rha2VBbW91bnQED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBBJuZXdVc2VyVG90YWxMb2NrZWQJAGUCBQ91c2VyVG90YWxMb2NrZWQFDXVuc3Rha2VBbW91bnQEFHVuaXRzVW5sb2NrZWRBY3Rpb25zCQEUZ2V0VW5sb2NrVW5pdHNBY3Rpb24BBQt1c2VyQWRkcmVzcwkAzggCCQDMCAIJARNnZXRMZWFzaW5nTm9kZUVudHJ5AwULbm9kZUFkZHJlc3MFEW5vZGVDdXJyZW50TGVhc2VkBRBuZXdOb2RlTmV4dExlYXNlCQDMCAIJARNnZXRVc2VyTGVhc2luZ0VudHJ5BAULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRF1c2VyQ3VycmVudExlYXNlZAURbmV3VXNlck5leHRMZWFzZWQJAMwIAgkBE2dldFVzZXJUb0NsYWltRW50cnkDBQt1c2VyQWRkcmVzcwUHdG9DbGFpbQULbmV3VG9VbmxvY2sJAMwIAgkBF2dldFVzZXJUb3RhbExvY2tlZEVudHJ5AgULdXNlckFkZHJlc3MFEm5ld1VzZXJUb3RhbExvY2tlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleU5vZGVMZWFzaW5nQnlIZWlnaHQBBQtub2RlQWRkcmVzcwUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleVVzZXJMZWFzaW5nQnlIZWlnaHQCBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFEW5ld1VzZXJOZXh0TGVhc2VkBQNuaWwFFHVuaXRzVW5sb2NrZWRBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwILdXNlckFkZHJlc3MLY2xhaW1BbW91bnQEDSR0MDEzNzUwMTM4MTAJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDEzNzUwMTM4MTACXzEECHRvVW5sb2NrCAUNJHQwMTM3NTAxMzgxMAJfMgQGY2hlY2tzCQDMCAIDCQEBIQEFC2lzRm9yY2VTdG9wBgkBCHRocm93RXJyAQIdY29udHJhY3QgaXMgdGVtcG9yYXJ5IHN0b3BwZWQJAMwIAgMJAQEhAQUOaXNGb3JjZU91dFN0b3AGCQEIdGhyb3dFcnIBAhtjbGFpbSBpcyB0ZW1wb3JhcnkgZGlzYWJsZWQJAMwIAgMJAGYCBQtjbGFpbUFtb3VudAAABgkBCHRocm93RXJyAQIlY2xhaW0gYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAZwIFB3RvQ2xhaW0FC2NsYWltQW1vdW50BgkBCHRocm93RXJyAQI0Y2xhaW0gYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHVubG9ja2VkIGFtb3VudAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBApuZXdUb0NsYWltCQBlAgUHdG9DbGFpbQULY2xhaW1BbW91bnQJAMwIAgkBE2dldFVzZXJUb0NsYWltRW50cnkDBQt1c2VyQWRkcmVzcwUKbmV3VG9DbGFpbQUIdG9VbmxvY2sJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQULdXNlckFkZHJlc3MFC2NsYWltQW1vdW50BQ5sMkFzc2V0SWRCeXRlcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARJnZXRTdGFrZUZvckFjdGlvbnMCC3VzZXJBZGRyZXNzAWkEDSR0MDE0NTc2MTQ2MzYJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDE0NTc2MTQ2MzYCXzEECHRvVW5sb2NrCAUNJHQwMTQ1NzYxNDYzNgJfMgQGY2hlY2tzCQDMCAIDCQEBIQEFC2lzRm9yY2VTdG9wBgkBCHRocm93RXJyAQIdY29udHJhY3QgaXMgdGVtcG9yYXJ5IHN0b3BwZWQJAMwIAgMJAGcCAAEJAJADAQgFAWkIcGF5bWVudHMGCQEIdGhyb3dFcnIBAhFtYXhpbXVtIDEgcGF5bWVudAkAzAgCAwMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAGCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQ5sMkFzc2V0SWRCeXRlcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhpwYXltZW50IGFzc2V0SWQgc2hvdWxkIGJlOgkAzAgCBQ9sMkFzc2V0SWRTdHJpbmcFA25pbAIBIAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBApuZXdUb0NsYWltCQBkAgUHdG9DbGFpbQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBE2dldFVzZXJUb0NsYWltRW50cnkDBQt1c2VyQWRkcmVzcwUKbmV3VG9DbGFpbQUIdG9VbmxvY2sFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEPZ2V0U3Rha2VBY3Rpb25zBAtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcxF1c2VyTGVhc2luZ0Ftb3VudAFpBA0kdDAxNTM2ODE1NDI4CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxNTM2ODE1NDI4Al8xBAh0b1VubG9jawgFDSR0MDE1MzY4MTU0MjgCXzIEDXBheW1lbnRBbW91bnQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAAAAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAlhdmFpbGFibGUJAGQCCQBkAgUIdG9VbmxvY2sFB3RvQ2xhaW0FDXBheW1lbnRBbW91bnQEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQBnAgABCQCQAwEIBQFpCHBheW1lbnRzBgkBCHRocm93RXJyAQIRbWF4aW11bSAxIHBheW1lbnQJAMwIAgMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUObDJBc3NldElkQnl0ZXMGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIacGF5bWVudCBhc3NldElkIHNob3VsZCBiZToJAMwIAgUPbDJBc3NldElkU3RyaW5nBQNuaWwCASAJAMwIAgMJAGYCBRF1c2VyTGVhc2luZ0Ftb3VudAAABgkBCHRocm93RXJyAQIfYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAZwIFCWF2YWlsYWJsZQURdXNlckxlYXNpbmdBbW91bnQGCQEIdGhyb3dFcnIBAjthbW91bnQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgKHBheW1lbnQgKyBhdmFpbGFibGUpIGFtb3VudAkAzAgCAwkAZwIFEXVzZXJMZWFzaW5nQW1vdW50BQ1wYXltZW50QW1vdW50BgkAAgECMGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbCBwYXltZW50IGFtb3VudAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULbm9kZUFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIabm9kZSBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULbm9kZUFkZHJlc3MFA25pbAIBIAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA0kdDAxNjUwMzE2NTc2CQESZ2V0TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEEW5vZGVDdXJyZW50TGVhc2VkCAUNJHQwMTY1MDMxNjU3NgJfMQQObm9kZU5leHRMZWFzZWQIBQ0kdDAxNjUwMzE2NTc2Al8yBBBuZXdOb2RlTmV4dExlYXNlCQBkAgUObm9kZU5leHRMZWFzZWQFEXVzZXJMZWFzaW5nQW1vdW50BA0kdDAxNjY0NDE2NzMwCQESZ2V0VXNlckxlYXNpbmdEYXRhAgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBBF1c2VyQ3VycmVudExlYXNlZAgFDSR0MDE2NjQ0MTY3MzACXzEEDnVzZXJOZXh0TGVhc2VkCAUNJHQwMTY2NDQxNjczMAJfMgQRbmV3VXNlck5leHRMZWFzZWQJAGQCBQ51c2VyTmV4dExlYXNlZAURdXNlckxlYXNpbmdBbW91bnQEEmZyb21VbmxvY2tlZEFtb3VudAkAZQIFEXVzZXJMZWFzaW5nQW1vdW50BQ1wYXltZW50QW1vdW50BAtuZXdUb1VubG9jawkAlgMBCQDMCAIAAAkAzAgCCQBlAgUIdG9VbmxvY2sFEmZyb21VbmxvY2tlZEFtb3VudAUDbmlsBApuZXdUb0NsYWltCQCXAwEJAMwIAgUHdG9DbGFpbQkAzAgCCQBkAgUHdG9DbGFpbQkAZQIFCHRvVW5sb2NrBRJmcm9tVW5sb2NrZWRBbW91bnQFA25pbAQPdXNlclRvdGFsTG9ja2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MEEm5ld1VzZXJUb3RhbExvY2tlZAkAZAIFD3VzZXJUb3RhbExvY2tlZAURdXNlckxlYXNpbmdBbW91bnQEFHVuaXRzVW5sb2NrZWRBY3Rpb25zCQEUZ2V0VW5sb2NrVW5pdHNBY3Rpb24BBQt1c2VyQWRkcmVzcwkAzggCCQDMCAIJARNnZXRMZWFzaW5nTm9kZUVudHJ5AwULbm9kZUFkZHJlc3MFEW5vZGVDdXJyZW50TGVhc2VkBRBuZXdOb2RlTmV4dExlYXNlCQDMCAIJARNnZXRVc2VyTGVhc2luZ0VudHJ5BAULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRF1c2VyQ3VycmVudExlYXNlZAURbmV3VXNlck5leHRMZWFzZWQJAMwIAgkBE2dldFVzZXJUb0NsYWltRW50cnkDBQt1c2VyQWRkcmVzcwUKbmV3VG9DbGFpbQULbmV3VG9VbmxvY2sJAMwIAgkBF2dldFVzZXJUb3RhbExvY2tlZEVudHJ5AgULdXNlckFkZHJlc3MFEm5ld1VzZXJUb3RhbExvY2tlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleU5vZGVMZWFzaW5nQnlIZWlnaHQBBQtub2RlQWRkcmVzcwUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleVVzZXJMZWFzaW5nQnlIZWlnaHQCBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFEW5ld1VzZXJOZXh0TGVhc2VkBQNuaWwFFHVuaXRzVW5sb2NrZWRBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARpnZXRTdGFrZUZyb21QYXltZW50QWN0aW9ucwMLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MBaQQGY2hlY2tzCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIgcGF5bWVudCBzaXplIHNob3VsZCBiZSBleGFjdGx5IDEFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBD2dldFN0YWtlQWN0aW9ucwQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFAWkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BHGdldFNldE5ld1BlcmlvZExlbmd0aEFjdGlvbnMBD25ld1BlcmlvZExlbmd0aAQFY2hlY2sJAMwIAgMJAGYCBQ9uZXdQZXJpb2RMZW5ndGgAAAYJAQh0aHJvd0VycgECJnBlcmlvZCBsZW5ndGggc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlQZXJpb2RMZW5ndGgFD25ld1BlcmlvZExlbmd0aAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0BQZoZWlnaHQFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa2V5UGVyaW9kT2Zmc2V0SWQJAGQCBQ9jdXJyZW50UGVyaW9kSWQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0BRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlQZXJpb2RMZW5ndGgFD25ld1BlcmlvZExlbmd0aAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFnZXRVbml0c0NsYWltRGF0YQELdXNlckFkZHJlc3MEDSR0MDE4NjE1MTg3MDAJARVjYWxjdWxhdGVVbml0c1RvQ2xhaW0BBQt1c2VyQWRkcmVzcwQPdW5sb2NrZWRVbml0Tm93CAUNJHQwMTg2MTUxODcwMAJfMQQLbDJUb0J1cm5Ob3cIBQ0kdDAxODYxNTE4NzAwAl8yBAxjbGFpbWVkQmxvY2sIBQ0kdDAxODYxNTE4NzAwAl8zBBF1bmxvY2tlZFVuaXRzUHJldgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEQa2V5VW5sb2NrZWRVbml0cwEFC3VzZXJBZGRyZXNzAAAEC3VuaXRzVG9TZW5kCQBkAgUPdW5sb2NrZWRVbml0Tm93BRF1bmxvY2tlZFVuaXRzUHJldgQMbDJUb0J1cm5QcmV2CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQtrZXlMMlRvQnVybgEFC3VzZXJBZGRyZXNzAAAECGwyVG9CdXJuCQBkAgUMbDJUb0J1cm5QcmV2BQtsMlRvQnVybk5vdwQRdG90YWxVbml0c0NsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBFGtleVRvdGFsVW5pdHNDbGFpbWVkAQULdXNlckFkZHJlc3MAAAQNdG90YWxMMkJ1cm5lZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEQa2V5TDJCdXJuZWRUb3RhbAEFC3VzZXJBZGRyZXNzAAAJAJcKBQULdW5pdHNUb1NlbmQFEXRvdGFsVW5pdHNDbGFpbWVkBQhsMlRvQnVybgUNdG90YWxMMkJ1cm5lZAUMY2xhaW1lZEJsb2NrARRnZXRDbGFpbVVuaXRzQWN0aW9ucwELdXNlckFkZHJlc3MEDSR0MDE5MjkyMTk0MDAJARFnZXRVbml0c0NsYWltRGF0YQEFC3VzZXJBZGRyZXNzBAt1bml0c1RvU2VuZAgFDSR0MDE5MjkyMTk0MDACXzEEEXRvdGFsVW5pdHNDbGFpbWVkCAUNJHQwMTkyOTIxOTQwMAJfMgQIbDJUb0J1cm4IBQ0kdDAxOTI5MjE5NDAwAl8zBA10b3RhbEwyQnVybmVkCAUNJHQwMTkyOTIxOTQwMAJfNAQMY2xhaW1lZEJsb2NrCAUNJHQwMTkyOTIxOTQwMAJfNQQFY2hlY2sJAMwIAgMJAGcCAAAFC3VuaXRzVG9TZW5kBgkBCHRocm93RXJyAQIQbm90aGluZyB0byBjbGFpbQUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawQKYnVybkFjdGlvbgQHJG1hdGNoMAUObDJBc3NldElkQnl0ZXMDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAMwIAgkBBEJ1cm4CBQJpZAUIbDJUb0J1cm4FA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlVbml0c0NsYWltZWRCbG9jawEFC3VzZXJBZGRyZXNzBQxjbGFpbWVkQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlUb3RhbFVuaXRzQ2xhaW1lZAEFC3VzZXJBZGRyZXNzCQBkAgURdG90YWxVbml0c0NsYWltZWQFC3VuaXRzVG9TZW5kCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQa2V5TDJCdXJuZWRUb3RhbAEFC3VzZXJBZGRyZXNzCQBkAgUNdG90YWxMMkJ1cm5lZAUIbDJUb0J1cm4JAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlVbmxvY2tlZFVuaXRzAQULdXNlckFkZHJlc3MAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBC2tleUwyVG9CdXJuAQULdXNlckFkZHJlc3MAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQt1c2VyQWRkcmVzcwULdW5pdHNUb1NlbmQFEXVuaXRzQXNzZXRJZEJ5dGVzBQNuaWwFCmJ1cm5BY3Rpb24JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4QAWkBEnNldE5ld1BlcmlvZExlbmd0aAEPbmV3UGVyaW9kTGVuZ3RoBAZjaGVja3MJAMwIAgMJAQ1pc0luQWRtaW5MaXN0AQkApQgBCAUBaQZjYWxsZXIGCQEIdGhyb3dFcnIBAhpjYWxsZXIgaXMgbm90IGluIGFkbWluTGlzdAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEcZ2V0U2V0TmV3UGVyaW9kTGVuZ3RoQWN0aW9ucwEFD25ld1BlcmlvZExlbmd0aAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjbGFpbVVuaXRzAAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEUZ2V0Q2xhaW1Vbml0c0FjdGlvbnMBBQt1c2VyQWRkcmVzcwFpARBzZXRGb3JjZVN0b3BGbGFnAQRzdG9wBAVjaGVjawkAzAgCAwkBDWlzSW5BZG1pbkxpc3QBCQClCAEIBQFpBmNhbGxlcgYJAQh0aHJvd0VycgECGmNhbGxlciBpcyBub3QgaW4gYWRtaW5MaXN0BQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrZXlGb3JjZVN0b3AFBHN0b3AFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNzZXRGb3JjZU91dFN0b3BGbGFnAQRzdG9wBAVjaGVjawkAzAgCAwkBDWlzSW5BZG1pbkxpc3QBCQClCAEIBQFpBmNhbGxlcgYJAQh0aHJvd0VycgECGmNhbGxlciBpcyBub3QgaW4gYWRtaW5MaXN0BQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxCb29sZWFuRW50cnkCBQ9rZXlGb3JjZU91dFN0b3AFBHN0b3AFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNnZXROb2RlRGF0YVJFQURPTkxZAQtub2RlQWRkcmVzcwQNJHQwMjExMzMyMTE5NwkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBAxjdXJyZW50TGVhc2UIBQ0kdDAyMTEzMzIxMTk3Al8xBApuZXh0TGVhc2VkCAUNJHQwMjExMzMyMTE5NwJfMgkAlAoCBQNuaWwJAJcKBQUTY3VycmVudFBlcmlvZEhlaWdodAUMY3VycmVudExlYXNlBRBuZXh0UGVyaW9kSGVpZ2h0BQpuZXh0TGVhc2VkBQZoZWlnaHQBaQEaZ2V0VXNlckxlYXNpbmdEYXRhUkVBRE9OTFkCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzBA0kdDAyMTU2NzIxNjQ0CQESZ2V0VXNlckxlYXNpbmdEYXRhAgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBAxjdXJyZW50TGVhc2UIBQ0kdDAyMTU2NzIxNjQ0Al8xBApuZXh0TGVhc2VkCAUNJHQwMjE1NjcyMTY0NAJfMgkAlAoCBQNuaWwJAJcKBQUTY3VycmVudFBlcmlvZEhlaWdodAUMY3VycmVudExlYXNlBRBuZXh0UGVyaW9kSGVpZ2h0BQpuZXh0TGVhc2VkBQZoZWlnaHQBaQETZ2V0VXNlckRhdGFSRUFET05MWQELdXNlckFkZHJlc3MEDSR0MDIyMTYwMjIyMjAJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDIyMTYwMjIyMjACXzEECHRvVW5sb2NrCAUNJHQwMjIxNjAyMjIyMAJfMgQPdXNlclRvdGFsTG9ja2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MEDSR0MDIyMjgzMjIzOTEJARFnZXRVbml0c0NsYWltRGF0YQEFC3VzZXJBZGRyZXNzBAt1bml0c1RvU2VuZAgFDSR0MDIyMjgzMjIzOTECXzEEEXRvdGFsVW5pdHNDbGFpbWVkCAUNJHQwMjIyODMyMjM5MQJfMgQIbDJUb0J1cm4IBQ0kdDAyMjI4MzIyMzkxAl8zBA10b3RhbEwyQnVybmVkCAUNJHQwMjIyODMyMjM5MQJfNAQMY2xhaW1lZEJsb2NrCAUNJHQwMjIyODMyMjM5MQJfNQkAlAoCBQNuaWwJAJ0KCwUTY3VycmVudFBlcmlvZEhlaWdodAUHdG9DbGFpbQUQbmV4dFBlcmlvZEhlaWdodAUIdG9VbmxvY2sFD3VzZXJUb3RhbExvY2tlZAUGaGVpZ2h0BQt1bml0c1RvU2VuZAURdG90YWxVbml0c0NsYWltZWQFCGwyVG9CdXJuBQ10b3RhbEwyQnVybmVkBQxjbGFpbWVkQmxvY2sBaQEObGVhc2VCeUFkZHJlc3MCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzCQEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFAWkBaQEFbGVhc2UBC25vZGVBZGRyZXNzBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARpnZXRTdGFrZUZyb21QYXltZW50QWN0aW9ucwMFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUBaQFpAQ9sZWFzZUZyb21Mb2NrZWQCC25vZGVBZGRyZXNzBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEPZ2V0U3Rha2VBY3Rpb25zBAULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQZhbW91bnQFAWkBaQELY2FuY2VsTGVhc2UCC25vZGVBZGRyZXNzBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQERZ2V0VW5zdGFrZUFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFBmFtb3VudAFpAQVjbGFpbQEGYW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwIFC3VzZXJBZGRyZXNzBQZhbW91bnQBaQEIY2xhaW1BbGwABAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDSR0MDIzNTgzMjM2NDMJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDIzNTgzMjM2NDMCXzEECHRvVW5sb2NrCAUNJHQwMjM1ODMyMzY0MwJfMgQGY2hlY2tzCQDMCAIDCQBmAgUHdG9DbGFpbQAABgkBCHRocm93RXJyAQIQbm90aGluZyB0byBjbGFpbQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCBQt1c2VyQWRkcmVzcwUHdG9DbGFpbQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhzdGFrZUZvcgELdXNlckFkZHJlc3MJARJnZXRTdGFrZUZvckFjdGlvbnMCBQt1c2VyQWRkcmVzcwUBaQFpARFzdGFydFVuaXRzVmVzdGluZwESdW5pdHNDbGFpbUludGVydmFsBAd0b3RhbEwyAICAqOyFr9GxAQQKdG90YWxVbml0cwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEE3VuaXRzUGVyQmxvY2tTY2FsZTgJAGkCCQBrAwUHdG90YWxMMgUGc2NhbGU4BQp0b3RhbFVuaXRzBRJ1bml0c0NsYWltSW50ZXJ2YWwEBWNoZWNrCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAhNzaG91bGQgYmUgMSBwYXltZW50CQDMCAIDCQBmAgUTdW5pdHNQZXJCbG9ja1NjYWxlOAAABgkBCHRocm93RXJyAQIodW5pdHMgcGVyIGJsb2NrIHNob3VsZCBiZSBncmVhdGVkIHRoYW4gMAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMSW50ZWdlckVudHJ5AgUWa2V5VW5pdHNQZXJCbG9ja1NjYWxlOAUTdW5pdHNQZXJCbG9ja1NjYWxlOAkAzAgCCQEMSW50ZWdlckVudHJ5AgUYa2V5VW5pdHNDbGFpbVN0YXJ0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVVuaXRzQ2xhaW1JbnRlcnZhbAUSdW5pdHNDbGFpbUludGVydmFsCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tleVVuaXRzQXNzZXRJZAkBEmFzc2V0Qnl0ZXNUb1N0cmluZwEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3ZvdGVGb3JUeElkAQR0eElkBBNjYWxsZXJBZGRyZXNzU3RyaW5nCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMECWtleVByZWZpeAkBGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEFBHR4SWQEBnJlc3VsdAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5QWxsb3dlZFR4SWQABQR0eElkBQNuaWwEEWFsbG93ZWRUeElkT3B0aW9uCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAAEA2VycgkAzAgCAwkAAAIJAMgBAQkA2QQBBQR0eElkBRFUWElEX0JZVEVTX0xFTkdUSAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAISIGlzIG5vdCB2YWxpZCB0eElkCQDMCAIDAwkAAAIFEWFsbG93ZWRUeElkT3B0aW9uBQR1bml0BgkBAiE9AgkBBXZhbHVlAQURYWxsb3dlZFR4SWRPcHRpb24FBHR4SWQGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEyBpcyBhbHJlYWR5IGFsbG93ZWQFA25pbAMJAAACBQNlcnIFA2VycgkBDHZvdGVJTlRFUk5BTAQFE2NhbGxlckFkZHJlc3NTdHJpbmcFCWtleVByZWZpeAUGUVVPUlVNBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAhieUFkbWlucwkAAAIIBQJ0eAJpZAkA2QQBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAACAAQHYnlPd25lcgMJAGcCCQCQAwEJAQ1nZXRBZG1pbnNMaXN0AAUGUVVPUlVNBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQMFCGJ5QWRtaW5zBgUHYnlPd25lchdpRxU=", "chainId": 84, "height": 3336628, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: A3kQoQSnGrcqFFfi8DFpr1ZLxcfqckRYfmdsacgFEWWH Next: GSmzqun3281fCHh1SLgmMkoJ5LjoKbiArJYkxg3bzjB9 Diff:
OldNewDifferences
88 let BLOCKS_IN_INTERVAL = 1000
99
1010 let scale8 = 100000000
11-
12-let unitsClaimInterval = ((365 * 24) * 60)
1311
1412 func throwErr (msg) = throw(((contractFile + ": ") + msg))
1513
3129 let keyPeriodLength = makeString(["%s", "periodLength"], SEP)
3230
3331 let keyUnitsClaimStartHeight = makeString(["%s", "unitsClaimStartHeight"], SEP)
32+
33+let keyUnitsClaimInterval = makeString(["%s", "unitsClaimInterval"], SEP)
3434
3535 let periodOffsetId = valueOrElse(getInteger(this, keyPeriodOffsetId), 0)
3636
6161 else (currentPeriodHeight + periodLength)
6262
6363 let unitsClaimStartHeight = valueOrElse(getInteger(this, keyUnitsClaimStartHeight), height)
64+
65+let unitsClaimInterval = valueOrElse(getInteger(this, keyUnitsClaimInterval), 0)
6466
6567 func keyLeasingNodeData (nodeAddress) = makeString(["%s", nodeAddress], SEP)
6668
174176
175177
176178 func genVotesKeysHelper (a,adminAddress) = {
177- let $t050215045 = a
178- let result = $t050215045._1
179- let prefix = $t050215045._2
179+ let $t051475171 = a
180+ let result = $t051475171._1
181+ let prefix = $t051475171._2
180182 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
181183 }
182184
183185
184186 func genVotesKeys (keyPrefix) = {
185187 let adminList = keyAdminAddressList()
186- let $t051925276 = {
188+ let $t053185402 = {
187189 let $l = getAdminsList()
188190 let $s = size($l)
189191 let $acc0 = $Tuple2(nil, keyPrefix)
197199
198200 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
199201 }
200- let result = $t051925276._1
201- let prefix = $t051925276._2
202+ let result = $t053185402._1
203+ let prefix = $t053185402._2
202204 result
203205 }
204206
367369 let unlockedUnits = valueOrElse(getInteger(this, kUnlockedUnits), 0)
368370 let kL2ToBurn = keyL2ToBurn(userAddress)
369371 let l2ToBurn = valueOrElse(getInteger(this, kL2ToBurn), 0)
370- let $t01121711302 = calculateUnitsToClaim(userAddress)
371- let unitsToClaimNow = $t01121711302._1
372- let l2ToBurnNow = $t01121711302._2
373- let claimedBlock = $t01121711302._3
372+ let $t01134311428 = calculateUnitsToClaim(userAddress)
373+ let unitsToClaimNow = $t01134311428._1
374+ let l2ToBurnNow = $t01134311428._2
375+ let claimedBlock = $t01134311428._3
374376 if ((0 >= unitsToClaimNow))
375377 then nil
376378 else [IntegerEntry(keyUnitsClaimedBlock(userAddress), claimedBlock), IntegerEntry(kL2ToBurn, (l2ToBurn + l2ToBurnNow)), IntegerEntry(kUnlockedUnits, (unlockedUnits + unitsToClaimNow))]
378380
379381
380382 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
381- let $t01169711770 = getLeasingNodeData(nodeAddress)
382- let nodeCurrentLeased = $t01169711770._1
383- let nodeNextLeased = $t01169711770._2
384- let $t01177511861 = getUserLeasingData(nodeAddress, userAddress)
385- let userCurrentLeased = $t01177511861._1
386- let userNextLeased = $t01177511861._2
383+ let $t01182311896 = getLeasingNodeData(nodeAddress)
384+ let nodeCurrentLeased = $t01182311896._1
385+ let nodeNextLeased = $t01182311896._2
386+ let $t01190111987 = getUserLeasingData(nodeAddress, userAddress)
387+ let userCurrentLeased = $t01190111987._1
388+ let userNextLeased = $t01190111987._2
387389 let checks = [if (!(isForceStop))
388390 then true
389391 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
403405 then {
404406 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
405407 let newUserNextLeased = (userNextLeased - unstakeAmount)
406- let $t01274512805 = getUserToClaimBalance(userAddress)
407- let toClaim = $t01274512805._1
408- let toUnlock = $t01274512805._2
408+ let $t01287112931 = getUserToClaimBalance(userAddress)
409+ let toClaim = $t01287112931._1
410+ let toUnlock = $t01287112931._2
409411 let newToUnlock = (toUnlock + unstakeAmount)
410412 let userTotalLocked = getUserTotalLocked(userAddress)
411413 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
417419
418420
419421 func getClaimUnlockedActions (userAddress,claimAmount) = {
420- let $t01362413684 = getUserToClaimBalance(userAddress)
421- let toClaim = $t01362413684._1
422- let toUnlock = $t01362413684._2
422+ let $t01375013810 = getUserToClaimBalance(userAddress)
423+ let toClaim = $t01375013810._1
424+ let toUnlock = $t01375013810._2
423425 let checks = [if (!(isForceStop))
424426 then true
425427 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
441443
442444
443445 func getStakeForActions (userAddress,i) = {
444- let $t01445014510 = getUserToClaimBalance(userAddress)
445- let toClaim = $t01445014510._1
446- let toUnlock = $t01445014510._2
446+ let $t01457614636 = getUserToClaimBalance(userAddress)
447+ let toClaim = $t01457614636._1
448+ let toUnlock = $t01457614636._2
447449 let checks = [if (!(isForceStop))
448450 then true
449451 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
465467
466468
467469 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
468- let $t01524215302 = getUserToClaimBalance(userAddress)
469- let toClaim = $t01524215302._1
470- let toUnlock = $t01524215302._2
470+ let $t01536815428 = getUserToClaimBalance(userAddress)
471+ let toClaim = $t01536815428._1
472+ let toUnlock = $t01536815428._2
471473 let paymentAmount = if ((size(i.payments) == 0))
472474 then 0
473475 else i.payments[0].amount
493495 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
494496 if ((checks == checks))
495497 then {
496- let $t01637716450 = getLeasingNodeData(nodeAddress)
497- let nodeCurrentLeased = $t01637716450._1
498- let nodeNextLeased = $t01637716450._2
498+ let $t01650316576 = getLeasingNodeData(nodeAddress)
499+ let nodeCurrentLeased = $t01650316576._1
500+ let nodeNextLeased = $t01650316576._2
499501 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
500- let $t01651816604 = getUserLeasingData(nodeAddress, userAddress)
501- let userCurrentLeased = $t01651816604._1
502- let userNextLeased = $t01651816604._2
502+ let $t01664416730 = getUserLeasingData(nodeAddress, userAddress)
503+ let userCurrentLeased = $t01664416730._1
504+ let userNextLeased = $t01664416730._2
503505 let newUserNextLeased = (userNextLeased + userLeasingAmount)
504506 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
505507 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
536538
537539
538540 func getUnitsClaimData (userAddress) = {
539- let $t01848918574 = calculateUnitsToClaim(userAddress)
540- let unlockedUnitNow = $t01848918574._1
541- let l2ToBurnNow = $t01848918574._2
542- let claimedBlock = $t01848918574._3
541+ let $t01861518700 = calculateUnitsToClaim(userAddress)
542+ let unlockedUnitNow = $t01861518700._1
543+ let l2ToBurnNow = $t01861518700._2
544+ let claimedBlock = $t01861518700._3
543545 let unlockedUnitsPrev = valueOrElse(getInteger(this, keyUnlockedUnits(userAddress)), 0)
544546 let unitsToSend = (unlockedUnitNow + unlockedUnitsPrev)
545547 let l2ToBurnPrev = valueOrElse(getInteger(this, keyL2ToBurn(userAddress)), 0)
551553
552554
553555 func getClaimUnitsActions (userAddress) = {
554- let $t01916619274 = getUnitsClaimData(userAddress)
555- let unitsToSend = $t01916619274._1
556- let totalUnitsClaimed = $t01916619274._2
557- let l2ToBurn = $t01916619274._3
558- let totalL2Burned = $t01916619274._4
559- let claimedBlock = $t01916619274._5
556+ let $t01929219400 = getUnitsClaimData(userAddress)
557+ let unitsToSend = $t01929219400._1
558+ let totalUnitsClaimed = $t01929219400._2
559+ let l2ToBurn = $t01929219400._3
560+ let totalL2Burned = $t01929219400._4
561+ let claimedBlock = $t01929219400._5
560562 let check = [if ((0 >= unitsToSend))
561563 then true
562564 else throwErr("nothing to claim")]
620622
621623 @Callable(i)
622624 func getNodeDataREADONLY (nodeAddress) = {
623- let $t02100721071 = getLeasingNodeData(nodeAddress)
624- let currentLease = $t02100721071._1
625- let nextLeased = $t02100721071._2
625+ let $t02113321197 = getLeasingNodeData(nodeAddress)
626+ let currentLease = $t02113321197._1
627+ let nextLeased = $t02113321197._2
626628 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
627629 }
628630
630632
631633 @Callable(i)
632634 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
633- let $t02144121518 = getUserLeasingData(nodeAddress, userAddress)
634- let currentLease = $t02144121518._1
635- let nextLeased = $t02144121518._2
635+ let $t02156721644 = getUserLeasingData(nodeAddress, userAddress)
636+ let currentLease = $t02156721644._1
637+ let nextLeased = $t02156721644._2
636638 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
637639 }
638640
640642
641643 @Callable(i)
642644 func getUserDataREADONLY (userAddress) = {
643- let $t02203422094 = getUserToClaimBalance(userAddress)
644- let toClaim = $t02203422094._1
645- let toUnlock = $t02203422094._2
645+ let $t02216022220 = getUserToClaimBalance(userAddress)
646+ let toClaim = $t02216022220._1
647+ let toUnlock = $t02216022220._2
646648 let userTotalLocked = getUserTotalLocked(userAddress)
647- let $t02215722265 = getUnitsClaimData(userAddress)
648- let unitsToSend = $t02215722265._1
649- let totalUnitsClaimed = $t02215722265._2
650- let l2ToBurn = $t02215722265._3
651- let totalL2Burned = $t02215722265._4
652- let claimedBlock = $t02215722265._5
649+ let $t02228322391 = getUnitsClaimData(userAddress)
650+ let unitsToSend = $t02228322391._1
651+ let totalUnitsClaimed = $t02228322391._2
652+ let l2ToBurn = $t02228322391._3
653+ let totalL2Burned = $t02228322391._4
654+ let claimedBlock = $t02228322391._5
653655 $Tuple2(nil, $Tuple11(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock))
654656 }
655657
695697 @Callable(i)
696698 func claimAll () = {
697699 let userAddress = toString(i.caller)
698- let $t02345723517 = getUserToClaimBalance(userAddress)
699- let toClaim = $t02345723517._1
700- let toUnlock = $t02345723517._2
700+ let $t02358323643 = getUserToClaimBalance(userAddress)
701+ let toClaim = $t02358323643._1
702+ let toUnlock = $t02358323643._2
701703 let checks = [if ((toClaim > 0))
702704 then true
703705 else throwErr("nothing to claim")]
714716
715717
716718 @Callable(i)
717-func startUnitsVesting () = {
719+func startUnitsVesting (unitsClaimInterval) = {
718720 let totalL2 = 100000000000000000
719721 let totalUnits = i.payments[0].amount
720722 let unitsPerBlockScale8 = (fraction(totalL2, scale8, totalUnits) / unitsClaimInterval)
726728 then true
727729 else throwErr("units per block should be greated than 0")]
728730 if ((check == check))
729- then [IntegerEntry(keyUnitsPerBlockScale8, unitsPerBlockScale8), IntegerEntry(keyUnitsClaimStartHeight, height), StringEntry(keyUnitsAssetId, assetBytesToString(i.payments[0].assetId))]
731+ then [IntegerEntry(keyUnitsPerBlockScale8, unitsPerBlockScale8), IntegerEntry(keyUnitsClaimStartHeight, height), IntegerEntry(keyUnitsClaimInterval, unitsClaimInterval), StringEntry(keyUnitsAssetId, assetBytesToString(i.payments[0].assetId))]
730732 else throw("Strict value is not equal to itself.")
731733 }
732734
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFile = "l2mp_leasing.ride"
55
66 let SEP = "__"
77
88 let BLOCKS_IN_INTERVAL = 1000
99
1010 let scale8 = 100000000
11-
12-let unitsClaimInterval = ((365 * 24) * 60)
1311
1412 func throwErr (msg) = throw(((contractFile + ": ") + msg))
1513
1614
1715 let keyL2AssetId = makeString(["%s", "assetId"], SEP)
1816
1917 let keyForceStop = makeString(["%s", "forceStop"], SEP)
2018
2119 let keyForceOutStop = makeString(["%s", "forceOutStop"], SEP)
2220
2321 let keyUnitsAssetId = makeString(["%s", "unitsAssetId"], SEP)
2422
2523 let keyUnitsPerBlockScale8 = makeString(["%s", "unitsPerBlock"], SEP)
2624
2725 let keyPeriodOffsetId = makeString(["%s", "offsetId"], SEP)
2826
2927 let keyPeriodOffsetHeight = makeString(["%s", "offsetHeight"], SEP)
3028
3129 let keyPeriodLength = makeString(["%s", "periodLength"], SEP)
3230
3331 let keyUnitsClaimStartHeight = makeString(["%s", "unitsClaimStartHeight"], SEP)
32+
33+let keyUnitsClaimInterval = makeString(["%s", "unitsClaimInterval"], SEP)
3434
3535 let periodOffsetId = valueOrElse(getInteger(this, keyPeriodOffsetId), 0)
3636
3737 let periodLength = valueOrElse(getInteger(this, keyPeriodLength), 10000)
3838
3939 let periodOffsetHeight = valueOrElse(getInteger(this, keyPeriodOffsetHeight), -1)
4040
4141 let currentPeriodId = if (if ((height > periodOffsetHeight))
4242 then (periodOffsetHeight != -1)
4343 else false)
4444 then (((height - periodOffsetHeight) / periodLength) + periodOffsetId)
4545 else max([0, (periodOffsetId - 1)])
4646
4747 let currentPeriodHeight = if (if ((periodOffsetHeight == -1))
4848 then true
4949 else if ((currentPeriodId == 0))
5050 then (periodOffsetHeight > height)
5151 else false)
5252 then 0
5353 else (periodOffsetHeight + ((currentPeriodId - periodOffsetId) * periodLength))
5454
5555 let nextPeriodHeight = if (if ((periodOffsetHeight == -1))
5656 then true
5757 else if ((currentPeriodId == 0))
5858 then (periodOffsetHeight > height)
5959 else false)
6060 then 0
6161 else (currentPeriodHeight + periodLength)
6262
6363 let unitsClaimStartHeight = valueOrElse(getInteger(this, keyUnitsClaimStartHeight), height)
64+
65+let unitsClaimInterval = valueOrElse(getInteger(this, keyUnitsClaimInterval), 0)
6466
6567 func keyLeasingNodeData (nodeAddress) = makeString(["%s", nodeAddress], SEP)
6668
6769
6870 func keyUserLeasingNodeData (userAddress,nodeAddress) = makeString(["%s%s", nodeAddress, userAddress], SEP)
6971
7072
7173 func keyUserToClaim (userAddress) = makeString(["%s%s", "toClaim", userAddress], SEP)
7274
7375
7476 func keyUserTotalLocked (userAddress) = makeString(["%s%s", "userTotalLocked", userAddress], SEP)
7577
7678
7779 func keyUnitsClaimedBlock (userAddress) = makeString(["%s%s", "unitsClaimedBlock", userAddress], SEP)
7880
7981
8082 func keyUnlockedUnits (userAddress) = makeString(["%s%s", "unlockedUnits", userAddress], SEP)
8183
8284
8385 func keyTotalUnitsClaimed (userAddress) = makeString(["%s%s", "totalUnitsClaimed", userAddress], SEP)
8486
8587
8688 func keyL2ToBurn (userAddress) = makeString(["%s%s", "l2ToBurn", userAddress], SEP)
8789
8890
8991 func keyL2BurnedTotal (userAddress) = makeString(["%s%s", "l2BurnedTotal", userAddress], SEP)
9092
9193
9294 func keyNodeLeasingByHeight (nodeAddress) = {
9395 let h = if ((periodOffsetHeight == -1))
9496 then 0
9597 else height
9698 makeString(["%s%d", nodeAddress, toString(h)], SEP)
9799 }
98100
99101
100102 func keyUserLeasingByHeight (nodeAddress,userAddress) = {
101103 let h = if ((periodOffsetHeight == -1))
102104 then 0
103105 else height
104106 makeString(["%s%s%d", nodeAddress, userAddress, toString(h)], SEP)
105107 }
106108
107109
108110 func assetStringToBytes (assetIdString) = if ((assetIdString == "WAVES"))
109111 then unit
110112 else fromBase58String(assetIdString)
111113
112114
113115 func assetBytesToString (assetId) = match assetId {
114116 case a: ByteVector =>
115117 toBase58String(a)
116118 case _ =>
117119 "WAVES"
118120 }
119121
120122
121123 let l2AssetIdString = valueOrElse(getString(this, keyL2AssetId), "WAVES")
122124
123125 let unitsAssetIdString = valueOrElse(getString(this, keyUnitsAssetId), "WAVES")
124126
125127 let l2AssetIdBytes = assetStringToBytes(l2AssetIdString)
126128
127129 let unitsAssetIdBytes = assetStringToBytes(unitsAssetIdString)
128130
129131 let isForceStop = valueOrElse(getBoolean(this, keyForceStop), false)
130132
131133 let isForceOutStop = valueOrElse(getBoolean(this, keyForceOutStop), false)
132134
133135 func isValidAddress (address) = match addressFromString(address) {
134136 case a: Address =>
135137 true
136138 case _ =>
137139 false
138140 }
139141
140142
141143 let ADMIN_LIST_SIZE = 5
142144
143145 let QUORUM = 3
144146
145147 let TXID_BYTES_LENGTH = 32
146148
147149 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
148150
149151
150152 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
151153
152154
153155 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
154156
155157
156158 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
157159
158160
159161 func getAdminVote (prefix,admin) = {
160162 let voteKey = keyFullAdminVote(prefix, admin)
161163 valueOrElse(getInteger(voteKey), 0)
162164 }
163165
164166
165167 func getAdminsList () = match getString(this, keyAdminAddressList()) {
166168 case s: String =>
167169 split(s, SEP)
168170 case _ =>
169171 nil
170172 }
171173
172174
173175 func isInAdminList (address) = containsElement(getAdminsList(), address)
174176
175177
176178 func genVotesKeysHelper (a,adminAddress) = {
177- let $t050215045 = a
178- let result = $t050215045._1
179- let prefix = $t050215045._2
179+ let $t051475171 = a
180+ let result = $t051475171._1
181+ let prefix = $t051475171._2
180182 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
181183 }
182184
183185
184186 func genVotesKeys (keyPrefix) = {
185187 let adminList = keyAdminAddressList()
186- let $t051925276 = {
188+ let $t053185402 = {
187189 let $l = getAdminsList()
188190 let $s = size($l)
189191 let $acc0 = $Tuple2(nil, keyPrefix)
190192 func $f0_1 ($a,$i) = if (($i >= $s))
191193 then $a
192194 else genVotesKeysHelper($a, $l[$i])
193195
194196 func $f0_2 ($a,$i) = if (($i >= $s))
195197 then $a
196198 else throw("List size exceeds 5")
197199
198200 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
199201 }
200- let result = $t051925276._1
201- let prefix = $t051925276._2
202+ let result = $t053185402._1
203+ let prefix = $t053185402._2
202204 result
203205 }
204206
205207
206208 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
207209
208210
209211 func countVotes (prefix) = {
210212 let votes = genVotesKeys(prefix)
211213 let $l = votes
212214 let $s = size($l)
213215 let $acc0 = 0
214216 func $f0_1 ($a,$i) = if (($i >= $s))
215217 then $a
216218 else countVotesHelper($a, $l[$i])
217219
218220 func $f0_2 ($a,$i) = if (($i >= $s))
219221 then $a
220222 else throw("List size exceeds 5")
221223
222224 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
223225 }
224226
225227
226228 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
227229
228230
229231 func getClearVoteEntries (prefix) = {
230232 let votes = genVotesKeys(prefix)
231233 let $l = votes
232234 let $s = size($l)
233235 let $acc0 = nil
234236 func $f0_1 ($a,$i) = if (($i >= $s))
235237 then $a
236238 else clearVotesHelper($a, $l[$i])
237239
238240 func $f0_2 ($a,$i) = if (($i >= $s))
239241 then $a
240242 else throw("List size exceeds 5")
241243
242244 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
243245 }
244246
245247
246248 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
247249 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
248250 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
249251 let err = if (!(isInAdminList(callerAddressString)))
250252 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
251253 else if ((adminCurrentVote == 1))
252254 then throwErr((voteKey + " you already voted"))
253255 else unit
254256 if ((err == err))
255257 then {
256258 let votes = countVotes(keyPrefix)
257259 if (((votes + 1) >= minVotes))
258260 then {
259261 let clearVoteEntries = getClearVoteEntries(keyPrefix)
260262 (clearVoteEntries ++ voteResult)
261263 }
262264 else [IntegerEntry(voteKey, 1)]
263265 }
264266 else throw("Strict value is not equal to itself.")
265267 }
266268
267269
268270 func getLeasingNodeEntry (nodeAddress,currentLeased,nextLeased) = {
269271 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(currentLeased), toString(nextPeriodHeight), toString(nextLeased)], SEP)
270272 StringEntry(keyLeasingNodeData(nodeAddress), valueString)
271273 }
272274
273275
274276 func getLeasingNodeData (nodeAddress) = {
275277 let leasingNodeDataStringRaw = getString(this, keyLeasingNodeData(nodeAddress))
276278 match leasingNodeDataStringRaw {
277279 case ds: String =>
278280 let dataList = split(ds, SEP)
279281 let nodeCurrentPeriod = parseIntValue(dataList[1])
280282 let nodeCurrentLeased = parseIntValue(dataList[2])
281283 let nodeNextPeriod = parseIntValue(dataList[3])
282284 let nodeNextLeased = parseIntValue(dataList[4])
283285 if (if ((nodeNextPeriod > height))
284286 then true
285287 else (periodOffsetHeight == -1))
286288 then $Tuple2(nodeCurrentLeased, nodeNextLeased)
287289 else $Tuple2(nodeNextLeased, nodeNextLeased)
288290 case _ =>
289291 $Tuple2(0, 0)
290292 }
291293 }
292294
293295
294296 func getUserLeasingEntry (nodeAddress,userAddress,userCurrentLeased,userNextLeased) = {
295297 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(userCurrentLeased), toString(nextPeriodHeight), toString(userNextLeased)], SEP)
296298 StringEntry(keyUserLeasingNodeData(userAddress, nodeAddress), valueString)
297299 }
298300
299301
300302 func getUserLeasingData (nodeAddress,userAddress) = {
301303 let leasingUserDataStringRaw = getString(this, keyUserLeasingNodeData(userAddress, nodeAddress))
302304 match leasingUserDataStringRaw {
303305 case ds: String =>
304306 let dataList = split(ds, SEP)
305307 let userCurrentPeriod = parseIntValue(dataList[1])
306308 let userCurrentLeased = parseIntValue(dataList[2])
307309 let userNextPeriod = parseIntValue(dataList[3])
308310 let userNextLeased = parseIntValue(dataList[4])
309311 if (if ((userNextPeriod > height))
310312 then true
311313 else (periodOffsetHeight == -1))
312314 then $Tuple2(userCurrentLeased, userNextLeased)
313315 else $Tuple2(userNextLeased, userNextLeased)
314316 case _ =>
315317 $Tuple2(0, 0)
316318 }
317319 }
318320
319321
320322 func getUserToClaimEntry (userAddress,toClaim,toUnlock) = {
321323 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(toClaim), toString(nextPeriodHeight), toString(toUnlock)], SEP)
322324 StringEntry(keyUserToClaim(userAddress), valueString)
323325 }
324326
325327
326328 func getUserToClaimBalance (userAddress) = {
327329 let userToClaimDataStringRaw = getString(this, keyUserToClaim(userAddress))
328330 match userToClaimDataStringRaw {
329331 case ds: String =>
330332 let dataList = split(ds, SEP)
331333 let currentPeriod = parseIntValue(dataList[1])
332334 let toClaim = parseIntValue(dataList[2])
333335 let nextPeriod = parseIntValue(dataList[3])
334336 let toUnlock = parseIntValue(dataList[4])
335337 if (if ((nextPeriod > height))
336338 then true
337339 else (currentPeriodId == 0))
338340 then $Tuple2(toClaim, toUnlock)
339341 else $Tuple2((toClaim + toUnlock), 0)
340342 case _ =>
341343 $Tuple2(0, 0)
342344 }
343345 }
344346
345347
346348 func getUserTotalLockedEntry (userAddress,userTotalLocked) = IntegerEntry(keyUserTotalLocked(userAddress), userTotalLocked)
347349
348350
349351 func getUserTotalLocked (userAddress) = valueOrElse(getInteger(this, keyUserTotalLocked(userAddress)), 0)
350352
351353
352354 func calculateUnitsToClaim (userAddress) = {
353355 let claimedBlockKey = keyUnitsClaimedBlock(userAddress)
354356 let claimedBlock = valueOrElse(getInteger(this, claimedBlockKey), unitsClaimStartHeight)
355357 let unitsPerBlockScale8 = valueOrElse(getInteger(this, keyUnitsPerBlockScale8), 0)
356358 let currentBlock = min([(unitsClaimStartHeight + unitsClaimInterval), height])
357359 let blocksPassed = (currentBlock - claimedBlock)
358360 let amountStaked = getUserTotalLocked(userAddress)
359361 let unitsToClaimNow = fraction((unitsPerBlockScale8 * blocksPassed), amountStaked, scale8)
360362 let l2ToBurn = fraction(amountStaked, blocksPassed, unitsClaimInterval)
361363 $Tuple3(unitsToClaimNow, l2ToBurn, claimedBlock)
362364 }
363365
364366
365367 func getUnlockUnitsAction (userAddress) = {
366368 let kUnlockedUnits = keyUnlockedUnits(userAddress)
367369 let unlockedUnits = valueOrElse(getInteger(this, kUnlockedUnits), 0)
368370 let kL2ToBurn = keyL2ToBurn(userAddress)
369371 let l2ToBurn = valueOrElse(getInteger(this, kL2ToBurn), 0)
370- let $t01121711302 = calculateUnitsToClaim(userAddress)
371- let unitsToClaimNow = $t01121711302._1
372- let l2ToBurnNow = $t01121711302._2
373- let claimedBlock = $t01121711302._3
372+ let $t01134311428 = calculateUnitsToClaim(userAddress)
373+ let unitsToClaimNow = $t01134311428._1
374+ let l2ToBurnNow = $t01134311428._2
375+ let claimedBlock = $t01134311428._3
374376 if ((0 >= unitsToClaimNow))
375377 then nil
376378 else [IntegerEntry(keyUnitsClaimedBlock(userAddress), claimedBlock), IntegerEntry(kL2ToBurn, (l2ToBurn + l2ToBurnNow)), IntegerEntry(kUnlockedUnits, (unlockedUnits + unitsToClaimNow))]
377379 }
378380
379381
380382 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
381- let $t01169711770 = getLeasingNodeData(nodeAddress)
382- let nodeCurrentLeased = $t01169711770._1
383- let nodeNextLeased = $t01169711770._2
384- let $t01177511861 = getUserLeasingData(nodeAddress, userAddress)
385- let userCurrentLeased = $t01177511861._1
386- let userNextLeased = $t01177511861._2
383+ let $t01182311896 = getLeasingNodeData(nodeAddress)
384+ let nodeCurrentLeased = $t01182311896._1
385+ let nodeNextLeased = $t01182311896._2
386+ let $t01190111987 = getUserLeasingData(nodeAddress, userAddress)
387+ let userCurrentLeased = $t01190111987._1
388+ let userNextLeased = $t01190111987._2
387389 let checks = [if (!(isForceStop))
388390 then true
389391 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
390392 then true
391393 else throwErr("unstake is temporary disabled"), if ((unstakeAmount > 0))
392394 then true
393395 else throwErr("unstake amount should be greater than 0"), if ((userNextLeased >= unstakeAmount))
394396 then true
395397 else throwErr("unstake amount should be less or equal user staked amount"), if ((nodeNextLeased >= unstakeAmount))
396398 then true
397399 else throwErr("unstake amount should be less or equal node staked amount"), if (isValidAddress(nodeAddress))
398400 then true
399401 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
400402 then true
401403 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
402404 if ((checks == checks))
403405 then {
404406 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
405407 let newUserNextLeased = (userNextLeased - unstakeAmount)
406- let $t01274512805 = getUserToClaimBalance(userAddress)
407- let toClaim = $t01274512805._1
408- let toUnlock = $t01274512805._2
408+ let $t01287112931 = getUserToClaimBalance(userAddress)
409+ let toClaim = $t01287112931._1
410+ let toUnlock = $t01287112931._2
409411 let newToUnlock = (toUnlock + unstakeAmount)
410412 let userTotalLocked = getUserTotalLocked(userAddress)
411413 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
412414 let unitsUnlockedActions = getUnlockUnitsAction(userAddress)
413415 ([getLeasingNodeEntry(nodeAddress, nodeCurrentLeased, newNodeNextLease), getUserLeasingEntry(nodeAddress, userAddress, userCurrentLeased, newUserNextLeased), getUserToClaimEntry(userAddress, toClaim, newToUnlock), getUserTotalLockedEntry(userAddress, newUserTotalLocked), IntegerEntry(keyNodeLeasingByHeight(nodeAddress), newNodeNextLease), IntegerEntry(keyUserLeasingByHeight(nodeAddress, userAddress), newUserNextLeased)] ++ unitsUnlockedActions)
414416 }
415417 else throw("Strict value is not equal to itself.")
416418 }
417419
418420
419421 func getClaimUnlockedActions (userAddress,claimAmount) = {
420- let $t01362413684 = getUserToClaimBalance(userAddress)
421- let toClaim = $t01362413684._1
422- let toUnlock = $t01362413684._2
422+ let $t01375013810 = getUserToClaimBalance(userAddress)
423+ let toClaim = $t01375013810._1
424+ let toUnlock = $t01375013810._2
423425 let checks = [if (!(isForceStop))
424426 then true
425427 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
426428 then true
427429 else throwErr("claim is temporary disabled"), if ((claimAmount > 0))
428430 then true
429431 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
430432 then true
431433 else throwErr("claim amount should be less or equal unlocked amount"), if (isValidAddress(userAddress))
432434 then true
433435 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
434436 if ((checks == checks))
435437 then {
436438 let newToClaim = (toClaim - claimAmount)
437439 [getUserToClaimEntry(userAddress, newToClaim, toUnlock), ScriptTransfer(addressFromStringValue(userAddress), claimAmount, l2AssetIdBytes)]
438440 }
439441 else throw("Strict value is not equal to itself.")
440442 }
441443
442444
443445 func getStakeForActions (userAddress,i) = {
444- let $t01445014510 = getUserToClaimBalance(userAddress)
445- let toClaim = $t01445014510._1
446- let toUnlock = $t01445014510._2
446+ let $t01457614636 = getUserToClaimBalance(userAddress)
447+ let toClaim = $t01457614636._1
448+ let toUnlock = $t01457614636._2
447449 let checks = [if (!(isForceStop))
448450 then true
449451 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
450452 then true
451453 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
452454 then true
453455 else (i.payments[0].assetId == l2AssetIdBytes))
454456 then true
455457 else throwErr(makeString(["payment assetId should be:", l2AssetIdString], " ")), if (isValidAddress(userAddress))
456458 then true
457459 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
458460 if ((checks == checks))
459461 then {
460462 let newToClaim = (toClaim + i.payments[0].amount)
461463 [getUserToClaimEntry(userAddress, newToClaim, toUnlock)]
462464 }
463465 else throw("Strict value is not equal to itself.")
464466 }
465467
466468
467469 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
468- let $t01524215302 = getUserToClaimBalance(userAddress)
469- let toClaim = $t01524215302._1
470- let toUnlock = $t01524215302._2
470+ let $t01536815428 = getUserToClaimBalance(userAddress)
471+ let toClaim = $t01536815428._1
472+ let toUnlock = $t01536815428._2
471473 let paymentAmount = if ((size(i.payments) == 0))
472474 then 0
473475 else i.payments[0].amount
474476 let available = ((toUnlock + toClaim) + paymentAmount)
475477 let checks = [if (!(isForceStop))
476478 then true
477479 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
478480 then true
479481 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
480482 then true
481483 else (i.payments[0].assetId == l2AssetIdBytes))
482484 then true
483485 else throwErr(makeString(["payment assetId should be:", l2AssetIdString], " ")), if ((userLeasingAmount > 0))
484486 then true
485487 else throwErr("amount should be greater than 0"), if ((available >= userLeasingAmount))
486488 then true
487489 else throwErr("amount should be less or equal (payment + available) amount"), if ((userLeasingAmount >= paymentAmount))
488490 then true
489491 else throw("amount should be greater or equal payment amount"), if (isValidAddress(nodeAddress))
490492 then true
491493 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
492494 then true
493495 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
494496 if ((checks == checks))
495497 then {
496- let $t01637716450 = getLeasingNodeData(nodeAddress)
497- let nodeCurrentLeased = $t01637716450._1
498- let nodeNextLeased = $t01637716450._2
498+ let $t01650316576 = getLeasingNodeData(nodeAddress)
499+ let nodeCurrentLeased = $t01650316576._1
500+ let nodeNextLeased = $t01650316576._2
499501 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
500- let $t01651816604 = getUserLeasingData(nodeAddress, userAddress)
501- let userCurrentLeased = $t01651816604._1
502- let userNextLeased = $t01651816604._2
502+ let $t01664416730 = getUserLeasingData(nodeAddress, userAddress)
503+ let userCurrentLeased = $t01664416730._1
504+ let userNextLeased = $t01664416730._2
503505 let newUserNextLeased = (userNextLeased + userLeasingAmount)
504506 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
505507 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
506508 let newToClaim = min([toClaim, (toClaim + (toUnlock - fromUnlockedAmount))])
507509 let userTotalLocked = getUserTotalLocked(userAddress)
508510 let newUserTotalLocked = (userTotalLocked + userLeasingAmount)
509511 let unitsUnlockedActions = getUnlockUnitsAction(userAddress)
510512 ([getLeasingNodeEntry(nodeAddress, nodeCurrentLeased, newNodeNextLease), getUserLeasingEntry(nodeAddress, userAddress, userCurrentLeased, newUserNextLeased), getUserToClaimEntry(userAddress, newToClaim, newToUnlock), getUserTotalLockedEntry(userAddress, newUserTotalLocked), IntegerEntry(keyNodeLeasingByHeight(nodeAddress), newNodeNextLease), IntegerEntry(keyUserLeasingByHeight(nodeAddress, userAddress), newUserNextLeased)] ++ unitsUnlockedActions)
511513 }
512514 else throw("Strict value is not equal to itself.")
513515 }
514516
515517
516518 func getStakeFromPaymentActions (nodeAddress,userAddress,i) = {
517519 let checks = [if ((size(i.payments) == 1))
518520 then true
519521 else throwErr("payment size should be exactly 1")]
520522 if ((checks == checks))
521523 then getStakeActions(nodeAddress, userAddress, i.payments[0].amount, i)
522524 else throw("Strict value is not equal to itself.")
523525 }
524526
525527
526528 func getSetNewPeriodLengthActions (newPeriodLength) = {
527529 let check = [if ((newPeriodLength > 0))
528530 then true
529531 else throwErr("period length should be greater than 0")]
530532 if ((check == check))
531533 then if ((periodOffsetHeight == -1))
532534 then [IntegerEntry(keyPeriodLength, newPeriodLength), IntegerEntry(keyPeriodOffsetHeight, height)]
533535 else [IntegerEntry(keyPeriodOffsetId, (currentPeriodId + 1)), IntegerEntry(keyPeriodOffsetHeight, nextPeriodHeight), IntegerEntry(keyPeriodLength, newPeriodLength)]
534536 else throw("Strict value is not equal to itself.")
535537 }
536538
537539
538540 func getUnitsClaimData (userAddress) = {
539- let $t01848918574 = calculateUnitsToClaim(userAddress)
540- let unlockedUnitNow = $t01848918574._1
541- let l2ToBurnNow = $t01848918574._2
542- let claimedBlock = $t01848918574._3
541+ let $t01861518700 = calculateUnitsToClaim(userAddress)
542+ let unlockedUnitNow = $t01861518700._1
543+ let l2ToBurnNow = $t01861518700._2
544+ let claimedBlock = $t01861518700._3
543545 let unlockedUnitsPrev = valueOrElse(getInteger(this, keyUnlockedUnits(userAddress)), 0)
544546 let unitsToSend = (unlockedUnitNow + unlockedUnitsPrev)
545547 let l2ToBurnPrev = valueOrElse(getInteger(this, keyL2ToBurn(userAddress)), 0)
546548 let l2ToBurn = (l2ToBurnPrev + l2ToBurnNow)
547549 let totalUnitsClaimed = valueOrElse(getInteger(this, keyTotalUnitsClaimed(userAddress)), 0)
548550 let totalL2Burned = valueOrElse(getInteger(this, keyL2BurnedTotal(userAddress)), 0)
549551 $Tuple5(unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock)
550552 }
551553
552554
553555 func getClaimUnitsActions (userAddress) = {
554- let $t01916619274 = getUnitsClaimData(userAddress)
555- let unitsToSend = $t01916619274._1
556- let totalUnitsClaimed = $t01916619274._2
557- let l2ToBurn = $t01916619274._3
558- let totalL2Burned = $t01916619274._4
559- let claimedBlock = $t01916619274._5
556+ let $t01929219400 = getUnitsClaimData(userAddress)
557+ let unitsToSend = $t01929219400._1
558+ let totalUnitsClaimed = $t01929219400._2
559+ let l2ToBurn = $t01929219400._3
560+ let totalL2Burned = $t01929219400._4
561+ let claimedBlock = $t01929219400._5
560562 let check = [if ((0 >= unitsToSend))
561563 then true
562564 else throwErr("nothing to claim")]
563565 if ((check == check))
564566 then {
565567 let burnAction = match l2AssetIdBytes {
566568 case id: ByteVector =>
567569 [Burn(id, l2ToBurn)]
568570 case _ =>
569571 nil
570572 }
571573 ([IntegerEntry(keyUnitsClaimedBlock(userAddress), claimedBlock), IntegerEntry(keyTotalUnitsClaimed(userAddress), (totalUnitsClaimed + unitsToSend)), IntegerEntry(keyL2BurnedTotal(userAddress), (totalL2Burned + l2ToBurn)), IntegerEntry(keyUnlockedUnits(userAddress), 0), IntegerEntry(keyL2ToBurn(userAddress), 0), ScriptTransfer(addressFromStringValue(userAddress), unitsToSend, unitsAssetIdBytes)] ++ burnAction)
572574 }
573575 else throw("Strict value is not equal to itself.")
574576 }
575577
576578
577579 @Callable(i)
578580 func setNewPeriodLength (newPeriodLength) = {
579581 let checks = [if (isInAdminList(toString(i.caller)))
580582 then true
581583 else throwErr("caller is not in adminList")]
582584 if ((checks == checks))
583585 then getSetNewPeriodLengthActions(newPeriodLength)
584586 else throw("Strict value is not equal to itself.")
585587 }
586588
587589
588590
589591 @Callable(i)
590592 func claimUnits () = {
591593 let userAddress = toString(i.caller)
592594 getClaimUnitsActions(userAddress)
593595 }
594596
595597
596598
597599 @Callable(i)
598600 func setForceStopFlag (stop) = {
599601 let check = [if (isInAdminList(toString(i.caller)))
600602 then true
601603 else throwErr("caller is not in adminList")]
602604 if ((check == check))
603605 then [BooleanEntry(keyForceStop, stop)]
604606 else throw("Strict value is not equal to itself.")
605607 }
606608
607609
608610
609611 @Callable(i)
610612 func setForceOutStopFlag (stop) = {
611613 let check = [if (isInAdminList(toString(i.caller)))
612614 then true
613615 else throwErr("caller is not in adminList")]
614616 if ((check == check))
615617 then [BooleanEntry(keyForceOutStop, stop)]
616618 else throw("Strict value is not equal to itself.")
617619 }
618620
619621
620622
621623 @Callable(i)
622624 func getNodeDataREADONLY (nodeAddress) = {
623- let $t02100721071 = getLeasingNodeData(nodeAddress)
624- let currentLease = $t02100721071._1
625- let nextLeased = $t02100721071._2
625+ let $t02113321197 = getLeasingNodeData(nodeAddress)
626+ let currentLease = $t02113321197._1
627+ let nextLeased = $t02113321197._2
626628 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
627629 }
628630
629631
630632
631633 @Callable(i)
632634 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
633- let $t02144121518 = getUserLeasingData(nodeAddress, userAddress)
634- let currentLease = $t02144121518._1
635- let nextLeased = $t02144121518._2
635+ let $t02156721644 = getUserLeasingData(nodeAddress, userAddress)
636+ let currentLease = $t02156721644._1
637+ let nextLeased = $t02156721644._2
636638 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
637639 }
638640
639641
640642
641643 @Callable(i)
642644 func getUserDataREADONLY (userAddress) = {
643- let $t02203422094 = getUserToClaimBalance(userAddress)
644- let toClaim = $t02203422094._1
645- let toUnlock = $t02203422094._2
645+ let $t02216022220 = getUserToClaimBalance(userAddress)
646+ let toClaim = $t02216022220._1
647+ let toUnlock = $t02216022220._2
646648 let userTotalLocked = getUserTotalLocked(userAddress)
647- let $t02215722265 = getUnitsClaimData(userAddress)
648- let unitsToSend = $t02215722265._1
649- let totalUnitsClaimed = $t02215722265._2
650- let l2ToBurn = $t02215722265._3
651- let totalL2Burned = $t02215722265._4
652- let claimedBlock = $t02215722265._5
649+ let $t02228322391 = getUnitsClaimData(userAddress)
650+ let unitsToSend = $t02228322391._1
651+ let totalUnitsClaimed = $t02228322391._2
652+ let l2ToBurn = $t02228322391._3
653+ let totalL2Burned = $t02228322391._4
654+ let claimedBlock = $t02228322391._5
653655 $Tuple2(nil, $Tuple11(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock))
654656 }
655657
656658
657659
658660 @Callable(i)
659661 func leaseByAddress (nodeAddress,userAddress) = getStakeFromPaymentActions(nodeAddress, userAddress, i)
660662
661663
662664
663665 @Callable(i)
664666 func lease (nodeAddress) = {
665667 let userAddress = toString(i.caller)
666668 getStakeFromPaymentActions(nodeAddress, userAddress, i)
667669 }
668670
669671
670672
671673 @Callable(i)
672674 func leaseFromLocked (nodeAddress,amount) = {
673675 let userAddress = toString(i.caller)
674676 getStakeActions(nodeAddress, userAddress, amount, i)
675677 }
676678
677679
678680
679681 @Callable(i)
680682 func cancelLease (nodeAddress,amount) = {
681683 let userAddress = toString(i.caller)
682684 getUnstakeActions(nodeAddress, userAddress, amount)
683685 }
684686
685687
686688
687689 @Callable(i)
688690 func claim (amount) = {
689691 let userAddress = toString(i.caller)
690692 getClaimUnlockedActions(userAddress, amount)
691693 }
692694
693695
694696
695697 @Callable(i)
696698 func claimAll () = {
697699 let userAddress = toString(i.caller)
698- let $t02345723517 = getUserToClaimBalance(userAddress)
699- let toClaim = $t02345723517._1
700- let toUnlock = $t02345723517._2
700+ let $t02358323643 = getUserToClaimBalance(userAddress)
701+ let toClaim = $t02358323643._1
702+ let toUnlock = $t02358323643._2
701703 let checks = [if ((toClaim > 0))
702704 then true
703705 else throwErr("nothing to claim")]
704706 if ((checks == checks))
705707 then getClaimUnlockedActions(userAddress, toClaim)
706708 else throw("Strict value is not equal to itself.")
707709 }
708710
709711
710712
711713 @Callable(i)
712714 func stakeFor (userAddress) = getStakeForActions(userAddress, i)
713715
714716
715717
716718 @Callable(i)
717-func startUnitsVesting () = {
719+func startUnitsVesting (unitsClaimInterval) = {
718720 let totalL2 = 100000000000000000
719721 let totalUnits = i.payments[0].amount
720722 let unitsPerBlockScale8 = (fraction(totalL2, scale8, totalUnits) / unitsClaimInterval)
721723 let check = [if (isInAdminList(toString(i.caller)))
722724 then true
723725 else throwErr("caller is not in adminList"), if ((size(i.payments) == 1))
724726 then true
725727 else throwErr("should be 1 payment"), if ((unitsPerBlockScale8 > 0))
726728 then true
727729 else throwErr("units per block should be greated than 0")]
728730 if ((check == check))
729- then [IntegerEntry(keyUnitsPerBlockScale8, unitsPerBlockScale8), IntegerEntry(keyUnitsClaimStartHeight, height), StringEntry(keyUnitsAssetId, assetBytesToString(i.payments[0].assetId))]
731+ then [IntegerEntry(keyUnitsPerBlockScale8, unitsPerBlockScale8), IntegerEntry(keyUnitsClaimStartHeight, height), IntegerEntry(keyUnitsClaimInterval, unitsClaimInterval), StringEntry(keyUnitsAssetId, assetBytesToString(i.payments[0].assetId))]
730732 else throw("Strict value is not equal to itself.")
731733 }
732734
733735
734736
735737 @Callable(i)
736738 func voteForTxId (txId) = {
737739 let callerAddressString = toBase58String(i.caller.bytes)
738740 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
739741 let result = [StringEntry(keyAllowedTxId(), txId)]
740742 let allowedTxIdOption = getString(this, keyAllowedTxId())
741743 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
742744 then true
743745 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
744746 then true
745747 else (value(allowedTxIdOption) != txId))
746748 then true
747749 else throwErr((txId + " is already allowed"))]
748750 if ((err == err))
749751 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
750752 else throw("Strict value is not equal to itself.")
751753 }
752754
753755
754756 @Verifier(tx)
755757 func verify () = {
756758 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
757759 let byOwner = if ((size(getAdminsList()) >= QUORUM))
758760 then false
759761 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
760762 if (byAdmins)
761763 then true
762764 else byOwner
763765 }
764766

github/deemru/w8io/169f3d6 
92.00 ms