tx · DyDaUSJJcu6bZSchTPg2usMRpdhEdJPJrWUmtz7uskoY

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.02700000 Waves

2024.10.22 09:59 [3337702] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "DyDaUSJJcu6bZSchTPg2usMRpdhEdJPJrWUmtz7uskoY", "fee": 2700000, "feeAssetId": null, "timestamp": 1729580403601, "version": 1, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "4q8FdVp8h2vCR7xHhyZovzNynKGa2fq1HZnYyi69NAWMGKhCrLpCpCs2d7FVDkQUo1sM1YsTEvswRMhCN6R1PtrD" ], "script": "base64:BgJQCAISAwoBARIAEgMKAQQSAwoBBBIDCgEIEgQKAggIEgMKAQgSBAoCCAgSAwoBCBIECgIIARIECgIIARIDCgEBEgASAwoBCBIDCgEBEgMKAQhPAAxjb250cmFjdEZpbGUCEWwybXBfbGVhc2luZy5yaWRlAANTRVACAl9fABJCTE9DS1NfSU5fSU5URVJWQUwA6AcABnNjYWxlOACAwtcvAAdzY2FsZTE2CQBoAgUGc2NhbGU4BQZzY2FsZTgBCHRocm93RXJyAQNtc2cJAAIBCQCsAgIJAKwCAgUMY29udHJhY3RGaWxlAgI6IAUDbXNnAAxrZXlMMkFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAAMa2V5Rm9yY2VTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIJZm9yY2VTdG9wBQNuaWwFA1NFUAAPa2V5Rm9yY2VPdXRTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIMZm9yY2VPdXRTdG9wBQNuaWwFA1NFUAAPa2V5VW5pdHNBc3NldElkCQC5CQIJAMwIAgICJXMJAMwIAgIMdW5pdHNBc3NldElkBQNuaWwFA1NFUAAXa2V5VW5pdHNQZXJCbG9ja1NjYWxlMTYJALkJAgkAzAgCAgIlcwkAzAgCAhR1bml0c1BlckJsb2NrU2NhbGUxNgUDbmlsBQNTRVAAEWtleVBlcmlvZE9mZnNldElkCQC5CQIJAMwIAgICJXMJAMwIAgIIb2Zmc2V0SWQFA25pbAUDU0VQABVrZXlQZXJpb2RPZmZzZXRIZWlnaHQJALkJAgkAzAgCAgIlcwkAzAgCAgxvZmZzZXRIZWlnaHQFA25pbAUDU0VQAA9rZXlQZXJpb2RMZW5ndGgJALkJAgkAzAgCAgIlcwkAzAgCAgxwZXJpb2RMZW5ndGgFA25pbAUDU0VQABhrZXlVbml0c0NsYWltU3RhcnRIZWlnaHQJALkJAgkAzAgCAgIlcwkAzAgCAhV1bml0c0NsYWltU3RhcnRIZWlnaHQFA25pbAUDU0VQABVrZXlVbml0c0NsYWltSW50ZXJ2YWwJALkJAgkAzAgCAgIlcwkAzAgCAhJ1bml0c0NsYWltSW50ZXJ2YWwFA25pbAUDU0VQAA5wZXJpb2RPZmZzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrZXlQZXJpb2RPZmZzZXRJZAAAAAxwZXJpb2RMZW5ndGgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUPa2V5UGVyaW9kTGVuZ3RoAJBOABJwZXJpb2RPZmZzZXRIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEAD2N1cnJlbnRQZXJpb2RJZAMDCQBmAgUGaGVpZ2h0BRJwZXJpb2RPZmZzZXRIZWlnaHQJAQIhPQIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BBwkAZAIJAGkCCQBlAgUGaGVpZ2h0BRJwZXJpb2RPZmZzZXRIZWlnaHQFDHBlcmlvZExlbmd0aAUOcGVyaW9kT2Zmc2V0SWQJAJYDAQkAzAgCAAAJAMwIAgkAZQIFDnBlcmlvZE9mZnNldElkAAEFA25pbAATY3VycmVudFBlcmlvZEhlaWdodAMDCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEGAwkAAAIFD2N1cnJlbnRQZXJpb2RJZAAACQBmAgUScGVyaW9kT2Zmc2V0SGVpZ2h0BQZoZWlnaHQHAAAJAGQCBRJwZXJpb2RPZmZzZXRIZWlnaHQJAGgCCQBlAgUPY3VycmVudFBlcmlvZElkBQ5wZXJpb2RPZmZzZXRJZAUMcGVyaW9kTGVuZ3RoABBuZXh0UGVyaW9kSGVpZ2h0AwMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQYDCQAAAgUPY3VycmVudFBlcmlvZElkAAAJAGYCBRJwZXJpb2RPZmZzZXRIZWlnaHQFBmhlaWdodAcAAAkAZAIFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDHBlcmlvZExlbmd0aAAVdW5pdHNDbGFpbVN0YXJ0SGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGGtleVVuaXRzQ2xhaW1TdGFydEhlaWdodAUGaGVpZ2h0ABJ1bml0c0NsYWltSW50ZXJ2YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa2V5VW5pdHNDbGFpbUludGVydmFsAAABEmtleUxlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MJALkJAgkAzAgCAgIlcwkAzAgCBQtub2RlQWRkcmVzcwUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nTm9kZURhdGECC3VzZXJBZGRyZXNzC25vZGVBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABDmtleVVzZXJUb0NsYWltAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIHdG9DbGFpbQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABEmtleVVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICD3VzZXJUb3RhbExvY2tlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIRdW5pdHNDbGFpbWVkQmxvY2sJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARBrZXlVbmxvY2tlZFVuaXRzAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgINdW5sb2NrZWRVbml0cwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFGtleVRvdGFsVW5pdHNDbGFpbWVkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIRdG90YWxVbml0c0NsYWltZWQJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQAQtrZXlMMlRvQnVybgELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICCGwyVG9CdXJuCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEQa2V5TDJCdXJuZWRUb3RhbAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICDWwyQnVybmVkVG90YWwJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQtub2RlQWRkcmVzcwQBaAMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAABQZoZWlnaHQJALkJAgkAzAgCAgQlcyVkCQDMCAIFC25vZGVBZGRyZXNzCQDMCAIJAKQDAQUBaAUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nQnlIZWlnaHQCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzBAFoAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BAAAFBmhlaWdodAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQCkAwEFAWgFA25pbAUDU0VQARJhc3NldFN0cmluZ1RvQnl0ZXMBDWFzc2V0SWRTdHJpbmcDCQAAAgUNYXNzZXRJZFN0cmluZwIFV0FWRVMFBHVuaXQJANkEAQUNYXNzZXRJZFN0cmluZwESYXNzZXRCeXRlc1RvU3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQIFV0FWRVMAD2wyQXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQxrZXlMMkFzc2V0SWQCBVdBVkVTABJ1bml0c0Fzc2V0SWRTdHJpbmcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUPa2V5VW5pdHNBc3NldElkAgVXQVZFUwAObDJBc3NldElkQnl0ZXMJARJhc3NldFN0cmluZ1RvQnl0ZXMBBQ9sMkFzc2V0SWRTdHJpbmcAEXVuaXRzQXNzZXRJZEJ5dGVzCQESYXNzZXRTdHJpbmdUb0J5dGVzAQUSdW5pdHNBc3NldElkU3RyaW5nAAtpc0ZvcmNlU3RvcAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrZXlGb3JjZVN0b3AHAA5pc0ZvcmNlT3V0U3RvcAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ9rZXlGb3JjZU91dFN0b3AHAQ5pc1ZhbGlkQWRkcmVzcwEHYWRkcmVzcwQHJG1hdGNoMAkApggBBQdhZGRyZXNzAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwAPQURNSU5fTElTVF9TSVpFAAUABlFVT1JVTQADABFUWElEX0JZVEVTX0xFTkdUSAAgARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBHR4SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIJYWxsb3dUeElkCQDMCAIFBHR4SWQFA25pbAUDU0VQARBrZXlGdWxsQWRtaW5Wb3RlAgZwcmVmaXgMYWRtaW5BZGRyZXNzCQC5CQIJAMwIAgUGcHJlZml4CQDMCAIFDGFkbWluQWRkcmVzcwUDbmlsBQNTRVABE2tleUFkbWluQWRkcmVzc0xpc3QACQC5CQIJAMwIAgICJXMJAMwIAgIQYWRtaW5BZGRyZXNzTGlzdAUDbmlsBQNTRVABDmtleUFsbG93ZWRUeElkAAkAuQkCCQDMCAICAiVzCQDMCAICBHR4SWQFA25pbAUDU0VQAQxnZXRBZG1pblZvdGUCBnByZWZpeAVhZG1pbgQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFBWFkbWluCQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAENZ2V0QWRtaW5zTGlzdAAEByRtYXRjaDAJAJ0IAgUEdGhpcwkBE2tleUFkbWluQWRkcmVzc0xpc3QAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkAtQkCBQFzBQNTRVAFA25pbAENaXNJbkFkbWluTGlzdAEHYWRkcmVzcwkBD2NvbnRhaW5zRWxlbWVudAIJAQ1nZXRBZG1pbnNMaXN0AAUHYWRkcmVzcwESZ2VuVm90ZXNLZXlzSGVscGVyAgFhDGFkbWluQWRkcmVzcwQLJHQwNTE4NTUyMDkFAWEEBnJlc3VsdAgFCyR0MDUxODU1MjA5Al8xBAZwcmVmaXgIBQskdDA1MTg1NTIwOQJfMgkAlAoCCQDNCAIFBnJlc3VsdAkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFDGFkbWluQWRkcmVzcwUGcHJlZml4AQxnZW5Wb3Rlc0tleXMBCWtleVByZWZpeAQJYWRtaW5MaXN0CQETa2V5QWRtaW5BZGRyZXNzTGlzdAAECyR0MDUzNTY1NDQwCgACJGwJAQ1nZXRBZG1pbnNMaXN0AAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQlrZXlQcmVmaXgKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEmdlblZvdGVzS2V5c0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUEBnJlc3VsdAgFCyR0MDUzNTY1NDQwAl8xBAZwcmVmaXgIBQskdDA1MzU2NTQ0MAJfMgUGcmVzdWx0ARBjb3VudFZvdGVzSGVscGVyAgZyZXN1bHQHdm90ZUtleQkAZAIFBnJlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABCmNvdW50Vm90ZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNvdW50Vm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFARBjbGVhclZvdGVzSGVscGVyAgZyZXN1bHQDa2V5CQDNCAIFBnJlc3VsdAkBC0RlbGV0ZUVudHJ5AQUDa2V5ARNnZXRDbGVhclZvdGVFbnRyaWVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjbGVhclZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEMdm90ZUlOVEVSTkFMBBNjYWxsZXJBZGRyZXNzU3RyaW5nCWtleVByZWZpeAhtaW5Wb3Rlcwp2b3RlUmVzdWx0BAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQQYWRtaW5DdXJyZW50Vm90ZQkBDGdldEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQDZXJyAwkBASEBCQENaXNJbkFkbWluTGlzdAEFE2NhbGxlckFkZHJlc3NTdHJpbmcJAQh0aHJvd0VycgEJAKwCAgkArAICAglBZGRyZXNzOiAFE2NhbGxlckFkZHJlc3NTdHJpbmcCEiBub3QgaW4gQWRtaW4gbGlzdAMJAAACBRBhZG1pbkN1cnJlbnRWb3RlAAEJAQh0aHJvd0VycgEJAKwCAgUHdm90ZUtleQISIHlvdSBhbHJlYWR5IHZvdGVkBQR1bml0AwkAAAIFA2VycgUDZXJyBAV2b3RlcwkBCmNvdW50Vm90ZXMBBQlrZXlQcmVmaXgDCQBnAgkAZAIFBXZvdGVzAAEFCG1pblZvdGVzBBBjbGVhclZvdGVFbnRyaWVzCQETZ2V0Q2xlYXJWb3RlRW50cmllcwEFCWtleVByZWZpeAkAzggCBRBjbGVhclZvdGVFbnRyaWVzBQp2b3RlUmVzdWx0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd2b3RlS2V5AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZ2V0TGVhc2luZ05vZGVFbnRyeQMLbm9kZUFkZHJlc3MNY3VycmVudExlYXNlZApuZXh0TGVhc2VkBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFDWN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUKbmV4dExlYXNlZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIJARJrZXlMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldExlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MEGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQESa2V5TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEByRtYXRjaDAFGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBBFub2RlQ3VycmVudFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEEEW5vZGVDdXJyZW50TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQObm9kZU5leHRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAADBA5ub2RlTmV4dExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAQDAwkAZgIFDm5vZGVOZXh0UGVyaW9kBQZoZWlnaHQGCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEJAJQKAgURbm9kZUN1cnJlbnRMZWFzZWQFDm5vZGVOZXh0TGVhc2VkCQCUCgIFDm5vZGVOZXh0TGVhc2VkBQ5ub2RlTmV4dExlYXNlZAkAlAoCAAAAAAETZ2V0VXNlckxlYXNpbmdFbnRyeQQLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MRdXNlckN1cnJlbnRMZWFzZWQOdXNlck5leHRMZWFzZWQEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgIIJWQlZCVkJWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQURdXNlckN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUOdXNlck5leHRMZWFzZWQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldFVzZXJMZWFzaW5nRGF0YQILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEGGxlYXNpbmdVc2VyRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwQHJG1hdGNoMAUYbGVhc2luZ1VzZXJEYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEEXVzZXJDdXJyZW50UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAQQRdXNlckN1cnJlbnRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAACBA51c2VyTmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMEDnVzZXJOZXh0TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUOdXNlck5leHRQZXJpb2QFBmhlaWdodAYJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAlAoCBRF1c2VyQ3VycmVudExlYXNlZAUOdXNlck5leHRMZWFzZWQJAJQKAgUOdXNlck5leHRMZWFzZWQFDnVzZXJOZXh0TGVhc2VkCQCUCgIAAAAAARNnZXRVc2VyVG9DbGFpbUVudHJ5Awt1c2VyQWRkcmVzcwd0b0NsYWltCHRvVW5sb2NrBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFB3RvQ2xhaW0JAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUIdG9VbmxvY2sFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwULdmFsdWVTdHJpbmcBFWdldFVzZXJUb0NsYWltQmFsYW5jZQELdXNlckFkZHJlc3MEGHVzZXJUb0NsYWltRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwQHJG1hdGNoMAUYdXNlclRvQ2xhaW1EYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEDWN1cnJlbnRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAABBAd0b0NsYWltCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQKbmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMECHRvVW5sb2NrCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUKbmV4dFBlcmlvZAUGaGVpZ2h0BgkAAAIFD2N1cnJlbnRQZXJpb2RJZAAACQCUCgIFB3RvQ2xhaW0FCHRvVW5sb2NrCQCUCgIJAGQCBQd0b0NsYWltBQh0b1VubG9jawAACQCUCgIAAAAAARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQILdXNlckFkZHJlc3MPdXNlclRvdGFsTG9ja2VkCQEMSW50ZWdlckVudHJ5AgkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBQ91c2VyVG90YWxMb2NrZWQBEmdldFVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzAAABFWNhbGN1bGF0ZVVuaXRzVG9DbGFpbQELdXNlckFkZHJlc3MED2NsYWltZWRCbG9ja0tleQkBFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQULdXNlckFkZHJlc3MEDGNsYWltZWRCbG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9jbGFpbWVkQmxvY2tLZXkFFXVuaXRzQ2xhaW1TdGFydEhlaWdodAQUdW5pdHNQZXJCbG9ja1NjYWxlMTYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXa2V5VW5pdHNQZXJCbG9ja1NjYWxlMTYAAAQMY3VycmVudEJsb2NrCQCXAwEJAMwIAgkAZAIFFXVuaXRzQ2xhaW1TdGFydEhlaWdodAUSdW5pdHNDbGFpbUludGVydmFsCQDMCAIFBmhlaWdodAUDbmlsBAxibG9ja3NQYXNzZWQJAGUCBQxjdXJyZW50QmxvY2sFDGNsYWltZWRCbG9jawQMYW1vdW50U3Rha2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MECGwyVG9CdXJuCQBrAwUMYW1vdW50U3Rha2VkBQxibG9ja3NQYXNzZWQFEnVuaXRzQ2xhaW1JbnRlcnZhbAQPdW5pdHNUb0NsYWltTm93CQBrAwUMYW1vdW50U3Rha2VkCQBoAgUUdW5pdHNQZXJCbG9ja1NjYWxlMTYFDGJsb2Nrc1Bhc3NlZAUHc2NhbGUxNgkAlgoEBQ91bml0c1RvQ2xhaW1Ob3cFCGwyVG9CdXJuBQxjdXJyZW50QmxvY2sJAJUKAwUMYmxvY2tzUGFzc2VkBRV1bml0c0NsYWltU3RhcnRIZWlnaHQFEnVuaXRzQ2xhaW1JbnRlcnZhbAEUZ2V0VW5sb2NrVW5pdHNBY3Rpb24BC3VzZXJBZGRyZXNzBA5rVW5sb2NrZWRVbml0cwkBEGtleVVubG9ja2VkVW5pdHMBBQt1c2VyQWRkcmVzcwQNdW5sb2NrZWRVbml0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rVW5sb2NrZWRVbml0cwAABAlrTDJUb0J1cm4JAQtrZXlMMlRvQnVybgEFC3VzZXJBZGRyZXNzBAhsMlRvQnVybgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQlrTDJUb0J1cm4AAAQNdG90YWxMMkxvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBA0kdDAxMTQ5NjExNzA2CQEVY2FsY3VsYXRlVW5pdHNUb0NsYWltAQULdXNlckFkZHJlc3MED3VuaXRzVG9DbGFpbU5vdwgFDSR0MDExNDk2MTE3MDYCXzEEC2wyVG9CdXJuTm93CAUNJHQwMTE0OTYxMTcwNgJfMgQMY3VycmVudEJsb2NrCAUNJHQwMTE0OTYxMTcwNgJfMwQEX3RtcAgFDSR0MDExNDk2MTE3MDYCXzQDCQBnAgAABQ91bml0c1RvQ2xhaW1Ob3cDCQBmAgUNdG90YWxMMkxvY2tlZAAABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlVbml0c0NsYWltZWRCbG9jawEFC3VzZXJBZGRyZXNzBQxjdXJyZW50QmxvY2sFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQULdXNlckFkZHJlc3MFDGN1cnJlbnRCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0wyVG9CdXJuCQBkAgUIbDJUb0J1cm4FC2wyVG9CdXJuTm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5rVW5sb2NrZWRVbml0cwkAZAIFDXVubG9ja2VkVW5pdHMFD3VuaXRzVG9DbGFpbU5vdwUDbmlsARFnZXRVbnN0YWtlQWN0aW9ucwMLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MNdW5zdGFrZUFtb3VudAQNJHQwMTIyNzcxMjM1MAkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBBFub2RlQ3VycmVudExlYXNlZAgFDSR0MDEyMjc3MTIzNTACXzEEDm5vZGVOZXh0TGVhc2VkCAUNJHQwMTIyNzcxMjM1MAJfMgQNJHQwMTIzNTUxMjQ0MQkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQRdXNlckN1cnJlbnRMZWFzZWQIBQ0kdDAxMjM1NTEyNDQxAl8xBA51c2VyTmV4dExlYXNlZAgFDSR0MDEyMzU1MTI0NDECXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQEBIQEFDmlzRm9yY2VPdXRTdG9wBgkBCHRocm93RXJyAQIddW5zdGFrZSBpcyB0ZW1wb3JhcnkgZGlzYWJsZWQJAMwIAgMJAGYCBQ11bnN0YWtlQW1vdW50AAAGCQEIdGhyb3dFcnIBAid1bnN0YWtlIGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQ51c2VyTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAYJAQh0aHJvd0VycgECOXVuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHVzZXIgc3Rha2VkIGFtb3VudAkAzAgCAwkAZwIFDm5vZGVOZXh0TGVhc2VkBQ11bnN0YWtlQW1vdW50BgkBCHRocm93RXJyAQI5dW5zdGFrZSBhbW91bnQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgbm9kZSBzdGFrZWQgYW1vdW50CQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQtub2RlQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhpub2RlIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQtub2RlQWRkcmVzcwUDbmlsAgEgCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQt1c2VyQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhp1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEEG5ld05vZGVOZXh0TGVhc2UJAGUCBQ5ub2RlTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAQRbmV3VXNlck5leHRMZWFzZWQJAGUCBQ51c2VyTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAQNJHQwMTMzMjUxMzM4NQkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTMzMjUxMzM4NQJfMQQIdG9VbmxvY2sIBQ0kdDAxMzMyNTEzMzg1Al8yBAtuZXdUb1VubG9jawkAZAIFCHRvVW5sb2NrBQ11bnN0YWtlQW1vdW50BA91c2VyVG90YWxMb2NrZWQJARJnZXRVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwQSbmV3VXNlclRvdGFsTG9ja2VkCQBlAgUPdXNlclRvdGFsTG9ja2VkBQ11bnN0YWtlQW1vdW50BBR1bml0c1VubG9ja2VkQWN0aW9ucwkBFGdldFVubG9ja1VuaXRzQWN0aW9uAQULdXNlckFkZHJlc3MJAM4IAgkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFB3RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsBRR1bml0c1VubG9ja2VkQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCC3VzZXJBZGRyZXNzC2NsYWltQW1vdW50BA0kdDAxNDIwNDE0MjY0CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxNDIwNDE0MjY0Al8xBAh0b1VubG9jawgFDSR0MDE0MjA0MTQyNjQCXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQEBIQEFDmlzRm9yY2VPdXRTdG9wBgkBCHRocm93RXJyAQIbY2xhaW0gaXMgdGVtcG9yYXJ5IGRpc2FibGVkCQDMCAIDCQBmAgULY2xhaW1BbW91bnQAAAYJAQh0aHJvd0VycgECJWNsYWltIGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQd0b0NsYWltBQtjbGFpbUFtb3VudAYJAQh0aHJvd0VycgECNGNsYWltIGFtb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB1bmxvY2tlZCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKbmV3VG9DbGFpbQkAZQIFB3RvQ2xhaW0FC2NsYWltQW1vdW50CQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FCHRvVW5sb2NrCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3VzZXJBZGRyZXNzBQtjbGFpbUFtb3VudAUObDJBc3NldElkQnl0ZXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgESZ2V0U3Rha2VGb3JBY3Rpb25zAgt1c2VyQWRkcmVzcwFpBA0kdDAxNTAzMDE1MDkwCQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxNTAzMDE1MDkwAl8xBAh0b1VubG9jawgFDSR0MDE1MDMwMTUwOTACXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQBnAgABCQCQAwEIBQFpCHBheW1lbnRzBgkBCHRocm93RXJyAQIRbWF4aW11bSAxIHBheW1lbnQJAMwIAgMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUObDJBc3NldElkQnl0ZXMGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIacGF5bWVudCBhc3NldElkIHNob3VsZCBiZToJAMwIAgUPbDJBc3NldElkU3RyaW5nBQNuaWwCASAJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKbmV3VG9DbGFpbQkAZAIFB3RvQ2xhaW0ICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FCHRvVW5sb2NrBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD2dldFN0YWtlQWN0aW9ucwQLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MRdXNlckxlYXNpbmdBbW91bnQBaQQNJHQwMTU4MjIxNTg4MgkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTU4MjIxNTg4MgJfMQQIdG9VbmxvY2sIBQ0kdDAxNTgyMjE1ODgyAl8yBA1wYXltZW50QW1vdW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQJYXZhaWxhYmxlCQBkAgkAZAIFCHRvVW5sb2NrBQd0b0NsYWltBQ1wYXltZW50QW1vdW50BAZjaGVja3MJAMwIAgMJAQEhAQULaXNGb3JjZVN0b3AGCQEIdGhyb3dFcnIBAh1jb250cmFjdCBpcyB0ZW1wb3Jhcnkgc3RvcHBlZAkAzAgCAwkAZwIAAQkAkAMBCAUBaQhwYXltZW50cwYJAQh0aHJvd0VycgECEW1heGltdW0gMSBwYXltZW50CQDMCAIDAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAYJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDmwyQXNzZXRJZEJ5dGVzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnBheW1lbnQgYXNzZXRJZCBzaG91bGQgYmU6CQDMCAIFD2wyQXNzZXRJZFN0cmluZwUDbmlsAgEgCQDMCAIDCQBmAgURdXNlckxlYXNpbmdBbW91bnQAAAYJAQh0aHJvd0VycgECH2Ftb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQlhdmFpbGFibGUFEXVzZXJMZWFzaW5nQW1vdW50BgkBCHRocm93RXJyAQI7YW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIChwYXltZW50ICsgYXZhaWxhYmxlKSBhbW91bnQJAMwIAgMJAGcCBRF1c2VyTGVhc2luZ0Ftb3VudAUNcGF5bWVudEFtb3VudAYJAAIBAjBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgb3IgZXF1YWwgcGF5bWVudCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC25vZGVBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGm5vZGUgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC25vZGVBZGRyZXNzBQNuaWwCASAJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQNJHQwMTY5NTcxNzAzMAkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBBFub2RlQ3VycmVudExlYXNlZAgFDSR0MDE2OTU3MTcwMzACXzEEDm5vZGVOZXh0TGVhc2VkCAUNJHQwMTY5NTcxNzAzMAJfMgQQbmV3Tm9kZU5leHRMZWFzZQkAZAIFDm5vZGVOZXh0TGVhc2VkBRF1c2VyTGVhc2luZ0Ftb3VudAQNJHQwMTcwOTgxNzE4NAkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQRdXNlckN1cnJlbnRMZWFzZWQIBQ0kdDAxNzA5ODE3MTg0Al8xBA51c2VyTmV4dExlYXNlZAgFDSR0MDE3MDk4MTcxODQCXzIEEW5ld1VzZXJOZXh0TGVhc2VkCQBkAgUOdXNlck5leHRMZWFzZWQFEXVzZXJMZWFzaW5nQW1vdW50BBJmcm9tVW5sb2NrZWRBbW91bnQJAGUCBRF1c2VyTGVhc2luZ0Ftb3VudAUNcGF5bWVudEFtb3VudAQLbmV3VG9VbmxvY2sJAJYDAQkAzAgCAAAJAMwIAgkAZQIFCHRvVW5sb2NrBRJmcm9tVW5sb2NrZWRBbW91bnQFA25pbAQKbmV3VG9DbGFpbQkAlwMBCQDMCAIFB3RvQ2xhaW0JAMwIAgkAZAIFB3RvQ2xhaW0JAGUCBQh0b1VubG9jawUSZnJvbVVubG9ja2VkQW1vdW50BQNuaWwED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBBJuZXdVc2VyVG90YWxMb2NrZWQJAGQCBQ91c2VyVG90YWxMb2NrZWQFEXVzZXJMZWFzaW5nQW1vdW50BBR1bml0c1VubG9ja2VkQWN0aW9ucwkBFGdldFVubG9ja1VuaXRzQWN0aW9uAQULdXNlckFkZHJlc3MJAM4IAgkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsBRR1bml0c1VubG9ja2VkQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzAWkEBmNoZWNrcwkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECIHBheW1lbnQgc2l6ZSBzaG91bGQgYmUgZXhhY3RseSAxBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJAQ9nZXRTdGFrZUFjdGlvbnMEBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQFpCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARxnZXRTZXROZXdQZXJpb2RMZW5ndGhBY3Rpb25zAQ9uZXdQZXJpb2RMZW5ndGgEBWNoZWNrCQDMCAIDCQBmAgUPbmV3UGVyaW9kTGVuZ3RoAAAGCQEIdGhyb3dFcnIBAiZwZXJpb2QgbGVuZ3RoIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa2V5UGVyaW9kTGVuZ3RoBQ9uZXdQZXJpb2RMZW5ndGgJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVBlcmlvZE9mZnNldEhlaWdodAUGaGVpZ2h0BQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleVBlcmlvZE9mZnNldElkCQBkAgUPY3VycmVudFBlcmlvZElkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVBlcmlvZE9mZnNldEhlaWdodAUQbmV4dFBlcmlvZEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa2V5UGVyaW9kTGVuZ3RoBQ9uZXdQZXJpb2RMZW5ndGgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERZ2V0VW5pdHNDbGFpbURhdGEBC3VzZXJBZGRyZXNzBA0kdDAxOTA2OTE5MTYwCQEVY2FsY3VsYXRlVW5pdHNUb0NsYWltAQULdXNlckFkZHJlc3MED3VubG9ja2VkVW5pdE5vdwgFDSR0MDE5MDY5MTkxNjACXzEEC2wyVG9CdXJuTm93CAUNJHQwMTkwNjkxOTE2MAJfMgQMY3VycmVudEJsb2NrCAUNJHQwMTkwNjkxOTE2MAJfMwQEX3RtcAgFDSR0MDE5MDY5MTkxNjACXzQEEXVubG9ja2VkVW5pdHNQcmV2CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARBrZXlVbmxvY2tlZFVuaXRzAQULdXNlckFkZHJlc3MAAAQLdW5pdHNUb1NlbmQJAGQCBQ91bmxvY2tlZFVuaXROb3cFEXVubG9ja2VkVW5pdHNQcmV2BAxsMlRvQnVyblByZXYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBC2tleUwyVG9CdXJuAQULdXNlckFkZHJlc3MAAAQIbDJUb0J1cm4JAGQCBQxsMlRvQnVyblByZXYFC2wyVG9CdXJuTm93BBF0b3RhbFVuaXRzQ2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEUa2V5VG90YWxVbml0c0NsYWltZWQBBQt1c2VyQWRkcmVzcwAABA10b3RhbEwyQnVybmVkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARBrZXlMMkJ1cm5lZFRvdGFsAQULdXNlckFkZHJlc3MAAAkAlwoFBQt1bml0c1RvU2VuZAURdG90YWxVbml0c0NsYWltZWQFCGwyVG9CdXJuBQ10b3RhbEwyQnVybmVkBQxjdXJyZW50QmxvY2sBFGdldENsYWltVW5pdHNBY3Rpb25zAQt1c2VyQWRkcmVzcwQNJHQwMTk3NTIxOTg2MAkBEWdldFVuaXRzQ2xhaW1EYXRhAQULdXNlckFkZHJlc3MEC3VuaXRzVG9TZW5kCAUNJHQwMTk3NTIxOTg2MAJfMQQRdG90YWxVbml0c0NsYWltZWQIBQ0kdDAxOTc1MjE5ODYwAl8yBAhsMlRvQnVybggFDSR0MDE5NzUyMTk4NjACXzMEDXRvdGFsTDJCdXJuZWQIBQ0kdDAxOTc1MjE5ODYwAl80BAxjbGFpbWVkQmxvY2sIBQ0kdDAxOTc1MjE5ODYwAl81BAVjaGVjawkAzAgCAwkAZgIFC3VuaXRzVG9TZW5kAAAGCQEIdGhyb3dFcnIBAhBub3RoaW5nIHRvIGNsYWltBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBApidXJuQWN0aW9uBAckbWF0Y2gwBQ5sMkFzc2V0SWRCeXRlcwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkAzAgCCQEEQnVybgIFAmlkBQhsMlRvQnVybgUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQULdXNlckFkZHJlc3MFDGNsYWltZWRCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVRvdGFsVW5pdHNDbGFpbWVkAQULdXNlckFkZHJlc3MJAGQCBRF0b3RhbFVuaXRzQ2xhaW1lZAULdW5pdHNUb1NlbmQJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlMMkJ1cm5lZFRvdGFsAQULdXNlckFkZHJlc3MJAGQCBQ10b3RhbEwyQnVybmVkBQhsMlRvQnVybgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleVVubG9ja2VkVW5pdHMBBQt1c2VyQWRkcmVzcwAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQELa2V5TDJUb0J1cm4BBQt1c2VyQWRkcmVzcwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3VzZXJBZGRyZXNzBQt1bml0c1RvU2VuZAURdW5pdHNBc3NldElkQnl0ZXMFA25pbAUKYnVybkFjdGlvbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhABaQESc2V0TmV3UGVyaW9kTGVuZ3RoAQ9uZXdQZXJpb2RMZW5ndGgEBmNoZWNrcwkAzAgCAwkBDWlzSW5BZG1pbkxpc3QBCQClCAEIBQFpBmNhbGxlcgYJAQh0aHJvd0VycgECGmNhbGxlciBpcyBub3QgaW4gYWRtaW5MaXN0BQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJARxnZXRTZXROZXdQZXJpb2RMZW5ndGhBY3Rpb25zAQUPbmV3UGVyaW9kTGVuZ3RoCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmNsYWltVW5pdHMABAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARRnZXRDbGFpbVVuaXRzQWN0aW9ucwEFC3VzZXJBZGRyZXNzAWkBEHNldEZvcmNlU3RvcEZsYWcBBHN0b3AEBWNoZWNrCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDGtleUZvcmNlU3RvcAUEc3RvcAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE3NldEZvcmNlT3V0U3RvcEZsYWcBBHN0b3AEBWNoZWNrCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAMwIAgkBDEJvb2xlYW5FbnRyeQIFD2tleUZvcmNlT3V0U3RvcAUEc3RvcAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2dldE5vZGVEYXRhUkVBRE9OTFkBC25vZGVBZGRyZXNzBA0kdDAyMTU5MjIxNjU2CQESZ2V0TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEDGN1cnJlbnRMZWFzZQgFDSR0MDIxNTkyMjE2NTYCXzEECm5leHRMZWFzZWQIBQ0kdDAyMTU5MjIxNjU2Al8yCQCUCgIFA25pbAkAlwoFBRNjdXJyZW50UGVyaW9kSGVpZ2h0BQxjdXJyZW50TGVhc2UFEG5leHRQZXJpb2RIZWlnaHQFCm5leHRMZWFzZWQFBmhlaWdodAFpARpnZXRVc2VyTGVhc2luZ0RhdGFSRUFET05MWQILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEDSR0MDIyMDI2MjIxMDMJARJnZXRVc2VyTGVhc2luZ0RhdGECBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MEDGN1cnJlbnRMZWFzZQgFDSR0MDIyMDI2MjIxMDMCXzEECm5leHRMZWFzZWQIBQ0kdDAyMjAyNjIyMTAzAl8yCQCUCgIFA25pbAkAlwoFBRNjdXJyZW50UGVyaW9kSGVpZ2h0BQxjdXJyZW50TGVhc2UFEG5leHRQZXJpb2RIZWlnaHQFCm5leHRMZWFzZWQFBmhlaWdodAFpARNnZXRVc2VyRGF0YVJFQURPTkxZAQt1c2VyQWRkcmVzcwQNJHQwMjI3MDcyMjc2NwkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMjI3MDcyMjc2NwJfMQQIdG9VbmxvY2sIBQ0kdDAyMjcwNzIyNzY3Al8yBA91c2VyVG90YWxMb2NrZWQJARJnZXRVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwQNJHQwMjI4MzAyMjkzOAkBEWdldFVuaXRzQ2xhaW1EYXRhAQULdXNlckFkZHJlc3MEC3VuaXRzVG9TZW5kCAUNJHQwMjI4MzAyMjkzOAJfMQQRdG90YWxVbml0c0NsYWltZWQIBQ0kdDAyMjgzMDIyOTM4Al8yBAhsMlRvQnVybggFDSR0MDIyODMwMjI5MzgCXzMEDXRvdGFsTDJCdXJuZWQIBQ0kdDAyMjgzMDIyOTM4Al80BAxjbGFpbWVkQmxvY2sIBQ0kdDAyMjgzMDIyOTM4Al81BBR1bml0c1BlckJsb2NrU2NhbGUxNgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRdrZXlVbml0c1BlckJsb2NrU2NhbGUxNgAABA9yZW1haW5pbmdibG9ja3MJAJYDAQkAzAgCAAAJAMwIAgkAZQIJAGQCBRV1bml0c0NsYWltU3RhcnRIZWlnaHQFEnVuaXRzQ2xhaW1JbnRlcnZhbAUGaGVpZ2h0BQNuaWwJAJQKAgUDbmlsCQCfCg0FE2N1cnJlbnRQZXJpb2RIZWlnaHQFB3RvQ2xhaW0FEG5leHRQZXJpb2RIZWlnaHQFCHRvVW5sb2NrBQ91c2VyVG90YWxMb2NrZWQFBmhlaWdodAULdW5pdHNUb1NlbmQFEXRvdGFsVW5pdHNDbGFpbWVkBQhsMlRvQnVybgUNdG90YWxMMkJ1cm5lZAUMY2xhaW1lZEJsb2NrBRR1bml0c1BlckJsb2NrU2NhbGUxNgUPcmVtYWluaW5nYmxvY2tzAWkBDmxlYXNlQnlBZGRyZXNzAgtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwkBGmdldFN0YWtlRnJvbVBheW1lbnRBY3Rpb25zAwULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQFpAWkBBWxlYXNlAQtub2RlQWRkcmVzcwQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFAWkBaQEPbGVhc2VGcm9tTG9ja2VkAgtub2RlQWRkcmVzcwZhbW91bnQEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBD2dldFN0YWtlQWN0aW9ucwQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUGYW1vdW50BQFpAWkBC2NhbmNlbExlYXNlAgtub2RlQWRkcmVzcwZhbW91bnQEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBEWdldFVuc3Rha2VBY3Rpb25zAwULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQZhbW91bnQBaQEFY2xhaW0BBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCBQt1c2VyQWRkcmVzcwUGYW1vdW50AWkBCGNsYWltQWxsAAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBA0kdDAyNDM2ODI0NDI4CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAyNDM2ODI0NDI4Al8xBAh0b1VubG9jawgFDSR0MDI0MzY4MjQ0MjgCXzIEBmNoZWNrcwkAzAgCAwkAZgIFB3RvQ2xhaW0AAAYJAQh0aHJvd0VycgECEG5vdGhpbmcgdG8gY2xhaW0FA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBF2dldENsYWltVW5sb2NrZWRBY3Rpb25zAgULdXNlckFkZHJlc3MFB3RvQ2xhaW0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIc3Rha2VGb3IBC3VzZXJBZGRyZXNzCQESZ2V0U3Rha2VGb3JBY3Rpb25zAgULdXNlckFkZHJlc3MFAWkBaQERc3RhcnRVbml0c1Zlc3RpbmcBFXVuaXRzQ2xhaW1OZXdJbnRlcnZhbAQHdG90YWxMMgCAgKjsha/RsQEECnRvdGFsVW5pdHMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBR1bml0c1BlckJsb2NrU2NhbGUxNgkAaQIJAGsDBQp0b3RhbFVuaXRzBQdzY2FsZTE2BQd0b3RhbEwyBRV1bml0c0NsYWltTmV3SW50ZXJ2YWwEBWNoZWNrCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAhNzaG91bGQgYmUgMSBwYXltZW50CQDMCAIDCQBmAgUUdW5pdHNQZXJCbG9ja1NjYWxlMTYAAAYJAQh0aHJvd0VycgECKHVuaXRzIHBlciBibG9jayBzaG91bGQgYmUgZ3JlYXRlZCB0aGFuIDAFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAMwIAgkBDEludGVnZXJFbnRyeQIFF2tleVVuaXRzUGVyQmxvY2tTY2FsZTE2BRR1bml0c1BlckJsb2NrU2NhbGUxNgkAzAgCCQEMSW50ZWdlckVudHJ5AgUYa2V5VW5pdHNDbGFpbVN0YXJ0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVVuaXRzQ2xhaW1JbnRlcnZhbAUVdW5pdHNDbGFpbU5ld0ludGVydmFsCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tleVVuaXRzQXNzZXRJZAkBEmFzc2V0Qnl0ZXNUb1N0cmluZwEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3ZvdGVGb3JUeElkAQR0eElkBBNjYWxsZXJBZGRyZXNzU3RyaW5nCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMECWtleVByZWZpeAkBGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEFBHR4SWQEBnJlc3VsdAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5QWxsb3dlZFR4SWQABQR0eElkBQNuaWwEEWFsbG93ZWRUeElkT3B0aW9uCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAAEA2VycgkAzAgCAwkAAAIJAMgBAQkA2QQBBQR0eElkBRFUWElEX0JZVEVTX0xFTkdUSAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAISIGlzIG5vdCB2YWxpZCB0eElkCQDMCAIDAwkAAAIFEWFsbG93ZWRUeElkT3B0aW9uBQR1bml0BgkBAiE9AgkBBXZhbHVlAQURYWxsb3dlZFR4SWRPcHRpb24FBHR4SWQGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEyBpcyBhbHJlYWR5IGFsbG93ZWQFA25pbAMJAAACBQNlcnIFA2VycgkBDHZvdGVJTlRFUk5BTAQFE2NhbGxlckFkZHJlc3NTdHJpbmcFCWtleVByZWZpeAUGUVVPUlVNBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAhieUFkbWlucwkAAAIIBQJ0eAJpZAkA2QQBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAACAAQHYnlPd25lcgMJAGcCCQCQAwEJAQ1nZXRBZG1pbnNMaXN0AAUGUVVPUlVNBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQMFCGJ5QWRtaW5zBgUHYnlPd25lci261h8=", "chainId": 84, "height": 3337702, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GZ1YEFBLNaR9ZxAVnGKBtn6mgMyfRyEhKnJD6W8pAN6U Next: 3nvQxbFtSuZgraJLAPMZLVVn1K45kZYKZjy2KXiMWaXH Diff:
OldNewDifferences
371371 let unlockedUnits = valueOrElse(getInteger(this, kUnlockedUnits), 0)
372372 let kL2ToBurn = keyL2ToBurn(userAddress)
373373 let l2ToBurn = valueOrElse(getInteger(this, kL2ToBurn), 0)
374- let $t01144011531 = calculateUnitsToClaim(userAddress)
375- let unitsToClaimNow = $t01144011531._1
376- let l2ToBurnNow = $t01144011531._2
377- let currentBlock = $t01144011531._3
378- let _tmp = $t01144011531._4
374+ let totalL2Locked = getUserTotalLocked(userAddress)
375+ let $t01149611706 = calculateUnitsToClaim(userAddress)
376+ let unitsToClaimNow = $t01149611706._1
377+ let l2ToBurnNow = $t01149611706._2
378+ let currentBlock = $t01149611706._3
379+ let _tmp = $t01149611706._4
379380 if ((0 >= unitsToClaimNow))
380- then nil
381+ then if ((totalL2Locked > 0))
382+ then nil
383+ else [IntegerEntry(keyUnitsClaimedBlock(userAddress), currentBlock)]
381384 else [IntegerEntry(keyUnitsClaimedBlock(userAddress), currentBlock), IntegerEntry(kL2ToBurn, (l2ToBurn + l2ToBurnNow)), IntegerEntry(kUnlockedUnits, (unlockedUnits + unitsToClaimNow))]
382385 }
383386
384387
385388 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
386- let $t01192611999 = getLeasingNodeData(nodeAddress)
387- let nodeCurrentLeased = $t01192611999._1
388- let nodeNextLeased = $t01192611999._2
389- let $t01200412090 = getUserLeasingData(nodeAddress, userAddress)
390- let userCurrentLeased = $t01200412090._1
391- let userNextLeased = $t01200412090._2
389+ let $t01227712350 = getLeasingNodeData(nodeAddress)
390+ let nodeCurrentLeased = $t01227712350._1
391+ let nodeNextLeased = $t01227712350._2
392+ let $t01235512441 = getUserLeasingData(nodeAddress, userAddress)
393+ let userCurrentLeased = $t01235512441._1
394+ let userNextLeased = $t01235512441._2
392395 let checks = [if (!(isForceStop))
393396 then true
394397 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
408411 then {
409412 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
410413 let newUserNextLeased = (userNextLeased - unstakeAmount)
411- let $t01297413034 = getUserToClaimBalance(userAddress)
412- let toClaim = $t01297413034._1
413- let toUnlock = $t01297413034._2
414+ let $t01332513385 = getUserToClaimBalance(userAddress)
415+ let toClaim = $t01332513385._1
416+ let toUnlock = $t01332513385._2
414417 let newToUnlock = (toUnlock + unstakeAmount)
415418 let userTotalLocked = getUserTotalLocked(userAddress)
416419 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
422425
423426
424427 func getClaimUnlockedActions (userAddress,claimAmount) = {
425- let $t01385313913 = getUserToClaimBalance(userAddress)
426- let toClaim = $t01385313913._1
427- let toUnlock = $t01385313913._2
428+ let $t01420414264 = getUserToClaimBalance(userAddress)
429+ let toClaim = $t01420414264._1
430+ let toUnlock = $t01420414264._2
428431 let checks = [if (!(isForceStop))
429432 then true
430433 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
446449
447450
448451 func getStakeForActions (userAddress,i) = {
449- let $t01467914739 = getUserToClaimBalance(userAddress)
450- let toClaim = $t01467914739._1
451- let toUnlock = $t01467914739._2
452+ let $t01503015090 = getUserToClaimBalance(userAddress)
453+ let toClaim = $t01503015090._1
454+ let toUnlock = $t01503015090._2
452455 let checks = [if (!(isForceStop))
453456 then true
454457 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
470473
471474
472475 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
473- let $t01547115531 = getUserToClaimBalance(userAddress)
474- let toClaim = $t01547115531._1
475- let toUnlock = $t01547115531._2
476+ let $t01582215882 = getUserToClaimBalance(userAddress)
477+ let toClaim = $t01582215882._1
478+ let toUnlock = $t01582215882._2
476479 let paymentAmount = if ((size(i.payments) == 0))
477480 then 0
478481 else i.payments[0].amount
498501 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
499502 if ((checks == checks))
500503 then {
501- let $t01660616679 = getLeasingNodeData(nodeAddress)
502- let nodeCurrentLeased = $t01660616679._1
503- let nodeNextLeased = $t01660616679._2
504+ let $t01695717030 = getLeasingNodeData(nodeAddress)
505+ let nodeCurrentLeased = $t01695717030._1
506+ let nodeNextLeased = $t01695717030._2
504507 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
505- let $t01674716833 = getUserLeasingData(nodeAddress, userAddress)
506- let userCurrentLeased = $t01674716833._1
507- let userNextLeased = $t01674716833._2
508+ let $t01709817184 = getUserLeasingData(nodeAddress, userAddress)
509+ let userCurrentLeased = $t01709817184._1
510+ let userNextLeased = $t01709817184._2
508511 let newUserNextLeased = (userNextLeased + userLeasingAmount)
509512 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
510513 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
541544
542545
543546 func getUnitsClaimData (userAddress) = {
544- let $t01871818809 = calculateUnitsToClaim(userAddress)
545- let unlockedUnitNow = $t01871818809._1
546- let l2ToBurnNow = $t01871818809._2
547- let currentBlock = $t01871818809._3
548- let _tmp = $t01871818809._4
547+ let $t01906919160 = calculateUnitsToClaim(userAddress)
548+ let unlockedUnitNow = $t01906919160._1
549+ let l2ToBurnNow = $t01906919160._2
550+ let currentBlock = $t01906919160._3
551+ let _tmp = $t01906919160._4
549552 let unlockedUnitsPrev = valueOrElse(getInteger(this, keyUnlockedUnits(userAddress)), 0)
550553 let unitsToSend = (unlockedUnitNow + unlockedUnitsPrev)
551554 let l2ToBurnPrev = valueOrElse(getInteger(this, keyL2ToBurn(userAddress)), 0)
557560
558561
559562 func getClaimUnitsActions (userAddress) = {
560- let $t01940119509 = getUnitsClaimData(userAddress)
561- let unitsToSend = $t01940119509._1
562- let totalUnitsClaimed = $t01940119509._2
563- let l2ToBurn = $t01940119509._3
564- let totalL2Burned = $t01940119509._4
565- let claimedBlock = $t01940119509._5
563+ let $t01975219860 = getUnitsClaimData(userAddress)
564+ let unitsToSend = $t01975219860._1
565+ let totalUnitsClaimed = $t01975219860._2
566+ let l2ToBurn = $t01975219860._3
567+ let totalL2Burned = $t01975219860._4
568+ let claimedBlock = $t01975219860._5
566569 let check = [if ((unitsToSend > 0))
567570 then true
568571 else throwErr("nothing to claim")]
626629
627630 @Callable(i)
628631 func getNodeDataREADONLY (nodeAddress) = {
629- let $t02124121305 = getLeasingNodeData(nodeAddress)
630- let currentLease = $t02124121305._1
631- let nextLeased = $t02124121305._2
632+ let $t02159221656 = getLeasingNodeData(nodeAddress)
633+ let currentLease = $t02159221656._1
634+ let nextLeased = $t02159221656._2
632635 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
633636 }
634637
636639
637640 @Callable(i)
638641 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
639- let $t02167521752 = getUserLeasingData(nodeAddress, userAddress)
640- let currentLease = $t02167521752._1
641- let nextLeased = $t02167521752._2
642+ let $t02202622103 = getUserLeasingData(nodeAddress, userAddress)
643+ let currentLease = $t02202622103._1
644+ let nextLeased = $t02202622103._2
642645 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
643646 }
644647
646649
647650 @Callable(i)
648651 func getUserDataREADONLY (userAddress) = {
649- let $t02235622416 = getUserToClaimBalance(userAddress)
650- let toClaim = $t02235622416._1
651- let toUnlock = $t02235622416._2
652+ let $t02270722767 = getUserToClaimBalance(userAddress)
653+ let toClaim = $t02270722767._1
654+ let toUnlock = $t02270722767._2
652655 let userTotalLocked = getUserTotalLocked(userAddress)
653- let $t02247922587 = getUnitsClaimData(userAddress)
654- let unitsToSend = $t02247922587._1
655- let totalUnitsClaimed = $t02247922587._2
656- let l2ToBurn = $t02247922587._3
657- let totalL2Burned = $t02247922587._4
658- let claimedBlock = $t02247922587._5
656+ let $t02283022938 = getUnitsClaimData(userAddress)
657+ let unitsToSend = $t02283022938._1
658+ let totalUnitsClaimed = $t02283022938._2
659+ let l2ToBurn = $t02283022938._3
660+ let totalL2Burned = $t02283022938._4
661+ let claimedBlock = $t02283022938._5
659662 let unitsPerBlockScale16 = valueOrElse(getInteger(this, keyUnitsPerBlockScale16), 0)
660663 let remainingblocks = max([0, ((unitsClaimStartHeight + unitsClaimInterval) - height)])
661664 $Tuple2(nil, $Tuple13(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock, unitsPerBlockScale16, remainingblocks))
703706 @Callable(i)
704707 func claimAll () = {
705708 let userAddress = toString(i.caller)
706- let $t02401724077 = getUserToClaimBalance(userAddress)
707- let toClaim = $t02401724077._1
708- let toUnlock = $t02401724077._2
709+ let $t02436824428 = getUserToClaimBalance(userAddress)
710+ let toClaim = $t02436824428._1
711+ let toUnlock = $t02436824428._2
709712 let checks = [if ((toClaim > 0))
710713 then true
711714 else throwErr("nothing to claim")]
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(amountStaked, (unitsPerBlockScale16 * blocksPassed), scale16)
365365 $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 $t01144011531 = calculateUnitsToClaim(userAddress)
375- let unitsToClaimNow = $t01144011531._1
376- let l2ToBurnNow = $t01144011531._2
377- let currentBlock = $t01144011531._3
378- let _tmp = $t01144011531._4
374+ let totalL2Locked = getUserTotalLocked(userAddress)
375+ let $t01149611706 = calculateUnitsToClaim(userAddress)
376+ let unitsToClaimNow = $t01149611706._1
377+ let l2ToBurnNow = $t01149611706._2
378+ let currentBlock = $t01149611706._3
379+ let _tmp = $t01149611706._4
379380 if ((0 >= unitsToClaimNow))
380- then nil
381+ then if ((totalL2Locked > 0))
382+ then nil
383+ else [IntegerEntry(keyUnitsClaimedBlock(userAddress), currentBlock)]
381384 else [IntegerEntry(keyUnitsClaimedBlock(userAddress), currentBlock), IntegerEntry(kL2ToBurn, (l2ToBurn + l2ToBurnNow)), IntegerEntry(kUnlockedUnits, (unlockedUnits + unitsToClaimNow))]
382385 }
383386
384387
385388 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
386- let $t01192611999 = getLeasingNodeData(nodeAddress)
387- let nodeCurrentLeased = $t01192611999._1
388- let nodeNextLeased = $t01192611999._2
389- let $t01200412090 = getUserLeasingData(nodeAddress, userAddress)
390- let userCurrentLeased = $t01200412090._1
391- let userNextLeased = $t01200412090._2
389+ let $t01227712350 = getLeasingNodeData(nodeAddress)
390+ let nodeCurrentLeased = $t01227712350._1
391+ let nodeNextLeased = $t01227712350._2
392+ let $t01235512441 = getUserLeasingData(nodeAddress, userAddress)
393+ let userCurrentLeased = $t01235512441._1
394+ let userNextLeased = $t01235512441._2
392395 let checks = [if (!(isForceStop))
393396 then true
394397 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
395398 then true
396399 else throwErr("unstake is temporary disabled"), if ((unstakeAmount > 0))
397400 then true
398401 else throwErr("unstake amount should be greater than 0"), if ((userNextLeased >= unstakeAmount))
399402 then true
400403 else throwErr("unstake amount should be less or equal user staked amount"), if ((nodeNextLeased >= unstakeAmount))
401404 then true
402405 else throwErr("unstake amount should be less or equal node staked amount"), if (isValidAddress(nodeAddress))
403406 then true
404407 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
405408 then true
406409 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
407410 if ((checks == checks))
408411 then {
409412 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
410413 let newUserNextLeased = (userNextLeased - unstakeAmount)
411- let $t01297413034 = getUserToClaimBalance(userAddress)
412- let toClaim = $t01297413034._1
413- let toUnlock = $t01297413034._2
414+ let $t01332513385 = getUserToClaimBalance(userAddress)
415+ let toClaim = $t01332513385._1
416+ let toUnlock = $t01332513385._2
414417 let newToUnlock = (toUnlock + unstakeAmount)
415418 let userTotalLocked = getUserTotalLocked(userAddress)
416419 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
417420 let unitsUnlockedActions = getUnlockUnitsAction(userAddress)
418421 ([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)
419422 }
420423 else throw("Strict value is not equal to itself.")
421424 }
422425
423426
424427 func getClaimUnlockedActions (userAddress,claimAmount) = {
425- let $t01385313913 = getUserToClaimBalance(userAddress)
426- let toClaim = $t01385313913._1
427- let toUnlock = $t01385313913._2
428+ let $t01420414264 = getUserToClaimBalance(userAddress)
429+ let toClaim = $t01420414264._1
430+ let toUnlock = $t01420414264._2
428431 let checks = [if (!(isForceStop))
429432 then true
430433 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
431434 then true
432435 else throwErr("claim is temporary disabled"), if ((claimAmount > 0))
433436 then true
434437 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
435438 then true
436439 else throwErr("claim amount should be less or equal unlocked amount"), if (isValidAddress(userAddress))
437440 then true
438441 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
439442 if ((checks == checks))
440443 then {
441444 let newToClaim = (toClaim - claimAmount)
442445 [getUserToClaimEntry(userAddress, newToClaim, toUnlock), ScriptTransfer(addressFromStringValue(userAddress), claimAmount, l2AssetIdBytes)]
443446 }
444447 else throw("Strict value is not equal to itself.")
445448 }
446449
447450
448451 func getStakeForActions (userAddress,i) = {
449- let $t01467914739 = getUserToClaimBalance(userAddress)
450- let toClaim = $t01467914739._1
451- let toUnlock = $t01467914739._2
452+ let $t01503015090 = getUserToClaimBalance(userAddress)
453+ let toClaim = $t01503015090._1
454+ let toUnlock = $t01503015090._2
452455 let checks = [if (!(isForceStop))
453456 then true
454457 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
455458 then true
456459 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
457460 then true
458461 else (i.payments[0].assetId == l2AssetIdBytes))
459462 then true
460463 else throwErr(makeString(["payment assetId should be:", l2AssetIdString], " ")), if (isValidAddress(userAddress))
461464 then true
462465 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
463466 if ((checks == checks))
464467 then {
465468 let newToClaim = (toClaim + i.payments[0].amount)
466469 [getUserToClaimEntry(userAddress, newToClaim, toUnlock)]
467470 }
468471 else throw("Strict value is not equal to itself.")
469472 }
470473
471474
472475 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
473- let $t01547115531 = getUserToClaimBalance(userAddress)
474- let toClaim = $t01547115531._1
475- let toUnlock = $t01547115531._2
476+ let $t01582215882 = getUserToClaimBalance(userAddress)
477+ let toClaim = $t01582215882._1
478+ let toUnlock = $t01582215882._2
476479 let paymentAmount = if ((size(i.payments) == 0))
477480 then 0
478481 else i.payments[0].amount
479482 let available = ((toUnlock + toClaim) + paymentAmount)
480483 let checks = [if (!(isForceStop))
481484 then true
482485 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
483486 then true
484487 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
485488 then true
486489 else (i.payments[0].assetId == l2AssetIdBytes))
487490 then true
488491 else throwErr(makeString(["payment assetId should be:", l2AssetIdString], " ")), if ((userLeasingAmount > 0))
489492 then true
490493 else throwErr("amount should be greater than 0"), if ((available >= userLeasingAmount))
491494 then true
492495 else throwErr("amount should be less or equal (payment + available) amount"), if ((userLeasingAmount >= paymentAmount))
493496 then true
494497 else throw("amount should be greater or equal payment amount"), if (isValidAddress(nodeAddress))
495498 then true
496499 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
497500 then true
498501 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
499502 if ((checks == checks))
500503 then {
501- let $t01660616679 = getLeasingNodeData(nodeAddress)
502- let nodeCurrentLeased = $t01660616679._1
503- let nodeNextLeased = $t01660616679._2
504+ let $t01695717030 = getLeasingNodeData(nodeAddress)
505+ let nodeCurrentLeased = $t01695717030._1
506+ let nodeNextLeased = $t01695717030._2
504507 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
505- let $t01674716833 = getUserLeasingData(nodeAddress, userAddress)
506- let userCurrentLeased = $t01674716833._1
507- let userNextLeased = $t01674716833._2
508+ let $t01709817184 = getUserLeasingData(nodeAddress, userAddress)
509+ let userCurrentLeased = $t01709817184._1
510+ let userNextLeased = $t01709817184._2
508511 let newUserNextLeased = (userNextLeased + userLeasingAmount)
509512 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
510513 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
511514 let newToClaim = min([toClaim, (toClaim + (toUnlock - fromUnlockedAmount))])
512515 let userTotalLocked = getUserTotalLocked(userAddress)
513516 let newUserTotalLocked = (userTotalLocked + userLeasingAmount)
514517 let unitsUnlockedActions = getUnlockUnitsAction(userAddress)
515518 ([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)
516519 }
517520 else throw("Strict value is not equal to itself.")
518521 }
519522
520523
521524 func getStakeFromPaymentActions (nodeAddress,userAddress,i) = {
522525 let checks = [if ((size(i.payments) == 1))
523526 then true
524527 else throwErr("payment size should be exactly 1")]
525528 if ((checks == checks))
526529 then getStakeActions(nodeAddress, userAddress, i.payments[0].amount, i)
527530 else throw("Strict value is not equal to itself.")
528531 }
529532
530533
531534 func getSetNewPeriodLengthActions (newPeriodLength) = {
532535 let check = [if ((newPeriodLength > 0))
533536 then true
534537 else throwErr("period length should be greater than 0")]
535538 if ((check == check))
536539 then if ((periodOffsetHeight == -1))
537540 then [IntegerEntry(keyPeriodLength, newPeriodLength), IntegerEntry(keyPeriodOffsetHeight, height)]
538541 else [IntegerEntry(keyPeriodOffsetId, (currentPeriodId + 1)), IntegerEntry(keyPeriodOffsetHeight, nextPeriodHeight), IntegerEntry(keyPeriodLength, newPeriodLength)]
539542 else throw("Strict value is not equal to itself.")
540543 }
541544
542545
543546 func getUnitsClaimData (userAddress) = {
544- let $t01871818809 = calculateUnitsToClaim(userAddress)
545- let unlockedUnitNow = $t01871818809._1
546- let l2ToBurnNow = $t01871818809._2
547- let currentBlock = $t01871818809._3
548- let _tmp = $t01871818809._4
547+ let $t01906919160 = calculateUnitsToClaim(userAddress)
548+ let unlockedUnitNow = $t01906919160._1
549+ let l2ToBurnNow = $t01906919160._2
550+ let currentBlock = $t01906919160._3
551+ let _tmp = $t01906919160._4
549552 let unlockedUnitsPrev = valueOrElse(getInteger(this, keyUnlockedUnits(userAddress)), 0)
550553 let unitsToSend = (unlockedUnitNow + unlockedUnitsPrev)
551554 let l2ToBurnPrev = valueOrElse(getInteger(this, keyL2ToBurn(userAddress)), 0)
552555 let l2ToBurn = (l2ToBurnPrev + l2ToBurnNow)
553556 let totalUnitsClaimed = valueOrElse(getInteger(this, keyTotalUnitsClaimed(userAddress)), 0)
554557 let totalL2Burned = valueOrElse(getInteger(this, keyL2BurnedTotal(userAddress)), 0)
555558 $Tuple5(unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, currentBlock)
556559 }
557560
558561
559562 func getClaimUnitsActions (userAddress) = {
560- let $t01940119509 = getUnitsClaimData(userAddress)
561- let unitsToSend = $t01940119509._1
562- let totalUnitsClaimed = $t01940119509._2
563- let l2ToBurn = $t01940119509._3
564- let totalL2Burned = $t01940119509._4
565- let claimedBlock = $t01940119509._5
563+ let $t01975219860 = getUnitsClaimData(userAddress)
564+ let unitsToSend = $t01975219860._1
565+ let totalUnitsClaimed = $t01975219860._2
566+ let l2ToBurn = $t01975219860._3
567+ let totalL2Burned = $t01975219860._4
568+ let claimedBlock = $t01975219860._5
566569 let check = [if ((unitsToSend > 0))
567570 then true
568571 else throwErr("nothing to claim")]
569572 if ((check == check))
570573 then {
571574 let burnAction = match l2AssetIdBytes {
572575 case id: ByteVector =>
573576 [Burn(id, l2ToBurn)]
574577 case _ =>
575578 nil
576579 }
577580 ([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)
578581 }
579582 else throw("Strict value is not equal to itself.")
580583 }
581584
582585
583586 @Callable(i)
584587 func setNewPeriodLength (newPeriodLength) = {
585588 let checks = [if (isInAdminList(toString(i.caller)))
586589 then true
587590 else throwErr("caller is not in adminList")]
588591 if ((checks == checks))
589592 then getSetNewPeriodLengthActions(newPeriodLength)
590593 else throw("Strict value is not equal to itself.")
591594 }
592595
593596
594597
595598 @Callable(i)
596599 func claimUnits () = {
597600 let userAddress = toString(i.caller)
598601 getClaimUnitsActions(userAddress)
599602 }
600603
601604
602605
603606 @Callable(i)
604607 func setForceStopFlag (stop) = {
605608 let check = [if (isInAdminList(toString(i.caller)))
606609 then true
607610 else throwErr("caller is not in adminList")]
608611 if ((check == check))
609612 then [BooleanEntry(keyForceStop, stop)]
610613 else throw("Strict value is not equal to itself.")
611614 }
612615
613616
614617
615618 @Callable(i)
616619 func setForceOutStopFlag (stop) = {
617620 let check = [if (isInAdminList(toString(i.caller)))
618621 then true
619622 else throwErr("caller is not in adminList")]
620623 if ((check == check))
621624 then [BooleanEntry(keyForceOutStop, stop)]
622625 else throw("Strict value is not equal to itself.")
623626 }
624627
625628
626629
627630 @Callable(i)
628631 func getNodeDataREADONLY (nodeAddress) = {
629- let $t02124121305 = getLeasingNodeData(nodeAddress)
630- let currentLease = $t02124121305._1
631- let nextLeased = $t02124121305._2
632+ let $t02159221656 = getLeasingNodeData(nodeAddress)
633+ let currentLease = $t02159221656._1
634+ let nextLeased = $t02159221656._2
632635 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
633636 }
634637
635638
636639
637640 @Callable(i)
638641 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
639- let $t02167521752 = getUserLeasingData(nodeAddress, userAddress)
640- let currentLease = $t02167521752._1
641- let nextLeased = $t02167521752._2
642+ let $t02202622103 = getUserLeasingData(nodeAddress, userAddress)
643+ let currentLease = $t02202622103._1
644+ let nextLeased = $t02202622103._2
642645 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
643646 }
644647
645648
646649
647650 @Callable(i)
648651 func getUserDataREADONLY (userAddress) = {
649- let $t02235622416 = getUserToClaimBalance(userAddress)
650- let toClaim = $t02235622416._1
651- let toUnlock = $t02235622416._2
652+ let $t02270722767 = getUserToClaimBalance(userAddress)
653+ let toClaim = $t02270722767._1
654+ let toUnlock = $t02270722767._2
652655 let userTotalLocked = getUserTotalLocked(userAddress)
653- let $t02247922587 = getUnitsClaimData(userAddress)
654- let unitsToSend = $t02247922587._1
655- let totalUnitsClaimed = $t02247922587._2
656- let l2ToBurn = $t02247922587._3
657- let totalL2Burned = $t02247922587._4
658- let claimedBlock = $t02247922587._5
656+ let $t02283022938 = getUnitsClaimData(userAddress)
657+ let unitsToSend = $t02283022938._1
658+ let totalUnitsClaimed = $t02283022938._2
659+ let l2ToBurn = $t02283022938._3
660+ let totalL2Burned = $t02283022938._4
661+ let claimedBlock = $t02283022938._5
659662 let unitsPerBlockScale16 = valueOrElse(getInteger(this, keyUnitsPerBlockScale16), 0)
660663 let remainingblocks = max([0, ((unitsClaimStartHeight + unitsClaimInterval) - height)])
661664 $Tuple2(nil, $Tuple13(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock, unitsPerBlockScale16, remainingblocks))
662665 }
663666
664667
665668
666669 @Callable(i)
667670 func leaseByAddress (nodeAddress,userAddress) = getStakeFromPaymentActions(nodeAddress, userAddress, i)
668671
669672
670673
671674 @Callable(i)
672675 func lease (nodeAddress) = {
673676 let userAddress = toString(i.caller)
674677 getStakeFromPaymentActions(nodeAddress, userAddress, i)
675678 }
676679
677680
678681
679682 @Callable(i)
680683 func leaseFromLocked (nodeAddress,amount) = {
681684 let userAddress = toString(i.caller)
682685 getStakeActions(nodeAddress, userAddress, amount, i)
683686 }
684687
685688
686689
687690 @Callable(i)
688691 func cancelLease (nodeAddress,amount) = {
689692 let userAddress = toString(i.caller)
690693 getUnstakeActions(nodeAddress, userAddress, amount)
691694 }
692695
693696
694697
695698 @Callable(i)
696699 func claim (amount) = {
697700 let userAddress = toString(i.caller)
698701 getClaimUnlockedActions(userAddress, amount)
699702 }
700703
701704
702705
703706 @Callable(i)
704707 func claimAll () = {
705708 let userAddress = toString(i.caller)
706- let $t02401724077 = getUserToClaimBalance(userAddress)
707- let toClaim = $t02401724077._1
708- let toUnlock = $t02401724077._2
709+ let $t02436824428 = getUserToClaimBalance(userAddress)
710+ let toClaim = $t02436824428._1
711+ let toUnlock = $t02436824428._2
709712 let checks = [if ((toClaim > 0))
710713 then true
711714 else throwErr("nothing to claim")]
712715 if ((checks == checks))
713716 then getClaimUnlockedActions(userAddress, toClaim)
714717 else throw("Strict value is not equal to itself.")
715718 }
716719
717720
718721
719722 @Callable(i)
720723 func stakeFor (userAddress) = getStakeForActions(userAddress, i)
721724
722725
723726
724727 @Callable(i)
725728 func startUnitsVesting (unitsClaimNewInterval) = {
726729 let totalL2 = 100000000000000000
727730 let totalUnits = i.payments[0].amount
728731 let unitsPerBlockScale16 = (fraction(totalUnits, scale16, totalL2) / unitsClaimNewInterval)
729732 let check = [if (isInAdminList(toString(i.caller)))
730733 then true
731734 else throwErr("caller is not in adminList"), if ((size(i.payments) == 1))
732735 then true
733736 else throwErr("should be 1 payment"), if ((unitsPerBlockScale16 > 0))
734737 then true
735738 else throwErr("units per block should be greated than 0")]
736739 if ((check == check))
737740 then [IntegerEntry(keyUnitsPerBlockScale16, unitsPerBlockScale16), IntegerEntry(keyUnitsClaimStartHeight, height), IntegerEntry(keyUnitsClaimInterval, unitsClaimNewInterval), StringEntry(keyUnitsAssetId, assetBytesToString(i.payments[0].assetId))]
738741 else throw("Strict value is not equal to itself.")
739742 }
740743
741744
742745
743746 @Callable(i)
744747 func voteForTxId (txId) = {
745748 let callerAddressString = toBase58String(i.caller.bytes)
746749 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
747750 let result = [StringEntry(keyAllowedTxId(), txId)]
748751 let allowedTxIdOption = getString(this, keyAllowedTxId())
749752 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
750753 then true
751754 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
752755 then true
753756 else (value(allowedTxIdOption) != txId))
754757 then true
755758 else throwErr((txId + " is already allowed"))]
756759 if ((err == err))
757760 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
758761 else throw("Strict value is not equal to itself.")
759762 }
760763
761764
762765 @Verifier(tx)
763766 func verify () = {
764767 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
765768 let byOwner = if ((size(getAdminsList()) >= QUORUM))
766769 then false
767770 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
768771 if (byAdmins)
769772 then true
770773 else byOwner
771774 }
772775

github/deemru/w8io/169f3d6 
87.75 ms