tx · 4sXod3A78sxQ8rhLLPDDQdPe2ds52rschzzU4MYvMENW

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.02700000 Waves

2024.10.22 09:27 [3337671] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "4sXod3A78sxQ8rhLLPDDQdPe2ds52rschzzU4MYvMENW", "fee": 2700000, "feeAssetId": null, "timestamp": 1729578490700, "version": 1, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "5fKBr3T3QYdNZiAzpFoaycQDHeEbPWBE5pjxa6XeMHvNeSYqH9HP5bepkiPRNdbq748KSMdphVdXXW47z8nrHHs9" ], "script": "base64:BgJQCAISAwoBARIAEgMKAQQSAwoBBBIDCgEIEgQKAggIEgMKAQgSBAoCCAgSAwoBCBIECgIIARIECgIIARIDCgEBEgASAwoBCBIDCgEBEgMKAQhPAAxjb250cmFjdEZpbGUCEWwybXBfbGVhc2luZy5yaWRlAANTRVACAl9fABJCTE9DS1NfSU5fSU5URVJWQUwA6AcABnNjYWxlOACAwtcvAAdzY2FsZTE2CQBoAgUGc2NhbGU4BQZzY2FsZTgBCHRocm93RXJyAQNtc2cJAAIBCQCsAgIJAKwCAgUMY29udHJhY3RGaWxlAgI6IAUDbXNnAAxrZXlMMkFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAAMa2V5Rm9yY2VTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIJZm9yY2VTdG9wBQNuaWwFA1NFUAAPa2V5Rm9yY2VPdXRTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIMZm9yY2VPdXRTdG9wBQNuaWwFA1NFUAAPa2V5VW5pdHNBc3NldElkCQC5CQIJAMwIAgICJXMJAMwIAgIMdW5pdHNBc3NldElkBQNuaWwFA1NFUAAXa2V5VW5pdHNQZXJCbG9ja1NjYWxlMTYJALkJAgkAzAgCAgIlcwkAzAgCAhR1bml0c1BlckJsb2NrU2NhbGUxNgUDbmlsBQNTRVAAEWtleVBlcmlvZE9mZnNldElkCQC5CQIJAMwIAgICJXMJAMwIAgIIb2Zmc2V0SWQFA25pbAUDU0VQABVrZXlQZXJpb2RPZmZzZXRIZWlnaHQJALkJAgkAzAgCAgIlcwkAzAgCAgxvZmZzZXRIZWlnaHQFA25pbAUDU0VQAA9rZXlQZXJpb2RMZW5ndGgJALkJAgkAzAgCAgIlcwkAzAgCAgxwZXJpb2RMZW5ndGgFA25pbAUDU0VQABhrZXlVbml0c0NsYWltU3RhcnRIZWlnaHQJALkJAgkAzAgCAgIlcwkAzAgCAhV1bml0c0NsYWltU3RhcnRIZWlnaHQFA25pbAUDU0VQABVrZXlVbml0c0NsYWltSW50ZXJ2YWwJALkJAgkAzAgCAgIlcwkAzAgCAhJ1bml0c0NsYWltSW50ZXJ2YWwFA25pbAUDU0VQAA5wZXJpb2RPZmZzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrZXlQZXJpb2RPZmZzZXRJZAAAAAxwZXJpb2RMZW5ndGgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUPa2V5UGVyaW9kTGVuZ3RoAJBOABJwZXJpb2RPZmZzZXRIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEAD2N1cnJlbnRQZXJpb2RJZAMDCQBmAgUGaGVpZ2h0BRJwZXJpb2RPZmZzZXRIZWlnaHQJAQIhPQIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BBwkAZAIJAGkCCQBlAgUGaGVpZ2h0BRJwZXJpb2RPZmZzZXRIZWlnaHQFDHBlcmlvZExlbmd0aAUOcGVyaW9kT2Zmc2V0SWQJAJYDAQkAzAgCAAAJAMwIAgkAZQIFDnBlcmlvZE9mZnNldElkAAEFA25pbAATY3VycmVudFBlcmlvZEhlaWdodAMDCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEGAwkAAAIFD2N1cnJlbnRQZXJpb2RJZAAACQBmAgUScGVyaW9kT2Zmc2V0SGVpZ2h0BQZoZWlnaHQHAAAJAGQCBRJwZXJpb2RPZmZzZXRIZWlnaHQJAGgCCQBlAgUPY3VycmVudFBlcmlvZElkBQ5wZXJpb2RPZmZzZXRJZAUMcGVyaW9kTGVuZ3RoABBuZXh0UGVyaW9kSGVpZ2h0AwMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQYDCQAAAgUPY3VycmVudFBlcmlvZElkAAAJAGYCBRJwZXJpb2RPZmZzZXRIZWlnaHQFBmhlaWdodAcAAAkAZAIFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDHBlcmlvZExlbmd0aAAVdW5pdHNDbGFpbVN0YXJ0SGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGGtleVVuaXRzQ2xhaW1TdGFydEhlaWdodAUGaGVpZ2h0ABJ1bml0c0NsYWltSW50ZXJ2YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa2V5VW5pdHNDbGFpbUludGVydmFsAAABEmtleUxlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MJALkJAgkAzAgCAgIlcwkAzAgCBQtub2RlQWRkcmVzcwUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nTm9kZURhdGECC3VzZXJBZGRyZXNzC25vZGVBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABDmtleVVzZXJUb0NsYWltAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIHdG9DbGFpbQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABEmtleVVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICD3VzZXJUb3RhbExvY2tlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIRdW5pdHNDbGFpbWVkQmxvY2sJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARBrZXlVbmxvY2tlZFVuaXRzAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgINdW5sb2NrZWRVbml0cwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFGtleVRvdGFsVW5pdHNDbGFpbWVkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIRdG90YWxVbml0c0NsYWltZWQJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQAQtrZXlMMlRvQnVybgELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICCGwyVG9CdXJuCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEQa2V5TDJCdXJuZWRUb3RhbAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICDWwyQnVybmVkVG90YWwJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQtub2RlQWRkcmVzcwQBaAMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAABQZoZWlnaHQJALkJAgkAzAgCAgQlcyVkCQDMCAIFC25vZGVBZGRyZXNzCQDMCAIJAKQDAQUBaAUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nQnlIZWlnaHQCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzBAFoAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BAAAFBmhlaWdodAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQCkAwEFAWgFA25pbAUDU0VQARJhc3NldFN0cmluZ1RvQnl0ZXMBDWFzc2V0SWRTdHJpbmcDCQAAAgUNYXNzZXRJZFN0cmluZwIFV0FWRVMFBHVuaXQJANkEAQUNYXNzZXRJZFN0cmluZwESYXNzZXRCeXRlc1RvU3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQIFV0FWRVMAD2wyQXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQxrZXlMMkFzc2V0SWQCBVdBVkVTABJ1bml0c0Fzc2V0SWRTdHJpbmcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUPa2V5VW5pdHNBc3NldElkAgVXQVZFUwAObDJBc3NldElkQnl0ZXMJARJhc3NldFN0cmluZ1RvQnl0ZXMBBQ9sMkFzc2V0SWRTdHJpbmcAEXVuaXRzQXNzZXRJZEJ5dGVzCQESYXNzZXRTdHJpbmdUb0J5dGVzAQUSdW5pdHNBc3NldElkU3RyaW5nAAtpc0ZvcmNlU3RvcAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrZXlGb3JjZVN0b3AHAA5pc0ZvcmNlT3V0U3RvcAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ9rZXlGb3JjZU91dFN0b3AHAQ5pc1ZhbGlkQWRkcmVzcwEHYWRkcmVzcwQHJG1hdGNoMAkApggBBQdhZGRyZXNzAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwAPQURNSU5fTElTVF9TSVpFAAUABlFVT1JVTQADABFUWElEX0JZVEVTX0xFTkdUSAAgARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBHR4SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIJYWxsb3dUeElkCQDMCAIFBHR4SWQFA25pbAUDU0VQARBrZXlGdWxsQWRtaW5Wb3RlAgZwcmVmaXgMYWRtaW5BZGRyZXNzCQC5CQIJAMwIAgUGcHJlZml4CQDMCAIFDGFkbWluQWRkcmVzcwUDbmlsBQNTRVABE2tleUFkbWluQWRkcmVzc0xpc3QACQC5CQIJAMwIAgICJXMJAMwIAgIQYWRtaW5BZGRyZXNzTGlzdAUDbmlsBQNTRVABDmtleUFsbG93ZWRUeElkAAkAuQkCCQDMCAICAiVzCQDMCAICBHR4SWQFA25pbAUDU0VQAQxnZXRBZG1pblZvdGUCBnByZWZpeAVhZG1pbgQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFBWFkbWluCQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAENZ2V0QWRtaW5zTGlzdAAEByRtYXRjaDAJAJ0IAgUEdGhpcwkBE2tleUFkbWluQWRkcmVzc0xpc3QAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkAtQkCBQFzBQNTRVAFA25pbAENaXNJbkFkbWluTGlzdAEHYWRkcmVzcwkBD2NvbnRhaW5zRWxlbWVudAIJAQ1nZXRBZG1pbnNMaXN0AAUHYWRkcmVzcwESZ2VuVm90ZXNLZXlzSGVscGVyAgFhDGFkbWluQWRkcmVzcwQLJHQwNTE4NTUyMDkFAWEEBnJlc3VsdAgFCyR0MDUxODU1MjA5Al8xBAZwcmVmaXgIBQskdDA1MTg1NTIwOQJfMgkAlAoCCQDNCAIFBnJlc3VsdAkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFDGFkbWluQWRkcmVzcwUGcHJlZml4AQxnZW5Wb3Rlc0tleXMBCWtleVByZWZpeAQJYWRtaW5MaXN0CQETa2V5QWRtaW5BZGRyZXNzTGlzdAAECyR0MDUzNTY1NDQwCgACJGwJAQ1nZXRBZG1pbnNMaXN0AAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQlrZXlQcmVmaXgKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEmdlblZvdGVzS2V5c0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUEBnJlc3VsdAgFCyR0MDUzNTY1NDQwAl8xBAZwcmVmaXgIBQskdDA1MzU2NTQ0MAJfMgUGcmVzdWx0ARBjb3VudFZvdGVzSGVscGVyAgZyZXN1bHQHdm90ZUtleQkAZAIFBnJlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABCmNvdW50Vm90ZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNvdW50Vm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFARBjbGVhclZvdGVzSGVscGVyAgZyZXN1bHQDa2V5CQDNCAIFBnJlc3VsdAkBC0RlbGV0ZUVudHJ5AQUDa2V5ARNnZXRDbGVhclZvdGVFbnRyaWVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjbGVhclZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEMdm90ZUlOVEVSTkFMBBNjYWxsZXJBZGRyZXNzU3RyaW5nCWtleVByZWZpeAhtaW5Wb3Rlcwp2b3RlUmVzdWx0BAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQQYWRtaW5DdXJyZW50Vm90ZQkBDGdldEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQDZXJyAwkBASEBCQENaXNJbkFkbWluTGlzdAEFE2NhbGxlckFkZHJlc3NTdHJpbmcJAQh0aHJvd0VycgEJAKwCAgkArAICAglBZGRyZXNzOiAFE2NhbGxlckFkZHJlc3NTdHJpbmcCEiBub3QgaW4gQWRtaW4gbGlzdAMJAAACBRBhZG1pbkN1cnJlbnRWb3RlAAEJAQh0aHJvd0VycgEJAKwCAgUHdm90ZUtleQISIHlvdSBhbHJlYWR5IHZvdGVkBQR1bml0AwkAAAIFA2VycgUDZXJyBAV2b3RlcwkBCmNvdW50Vm90ZXMBBQlrZXlQcmVmaXgDCQBnAgkAZAIFBXZvdGVzAAEFCG1pblZvdGVzBBBjbGVhclZvdGVFbnRyaWVzCQETZ2V0Q2xlYXJWb3RlRW50cmllcwEFCWtleVByZWZpeAkAzggCBRBjbGVhclZvdGVFbnRyaWVzBQp2b3RlUmVzdWx0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd2b3RlS2V5AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZ2V0TGVhc2luZ05vZGVFbnRyeQMLbm9kZUFkZHJlc3MNY3VycmVudExlYXNlZApuZXh0TGVhc2VkBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFDWN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUKbmV4dExlYXNlZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIJARJrZXlMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldExlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MEGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQESa2V5TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEByRtYXRjaDAFGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBBFub2RlQ3VycmVudFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEEEW5vZGVDdXJyZW50TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQObm9kZU5leHRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAADBA5ub2RlTmV4dExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAQDAwkAZgIFDm5vZGVOZXh0UGVyaW9kBQZoZWlnaHQGCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEJAJQKAgURbm9kZUN1cnJlbnRMZWFzZWQFDm5vZGVOZXh0TGVhc2VkCQCUCgIFDm5vZGVOZXh0TGVhc2VkBQ5ub2RlTmV4dExlYXNlZAkAlAoCAAAAAAETZ2V0VXNlckxlYXNpbmdFbnRyeQQLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MRdXNlckN1cnJlbnRMZWFzZWQOdXNlck5leHRMZWFzZWQEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgIIJWQlZCVkJWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQURdXNlckN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUOdXNlck5leHRMZWFzZWQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldFVzZXJMZWFzaW5nRGF0YQILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEGGxlYXNpbmdVc2VyRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwQHJG1hdGNoMAUYbGVhc2luZ1VzZXJEYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEEXVzZXJDdXJyZW50UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAQQRdXNlckN1cnJlbnRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAACBA51c2VyTmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMEDnVzZXJOZXh0TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUOdXNlck5leHRQZXJpb2QFBmhlaWdodAYJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAlAoCBRF1c2VyQ3VycmVudExlYXNlZAUOdXNlck5leHRMZWFzZWQJAJQKAgUOdXNlck5leHRMZWFzZWQFDnVzZXJOZXh0TGVhc2VkCQCUCgIAAAAAARNnZXRVc2VyVG9DbGFpbUVudHJ5Awt1c2VyQWRkcmVzcwd0b0NsYWltCHRvVW5sb2NrBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFB3RvQ2xhaW0JAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUIdG9VbmxvY2sFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwULdmFsdWVTdHJpbmcBFWdldFVzZXJUb0NsYWltQmFsYW5jZQELdXNlckFkZHJlc3MEGHVzZXJUb0NsYWltRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwQHJG1hdGNoMAUYdXNlclRvQ2xhaW1EYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEDWN1cnJlbnRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAABBAd0b0NsYWltCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQKbmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMECHRvVW5sb2NrCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUKbmV4dFBlcmlvZAUGaGVpZ2h0BgkAAAIFD2N1cnJlbnRQZXJpb2RJZAAACQCUCgIFB3RvQ2xhaW0FCHRvVW5sb2NrCQCUCgIJAGQCBQd0b0NsYWltBQh0b1VubG9jawAACQCUCgIAAAAAARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQILdXNlckFkZHJlc3MPdXNlclRvdGFsTG9ja2VkCQEMSW50ZWdlckVudHJ5AgkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBQ91c2VyVG90YWxMb2NrZWQBEmdldFVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzAAABFWNhbGN1bGF0ZVVuaXRzVG9DbGFpbQELdXNlckFkZHJlc3MED2NsYWltZWRCbG9ja0tleQkBFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQULdXNlckFkZHJlc3MEDGNsYWltZWRCbG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9jbGFpbWVkQmxvY2tLZXkFFXVuaXRzQ2xhaW1TdGFydEhlaWdodAQUdW5pdHNQZXJCbG9ja1NjYWxlMTYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXa2V5VW5pdHNQZXJCbG9ja1NjYWxlMTYAAAQMY3VycmVudEJsb2NrCQCXAwEJAMwIAgkAZAIFFXVuaXRzQ2xhaW1TdGFydEhlaWdodAUSdW5pdHNDbGFpbUludGVydmFsCQDMCAIFBmhlaWdodAUDbmlsBAxibG9ja3NQYXNzZWQJAGUCBQxjdXJyZW50QmxvY2sFDGNsYWltZWRCbG9jawQMYW1vdW50U3Rha2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MECGwyVG9CdXJuCQBrAwUMYW1vdW50U3Rha2VkBQxibG9ja3NQYXNzZWQFEnVuaXRzQ2xhaW1JbnRlcnZhbAQPdW5pdHNUb0NsYWltTm93CQBrAwUIbDJUb0J1cm4FFHVuaXRzUGVyQmxvY2tTY2FsZTE2BQdzY2FsZTE2CQCWCgQFD3VuaXRzVG9DbGFpbU5vdwUIbDJUb0J1cm4FDGN1cnJlbnRCbG9jawkAlQoDBQxibG9ja3NQYXNzZWQFFXVuaXRzQ2xhaW1TdGFydEhlaWdodAUSdW5pdHNDbGFpbUludGVydmFsARRnZXRVbmxvY2tVbml0c0FjdGlvbgELdXNlckFkZHJlc3MEDmtVbmxvY2tlZFVuaXRzCQEQa2V5VW5sb2NrZWRVbml0cwEFC3VzZXJBZGRyZXNzBA11bmxvY2tlZFVuaXRzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDmtVbmxvY2tlZFVuaXRzAAAECWtMMlRvQnVybgkBC2tleUwyVG9CdXJuAQULdXNlckFkZHJlc3MECGwyVG9CdXJuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCWtMMlRvQnVybgAABA0kdDAxMTQyMzExNTE0CQEVY2FsY3VsYXRlVW5pdHNUb0NsYWltAQULdXNlckFkZHJlc3MED3VuaXRzVG9DbGFpbU5vdwgFDSR0MDExNDIzMTE1MTQCXzEEC2wyVG9CdXJuTm93CAUNJHQwMTE0MjMxMTUxNAJfMgQMY3VycmVudEJsb2NrCAUNJHQwMTE0MjMxMTUxNAJfMwQEX3RtcAgFDSR0MDExNDIzMTE1MTQCXzQDCQBnAgAABQ91bml0c1RvQ2xhaW1Ob3cFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQULdXNlckFkZHJlc3MFDGN1cnJlbnRCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0wyVG9CdXJuCQBkAgUIbDJUb0J1cm4FC2wyVG9CdXJuTm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5rVW5sb2NrZWRVbml0cwkAZAIFDXVubG9ja2VkVW5pdHMFD3VuaXRzVG9DbGFpbU5vdwUDbmlsARFnZXRVbnN0YWtlQWN0aW9ucwMLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MNdW5zdGFrZUFtb3VudAQNJHQwMTE5MDkxMTk4MgkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBBFub2RlQ3VycmVudExlYXNlZAgFDSR0MDExOTA5MTE5ODICXzEEDm5vZGVOZXh0TGVhc2VkCAUNJHQwMTE5MDkxMTk4MgJfMgQNJHQwMTE5ODcxMjA3MwkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQRdXNlckN1cnJlbnRMZWFzZWQIBQ0kdDAxMTk4NzEyMDczAl8xBA51c2VyTmV4dExlYXNlZAgFDSR0MDExOTg3MTIwNzMCXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQEBIQEFDmlzRm9yY2VPdXRTdG9wBgkBCHRocm93RXJyAQIddW5zdGFrZSBpcyB0ZW1wb3JhcnkgZGlzYWJsZWQJAMwIAgMJAGYCBQ11bnN0YWtlQW1vdW50AAAGCQEIdGhyb3dFcnIBAid1bnN0YWtlIGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQ51c2VyTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAYJAQh0aHJvd0VycgECOXVuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHVzZXIgc3Rha2VkIGFtb3VudAkAzAgCAwkAZwIFDm5vZGVOZXh0TGVhc2VkBQ11bnN0YWtlQW1vdW50BgkBCHRocm93RXJyAQI5dW5zdGFrZSBhbW91bnQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgbm9kZSBzdGFrZWQgYW1vdW50CQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQtub2RlQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhpub2RlIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQtub2RlQWRkcmVzcwUDbmlsAgEgCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQt1c2VyQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhp1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEEG5ld05vZGVOZXh0TGVhc2UJAGUCBQ5ub2RlTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAQRbmV3VXNlck5leHRMZWFzZWQJAGUCBQ51c2VyTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAQNJHQwMTI5NTcxMzAxNwkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTI5NTcxMzAxNwJfMQQIdG9VbmxvY2sIBQ0kdDAxMjk1NzEzMDE3Al8yBAtuZXdUb1VubG9jawkAZAIFCHRvVW5sb2NrBQ11bnN0YWtlQW1vdW50BA91c2VyVG90YWxMb2NrZWQJARJnZXRVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwQSbmV3VXNlclRvdGFsTG9ja2VkCQBlAgUPdXNlclRvdGFsTG9ja2VkBQ11bnN0YWtlQW1vdW50BBR1bml0c1VubG9ja2VkQWN0aW9ucwkBFGdldFVubG9ja1VuaXRzQWN0aW9uAQULdXNlckFkZHJlc3MJAM4IAgkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFB3RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsBRR1bml0c1VubG9ja2VkQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCC3VzZXJBZGRyZXNzC2NsYWltQW1vdW50BA0kdDAxMzgzNjEzODk2CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxMzgzNjEzODk2Al8xBAh0b1VubG9jawgFDSR0MDEzODM2MTM4OTYCXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQEBIQEFDmlzRm9yY2VPdXRTdG9wBgkBCHRocm93RXJyAQIbY2xhaW0gaXMgdGVtcG9yYXJ5IGRpc2FibGVkCQDMCAIDCQBmAgULY2xhaW1BbW91bnQAAAYJAQh0aHJvd0VycgECJWNsYWltIGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQd0b0NsYWltBQtjbGFpbUFtb3VudAYJAQh0aHJvd0VycgECNGNsYWltIGFtb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB1bmxvY2tlZCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKbmV3VG9DbGFpbQkAZQIFB3RvQ2xhaW0FC2NsYWltQW1vdW50CQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FCHRvVW5sb2NrCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3VzZXJBZGRyZXNzBQtjbGFpbUFtb3VudAUObDJBc3NldElkQnl0ZXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgESZ2V0U3Rha2VGb3JBY3Rpb25zAgt1c2VyQWRkcmVzcwFpBA0kdDAxNDY2MjE0NzIyCQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxNDY2MjE0NzIyAl8xBAh0b1VubG9jawgFDSR0MDE0NjYyMTQ3MjICXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQBnAgABCQCQAwEIBQFpCHBheW1lbnRzBgkBCHRocm93RXJyAQIRbWF4aW11bSAxIHBheW1lbnQJAMwIAgMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUObDJBc3NldElkQnl0ZXMGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIacGF5bWVudCBhc3NldElkIHNob3VsZCBiZToJAMwIAgUPbDJBc3NldElkU3RyaW5nBQNuaWwCASAJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKbmV3VG9DbGFpbQkAZAIFB3RvQ2xhaW0ICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FCHRvVW5sb2NrBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD2dldFN0YWtlQWN0aW9ucwQLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MRdXNlckxlYXNpbmdBbW91bnQBaQQNJHQwMTU0NTQxNTUxNAkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTU0NTQxNTUxNAJfMQQIdG9VbmxvY2sIBQ0kdDAxNTQ1NDE1NTE0Al8yBA1wYXltZW50QW1vdW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQJYXZhaWxhYmxlCQBkAgkAZAIFCHRvVW5sb2NrBQd0b0NsYWltBQ1wYXltZW50QW1vdW50BAZjaGVja3MJAMwIAgMJAQEhAQULaXNGb3JjZVN0b3AGCQEIdGhyb3dFcnIBAh1jb250cmFjdCBpcyB0ZW1wb3Jhcnkgc3RvcHBlZAkAzAgCAwkAZwIAAQkAkAMBCAUBaQhwYXltZW50cwYJAQh0aHJvd0VycgECEW1heGltdW0gMSBwYXltZW50CQDMCAIDAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAYJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDmwyQXNzZXRJZEJ5dGVzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnBheW1lbnQgYXNzZXRJZCBzaG91bGQgYmU6CQDMCAIFD2wyQXNzZXRJZFN0cmluZwUDbmlsAgEgCQDMCAIDCQBmAgURdXNlckxlYXNpbmdBbW91bnQAAAYJAQh0aHJvd0VycgECH2Ftb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQlhdmFpbGFibGUFEXVzZXJMZWFzaW5nQW1vdW50BgkBCHRocm93RXJyAQI7YW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIChwYXltZW50ICsgYXZhaWxhYmxlKSBhbW91bnQJAMwIAgMJAGcCBRF1c2VyTGVhc2luZ0Ftb3VudAUNcGF5bWVudEFtb3VudAYJAAIBAjBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgb3IgZXF1YWwgcGF5bWVudCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC25vZGVBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGm5vZGUgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC25vZGVBZGRyZXNzBQNuaWwCASAJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQNJHQwMTY1ODkxNjY2MgkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBBFub2RlQ3VycmVudExlYXNlZAgFDSR0MDE2NTg5MTY2NjICXzEEDm5vZGVOZXh0TGVhc2VkCAUNJHQwMTY1ODkxNjY2MgJfMgQQbmV3Tm9kZU5leHRMZWFzZQkAZAIFDm5vZGVOZXh0TGVhc2VkBRF1c2VyTGVhc2luZ0Ftb3VudAQNJHQwMTY3MzAxNjgxNgkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQRdXNlckN1cnJlbnRMZWFzZWQIBQ0kdDAxNjczMDE2ODE2Al8xBA51c2VyTmV4dExlYXNlZAgFDSR0MDE2NzMwMTY4MTYCXzIEEW5ld1VzZXJOZXh0TGVhc2VkCQBkAgUOdXNlck5leHRMZWFzZWQFEXVzZXJMZWFzaW5nQW1vdW50BBJmcm9tVW5sb2NrZWRBbW91bnQJAGUCBRF1c2VyTGVhc2luZ0Ftb3VudAUNcGF5bWVudEFtb3VudAQLbmV3VG9VbmxvY2sJAJYDAQkAzAgCAAAJAMwIAgkAZQIFCHRvVW5sb2NrBRJmcm9tVW5sb2NrZWRBbW91bnQFA25pbAQKbmV3VG9DbGFpbQkAlwMBCQDMCAIFB3RvQ2xhaW0JAMwIAgkAZAIFB3RvQ2xhaW0JAGUCBQh0b1VubG9jawUSZnJvbVVubG9ja2VkQW1vdW50BQNuaWwED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBBJuZXdVc2VyVG90YWxMb2NrZWQJAGQCBQ91c2VyVG90YWxMb2NrZWQFEXVzZXJMZWFzaW5nQW1vdW50BBR1bml0c1VubG9ja2VkQWN0aW9ucwkBFGdldFVubG9ja1VuaXRzQWN0aW9uAQULdXNlckFkZHJlc3MJAM4IAgkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsBRR1bml0c1VubG9ja2VkQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzAWkEBmNoZWNrcwkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECIHBheW1lbnQgc2l6ZSBzaG91bGQgYmUgZXhhY3RseSAxBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJAQ9nZXRTdGFrZUFjdGlvbnMEBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQFpCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARxnZXRTZXROZXdQZXJpb2RMZW5ndGhBY3Rpb25zAQ9uZXdQZXJpb2RMZW5ndGgEBWNoZWNrCQDMCAIDCQBmAgUPbmV3UGVyaW9kTGVuZ3RoAAAGCQEIdGhyb3dFcnIBAiZwZXJpb2QgbGVuZ3RoIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa2V5UGVyaW9kTGVuZ3RoBQ9uZXdQZXJpb2RMZW5ndGgJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVBlcmlvZE9mZnNldEhlaWdodAUGaGVpZ2h0BQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleVBlcmlvZE9mZnNldElkCQBkAgUPY3VycmVudFBlcmlvZElkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVBlcmlvZE9mZnNldEhlaWdodAUQbmV4dFBlcmlvZEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa2V5UGVyaW9kTGVuZ3RoBQ9uZXdQZXJpb2RMZW5ndGgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERZ2V0VW5pdHNDbGFpbURhdGEBC3VzZXJBZGRyZXNzBA0kdDAxODcwMTE4NzkyCQEVY2FsY3VsYXRlVW5pdHNUb0NsYWltAQULdXNlckFkZHJlc3MED3VubG9ja2VkVW5pdE5vdwgFDSR0MDE4NzAxMTg3OTICXzEEC2wyVG9CdXJuTm93CAUNJHQwMTg3MDExODc5MgJfMgQMY3VycmVudEJsb2NrCAUNJHQwMTg3MDExODc5MgJfMwQEX3RtcAgFDSR0MDE4NzAxMTg3OTICXzQEEXVubG9ja2VkVW5pdHNQcmV2CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARBrZXlVbmxvY2tlZFVuaXRzAQULdXNlckFkZHJlc3MAAAQLdW5pdHNUb1NlbmQJAGQCBQ91bmxvY2tlZFVuaXROb3cFEXVubG9ja2VkVW5pdHNQcmV2BAxsMlRvQnVyblByZXYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBC2tleUwyVG9CdXJuAQULdXNlckFkZHJlc3MAAAQIbDJUb0J1cm4JAGQCBQxsMlRvQnVyblByZXYFC2wyVG9CdXJuTm93BBF0b3RhbFVuaXRzQ2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEUa2V5VG90YWxVbml0c0NsYWltZWQBBQt1c2VyQWRkcmVzcwAABA10b3RhbEwyQnVybmVkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARBrZXlMMkJ1cm5lZFRvdGFsAQULdXNlckFkZHJlc3MAAAkAlwoFBQt1bml0c1RvU2VuZAURdG90YWxVbml0c0NsYWltZWQFCGwyVG9CdXJuBQ10b3RhbEwyQnVybmVkBQxjdXJyZW50QmxvY2sBFGdldENsYWltVW5pdHNBY3Rpb25zAQt1c2VyQWRkcmVzcwQNJHQwMTkzODQxOTQ5MgkBEWdldFVuaXRzQ2xhaW1EYXRhAQULdXNlckFkZHJlc3MEC3VuaXRzVG9TZW5kCAUNJHQwMTkzODQxOTQ5MgJfMQQRdG90YWxVbml0c0NsYWltZWQIBQ0kdDAxOTM4NDE5NDkyAl8yBAhsMlRvQnVybggFDSR0MDE5Mzg0MTk0OTICXzMEDXRvdGFsTDJCdXJuZWQIBQ0kdDAxOTM4NDE5NDkyAl80BAxjbGFpbWVkQmxvY2sIBQ0kdDAxOTM4NDE5NDkyAl81BAVjaGVjawkAzAgCAwkAZgIFC3VuaXRzVG9TZW5kAAAGCQEIdGhyb3dFcnIBAhBub3RoaW5nIHRvIGNsYWltBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBApidXJuQWN0aW9uBAckbWF0Y2gwBQ5sMkFzc2V0SWRCeXRlcwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkAzAgCCQEEQnVybgIFAmlkBQhsMlRvQnVybgUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQULdXNlckFkZHJlc3MFDGNsYWltZWRCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVRvdGFsVW5pdHNDbGFpbWVkAQULdXNlckFkZHJlc3MJAGQCBRF0b3RhbFVuaXRzQ2xhaW1lZAULdW5pdHNUb1NlbmQJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlMMkJ1cm5lZFRvdGFsAQULdXNlckFkZHJlc3MJAGQCBQ10b3RhbEwyQnVybmVkBQhsMlRvQnVybgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleVVubG9ja2VkVW5pdHMBBQt1c2VyQWRkcmVzcwAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQELa2V5TDJUb0J1cm4BBQt1c2VyQWRkcmVzcwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3VzZXJBZGRyZXNzBQt1bml0c1RvU2VuZAURdW5pdHNBc3NldElkQnl0ZXMFA25pbAUKYnVybkFjdGlvbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhABaQESc2V0TmV3UGVyaW9kTGVuZ3RoAQ9uZXdQZXJpb2RMZW5ndGgEBmNoZWNrcwkAzAgCAwkBDWlzSW5BZG1pbkxpc3QBCQClCAEIBQFpBmNhbGxlcgYJAQh0aHJvd0VycgECGmNhbGxlciBpcyBub3QgaW4gYWRtaW5MaXN0BQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJARxnZXRTZXROZXdQZXJpb2RMZW5ndGhBY3Rpb25zAQUPbmV3UGVyaW9kTGVuZ3RoCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmNsYWltVW5pdHMABAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARRnZXRDbGFpbVVuaXRzQWN0aW9ucwEFC3VzZXJBZGRyZXNzAWkBEHNldEZvcmNlU3RvcEZsYWcBBHN0b3AEBWNoZWNrCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtleUZvcmNlU3RvcAUEc3RvcAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE3NldEZvcmNlT3V0U3RvcEZsYWcBBHN0b3AEBWNoZWNrCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAMwIAgkBDEJvb2xlYW5FbnRyeQIFD2tleUZvcmNlT3V0U3RvcAUEc3RvcAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2dldE5vZGVEYXRhUkVBRE9OTFkBC25vZGVBZGRyZXNzBA0kdDAyMTIyNDIxMjg4CQESZ2V0TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEDGN1cnJlbnRMZWFzZQgFDSR0MDIxMjI0MjEyODgCXzEECm5leHRMZWFzZWQIBQ0kdDAyMTIyNDIxMjg4Al8yCQCUCgIFA25pbAkAlwoFBRNjdXJyZW50UGVyaW9kSGVpZ2h0BQxjdXJyZW50TGVhc2UFEG5leHRQZXJpb2RIZWlnaHQFCm5leHRMZWFzZWQFBmhlaWdodAFpARpnZXRVc2VyTGVhc2luZ0RhdGFSRUFET05MWQILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEDSR0MDIxNjU4MjE3MzUJARJnZXRVc2VyTGVhc2luZ0RhdGECBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MEDGN1cnJlbnRMZWFzZQgFDSR0MDIxNjU4MjE3MzUCXzEECm5leHRMZWFzZWQIBQ0kdDAyMTY1ODIxNzM1Al8yCQCUCgIFA25pbAkAlwoFBRNjdXJyZW50UGVyaW9kSGVpZ2h0BQxjdXJyZW50TGVhc2UFEG5leHRQZXJpb2RIZWlnaHQFCm5leHRMZWFzZWQFBmhlaWdodAFpARNnZXRVc2VyRGF0YVJFQURPTkxZAQt1c2VyQWRkcmVzcwQNJHQwMjIzMzkyMjM5OQkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMjIzMzkyMjM5OQJfMQQIdG9VbmxvY2sIBQ0kdDAyMjMzOTIyMzk5Al8yBA91c2VyVG90YWxMb2NrZWQJARJnZXRVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwQNJHQwMjI0NjIyMjU3MAkBEWdldFVuaXRzQ2xhaW1EYXRhAQULdXNlckFkZHJlc3MEC3VuaXRzVG9TZW5kCAUNJHQwMjI0NjIyMjU3MAJfMQQRdG90YWxVbml0c0NsYWltZWQIBQ0kdDAyMjQ2MjIyNTcwAl8yBAhsMlRvQnVybggFDSR0MDIyNDYyMjI1NzACXzMEDXRvdGFsTDJCdXJuZWQIBQ0kdDAyMjQ2MjIyNTcwAl80BAxjbGFpbWVkQmxvY2sIBQ0kdDAyMjQ2MjIyNTcwAl81BBR1bml0c1BlckJsb2NrU2NhbGUxNgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRdrZXlVbml0c1BlckJsb2NrU2NhbGUxNgAABA9yZW1haW5pbmdibG9ja3MJAJYDAQkAzAgCAAAJAMwIAgkAZQIJAGQCBRV1bml0c0NsYWltU3RhcnRIZWlnaHQFEnVuaXRzQ2xhaW1JbnRlcnZhbAUGaGVpZ2h0BQNuaWwJAJQKAgUDbmlsCQCfCg0FE2N1cnJlbnRQZXJpb2RIZWlnaHQFB3RvQ2xhaW0FEG5leHRQZXJpb2RIZWlnaHQFCHRvVW5sb2NrBQ91c2VyVG90YWxMb2NrZWQFBmhlaWdodAULdW5pdHNUb1NlbmQFEXRvdGFsVW5pdHNDbGFpbWVkBQhsMlRvQnVybgUNdG90YWxMMkJ1cm5lZAUMY2xhaW1lZEJsb2NrBRR1bml0c1BlckJsb2NrU2NhbGUxNgUPcmVtYWluaW5nYmxvY2tzAWkBDmxlYXNlQnlBZGRyZXNzAgtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwkBGmdldFN0YWtlRnJvbVBheW1lbnRBY3Rpb25zAwULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQFpAWkBBWxlYXNlAQtub2RlQWRkcmVzcwQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFAWkBaQEPbGVhc2VGcm9tTG9ja2VkAgtub2RlQWRkcmVzcwZhbW91bnQEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBD2dldFN0YWtlQWN0aW9ucwQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUGYW1vdW50BQFpAWkBC2NhbmNlbExlYXNlAgtub2RlQWRkcmVzcwZhbW91bnQEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBEWdldFVuc3Rha2VBY3Rpb25zAwULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQZhbW91bnQBaQEFY2xhaW0BBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCBQt1c2VyQWRkcmVzcwUGYW1vdW50AWkBCGNsYWltQWxsAAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBA0kdDAyNDAwMDI0MDYwCQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAyNDAwMDI0MDYwAl8xBAh0b1VubG9jawgFDSR0MDI0MDAwMjQwNjACXzIEBmNoZWNrcwkAzAgCAwkAZgIFB3RvQ2xhaW0AAAYJAQh0aHJvd0VycgECEG5vdGhpbmcgdG8gY2xhaW0FA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBF2dldENsYWltVW5sb2NrZWRBY3Rpb25zAgULdXNlckFkZHJlc3MFB3RvQ2xhaW0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIc3Rha2VGb3IBC3VzZXJBZGRyZXNzCQESZ2V0U3Rha2VGb3JBY3Rpb25zAgULdXNlckFkZHJlc3MFAWkBaQERc3RhcnRVbml0c1Zlc3RpbmcBFXVuaXRzQ2xhaW1OZXdJbnRlcnZhbAQHdG90YWxMMgCAgKjsha/RsQEECnRvdGFsVW5pdHMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBR1bml0c1BlckJsb2NrU2NhbGUxNgkAaQIJAGsDBQp0b3RhbFVuaXRzBQdzY2FsZTE2BQd0b3RhbEwyBRV1bml0c0NsYWltTmV3SW50ZXJ2YWwEBWNoZWNrCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAhNzaG91bGQgYmUgMSBwYXltZW50CQDMCAIDCQBmAgUUdW5pdHNQZXJCbG9ja1NjYWxlMTYAAAYJAQh0aHJvd0VycgECKHVuaXRzIHBlciBibG9jayBzaG91bGQgYmUgZ3JlYXRlZCB0aGFuIDAFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAMwIAgkBDEludGVnZXJFbnRyeQIFF2tleVVuaXRzUGVyQmxvY2tTY2FsZTE2BRR1bml0c1BlckJsb2NrU2NhbGUxNgkAzAgCCQEMSW50ZWdlckVudHJ5AgUYa2V5VW5pdHNDbGFpbVN0YXJ0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVVuaXRzQ2xhaW1JbnRlcnZhbAUVdW5pdHNDbGFpbU5ld0ludGVydmFsCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tleVVuaXRzQXNzZXRJZAkBEmFzc2V0Qnl0ZXNUb1N0cmluZwEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3ZvdGVGb3JUeElkAQR0eElkBBNjYWxsZXJBZGRyZXNzU3RyaW5nCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMECWtleVByZWZpeAkBGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEFBHR4SWQEBnJlc3VsdAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5QWxsb3dlZFR4SWQABQR0eElkBQNuaWwEEWFsbG93ZWRUeElkT3B0aW9uCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAAEA2VycgkAzAgCAwkAAAIJAMgBAQkA2QQBBQR0eElkBRFUWElEX0JZVEVTX0xFTkdUSAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAISIGlzIG5vdCB2YWxpZCB0eElkCQDMCAIDAwkAAAIFEWFsbG93ZWRUeElkT3B0aW9uBQR1bml0BgkBAiE9AgkBBXZhbHVlAQURYWxsb3dlZFR4SWRPcHRpb24FBHR4SWQGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEyBpcyBhbHJlYWR5IGFsbG93ZWQFA25pbAMJAAACBQNlcnIFA2VycgkBDHZvdGVJTlRFUk5BTAQFE2NhbGxlckFkZHJlc3NTdHJpbmcFCWtleVByZWZpeAUGUVVPUlVNBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAhieUFkbWlucwkAAAIIBQJ0eAJpZAkA2QQBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAACAAQHYnlPd25lcgMJAGcCCQCQAwEJAQ1nZXRBZG1pbnNMaXN0AAUGUVVPUlVNBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQMFCGJ5QWRtaW5zBgUHYnlPd25lcr+Po/A=", "chainId": 84, "height": 3337671, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: D2h3bfs4LSU8wi2sD7YJX2wv2ckFxpJcq8eomdf1uG1e Next: GZ1YEFBLNaR9ZxAVnGKBtn6mgMyfRyEhKnJD6W8pAN6U Diff:
OldNewDifferences
362362 let amountStaked = getUserTotalLocked(userAddress)
363363 let l2ToBurn = fraction(amountStaked, blocksPassed, unitsClaimInterval)
364364 let unitsToClaimNow = fraction(l2ToBurn, unitsPerBlockScale16, scale16)
365- $Tuple3(unitsToClaimNow, l2ToBurn, currentBlock)
365+ $Tuple4(unitsToClaimNow, l2ToBurn, currentBlock, $Tuple3(blocksPassed, unitsClaimStartHeight, unitsClaimInterval))
366366 }
367367
368368
371371 let unlockedUnits = valueOrElse(getInteger(this, kUnlockedUnits), 0)
372372 let kL2ToBurn = keyL2ToBurn(userAddress)
373373 let l2ToBurn = valueOrElse(getInteger(this, kL2ToBurn), 0)
374- let $t01136411449 = calculateUnitsToClaim(userAddress)
375- let unitsToClaimNow = $t01136411449._1
376- let l2ToBurnNow = $t01136411449._2
377- let currentBlock = $t01136411449._3
374+ let $t01142311514 = calculateUnitsToClaim(userAddress)
375+ let unitsToClaimNow = $t01142311514._1
376+ let l2ToBurnNow = $t01142311514._2
377+ let currentBlock = $t01142311514._3
378+ let _tmp = $t01142311514._4
378379 if ((0 >= unitsToClaimNow))
379380 then nil
380381 else [IntegerEntry(keyUnitsClaimedBlock(userAddress), currentBlock), IntegerEntry(kL2ToBurn, (l2ToBurn + l2ToBurnNow)), IntegerEntry(kUnlockedUnits, (unlockedUnits + unitsToClaimNow))]
382383
383384
384385 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
385- let $t01184411917 = getLeasingNodeData(nodeAddress)
386- let nodeCurrentLeased = $t01184411917._1
387- let nodeNextLeased = $t01184411917._2
388- let $t01192212008 = getUserLeasingData(nodeAddress, userAddress)
389- let userCurrentLeased = $t01192212008._1
390- let userNextLeased = $t01192212008._2
386+ let $t01190911982 = getLeasingNodeData(nodeAddress)
387+ let nodeCurrentLeased = $t01190911982._1
388+ let nodeNextLeased = $t01190911982._2
389+ let $t01198712073 = getUserLeasingData(nodeAddress, userAddress)
390+ let userCurrentLeased = $t01198712073._1
391+ let userNextLeased = $t01198712073._2
391392 let checks = [if (!(isForceStop))
392393 then true
393394 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
407408 then {
408409 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
409410 let newUserNextLeased = (userNextLeased - unstakeAmount)
410- let $t01289212952 = getUserToClaimBalance(userAddress)
411- let toClaim = $t01289212952._1
412- let toUnlock = $t01289212952._2
411+ let $t01295713017 = getUserToClaimBalance(userAddress)
412+ let toClaim = $t01295713017._1
413+ let toUnlock = $t01295713017._2
413414 let newToUnlock = (toUnlock + unstakeAmount)
414415 let userTotalLocked = getUserTotalLocked(userAddress)
415416 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
421422
422423
423424 func getClaimUnlockedActions (userAddress,claimAmount) = {
424- let $t01377113831 = getUserToClaimBalance(userAddress)
425- let toClaim = $t01377113831._1
426- let toUnlock = $t01377113831._2
425+ let $t01383613896 = getUserToClaimBalance(userAddress)
426+ let toClaim = $t01383613896._1
427+ let toUnlock = $t01383613896._2
427428 let checks = [if (!(isForceStop))
428429 then true
429430 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
445446
446447
447448 func getStakeForActions (userAddress,i) = {
448- let $t01459714657 = getUserToClaimBalance(userAddress)
449- let toClaim = $t01459714657._1
450- let toUnlock = $t01459714657._2
449+ let $t01466214722 = getUserToClaimBalance(userAddress)
450+ let toClaim = $t01466214722._1
451+ let toUnlock = $t01466214722._2
451452 let checks = [if (!(isForceStop))
452453 then true
453454 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
469470
470471
471472 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
472- let $t01538915449 = getUserToClaimBalance(userAddress)
473- let toClaim = $t01538915449._1
474- let toUnlock = $t01538915449._2
473+ let $t01545415514 = getUserToClaimBalance(userAddress)
474+ let toClaim = $t01545415514._1
475+ let toUnlock = $t01545415514._2
475476 let paymentAmount = if ((size(i.payments) == 0))
476477 then 0
477478 else i.payments[0].amount
497498 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
498499 if ((checks == checks))
499500 then {
500- let $t01652416597 = getLeasingNodeData(nodeAddress)
501- let nodeCurrentLeased = $t01652416597._1
502- let nodeNextLeased = $t01652416597._2
501+ let $t01658916662 = getLeasingNodeData(nodeAddress)
502+ let nodeCurrentLeased = $t01658916662._1
503+ let nodeNextLeased = $t01658916662._2
503504 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
504- let $t01666516751 = getUserLeasingData(nodeAddress, userAddress)
505- let userCurrentLeased = $t01666516751._1
506- let userNextLeased = $t01666516751._2
505+ let $t01673016816 = getUserLeasingData(nodeAddress, userAddress)
506+ let userCurrentLeased = $t01673016816._1
507+ let userNextLeased = $t01673016816._2
507508 let newUserNextLeased = (userNextLeased + userLeasingAmount)
508509 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
509510 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
540541
541542
542543 func getUnitsClaimData (userAddress) = {
543- let $t01863618721 = calculateUnitsToClaim(userAddress)
544- let unlockedUnitNow = $t01863618721._1
545- let l2ToBurnNow = $t01863618721._2
546- let currentBlock = $t01863618721._3
544+ let $t01870118792 = calculateUnitsToClaim(userAddress)
545+ let unlockedUnitNow = $t01870118792._1
546+ let l2ToBurnNow = $t01870118792._2
547+ let currentBlock = $t01870118792._3
548+ let _tmp = $t01870118792._4
547549 let unlockedUnitsPrev = valueOrElse(getInteger(this, keyUnlockedUnits(userAddress)), 0)
548550 let unitsToSend = (unlockedUnitNow + unlockedUnitsPrev)
549551 let l2ToBurnPrev = valueOrElse(getInteger(this, keyL2ToBurn(userAddress)), 0)
555557
556558
557559 func getClaimUnitsActions (userAddress) = {
558- let $t01931319421 = getUnitsClaimData(userAddress)
559- let unitsToSend = $t01931319421._1
560- let totalUnitsClaimed = $t01931319421._2
561- let l2ToBurn = $t01931319421._3
562- let totalL2Burned = $t01931319421._4
563- let claimedBlock = $t01931319421._5
560+ let $t01938419492 = getUnitsClaimData(userAddress)
561+ let unitsToSend = $t01938419492._1
562+ let totalUnitsClaimed = $t01938419492._2
563+ let l2ToBurn = $t01938419492._3
564+ let totalL2Burned = $t01938419492._4
565+ let claimedBlock = $t01938419492._5
564566 let check = [if ((unitsToSend > 0))
565567 then true
566568 else throwErr("nothing to claim")]
624626
625627 @Callable(i)
626628 func getNodeDataREADONLY (nodeAddress) = {
627- let $t02115321217 = getLeasingNodeData(nodeAddress)
628- let currentLease = $t02115321217._1
629- let nextLeased = $t02115321217._2
629+ let $t02122421288 = getLeasingNodeData(nodeAddress)
630+ let currentLease = $t02122421288._1
631+ let nextLeased = $t02122421288._2
630632 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
631633 }
632634
634636
635637 @Callable(i)
636638 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
637- let $t02158721664 = getUserLeasingData(nodeAddress, userAddress)
638- let currentLease = $t02158721664._1
639- let nextLeased = $t02158721664._2
639+ let $t02165821735 = getUserLeasingData(nodeAddress, userAddress)
640+ let currentLease = $t02165821735._1
641+ let nextLeased = $t02165821735._2
640642 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
641643 }
642644
644646
645647 @Callable(i)
646648 func getUserDataREADONLY (userAddress) = {
647- let $t02225922319 = getUserToClaimBalance(userAddress)
648- let toClaim = $t02225922319._1
649- let toUnlock = $t02225922319._2
649+ let $t02233922399 = getUserToClaimBalance(userAddress)
650+ let toClaim = $t02233922399._1
651+ let toUnlock = $t02233922399._2
650652 let userTotalLocked = getUserTotalLocked(userAddress)
651- let $t02238222490 = getUnitsClaimData(userAddress)
652- let unitsToSend = $t02238222490._1
653- let totalUnitsClaimed = $t02238222490._2
654- let l2ToBurn = $t02238222490._3
655- let totalL2Burned = $t02238222490._4
656- let claimedBlock = $t02238222490._5
653+ let $t02246222570 = getUnitsClaimData(userAddress)
654+ let unitsToSend = $t02246222570._1
655+ let totalUnitsClaimed = $t02246222570._2
656+ let l2ToBurn = $t02246222570._3
657+ let totalL2Burned = $t02246222570._4
658+ let claimedBlock = $t02246222570._5
657659 let unitsPerBlockScale16 = valueOrElse(getInteger(this, keyUnitsPerBlockScale16), 0)
658660 let remainingblocks = max([0, ((unitsClaimStartHeight + unitsClaimInterval) - height)])
659661 $Tuple2(nil, $Tuple13(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock, unitsPerBlockScale16, remainingblocks))
701703 @Callable(i)
702704 func claimAll () = {
703705 let userAddress = toString(i.caller)
704- let $t02392023980 = getUserToClaimBalance(userAddress)
705- let toClaim = $t02392023980._1
706- let toUnlock = $t02392023980._2
706+ let $t02400024060 = getUserToClaimBalance(userAddress)
707+ let toClaim = $t02400024060._1
708+ let toUnlock = $t02400024060._2
707709 let checks = [if ((toClaim > 0))
708710 then true
709711 else throwErr("nothing to claim")]
720722
721723
722724 @Callable(i)
723-func startUnitsVesting (unitsClaimInterval) = {
725+func startUnitsVesting (unitsClaimNewInterval) = {
724726 let totalL2 = 100000000000000000
725727 let totalUnits = i.payments[0].amount
726- let unitsPerBlockScale16 = (fraction(totalUnits, scale16, totalL2) / unitsClaimInterval)
728+ let unitsPerBlockScale16 = (fraction(totalUnits, scale16, totalL2) / unitsClaimNewInterval)
727729 let check = [if (isInAdminList(toString(i.caller)))
728730 then true
729731 else throwErr("caller is not in adminList"), if ((size(i.payments) == 1))
732734 then true
733735 else throwErr("units per block should be greated than 0")]
734736 if ((check == check))
735- then [IntegerEntry(keyUnitsPerBlockScale16, unitsPerBlockScale16), IntegerEntry(keyUnitsClaimStartHeight, height), IntegerEntry(keyUnitsClaimInterval, unitsClaimInterval), StringEntry(keyUnitsAssetId, assetBytesToString(i.payments[0].assetId))]
737+ then [IntegerEntry(keyUnitsPerBlockScale16, unitsPerBlockScale16), IntegerEntry(keyUnitsClaimStartHeight, height), IntegerEntry(keyUnitsClaimInterval, unitsClaimNewInterval), StringEntry(keyUnitsAssetId, assetBytesToString(i.payments[0].assetId))]
736738 else throw("Strict value is not equal to itself.")
737739 }
738740
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
1111
1212 let scale16 = (scale8 * scale8)
1313
1414 func throwErr (msg) = throw(((contractFile + ": ") + msg))
1515
1616
1717 let keyL2AssetId = makeString(["%s", "assetId"], SEP)
1818
1919 let keyForceStop = makeString(["%s", "forceStop"], SEP)
2020
2121 let keyForceOutStop = makeString(["%s", "forceOutStop"], SEP)
2222
2323 let keyUnitsAssetId = makeString(["%s", "unitsAssetId"], SEP)
2424
2525 let keyUnitsPerBlockScale16 = makeString(["%s", "unitsPerBlockScale16"], SEP)
2626
2727 let keyPeriodOffsetId = makeString(["%s", "offsetId"], SEP)
2828
2929 let keyPeriodOffsetHeight = makeString(["%s", "offsetHeight"], SEP)
3030
3131 let keyPeriodLength = makeString(["%s", "periodLength"], SEP)
3232
3333 let keyUnitsClaimStartHeight = makeString(["%s", "unitsClaimStartHeight"], SEP)
3434
3535 let keyUnitsClaimInterval = makeString(["%s", "unitsClaimInterval"], SEP)
3636
3737 let periodOffsetId = valueOrElse(getInteger(this, keyPeriodOffsetId), 0)
3838
3939 let periodLength = valueOrElse(getInteger(this, keyPeriodLength), 10000)
4040
4141 let periodOffsetHeight = valueOrElse(getInteger(this, keyPeriodOffsetHeight), -1)
4242
4343 let currentPeriodId = if (if ((height > periodOffsetHeight))
4444 then (periodOffsetHeight != -1)
4545 else false)
4646 then (((height - periodOffsetHeight) / periodLength) + periodOffsetId)
4747 else max([0, (periodOffsetId - 1)])
4848
4949 let currentPeriodHeight = if (if ((periodOffsetHeight == -1))
5050 then true
5151 else if ((currentPeriodId == 0))
5252 then (periodOffsetHeight > height)
5353 else false)
5454 then 0
5555 else (periodOffsetHeight + ((currentPeriodId - periodOffsetId) * periodLength))
5656
5757 let nextPeriodHeight = if (if ((periodOffsetHeight == -1))
5858 then true
5959 else if ((currentPeriodId == 0))
6060 then (periodOffsetHeight > height)
6161 else false)
6262 then 0
6363 else (currentPeriodHeight + periodLength)
6464
6565 let unitsClaimStartHeight = valueOrElse(getInteger(this, keyUnitsClaimStartHeight), height)
6666
6767 let unitsClaimInterval = valueOrElse(getInteger(this, keyUnitsClaimInterval), 0)
6868
6969 func keyLeasingNodeData (nodeAddress) = makeString(["%s", nodeAddress], SEP)
7070
7171
7272 func keyUserLeasingNodeData (userAddress,nodeAddress) = makeString(["%s%s", nodeAddress, userAddress], SEP)
7373
7474
7575 func keyUserToClaim (userAddress) = makeString(["%s%s", "toClaim", userAddress], SEP)
7676
7777
7878 func keyUserTotalLocked (userAddress) = makeString(["%s%s", "userTotalLocked", userAddress], SEP)
7979
8080
8181 func keyUnitsClaimedBlock (userAddress) = makeString(["%s%s", "unitsClaimedBlock", userAddress], SEP)
8282
8383
8484 func keyUnlockedUnits (userAddress) = makeString(["%s%s", "unlockedUnits", userAddress], SEP)
8585
8686
8787 func keyTotalUnitsClaimed (userAddress) = makeString(["%s%s", "totalUnitsClaimed", userAddress], SEP)
8888
8989
9090 func keyL2ToBurn (userAddress) = makeString(["%s%s", "l2ToBurn", userAddress], SEP)
9191
9292
9393 func keyL2BurnedTotal (userAddress) = makeString(["%s%s", "l2BurnedTotal", userAddress], SEP)
9494
9595
9696 func keyNodeLeasingByHeight (nodeAddress) = {
9797 let h = if ((periodOffsetHeight == -1))
9898 then 0
9999 else height
100100 makeString(["%s%d", nodeAddress, toString(h)], SEP)
101101 }
102102
103103
104104 func keyUserLeasingByHeight (nodeAddress,userAddress) = {
105105 let h = if ((periodOffsetHeight == -1))
106106 then 0
107107 else height
108108 makeString(["%s%s%d", nodeAddress, userAddress, toString(h)], SEP)
109109 }
110110
111111
112112 func assetStringToBytes (assetIdString) = if ((assetIdString == "WAVES"))
113113 then unit
114114 else fromBase58String(assetIdString)
115115
116116
117117 func assetBytesToString (assetId) = match assetId {
118118 case a: ByteVector =>
119119 toBase58String(a)
120120 case _ =>
121121 "WAVES"
122122 }
123123
124124
125125 let l2AssetIdString = valueOrElse(getString(this, keyL2AssetId), "WAVES")
126126
127127 let unitsAssetIdString = valueOrElse(getString(this, keyUnitsAssetId), "WAVES")
128128
129129 let l2AssetIdBytes = assetStringToBytes(l2AssetIdString)
130130
131131 let unitsAssetIdBytes = assetStringToBytes(unitsAssetIdString)
132132
133133 let isForceStop = valueOrElse(getBoolean(this, keyForceStop), false)
134134
135135 let isForceOutStop = valueOrElse(getBoolean(this, keyForceOutStop), false)
136136
137137 func isValidAddress (address) = match addressFromString(address) {
138138 case a: Address =>
139139 true
140140 case _ =>
141141 false
142142 }
143143
144144
145145 let ADMIN_LIST_SIZE = 5
146146
147147 let QUORUM = 3
148148
149149 let TXID_BYTES_LENGTH = 32
150150
151151 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
152152
153153
154154 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
155155
156156
157157 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
158158
159159
160160 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
161161
162162
163163 func getAdminVote (prefix,admin) = {
164164 let voteKey = keyFullAdminVote(prefix, admin)
165165 valueOrElse(getInteger(voteKey), 0)
166166 }
167167
168168
169169 func getAdminsList () = match getString(this, keyAdminAddressList()) {
170170 case s: String =>
171171 split(s, SEP)
172172 case _ =>
173173 nil
174174 }
175175
176176
177177 func isInAdminList (address) = containsElement(getAdminsList(), address)
178178
179179
180180 func genVotesKeysHelper (a,adminAddress) = {
181181 let $t051855209 = a
182182 let result = $t051855209._1
183183 let prefix = $t051855209._2
184184 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
185185 }
186186
187187
188188 func genVotesKeys (keyPrefix) = {
189189 let adminList = keyAdminAddressList()
190190 let $t053565440 = {
191191 let $l = getAdminsList()
192192 let $s = size($l)
193193 let $acc0 = $Tuple2(nil, keyPrefix)
194194 func $f0_1 ($a,$i) = if (($i >= $s))
195195 then $a
196196 else genVotesKeysHelper($a, $l[$i])
197197
198198 func $f0_2 ($a,$i) = if (($i >= $s))
199199 then $a
200200 else throw("List size exceeds 5")
201201
202202 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
203203 }
204204 let result = $t053565440._1
205205 let prefix = $t053565440._2
206206 result
207207 }
208208
209209
210210 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
211211
212212
213213 func countVotes (prefix) = {
214214 let votes = genVotesKeys(prefix)
215215 let $l = votes
216216 let $s = size($l)
217217 let $acc0 = 0
218218 func $f0_1 ($a,$i) = if (($i >= $s))
219219 then $a
220220 else countVotesHelper($a, $l[$i])
221221
222222 func $f0_2 ($a,$i) = if (($i >= $s))
223223 then $a
224224 else throw("List size exceeds 5")
225225
226226 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
227227 }
228228
229229
230230 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
231231
232232
233233 func getClearVoteEntries (prefix) = {
234234 let votes = genVotesKeys(prefix)
235235 let $l = votes
236236 let $s = size($l)
237237 let $acc0 = nil
238238 func $f0_1 ($a,$i) = if (($i >= $s))
239239 then $a
240240 else clearVotesHelper($a, $l[$i])
241241
242242 func $f0_2 ($a,$i) = if (($i >= $s))
243243 then $a
244244 else throw("List size exceeds 5")
245245
246246 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
247247 }
248248
249249
250250 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
251251 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
252252 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
253253 let err = if (!(isInAdminList(callerAddressString)))
254254 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
255255 else if ((adminCurrentVote == 1))
256256 then throwErr((voteKey + " you already voted"))
257257 else unit
258258 if ((err == err))
259259 then {
260260 let votes = countVotes(keyPrefix)
261261 if (((votes + 1) >= minVotes))
262262 then {
263263 let clearVoteEntries = getClearVoteEntries(keyPrefix)
264264 (clearVoteEntries ++ voteResult)
265265 }
266266 else [IntegerEntry(voteKey, 1)]
267267 }
268268 else throw("Strict value is not equal to itself.")
269269 }
270270
271271
272272 func getLeasingNodeEntry (nodeAddress,currentLeased,nextLeased) = {
273273 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(currentLeased), toString(nextPeriodHeight), toString(nextLeased)], SEP)
274274 StringEntry(keyLeasingNodeData(nodeAddress), valueString)
275275 }
276276
277277
278278 func getLeasingNodeData (nodeAddress) = {
279279 let leasingNodeDataStringRaw = getString(this, keyLeasingNodeData(nodeAddress))
280280 match leasingNodeDataStringRaw {
281281 case ds: String =>
282282 let dataList = split(ds, SEP)
283283 let nodeCurrentPeriod = parseIntValue(dataList[1])
284284 let nodeCurrentLeased = parseIntValue(dataList[2])
285285 let nodeNextPeriod = parseIntValue(dataList[3])
286286 let nodeNextLeased = parseIntValue(dataList[4])
287287 if (if ((nodeNextPeriod > height))
288288 then true
289289 else (periodOffsetHeight == -1))
290290 then $Tuple2(nodeCurrentLeased, nodeNextLeased)
291291 else $Tuple2(nodeNextLeased, nodeNextLeased)
292292 case _ =>
293293 $Tuple2(0, 0)
294294 }
295295 }
296296
297297
298298 func getUserLeasingEntry (nodeAddress,userAddress,userCurrentLeased,userNextLeased) = {
299299 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(userCurrentLeased), toString(nextPeriodHeight), toString(userNextLeased)], SEP)
300300 StringEntry(keyUserLeasingNodeData(userAddress, nodeAddress), valueString)
301301 }
302302
303303
304304 func getUserLeasingData (nodeAddress,userAddress) = {
305305 let leasingUserDataStringRaw = getString(this, keyUserLeasingNodeData(userAddress, nodeAddress))
306306 match leasingUserDataStringRaw {
307307 case ds: String =>
308308 let dataList = split(ds, SEP)
309309 let userCurrentPeriod = parseIntValue(dataList[1])
310310 let userCurrentLeased = parseIntValue(dataList[2])
311311 let userNextPeriod = parseIntValue(dataList[3])
312312 let userNextLeased = parseIntValue(dataList[4])
313313 if (if ((userNextPeriod > height))
314314 then true
315315 else (periodOffsetHeight == -1))
316316 then $Tuple2(userCurrentLeased, userNextLeased)
317317 else $Tuple2(userNextLeased, userNextLeased)
318318 case _ =>
319319 $Tuple2(0, 0)
320320 }
321321 }
322322
323323
324324 func getUserToClaimEntry (userAddress,toClaim,toUnlock) = {
325325 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(toClaim), toString(nextPeriodHeight), toString(toUnlock)], SEP)
326326 StringEntry(keyUserToClaim(userAddress), valueString)
327327 }
328328
329329
330330 func getUserToClaimBalance (userAddress) = {
331331 let userToClaimDataStringRaw = getString(this, keyUserToClaim(userAddress))
332332 match userToClaimDataStringRaw {
333333 case ds: String =>
334334 let dataList = split(ds, SEP)
335335 let currentPeriod = parseIntValue(dataList[1])
336336 let toClaim = parseIntValue(dataList[2])
337337 let nextPeriod = parseIntValue(dataList[3])
338338 let toUnlock = parseIntValue(dataList[4])
339339 if (if ((nextPeriod > height))
340340 then true
341341 else (currentPeriodId == 0))
342342 then $Tuple2(toClaim, toUnlock)
343343 else $Tuple2((toClaim + toUnlock), 0)
344344 case _ =>
345345 $Tuple2(0, 0)
346346 }
347347 }
348348
349349
350350 func getUserTotalLockedEntry (userAddress,userTotalLocked) = IntegerEntry(keyUserTotalLocked(userAddress), userTotalLocked)
351351
352352
353353 func getUserTotalLocked (userAddress) = valueOrElse(getInteger(this, keyUserTotalLocked(userAddress)), 0)
354354
355355
356356 func calculateUnitsToClaim (userAddress) = {
357357 let claimedBlockKey = keyUnitsClaimedBlock(userAddress)
358358 let claimedBlock = valueOrElse(getInteger(this, claimedBlockKey), unitsClaimStartHeight)
359359 let unitsPerBlockScale16 = valueOrElse(getInteger(this, keyUnitsPerBlockScale16), 0)
360360 let currentBlock = min([(unitsClaimStartHeight + unitsClaimInterval), height])
361361 let blocksPassed = (currentBlock - claimedBlock)
362362 let amountStaked = getUserTotalLocked(userAddress)
363363 let l2ToBurn = fraction(amountStaked, blocksPassed, unitsClaimInterval)
364364 let unitsToClaimNow = fraction(l2ToBurn, unitsPerBlockScale16, scale16)
365- $Tuple3(unitsToClaimNow, l2ToBurn, currentBlock)
365+ $Tuple4(unitsToClaimNow, l2ToBurn, currentBlock, $Tuple3(blocksPassed, unitsClaimStartHeight, unitsClaimInterval))
366366 }
367367
368368
369369 func getUnlockUnitsAction (userAddress) = {
370370 let kUnlockedUnits = keyUnlockedUnits(userAddress)
371371 let unlockedUnits = valueOrElse(getInteger(this, kUnlockedUnits), 0)
372372 let kL2ToBurn = keyL2ToBurn(userAddress)
373373 let l2ToBurn = valueOrElse(getInteger(this, kL2ToBurn), 0)
374- let $t01136411449 = calculateUnitsToClaim(userAddress)
375- let unitsToClaimNow = $t01136411449._1
376- let l2ToBurnNow = $t01136411449._2
377- let currentBlock = $t01136411449._3
374+ let $t01142311514 = calculateUnitsToClaim(userAddress)
375+ let unitsToClaimNow = $t01142311514._1
376+ let l2ToBurnNow = $t01142311514._2
377+ let currentBlock = $t01142311514._3
378+ let _tmp = $t01142311514._4
378379 if ((0 >= unitsToClaimNow))
379380 then nil
380381 else [IntegerEntry(keyUnitsClaimedBlock(userAddress), currentBlock), IntegerEntry(kL2ToBurn, (l2ToBurn + l2ToBurnNow)), IntegerEntry(kUnlockedUnits, (unlockedUnits + unitsToClaimNow))]
381382 }
382383
383384
384385 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
385- let $t01184411917 = getLeasingNodeData(nodeAddress)
386- let nodeCurrentLeased = $t01184411917._1
387- let nodeNextLeased = $t01184411917._2
388- let $t01192212008 = getUserLeasingData(nodeAddress, userAddress)
389- let userCurrentLeased = $t01192212008._1
390- let userNextLeased = $t01192212008._2
386+ let $t01190911982 = getLeasingNodeData(nodeAddress)
387+ let nodeCurrentLeased = $t01190911982._1
388+ let nodeNextLeased = $t01190911982._2
389+ let $t01198712073 = getUserLeasingData(nodeAddress, userAddress)
390+ let userCurrentLeased = $t01198712073._1
391+ let userNextLeased = $t01198712073._2
391392 let checks = [if (!(isForceStop))
392393 then true
393394 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
394395 then true
395396 else throwErr("unstake is temporary disabled"), if ((unstakeAmount > 0))
396397 then true
397398 else throwErr("unstake amount should be greater than 0"), if ((userNextLeased >= unstakeAmount))
398399 then true
399400 else throwErr("unstake amount should be less or equal user staked amount"), if ((nodeNextLeased >= unstakeAmount))
400401 then true
401402 else throwErr("unstake amount should be less or equal node staked amount"), if (isValidAddress(nodeAddress))
402403 then true
403404 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
404405 then true
405406 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
406407 if ((checks == checks))
407408 then {
408409 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
409410 let newUserNextLeased = (userNextLeased - unstakeAmount)
410- let $t01289212952 = getUserToClaimBalance(userAddress)
411- let toClaim = $t01289212952._1
412- let toUnlock = $t01289212952._2
411+ let $t01295713017 = getUserToClaimBalance(userAddress)
412+ let toClaim = $t01295713017._1
413+ let toUnlock = $t01295713017._2
413414 let newToUnlock = (toUnlock + unstakeAmount)
414415 let userTotalLocked = getUserTotalLocked(userAddress)
415416 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
416417 let unitsUnlockedActions = getUnlockUnitsAction(userAddress)
417418 ([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)
418419 }
419420 else throw("Strict value is not equal to itself.")
420421 }
421422
422423
423424 func getClaimUnlockedActions (userAddress,claimAmount) = {
424- let $t01377113831 = getUserToClaimBalance(userAddress)
425- let toClaim = $t01377113831._1
426- let toUnlock = $t01377113831._2
425+ let $t01383613896 = getUserToClaimBalance(userAddress)
426+ let toClaim = $t01383613896._1
427+ let toUnlock = $t01383613896._2
427428 let checks = [if (!(isForceStop))
428429 then true
429430 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
430431 then true
431432 else throwErr("claim is temporary disabled"), if ((claimAmount > 0))
432433 then true
433434 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
434435 then true
435436 else throwErr("claim amount should be less or equal unlocked amount"), if (isValidAddress(userAddress))
436437 then true
437438 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
438439 if ((checks == checks))
439440 then {
440441 let newToClaim = (toClaim - claimAmount)
441442 [getUserToClaimEntry(userAddress, newToClaim, toUnlock), ScriptTransfer(addressFromStringValue(userAddress), claimAmount, l2AssetIdBytes)]
442443 }
443444 else throw("Strict value is not equal to itself.")
444445 }
445446
446447
447448 func getStakeForActions (userAddress,i) = {
448- let $t01459714657 = getUserToClaimBalance(userAddress)
449- let toClaim = $t01459714657._1
450- let toUnlock = $t01459714657._2
449+ let $t01466214722 = getUserToClaimBalance(userAddress)
450+ let toClaim = $t01466214722._1
451+ let toUnlock = $t01466214722._2
451452 let checks = [if (!(isForceStop))
452453 then true
453454 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
454455 then true
455456 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
456457 then true
457458 else (i.payments[0].assetId == l2AssetIdBytes))
458459 then true
459460 else throwErr(makeString(["payment assetId should be:", l2AssetIdString], " ")), if (isValidAddress(userAddress))
460461 then true
461462 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
462463 if ((checks == checks))
463464 then {
464465 let newToClaim = (toClaim + i.payments[0].amount)
465466 [getUserToClaimEntry(userAddress, newToClaim, toUnlock)]
466467 }
467468 else throw("Strict value is not equal to itself.")
468469 }
469470
470471
471472 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
472- let $t01538915449 = getUserToClaimBalance(userAddress)
473- let toClaim = $t01538915449._1
474- let toUnlock = $t01538915449._2
473+ let $t01545415514 = getUserToClaimBalance(userAddress)
474+ let toClaim = $t01545415514._1
475+ let toUnlock = $t01545415514._2
475476 let paymentAmount = if ((size(i.payments) == 0))
476477 then 0
477478 else i.payments[0].amount
478479 let available = ((toUnlock + toClaim) + paymentAmount)
479480 let checks = [if (!(isForceStop))
480481 then true
481482 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
482483 then true
483484 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
484485 then true
485486 else (i.payments[0].assetId == l2AssetIdBytes))
486487 then true
487488 else throwErr(makeString(["payment assetId should be:", l2AssetIdString], " ")), if ((userLeasingAmount > 0))
488489 then true
489490 else throwErr("amount should be greater than 0"), if ((available >= userLeasingAmount))
490491 then true
491492 else throwErr("amount should be less or equal (payment + available) amount"), if ((userLeasingAmount >= paymentAmount))
492493 then true
493494 else throw("amount should be greater or equal payment amount"), if (isValidAddress(nodeAddress))
494495 then true
495496 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
496497 then true
497498 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
498499 if ((checks == checks))
499500 then {
500- let $t01652416597 = getLeasingNodeData(nodeAddress)
501- let nodeCurrentLeased = $t01652416597._1
502- let nodeNextLeased = $t01652416597._2
501+ let $t01658916662 = getLeasingNodeData(nodeAddress)
502+ let nodeCurrentLeased = $t01658916662._1
503+ let nodeNextLeased = $t01658916662._2
503504 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
504- let $t01666516751 = getUserLeasingData(nodeAddress, userAddress)
505- let userCurrentLeased = $t01666516751._1
506- let userNextLeased = $t01666516751._2
505+ let $t01673016816 = getUserLeasingData(nodeAddress, userAddress)
506+ let userCurrentLeased = $t01673016816._1
507+ let userNextLeased = $t01673016816._2
507508 let newUserNextLeased = (userNextLeased + userLeasingAmount)
508509 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
509510 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
510511 let newToClaim = min([toClaim, (toClaim + (toUnlock - fromUnlockedAmount))])
511512 let userTotalLocked = getUserTotalLocked(userAddress)
512513 let newUserTotalLocked = (userTotalLocked + userLeasingAmount)
513514 let unitsUnlockedActions = getUnlockUnitsAction(userAddress)
514515 ([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)
515516 }
516517 else throw("Strict value is not equal to itself.")
517518 }
518519
519520
520521 func getStakeFromPaymentActions (nodeAddress,userAddress,i) = {
521522 let checks = [if ((size(i.payments) == 1))
522523 then true
523524 else throwErr("payment size should be exactly 1")]
524525 if ((checks == checks))
525526 then getStakeActions(nodeAddress, userAddress, i.payments[0].amount, i)
526527 else throw("Strict value is not equal to itself.")
527528 }
528529
529530
530531 func getSetNewPeriodLengthActions (newPeriodLength) = {
531532 let check = [if ((newPeriodLength > 0))
532533 then true
533534 else throwErr("period length should be greater than 0")]
534535 if ((check == check))
535536 then if ((periodOffsetHeight == -1))
536537 then [IntegerEntry(keyPeriodLength, newPeriodLength), IntegerEntry(keyPeriodOffsetHeight, height)]
537538 else [IntegerEntry(keyPeriodOffsetId, (currentPeriodId + 1)), IntegerEntry(keyPeriodOffsetHeight, nextPeriodHeight), IntegerEntry(keyPeriodLength, newPeriodLength)]
538539 else throw("Strict value is not equal to itself.")
539540 }
540541
541542
542543 func getUnitsClaimData (userAddress) = {
543- let $t01863618721 = calculateUnitsToClaim(userAddress)
544- let unlockedUnitNow = $t01863618721._1
545- let l2ToBurnNow = $t01863618721._2
546- let currentBlock = $t01863618721._3
544+ let $t01870118792 = calculateUnitsToClaim(userAddress)
545+ let unlockedUnitNow = $t01870118792._1
546+ let l2ToBurnNow = $t01870118792._2
547+ let currentBlock = $t01870118792._3
548+ let _tmp = $t01870118792._4
547549 let unlockedUnitsPrev = valueOrElse(getInteger(this, keyUnlockedUnits(userAddress)), 0)
548550 let unitsToSend = (unlockedUnitNow + unlockedUnitsPrev)
549551 let l2ToBurnPrev = valueOrElse(getInteger(this, keyL2ToBurn(userAddress)), 0)
550552 let l2ToBurn = (l2ToBurnPrev + l2ToBurnNow)
551553 let totalUnitsClaimed = valueOrElse(getInteger(this, keyTotalUnitsClaimed(userAddress)), 0)
552554 let totalL2Burned = valueOrElse(getInteger(this, keyL2BurnedTotal(userAddress)), 0)
553555 $Tuple5(unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, currentBlock)
554556 }
555557
556558
557559 func getClaimUnitsActions (userAddress) = {
558- let $t01931319421 = getUnitsClaimData(userAddress)
559- let unitsToSend = $t01931319421._1
560- let totalUnitsClaimed = $t01931319421._2
561- let l2ToBurn = $t01931319421._3
562- let totalL2Burned = $t01931319421._4
563- let claimedBlock = $t01931319421._5
560+ let $t01938419492 = getUnitsClaimData(userAddress)
561+ let unitsToSend = $t01938419492._1
562+ let totalUnitsClaimed = $t01938419492._2
563+ let l2ToBurn = $t01938419492._3
564+ let totalL2Burned = $t01938419492._4
565+ let claimedBlock = $t01938419492._5
564566 let check = [if ((unitsToSend > 0))
565567 then true
566568 else throwErr("nothing to claim")]
567569 if ((check == check))
568570 then {
569571 let burnAction = match l2AssetIdBytes {
570572 case id: ByteVector =>
571573 [Burn(id, l2ToBurn)]
572574 case _ =>
573575 nil
574576 }
575577 ([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)
576578 }
577579 else throw("Strict value is not equal to itself.")
578580 }
579581
580582
581583 @Callable(i)
582584 func setNewPeriodLength (newPeriodLength) = {
583585 let checks = [if (isInAdminList(toString(i.caller)))
584586 then true
585587 else throwErr("caller is not in adminList")]
586588 if ((checks == checks))
587589 then getSetNewPeriodLengthActions(newPeriodLength)
588590 else throw("Strict value is not equal to itself.")
589591 }
590592
591593
592594
593595 @Callable(i)
594596 func claimUnits () = {
595597 let userAddress = toString(i.caller)
596598 getClaimUnitsActions(userAddress)
597599 }
598600
599601
600602
601603 @Callable(i)
602604 func setForceStopFlag (stop) = {
603605 let check = [if (isInAdminList(toString(i.caller)))
604606 then true
605607 else throwErr("caller is not in adminList")]
606608 if ((check == check))
607609 then [BooleanEntry(keyForceStop, stop)]
608610 else throw("Strict value is not equal to itself.")
609611 }
610612
611613
612614
613615 @Callable(i)
614616 func setForceOutStopFlag (stop) = {
615617 let check = [if (isInAdminList(toString(i.caller)))
616618 then true
617619 else throwErr("caller is not in adminList")]
618620 if ((check == check))
619621 then [BooleanEntry(keyForceOutStop, stop)]
620622 else throw("Strict value is not equal to itself.")
621623 }
622624
623625
624626
625627 @Callable(i)
626628 func getNodeDataREADONLY (nodeAddress) = {
627- let $t02115321217 = getLeasingNodeData(nodeAddress)
628- let currentLease = $t02115321217._1
629- let nextLeased = $t02115321217._2
629+ let $t02122421288 = getLeasingNodeData(nodeAddress)
630+ let currentLease = $t02122421288._1
631+ let nextLeased = $t02122421288._2
630632 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
631633 }
632634
633635
634636
635637 @Callable(i)
636638 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
637- let $t02158721664 = getUserLeasingData(nodeAddress, userAddress)
638- let currentLease = $t02158721664._1
639- let nextLeased = $t02158721664._2
639+ let $t02165821735 = getUserLeasingData(nodeAddress, userAddress)
640+ let currentLease = $t02165821735._1
641+ let nextLeased = $t02165821735._2
640642 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
641643 }
642644
643645
644646
645647 @Callable(i)
646648 func getUserDataREADONLY (userAddress) = {
647- let $t02225922319 = getUserToClaimBalance(userAddress)
648- let toClaim = $t02225922319._1
649- let toUnlock = $t02225922319._2
649+ let $t02233922399 = getUserToClaimBalance(userAddress)
650+ let toClaim = $t02233922399._1
651+ let toUnlock = $t02233922399._2
650652 let userTotalLocked = getUserTotalLocked(userAddress)
651- let $t02238222490 = getUnitsClaimData(userAddress)
652- let unitsToSend = $t02238222490._1
653- let totalUnitsClaimed = $t02238222490._2
654- let l2ToBurn = $t02238222490._3
655- let totalL2Burned = $t02238222490._4
656- let claimedBlock = $t02238222490._5
653+ let $t02246222570 = getUnitsClaimData(userAddress)
654+ let unitsToSend = $t02246222570._1
655+ let totalUnitsClaimed = $t02246222570._2
656+ let l2ToBurn = $t02246222570._3
657+ let totalL2Burned = $t02246222570._4
658+ let claimedBlock = $t02246222570._5
657659 let unitsPerBlockScale16 = valueOrElse(getInteger(this, keyUnitsPerBlockScale16), 0)
658660 let remainingblocks = max([0, ((unitsClaimStartHeight + unitsClaimInterval) - height)])
659661 $Tuple2(nil, $Tuple13(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock, unitsPerBlockScale16, remainingblocks))
660662 }
661663
662664
663665
664666 @Callable(i)
665667 func leaseByAddress (nodeAddress,userAddress) = getStakeFromPaymentActions(nodeAddress, userAddress, i)
666668
667669
668670
669671 @Callable(i)
670672 func lease (nodeAddress) = {
671673 let userAddress = toString(i.caller)
672674 getStakeFromPaymentActions(nodeAddress, userAddress, i)
673675 }
674676
675677
676678
677679 @Callable(i)
678680 func leaseFromLocked (nodeAddress,amount) = {
679681 let userAddress = toString(i.caller)
680682 getStakeActions(nodeAddress, userAddress, amount, i)
681683 }
682684
683685
684686
685687 @Callable(i)
686688 func cancelLease (nodeAddress,amount) = {
687689 let userAddress = toString(i.caller)
688690 getUnstakeActions(nodeAddress, userAddress, amount)
689691 }
690692
691693
692694
693695 @Callable(i)
694696 func claim (amount) = {
695697 let userAddress = toString(i.caller)
696698 getClaimUnlockedActions(userAddress, amount)
697699 }
698700
699701
700702
701703 @Callable(i)
702704 func claimAll () = {
703705 let userAddress = toString(i.caller)
704- let $t02392023980 = getUserToClaimBalance(userAddress)
705- let toClaim = $t02392023980._1
706- let toUnlock = $t02392023980._2
706+ let $t02400024060 = getUserToClaimBalance(userAddress)
707+ let toClaim = $t02400024060._1
708+ let toUnlock = $t02400024060._2
707709 let checks = [if ((toClaim > 0))
708710 then true
709711 else throwErr("nothing to claim")]
710712 if ((checks == checks))
711713 then getClaimUnlockedActions(userAddress, toClaim)
712714 else throw("Strict value is not equal to itself.")
713715 }
714716
715717
716718
717719 @Callable(i)
718720 func stakeFor (userAddress) = getStakeForActions(userAddress, i)
719721
720722
721723
722724 @Callable(i)
723-func startUnitsVesting (unitsClaimInterval) = {
725+func startUnitsVesting (unitsClaimNewInterval) = {
724726 let totalL2 = 100000000000000000
725727 let totalUnits = i.payments[0].amount
726- let unitsPerBlockScale16 = (fraction(totalUnits, scale16, totalL2) / unitsClaimInterval)
728+ let unitsPerBlockScale16 = (fraction(totalUnits, scale16, totalL2) / unitsClaimNewInterval)
727729 let check = [if (isInAdminList(toString(i.caller)))
728730 then true
729731 else throwErr("caller is not in adminList"), if ((size(i.payments) == 1))
730732 then true
731733 else throwErr("should be 1 payment"), if ((unitsPerBlockScale16 > 0))
732734 then true
733735 else throwErr("units per block should be greated than 0")]
734736 if ((check == check))
735- then [IntegerEntry(keyUnitsPerBlockScale16, unitsPerBlockScale16), IntegerEntry(keyUnitsClaimStartHeight, height), IntegerEntry(keyUnitsClaimInterval, unitsClaimInterval), StringEntry(keyUnitsAssetId, assetBytesToString(i.payments[0].assetId))]
737+ then [IntegerEntry(keyUnitsPerBlockScale16, unitsPerBlockScale16), IntegerEntry(keyUnitsClaimStartHeight, height), IntegerEntry(keyUnitsClaimInterval, unitsClaimNewInterval), StringEntry(keyUnitsAssetId, assetBytesToString(i.payments[0].assetId))]
736738 else throw("Strict value is not equal to itself.")
737739 }
738740
739741
740742
741743 @Callable(i)
742744 func voteForTxId (txId) = {
743745 let callerAddressString = toBase58String(i.caller.bytes)
744746 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
745747 let result = [StringEntry(keyAllowedTxId(), txId)]
746748 let allowedTxIdOption = getString(this, keyAllowedTxId())
747749 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
748750 then true
749751 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
750752 then true
751753 else (value(allowedTxIdOption) != txId))
752754 then true
753755 else throwErr((txId + " is already allowed"))]
754756 if ((err == err))
755757 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
756758 else throw("Strict value is not equal to itself.")
757759 }
758760
759761
760762 @Verifier(tx)
761763 func verify () = {
762764 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
763765 let byOwner = if ((size(getAdminsList()) >= QUORUM))
764766 then false
765767 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
766768 if (byAdmins)
767769 then true
768770 else byOwner
769771 }
770772

github/deemru/w8io/026f985 
123.15 ms