tx · D2h3bfs4LSU8wi2sD7YJX2wv2ckFxpJcq8eomdf1uG1e

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.02700000 Waves

2024.10.21 18:47 [3336805] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "D2h3bfs4LSU8wi2sD7YJX2wv2ckFxpJcq8eomdf1uG1e", "fee": 2700000, "feeAssetId": null, "timestamp": 1729525709443, "version": 1, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "3Z81NF91fv7KWMuXWSadQceH35JkoH8ZieS2CDpBGB1PAKRz4DiVJWZHUCwqYrzz9JkCpjrajRsP6FDGApkEoitK" ], "script": "base64:BgJQCAISAwoBARIAEgMKAQQSAwoBBBIDCgEIEgQKAggIEgMKAQgSBAoCCAgSAwoBCBIECgIIARIECgIIARIDCgEBEgASAwoBCBIDCgEBEgMKAQhPAAxjb250cmFjdEZpbGUCEWwybXBfbGVhc2luZy5yaWRlAANTRVACAl9fABJCTE9DS1NfSU5fSU5URVJWQUwA6AcABnNjYWxlOACAwtcvAAdzY2FsZTE2CQBoAgUGc2NhbGU4BQZzY2FsZTgBCHRocm93RXJyAQNtc2cJAAIBCQCsAgIJAKwCAgUMY29udHJhY3RGaWxlAgI6IAUDbXNnAAxrZXlMMkFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAAMa2V5Rm9yY2VTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIJZm9yY2VTdG9wBQNuaWwFA1NFUAAPa2V5Rm9yY2VPdXRTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIMZm9yY2VPdXRTdG9wBQNuaWwFA1NFUAAPa2V5VW5pdHNBc3NldElkCQC5CQIJAMwIAgICJXMJAMwIAgIMdW5pdHNBc3NldElkBQNuaWwFA1NFUAAXa2V5VW5pdHNQZXJCbG9ja1NjYWxlMTYJALkJAgkAzAgCAgIlcwkAzAgCAhR1bml0c1BlckJsb2NrU2NhbGUxNgUDbmlsBQNTRVAAEWtleVBlcmlvZE9mZnNldElkCQC5CQIJAMwIAgICJXMJAMwIAgIIb2Zmc2V0SWQFA25pbAUDU0VQABVrZXlQZXJpb2RPZmZzZXRIZWlnaHQJALkJAgkAzAgCAgIlcwkAzAgCAgxvZmZzZXRIZWlnaHQFA25pbAUDU0VQAA9rZXlQZXJpb2RMZW5ndGgJALkJAgkAzAgCAgIlcwkAzAgCAgxwZXJpb2RMZW5ndGgFA25pbAUDU0VQABhrZXlVbml0c0NsYWltU3RhcnRIZWlnaHQJALkJAgkAzAgCAgIlcwkAzAgCAhV1bml0c0NsYWltU3RhcnRIZWlnaHQFA25pbAUDU0VQABVrZXlVbml0c0NsYWltSW50ZXJ2YWwJALkJAgkAzAgCAgIlcwkAzAgCAhJ1bml0c0NsYWltSW50ZXJ2YWwFA25pbAUDU0VQAA5wZXJpb2RPZmZzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrZXlQZXJpb2RPZmZzZXRJZAAAAAxwZXJpb2RMZW5ndGgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUPa2V5UGVyaW9kTGVuZ3RoAJBOABJwZXJpb2RPZmZzZXRIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEAD2N1cnJlbnRQZXJpb2RJZAMDCQBmAgUGaGVpZ2h0BRJwZXJpb2RPZmZzZXRIZWlnaHQJAQIhPQIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BBwkAZAIJAGkCCQBlAgUGaGVpZ2h0BRJwZXJpb2RPZmZzZXRIZWlnaHQFDHBlcmlvZExlbmd0aAUOcGVyaW9kT2Zmc2V0SWQJAJYDAQkAzAgCAAAJAMwIAgkAZQIFDnBlcmlvZE9mZnNldElkAAEFA25pbAATY3VycmVudFBlcmlvZEhlaWdodAMDCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEGAwkAAAIFD2N1cnJlbnRQZXJpb2RJZAAACQBmAgUScGVyaW9kT2Zmc2V0SGVpZ2h0BQZoZWlnaHQHAAAJAGQCBRJwZXJpb2RPZmZzZXRIZWlnaHQJAGgCCQBlAgUPY3VycmVudFBlcmlvZElkBQ5wZXJpb2RPZmZzZXRJZAUMcGVyaW9kTGVuZ3RoABBuZXh0UGVyaW9kSGVpZ2h0AwMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQYDCQAAAgUPY3VycmVudFBlcmlvZElkAAAJAGYCBRJwZXJpb2RPZmZzZXRIZWlnaHQFBmhlaWdodAcAAAkAZAIFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDHBlcmlvZExlbmd0aAAVdW5pdHNDbGFpbVN0YXJ0SGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGGtleVVuaXRzQ2xhaW1TdGFydEhlaWdodAUGaGVpZ2h0ABJ1bml0c0NsYWltSW50ZXJ2YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa2V5VW5pdHNDbGFpbUludGVydmFsAAABEmtleUxlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MJALkJAgkAzAgCAgIlcwkAzAgCBQtub2RlQWRkcmVzcwUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nTm9kZURhdGECC3VzZXJBZGRyZXNzC25vZGVBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABDmtleVVzZXJUb0NsYWltAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIHdG9DbGFpbQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABEmtleVVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICD3VzZXJUb3RhbExvY2tlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIRdW5pdHNDbGFpbWVkQmxvY2sJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARBrZXlVbmxvY2tlZFVuaXRzAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgINdW5sb2NrZWRVbml0cwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFGtleVRvdGFsVW5pdHNDbGFpbWVkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIRdG90YWxVbml0c0NsYWltZWQJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQAQtrZXlMMlRvQnVybgELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICCGwyVG9CdXJuCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEQa2V5TDJCdXJuZWRUb3RhbAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICDWwyQnVybmVkVG90YWwJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQtub2RlQWRkcmVzcwQBaAMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAABQZoZWlnaHQJALkJAgkAzAgCAgQlcyVkCQDMCAIFC25vZGVBZGRyZXNzCQDMCAIJAKQDAQUBaAUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nQnlIZWlnaHQCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzBAFoAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BAAAFBmhlaWdodAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQCkAwEFAWgFA25pbAUDU0VQARJhc3NldFN0cmluZ1RvQnl0ZXMBDWFzc2V0SWRTdHJpbmcDCQAAAgUNYXNzZXRJZFN0cmluZwIFV0FWRVMFBHVuaXQJANkEAQUNYXNzZXRJZFN0cmluZwESYXNzZXRCeXRlc1RvU3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQIFV0FWRVMAD2wyQXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQxrZXlMMkFzc2V0SWQCBVdBVkVTABJ1bml0c0Fzc2V0SWRTdHJpbmcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUPa2V5VW5pdHNBc3NldElkAgVXQVZFUwAObDJBc3NldElkQnl0ZXMJARJhc3NldFN0cmluZ1RvQnl0ZXMBBQ9sMkFzc2V0SWRTdHJpbmcAEXVuaXRzQXNzZXRJZEJ5dGVzCQESYXNzZXRTdHJpbmdUb0J5dGVzAQUSdW5pdHNBc3NldElkU3RyaW5nAAtpc0ZvcmNlU3RvcAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrZXlGb3JjZVN0b3AHAA5pc0ZvcmNlT3V0U3RvcAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ9rZXlGb3JjZU91dFN0b3AHAQ5pc1ZhbGlkQWRkcmVzcwEHYWRkcmVzcwQHJG1hdGNoMAkApggBBQdhZGRyZXNzAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwAPQURNSU5fTElTVF9TSVpFAAUABlFVT1JVTQADABFUWElEX0JZVEVTX0xFTkdUSAAgARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBHR4SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIJYWxsb3dUeElkCQDMCAIFBHR4SWQFA25pbAUDU0VQARBrZXlGdWxsQWRtaW5Wb3RlAgZwcmVmaXgMYWRtaW5BZGRyZXNzCQC5CQIJAMwIAgUGcHJlZml4CQDMCAIFDGFkbWluQWRkcmVzcwUDbmlsBQNTRVABE2tleUFkbWluQWRkcmVzc0xpc3QACQC5CQIJAMwIAgICJXMJAMwIAgIQYWRtaW5BZGRyZXNzTGlzdAUDbmlsBQNTRVABDmtleUFsbG93ZWRUeElkAAkAuQkCCQDMCAICAiVzCQDMCAICBHR4SWQFA25pbAUDU0VQAQxnZXRBZG1pblZvdGUCBnByZWZpeAVhZG1pbgQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFBWFkbWluCQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAENZ2V0QWRtaW5zTGlzdAAEByRtYXRjaDAJAJ0IAgUEdGhpcwkBE2tleUFkbWluQWRkcmVzc0xpc3QAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkAtQkCBQFzBQNTRVAFA25pbAENaXNJbkFkbWluTGlzdAEHYWRkcmVzcwkBD2NvbnRhaW5zRWxlbWVudAIJAQ1nZXRBZG1pbnNMaXN0AAUHYWRkcmVzcwESZ2VuVm90ZXNLZXlzSGVscGVyAgFhDGFkbWluQWRkcmVzcwQLJHQwNTE4NTUyMDkFAWEEBnJlc3VsdAgFCyR0MDUxODU1MjA5Al8xBAZwcmVmaXgIBQskdDA1MTg1NTIwOQJfMgkAlAoCCQDNCAIFBnJlc3VsdAkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFDGFkbWluQWRkcmVzcwUGcHJlZml4AQxnZW5Wb3Rlc0tleXMBCWtleVByZWZpeAQJYWRtaW5MaXN0CQETa2V5QWRtaW5BZGRyZXNzTGlzdAAECyR0MDUzNTY1NDQwCgACJGwJAQ1nZXRBZG1pbnNMaXN0AAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQlrZXlQcmVmaXgKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEmdlblZvdGVzS2V5c0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUEBnJlc3VsdAgFCyR0MDUzNTY1NDQwAl8xBAZwcmVmaXgIBQskdDA1MzU2NTQ0MAJfMgUGcmVzdWx0ARBjb3VudFZvdGVzSGVscGVyAgZyZXN1bHQHdm90ZUtleQkAZAIFBnJlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABCmNvdW50Vm90ZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNvdW50Vm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFARBjbGVhclZvdGVzSGVscGVyAgZyZXN1bHQDa2V5CQDNCAIFBnJlc3VsdAkBC0RlbGV0ZUVudHJ5AQUDa2V5ARNnZXRDbGVhclZvdGVFbnRyaWVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjbGVhclZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEMdm90ZUlOVEVSTkFMBBNjYWxsZXJBZGRyZXNzU3RyaW5nCWtleVByZWZpeAhtaW5Wb3Rlcwp2b3RlUmVzdWx0BAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQQYWRtaW5DdXJyZW50Vm90ZQkBDGdldEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQDZXJyAwkBASEBCQENaXNJbkFkbWluTGlzdAEFE2NhbGxlckFkZHJlc3NTdHJpbmcJAQh0aHJvd0VycgEJAKwCAgkArAICAglBZGRyZXNzOiAFE2NhbGxlckFkZHJlc3NTdHJpbmcCEiBub3QgaW4gQWRtaW4gbGlzdAMJAAACBRBhZG1pbkN1cnJlbnRWb3RlAAEJAQh0aHJvd0VycgEJAKwCAgUHdm90ZUtleQISIHlvdSBhbHJlYWR5IHZvdGVkBQR1bml0AwkAAAIFA2VycgUDZXJyBAV2b3RlcwkBCmNvdW50Vm90ZXMBBQlrZXlQcmVmaXgDCQBnAgkAZAIFBXZvdGVzAAEFCG1pblZvdGVzBBBjbGVhclZvdGVFbnRyaWVzCQETZ2V0Q2xlYXJWb3RlRW50cmllcwEFCWtleVByZWZpeAkAzggCBRBjbGVhclZvdGVFbnRyaWVzBQp2b3RlUmVzdWx0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd2b3RlS2V5AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZ2V0TGVhc2luZ05vZGVFbnRyeQMLbm9kZUFkZHJlc3MNY3VycmVudExlYXNlZApuZXh0TGVhc2VkBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFDWN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUKbmV4dExlYXNlZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIJARJrZXlMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldExlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MEGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQESa2V5TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEByRtYXRjaDAFGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBBFub2RlQ3VycmVudFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEEEW5vZGVDdXJyZW50TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQObm9kZU5leHRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAADBA5ub2RlTmV4dExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAQDAwkAZgIFDm5vZGVOZXh0UGVyaW9kBQZoZWlnaHQGCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEJAJQKAgURbm9kZUN1cnJlbnRMZWFzZWQFDm5vZGVOZXh0TGVhc2VkCQCUCgIFDm5vZGVOZXh0TGVhc2VkBQ5ub2RlTmV4dExlYXNlZAkAlAoCAAAAAAETZ2V0VXNlckxlYXNpbmdFbnRyeQQLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MRdXNlckN1cnJlbnRMZWFzZWQOdXNlck5leHRMZWFzZWQEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgIIJWQlZCVkJWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQURdXNlckN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUOdXNlck5leHRMZWFzZWQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldFVzZXJMZWFzaW5nRGF0YQILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEGGxlYXNpbmdVc2VyRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwQHJG1hdGNoMAUYbGVhc2luZ1VzZXJEYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEEXVzZXJDdXJyZW50UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAQQRdXNlckN1cnJlbnRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAACBA51c2VyTmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMEDnVzZXJOZXh0TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUOdXNlck5leHRQZXJpb2QFBmhlaWdodAYJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAlAoCBRF1c2VyQ3VycmVudExlYXNlZAUOdXNlck5leHRMZWFzZWQJAJQKAgUOdXNlck5leHRMZWFzZWQFDnVzZXJOZXh0TGVhc2VkCQCUCgIAAAAAARNnZXRVc2VyVG9DbGFpbUVudHJ5Awt1c2VyQWRkcmVzcwd0b0NsYWltCHRvVW5sb2NrBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFB3RvQ2xhaW0JAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUIdG9VbmxvY2sFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwULdmFsdWVTdHJpbmcBFWdldFVzZXJUb0NsYWltQmFsYW5jZQELdXNlckFkZHJlc3MEGHVzZXJUb0NsYWltRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwQHJG1hdGNoMAUYdXNlclRvQ2xhaW1EYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEDWN1cnJlbnRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAABBAd0b0NsYWltCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQKbmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMECHRvVW5sb2NrCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUKbmV4dFBlcmlvZAUGaGVpZ2h0BgkAAAIFD2N1cnJlbnRQZXJpb2RJZAAACQCUCgIFB3RvQ2xhaW0FCHRvVW5sb2NrCQCUCgIJAGQCBQd0b0NsYWltBQh0b1VubG9jawAACQCUCgIAAAAAARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQILdXNlckFkZHJlc3MPdXNlclRvdGFsTG9ja2VkCQEMSW50ZWdlckVudHJ5AgkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBQ91c2VyVG90YWxMb2NrZWQBEmdldFVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzAAABFWNhbGN1bGF0ZVVuaXRzVG9DbGFpbQELdXNlckFkZHJlc3MED2NsYWltZWRCbG9ja0tleQkBFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQULdXNlckFkZHJlc3MEDGNsYWltZWRCbG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9jbGFpbWVkQmxvY2tLZXkFFXVuaXRzQ2xhaW1TdGFydEhlaWdodAQUdW5pdHNQZXJCbG9ja1NjYWxlMTYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXa2V5VW5pdHNQZXJCbG9ja1NjYWxlMTYAAAQMY3VycmVudEJsb2NrCQCXAwEJAMwIAgkAZAIFFXVuaXRzQ2xhaW1TdGFydEhlaWdodAUSdW5pdHNDbGFpbUludGVydmFsCQDMCAIFBmhlaWdodAUDbmlsBAxibG9ja3NQYXNzZWQJAGUCBQxjdXJyZW50QmxvY2sFDGNsYWltZWRCbG9jawQMYW1vdW50U3Rha2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MECGwyVG9CdXJuCQBrAwUMYW1vdW50U3Rha2VkBQxibG9ja3NQYXNzZWQFEnVuaXRzQ2xhaW1JbnRlcnZhbAQPdW5pdHNUb0NsYWltTm93CQBrAwUIbDJUb0J1cm4FFHVuaXRzUGVyQmxvY2tTY2FsZTE2BQdzY2FsZTE2CQCVCgMFD3VuaXRzVG9DbGFpbU5vdwUIbDJUb0J1cm4FDGN1cnJlbnRCbG9jawEUZ2V0VW5sb2NrVW5pdHNBY3Rpb24BC3VzZXJBZGRyZXNzBA5rVW5sb2NrZWRVbml0cwkBEGtleVVubG9ja2VkVW5pdHMBBQt1c2VyQWRkcmVzcwQNdW5sb2NrZWRVbml0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rVW5sb2NrZWRVbml0cwAABAlrTDJUb0J1cm4JAQtrZXlMMlRvQnVybgEFC3VzZXJBZGRyZXNzBAhsMlRvQnVybgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQlrTDJUb0J1cm4AAAQNJHQwMTEzNjQxMTQ0OQkBFWNhbGN1bGF0ZVVuaXRzVG9DbGFpbQEFC3VzZXJBZGRyZXNzBA91bml0c1RvQ2xhaW1Ob3cIBQ0kdDAxMTM2NDExNDQ5Al8xBAtsMlRvQnVybk5vdwgFDSR0MDExMzY0MTE0NDkCXzIEDGN1cnJlbnRCbG9jawgFDSR0MDExMzY0MTE0NDkCXzMDCQBnAgAABQ91bml0c1RvQ2xhaW1Ob3cFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQULdXNlckFkZHJlc3MFDGN1cnJlbnRCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0wyVG9CdXJuCQBkAgUIbDJUb0J1cm4FC2wyVG9CdXJuTm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5rVW5sb2NrZWRVbml0cwkAZAIFDXVubG9ja2VkVW5pdHMFD3VuaXRzVG9DbGFpbU5vdwUDbmlsARFnZXRVbnN0YWtlQWN0aW9ucwMLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MNdW5zdGFrZUFtb3VudAQNJHQwMTE4NDQxMTkxNwkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBBFub2RlQ3VycmVudExlYXNlZAgFDSR0MDExODQ0MTE5MTcCXzEEDm5vZGVOZXh0TGVhc2VkCAUNJHQwMTE4NDQxMTkxNwJfMgQNJHQwMTE5MjIxMjAwOAkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQRdXNlckN1cnJlbnRMZWFzZWQIBQ0kdDAxMTkyMjEyMDA4Al8xBA51c2VyTmV4dExlYXNlZAgFDSR0MDExOTIyMTIwMDgCXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQEBIQEFDmlzRm9yY2VPdXRTdG9wBgkBCHRocm93RXJyAQIddW5zdGFrZSBpcyB0ZW1wb3JhcnkgZGlzYWJsZWQJAMwIAgMJAGYCBQ11bnN0YWtlQW1vdW50AAAGCQEIdGhyb3dFcnIBAid1bnN0YWtlIGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQ51c2VyTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAYJAQh0aHJvd0VycgECOXVuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHVzZXIgc3Rha2VkIGFtb3VudAkAzAgCAwkAZwIFDm5vZGVOZXh0TGVhc2VkBQ11bnN0YWtlQW1vdW50BgkBCHRocm93RXJyAQI5dW5zdGFrZSBhbW91bnQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgbm9kZSBzdGFrZWQgYW1vdW50CQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQtub2RlQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhpub2RlIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQtub2RlQWRkcmVzcwUDbmlsAgEgCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQt1c2VyQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhp1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEEG5ld05vZGVOZXh0TGVhc2UJAGUCBQ5ub2RlTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAQRbmV3VXNlck5leHRMZWFzZWQJAGUCBQ51c2VyTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAQNJHQwMTI4OTIxMjk1MgkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTI4OTIxMjk1MgJfMQQIdG9VbmxvY2sIBQ0kdDAxMjg5MjEyOTUyAl8yBAtuZXdUb1VubG9jawkAZAIFCHRvVW5sb2NrBQ11bnN0YWtlQW1vdW50BA91c2VyVG90YWxMb2NrZWQJARJnZXRVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwQSbmV3VXNlclRvdGFsTG9ja2VkCQBlAgUPdXNlclRvdGFsTG9ja2VkBQ11bnN0YWtlQW1vdW50BBR1bml0c1VubG9ja2VkQWN0aW9ucwkBFGdldFVubG9ja1VuaXRzQWN0aW9uAQULdXNlckFkZHJlc3MJAM4IAgkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFB3RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsBRR1bml0c1VubG9ja2VkQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCC3VzZXJBZGRyZXNzC2NsYWltQW1vdW50BA0kdDAxMzc3MTEzODMxCQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxMzc3MTEzODMxAl8xBAh0b1VubG9jawgFDSR0MDEzNzcxMTM4MzECXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQEBIQEFDmlzRm9yY2VPdXRTdG9wBgkBCHRocm93RXJyAQIbY2xhaW0gaXMgdGVtcG9yYXJ5IGRpc2FibGVkCQDMCAIDCQBmAgULY2xhaW1BbW91bnQAAAYJAQh0aHJvd0VycgECJWNsYWltIGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQd0b0NsYWltBQtjbGFpbUFtb3VudAYJAQh0aHJvd0VycgECNGNsYWltIGFtb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB1bmxvY2tlZCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKbmV3VG9DbGFpbQkAZQIFB3RvQ2xhaW0FC2NsYWltQW1vdW50CQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FCHRvVW5sb2NrCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3VzZXJBZGRyZXNzBQtjbGFpbUFtb3VudAUObDJBc3NldElkQnl0ZXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgESZ2V0U3Rha2VGb3JBY3Rpb25zAgt1c2VyQWRkcmVzcwFpBA0kdDAxNDU5NzE0NjU3CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxNDU5NzE0NjU3Al8xBAh0b1VubG9jawgFDSR0MDE0NTk3MTQ2NTcCXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQBnAgABCQCQAwEIBQFpCHBheW1lbnRzBgkBCHRocm93RXJyAQIRbWF4aW11bSAxIHBheW1lbnQJAMwIAgMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUObDJBc3NldElkQnl0ZXMGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIacGF5bWVudCBhc3NldElkIHNob3VsZCBiZToJAMwIAgUPbDJBc3NldElkU3RyaW5nBQNuaWwCASAJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKbmV3VG9DbGFpbQkAZAIFB3RvQ2xhaW0ICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FCHRvVW5sb2NrBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD2dldFN0YWtlQWN0aW9ucwQLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MRdXNlckxlYXNpbmdBbW91bnQBaQQNJHQwMTUzODkxNTQ0OQkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTUzODkxNTQ0OQJfMQQIdG9VbmxvY2sIBQ0kdDAxNTM4OTE1NDQ5Al8yBA1wYXltZW50QW1vdW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQJYXZhaWxhYmxlCQBkAgkAZAIFCHRvVW5sb2NrBQd0b0NsYWltBQ1wYXltZW50QW1vdW50BAZjaGVja3MJAMwIAgMJAQEhAQULaXNGb3JjZVN0b3AGCQEIdGhyb3dFcnIBAh1jb250cmFjdCBpcyB0ZW1wb3Jhcnkgc3RvcHBlZAkAzAgCAwkAZwIAAQkAkAMBCAUBaQhwYXltZW50cwYJAQh0aHJvd0VycgECEW1heGltdW0gMSBwYXltZW50CQDMCAIDAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAYJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDmwyQXNzZXRJZEJ5dGVzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnBheW1lbnQgYXNzZXRJZCBzaG91bGQgYmU6CQDMCAIFD2wyQXNzZXRJZFN0cmluZwUDbmlsAgEgCQDMCAIDCQBmAgURdXNlckxlYXNpbmdBbW91bnQAAAYJAQh0aHJvd0VycgECH2Ftb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQlhdmFpbGFibGUFEXVzZXJMZWFzaW5nQW1vdW50BgkBCHRocm93RXJyAQI7YW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIChwYXltZW50ICsgYXZhaWxhYmxlKSBhbW91bnQJAMwIAgMJAGcCBRF1c2VyTGVhc2luZ0Ftb3VudAUNcGF5bWVudEFtb3VudAYJAAIBAjBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgb3IgZXF1YWwgcGF5bWVudCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC25vZGVBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGm5vZGUgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC25vZGVBZGRyZXNzBQNuaWwCASAJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQNJHQwMTY1MjQxNjU5NwkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBBFub2RlQ3VycmVudExlYXNlZAgFDSR0MDE2NTI0MTY1OTcCXzEEDm5vZGVOZXh0TGVhc2VkCAUNJHQwMTY1MjQxNjU5NwJfMgQQbmV3Tm9kZU5leHRMZWFzZQkAZAIFDm5vZGVOZXh0TGVhc2VkBRF1c2VyTGVhc2luZ0Ftb3VudAQNJHQwMTY2NjUxNjc1MQkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQRdXNlckN1cnJlbnRMZWFzZWQIBQ0kdDAxNjY2NTE2NzUxAl8xBA51c2VyTmV4dExlYXNlZAgFDSR0MDE2NjY1MTY3NTECXzIEEW5ld1VzZXJOZXh0TGVhc2VkCQBkAgUOdXNlck5leHRMZWFzZWQFEXVzZXJMZWFzaW5nQW1vdW50BBJmcm9tVW5sb2NrZWRBbW91bnQJAGUCBRF1c2VyTGVhc2luZ0Ftb3VudAUNcGF5bWVudEFtb3VudAQLbmV3VG9VbmxvY2sJAJYDAQkAzAgCAAAJAMwIAgkAZQIFCHRvVW5sb2NrBRJmcm9tVW5sb2NrZWRBbW91bnQFA25pbAQKbmV3VG9DbGFpbQkAlwMBCQDMCAIFB3RvQ2xhaW0JAMwIAgkAZAIFB3RvQ2xhaW0JAGUCBQh0b1VubG9jawUSZnJvbVVubG9ja2VkQW1vdW50BQNuaWwED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBBJuZXdVc2VyVG90YWxMb2NrZWQJAGQCBQ91c2VyVG90YWxMb2NrZWQFEXVzZXJMZWFzaW5nQW1vdW50BBR1bml0c1VubG9ja2VkQWN0aW9ucwkBFGdldFVubG9ja1VuaXRzQWN0aW9uAQULdXNlckFkZHJlc3MJAM4IAgkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsBRR1bml0c1VubG9ja2VkQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzAWkEBmNoZWNrcwkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECIHBheW1lbnQgc2l6ZSBzaG91bGQgYmUgZXhhY3RseSAxBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJAQ9nZXRTdGFrZUFjdGlvbnMEBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQFpCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARxnZXRTZXROZXdQZXJpb2RMZW5ndGhBY3Rpb25zAQ9uZXdQZXJpb2RMZW5ndGgEBWNoZWNrCQDMCAIDCQBmAgUPbmV3UGVyaW9kTGVuZ3RoAAAGCQEIdGhyb3dFcnIBAiZwZXJpb2QgbGVuZ3RoIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa2V5UGVyaW9kTGVuZ3RoBQ9uZXdQZXJpb2RMZW5ndGgJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVBlcmlvZE9mZnNldEhlaWdodAUGaGVpZ2h0BQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleVBlcmlvZE9mZnNldElkCQBkAgUPY3VycmVudFBlcmlvZElkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVBlcmlvZE9mZnNldEhlaWdodAUQbmV4dFBlcmlvZEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa2V5UGVyaW9kTGVuZ3RoBQ9uZXdQZXJpb2RMZW5ndGgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERZ2V0VW5pdHNDbGFpbURhdGEBC3VzZXJBZGRyZXNzBA0kdDAxODYzNjE4NzIxCQEVY2FsY3VsYXRlVW5pdHNUb0NsYWltAQULdXNlckFkZHJlc3MED3VubG9ja2VkVW5pdE5vdwgFDSR0MDE4NjM2MTg3MjECXzEEC2wyVG9CdXJuTm93CAUNJHQwMTg2MzYxODcyMQJfMgQMY3VycmVudEJsb2NrCAUNJHQwMTg2MzYxODcyMQJfMwQRdW5sb2NrZWRVbml0c1ByZXYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEGtleVVubG9ja2VkVW5pdHMBBQt1c2VyQWRkcmVzcwAABAt1bml0c1RvU2VuZAkAZAIFD3VubG9ja2VkVW5pdE5vdwURdW5sb2NrZWRVbml0c1ByZXYEDGwyVG9CdXJuUHJldgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQELa2V5TDJUb0J1cm4BBQt1c2VyQWRkcmVzcwAABAhsMlRvQnVybgkAZAIFDGwyVG9CdXJuUHJldgULbDJUb0J1cm5Ob3cEEXRvdGFsVW5pdHNDbGFpbWVkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARRrZXlUb3RhbFVuaXRzQ2xhaW1lZAEFC3VzZXJBZGRyZXNzAAAEDXRvdGFsTDJCdXJuZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEGtleUwyQnVybmVkVG90YWwBBQt1c2VyQWRkcmVzcwAACQCXCgUFC3VuaXRzVG9TZW5kBRF0b3RhbFVuaXRzQ2xhaW1lZAUIbDJUb0J1cm4FDXRvdGFsTDJCdXJuZWQFDGN1cnJlbnRCbG9jawEUZ2V0Q2xhaW1Vbml0c0FjdGlvbnMBC3VzZXJBZGRyZXNzBA0kdDAxOTMxMzE5NDIxCQERZ2V0VW5pdHNDbGFpbURhdGEBBQt1c2VyQWRkcmVzcwQLdW5pdHNUb1NlbmQIBQ0kdDAxOTMxMzE5NDIxAl8xBBF0b3RhbFVuaXRzQ2xhaW1lZAgFDSR0MDE5MzEzMTk0MjECXzIECGwyVG9CdXJuCAUNJHQwMTkzMTMxOTQyMQJfMwQNdG90YWxMMkJ1cm5lZAgFDSR0MDE5MzEzMTk0MjECXzQEDGNsYWltZWRCbG9jawgFDSR0MDE5MzEzMTk0MjECXzUEBWNoZWNrCQDMCAIDCQBmAgULdW5pdHNUb1NlbmQAAAYJAQh0aHJvd0VycgECEG5vdGhpbmcgdG8gY2xhaW0FA25pbAMJAAACBQVjaGVjawUFY2hlY2sECmJ1cm5BY3Rpb24EByRtYXRjaDAFDmwyQXNzZXRJZEJ5dGVzAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDMCAIJAQRCdXJuAgUCaWQFCGwyVG9CdXJuBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5VW5pdHNDbGFpbWVkQmxvY2sBBQt1c2VyQWRkcmVzcwUMY2xhaW1lZEJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5VG90YWxVbml0c0NsYWltZWQBBQt1c2VyQWRkcmVzcwkAZAIFEXRvdGFsVW5pdHNDbGFpbWVkBQt1bml0c1RvU2VuZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleUwyQnVybmVkVG90YWwBBQt1c2VyQWRkcmVzcwkAZAIFDXRvdGFsTDJCdXJuZWQFCGwyVG9CdXJuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQa2V5VW5sb2NrZWRVbml0cwEFC3VzZXJBZGRyZXNzAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtrZXlMMlRvQnVybgEFC3VzZXJBZGRyZXNzAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQULdXNlckFkZHJlc3MFC3VuaXRzVG9TZW5kBRF1bml0c0Fzc2V0SWRCeXRlcwUDbmlsBQpidXJuQWN0aW9uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuEAFpARJzZXROZXdQZXJpb2RMZW5ndGgBD25ld1BlcmlvZExlbmd0aAQGY2hlY2tzCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBHGdldFNldE5ld1BlcmlvZExlbmd0aEFjdGlvbnMBBQ9uZXdQZXJpb2RMZW5ndGgJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY2xhaW1Vbml0cwAEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBFGdldENsYWltVW5pdHNBY3Rpb25zAQULdXNlckFkZHJlc3MBaQEQc2V0Rm9yY2VTdG9wRmxhZwEEc3RvcAQFY2hlY2sJAMwIAgMJAQ1pc0luQWRtaW5MaXN0AQkApQgBCAUBaQZjYWxsZXIGCQEIdGhyb3dFcnIBAhpjYWxsZXIgaXMgbm90IGluIGFkbWluTGlzdAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa2V5Rm9yY2VTdG9wBQRzdG9wBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETc2V0Rm9yY2VPdXRTdG9wRmxhZwEEc3RvcAQFY2hlY2sJAMwIAgMJAQ1pc0luQWRtaW5MaXN0AQkApQgBCAUBaQZjYWxsZXIGCQEIdGhyb3dFcnIBAhpjYWxsZXIgaXMgbm90IGluIGFkbWluTGlzdAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMQm9vbGVhbkVudHJ5AgUPa2V5Rm9yY2VPdXRTdG9wBQRzdG9wBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETZ2V0Tm9kZURhdGFSRUFET05MWQELbm9kZUFkZHJlc3MEDSR0MDIxMTUzMjEyMTcJARJnZXRMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQMY3VycmVudExlYXNlCAUNJHQwMjExNTMyMTIxNwJfMQQKbmV4dExlYXNlZAgFDSR0MDIxMTUzMjEyMTcCXzIJAJQKAgUDbmlsCQCXCgUFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDGN1cnJlbnRMZWFzZQUQbmV4dFBlcmlvZEhlaWdodAUKbmV4dExlYXNlZAUGaGVpZ2h0AWkBGmdldFVzZXJMZWFzaW5nRGF0YVJFQURPTkxZAgtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwQNJHQwMjE1ODcyMTY2NAkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQMY3VycmVudExlYXNlCAUNJHQwMjE1ODcyMTY2NAJfMQQKbmV4dExlYXNlZAgFDSR0MDIxNTg3MjE2NjQCXzIJAJQKAgUDbmlsCQCXCgUFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDGN1cnJlbnRMZWFzZQUQbmV4dFBlcmlvZEhlaWdodAUKbmV4dExlYXNlZAUGaGVpZ2h0AWkBE2dldFVzZXJEYXRhUkVBRE9OTFkBC3VzZXJBZGRyZXNzBA0kdDAyMjI1OTIyMzE5CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAyMjI1OTIyMzE5Al8xBAh0b1VubG9jawgFDSR0MDIyMjU5MjIzMTkCXzIED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBA0kdDAyMjM4MjIyNDkwCQERZ2V0VW5pdHNDbGFpbURhdGEBBQt1c2VyQWRkcmVzcwQLdW5pdHNUb1NlbmQIBQ0kdDAyMjM4MjIyNDkwAl8xBBF0b3RhbFVuaXRzQ2xhaW1lZAgFDSR0MDIyMzgyMjI0OTACXzIECGwyVG9CdXJuCAUNJHQwMjIzODIyMjQ5MAJfMwQNdG90YWxMMkJ1cm5lZAgFDSR0MDIyMzgyMjI0OTACXzQEDGNsYWltZWRCbG9jawgFDSR0MDIyMzgyMjI0OTACXzUEFHVuaXRzUGVyQmxvY2tTY2FsZTE2CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFF2tleVVuaXRzUGVyQmxvY2tTY2FsZTE2AAAED3JlbWFpbmluZ2Jsb2NrcwkAlgMBCQDMCAIAAAkAzAgCCQBlAgkAZAIFFXVuaXRzQ2xhaW1TdGFydEhlaWdodAUSdW5pdHNDbGFpbUludGVydmFsBQZoZWlnaHQFA25pbAkAlAoCBQNuaWwJAJ8KDQUTY3VycmVudFBlcmlvZEhlaWdodAUHdG9DbGFpbQUQbmV4dFBlcmlvZEhlaWdodAUIdG9VbmxvY2sFD3VzZXJUb3RhbExvY2tlZAUGaGVpZ2h0BQt1bml0c1RvU2VuZAURdG90YWxVbml0c0NsYWltZWQFCGwyVG9CdXJuBQ10b3RhbEwyQnVybmVkBQxjbGFpbWVkQmxvY2sFFHVuaXRzUGVyQmxvY2tTY2FsZTE2BQ9yZW1haW5pbmdibG9ja3MBaQEObGVhc2VCeUFkZHJlc3MCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzCQEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFAWkBaQEFbGVhc2UBC25vZGVBZGRyZXNzBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARpnZXRTdGFrZUZyb21QYXltZW50QWN0aW9ucwMFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUBaQFpAQ9sZWFzZUZyb21Mb2NrZWQCC25vZGVBZGRyZXNzBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEPZ2V0U3Rha2VBY3Rpb25zBAULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQZhbW91bnQFAWkBaQELY2FuY2VsTGVhc2UCC25vZGVBZGRyZXNzBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQERZ2V0VW5zdGFrZUFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFBmFtb3VudAFpAQVjbGFpbQEGYW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwIFC3VzZXJBZGRyZXNzBQZhbW91bnQBaQEIY2xhaW1BbGwABAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDSR0MDIzOTIwMjM5ODAJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDIzOTIwMjM5ODACXzEECHRvVW5sb2NrCAUNJHQwMjM5MjAyMzk4MAJfMgQGY2hlY2tzCQDMCAIDCQBmAgUHdG9DbGFpbQAABgkBCHRocm93RXJyAQIQbm90aGluZyB0byBjbGFpbQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCBQt1c2VyQWRkcmVzcwUHdG9DbGFpbQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhzdGFrZUZvcgELdXNlckFkZHJlc3MJARJnZXRTdGFrZUZvckFjdGlvbnMCBQt1c2VyQWRkcmVzcwUBaQFpARFzdGFydFVuaXRzVmVzdGluZwESdW5pdHNDbGFpbUludGVydmFsBAd0b3RhbEwyAICAqOyFr9GxAQQKdG90YWxVbml0cwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEFHVuaXRzUGVyQmxvY2tTY2FsZTE2CQBpAgkAawMFCnRvdGFsVW5pdHMFB3NjYWxlMTYFB3RvdGFsTDIFEnVuaXRzQ2xhaW1JbnRlcnZhbAQFY2hlY2sJAMwIAgMJAQ1pc0luQWRtaW5MaXN0AQkApQgBCAUBaQZjYWxsZXIGCQEIdGhyb3dFcnIBAhpjYWxsZXIgaXMgbm90IGluIGFkbWluTGlzdAkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECE3Nob3VsZCBiZSAxIHBheW1lbnQJAMwIAgMJAGYCBRR1bml0c1BlckJsb2NrU2NhbGUxNgAABgkBCHRocm93RXJyAQIodW5pdHMgcGVyIGJsb2NrIHNob3VsZCBiZSBncmVhdGVkIHRoYW4gMAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMSW50ZWdlckVudHJ5AgUXa2V5VW5pdHNQZXJCbG9ja1NjYWxlMTYFFHVuaXRzUGVyQmxvY2tTY2FsZTE2CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRhrZXlVbml0c0NsYWltU3RhcnRIZWlnaHQFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5VW5pdHNDbGFpbUludGVydmFsBRJ1bml0c0NsYWltSW50ZXJ2YWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa2V5VW5pdHNBc3NldElkCQESYXNzZXRCeXRlc1RvU3RyaW5nAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELdm90ZUZvclR4SWQBBHR4SWQEE2NhbGxlckFkZHJlc3NTdHJpbmcJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJa2V5UHJlZml4CQEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQUEdHhJZAQGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBbGxvd2VkVHhJZAAFBHR4SWQFA25pbAQRYWxsb3dlZFR4SWRPcHRpb24JAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAQDZXJyCQDMCAIDCQAAAgkAyAEBCQDZBAEFBHR4SWQFEVRYSURfQllURVNfTEVOR1RIBgkBCHRocm93RXJyAQkArAICBQR0eElkAhIgaXMgbm90IHZhbGlkIHR4SWQJAMwIAgMDCQAAAgURYWxsb3dlZFR4SWRPcHRpb24FBHVuaXQGCQECIT0CCQEFdmFsdWUBBRFhbGxvd2VkVHhJZE9wdGlvbgUEdHhJZAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAITIGlzIGFscmVhZHkgYWxsb3dlZAUDbmlsAwkAAAIFA2VycgUDZXJyCQEMdm90ZUlOVEVSTkFMBAUTY2FsbGVyQWRkcmVzc1N0cmluZwUJa2V5UHJlZml4BQZRVU9SVU0FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAECGJ5QWRtaW5zCQAAAggFAnR4AmlkCQDZBAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAIABAdieU93bmVyAwkAZwIJAJADAQkBDWdldEFkbWluc0xpc3QABQZRVU9SVU0HCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5AwUIYnlBZG1pbnMGBQdieU93bmVyHULxmw==", "chainId": 84, "height": 3336805, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EDS2JzwHfQLX9WX6Se6unA3uHm3JRq83rz1KVeNngGg9 Next: 4sXod3A78sxQ8rhLLPDDQdPe2ds52rschzzU4MYvMENW Diff:
OldNewDifferences
644644
645645 @Callable(i)
646646 func getUserDataREADONLY (userAddress) = {
647- let $t02222222282 = getUserToClaimBalance(userAddress)
648- let toClaim = $t02222222282._1
649- let toUnlock = $t02222222282._2
647+ let $t02225922319 = getUserToClaimBalance(userAddress)
648+ let toClaim = $t02225922319._1
649+ let toUnlock = $t02225922319._2
650650 let userTotalLocked = getUserTotalLocked(userAddress)
651- let $t02234522453 = getUnitsClaimData(userAddress)
652- let unitsToSend = $t02234522453._1
653- let totalUnitsClaimed = $t02234522453._2
654- let l2ToBurn = $t02234522453._3
655- let totalL2Burned = $t02234522453._4
656- let claimedBlock = $t02234522453._5
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
657657 let unitsPerBlockScale16 = valueOrElse(getInteger(this, keyUnitsPerBlockScale16), 0)
658- $Tuple2(nil, $Tuple12(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock, unitsPerBlockScale16))
658+ let remainingblocks = max([0, ((unitsClaimStartHeight + unitsClaimInterval) - height)])
659+ $Tuple2(nil, $Tuple13(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock, unitsPerBlockScale16, remainingblocks))
659660 }
660661
661662
700701 @Callable(i)
701702 func claimAll () = {
702703 let userAddress = toString(i.caller)
703- let $t02376623826 = getUserToClaimBalance(userAddress)
704- let toClaim = $t02376623826._1
705- let toUnlock = $t02376623826._2
704+ let $t02392023980 = getUserToClaimBalance(userAddress)
705+ let toClaim = $t02392023980._1
706+ let toUnlock = $t02392023980._2
706707 let checks = [if ((toClaim > 0))
707708 then true
708709 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(l2ToBurn, unitsPerBlockScale16, scale16)
365365 $Tuple3(unitsToClaimNow, l2ToBurn, currentBlock)
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)
374374 let $t01136411449 = calculateUnitsToClaim(userAddress)
375375 let unitsToClaimNow = $t01136411449._1
376376 let l2ToBurnNow = $t01136411449._2
377377 let currentBlock = $t01136411449._3
378378 if ((0 >= unitsToClaimNow))
379379 then nil
380380 else [IntegerEntry(keyUnitsClaimedBlock(userAddress), currentBlock), IntegerEntry(kL2ToBurn, (l2ToBurn + l2ToBurnNow)), IntegerEntry(kUnlockedUnits, (unlockedUnits + unitsToClaimNow))]
381381 }
382382
383383
384384 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
385385 let $t01184411917 = getLeasingNodeData(nodeAddress)
386386 let nodeCurrentLeased = $t01184411917._1
387387 let nodeNextLeased = $t01184411917._2
388388 let $t01192212008 = getUserLeasingData(nodeAddress, userAddress)
389389 let userCurrentLeased = $t01192212008._1
390390 let userNextLeased = $t01192212008._2
391391 let checks = [if (!(isForceStop))
392392 then true
393393 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
394394 then true
395395 else throwErr("unstake is temporary disabled"), if ((unstakeAmount > 0))
396396 then true
397397 else throwErr("unstake amount should be greater than 0"), if ((userNextLeased >= unstakeAmount))
398398 then true
399399 else throwErr("unstake amount should be less or equal user staked amount"), if ((nodeNextLeased >= unstakeAmount))
400400 then true
401401 else throwErr("unstake amount should be less or equal node staked amount"), if (isValidAddress(nodeAddress))
402402 then true
403403 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
404404 then true
405405 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
406406 if ((checks == checks))
407407 then {
408408 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
409409 let newUserNextLeased = (userNextLeased - unstakeAmount)
410410 let $t01289212952 = getUserToClaimBalance(userAddress)
411411 let toClaim = $t01289212952._1
412412 let toUnlock = $t01289212952._2
413413 let newToUnlock = (toUnlock + unstakeAmount)
414414 let userTotalLocked = getUserTotalLocked(userAddress)
415415 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
416416 let unitsUnlockedActions = getUnlockUnitsAction(userAddress)
417417 ([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)
418418 }
419419 else throw("Strict value is not equal to itself.")
420420 }
421421
422422
423423 func getClaimUnlockedActions (userAddress,claimAmount) = {
424424 let $t01377113831 = getUserToClaimBalance(userAddress)
425425 let toClaim = $t01377113831._1
426426 let toUnlock = $t01377113831._2
427427 let checks = [if (!(isForceStop))
428428 then true
429429 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
430430 then true
431431 else throwErr("claim is temporary disabled"), if ((claimAmount > 0))
432432 then true
433433 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
434434 then true
435435 else throwErr("claim amount should be less or equal unlocked amount"), if (isValidAddress(userAddress))
436436 then true
437437 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
438438 if ((checks == checks))
439439 then {
440440 let newToClaim = (toClaim - claimAmount)
441441 [getUserToClaimEntry(userAddress, newToClaim, toUnlock), ScriptTransfer(addressFromStringValue(userAddress), claimAmount, l2AssetIdBytes)]
442442 }
443443 else throw("Strict value is not equal to itself.")
444444 }
445445
446446
447447 func getStakeForActions (userAddress,i) = {
448448 let $t01459714657 = getUserToClaimBalance(userAddress)
449449 let toClaim = $t01459714657._1
450450 let toUnlock = $t01459714657._2
451451 let checks = [if (!(isForceStop))
452452 then true
453453 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
454454 then true
455455 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
456456 then true
457457 else (i.payments[0].assetId == l2AssetIdBytes))
458458 then true
459459 else throwErr(makeString(["payment assetId should be:", l2AssetIdString], " ")), if (isValidAddress(userAddress))
460460 then true
461461 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
462462 if ((checks == checks))
463463 then {
464464 let newToClaim = (toClaim + i.payments[0].amount)
465465 [getUserToClaimEntry(userAddress, newToClaim, toUnlock)]
466466 }
467467 else throw("Strict value is not equal to itself.")
468468 }
469469
470470
471471 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
472472 let $t01538915449 = getUserToClaimBalance(userAddress)
473473 let toClaim = $t01538915449._1
474474 let toUnlock = $t01538915449._2
475475 let paymentAmount = if ((size(i.payments) == 0))
476476 then 0
477477 else i.payments[0].amount
478478 let available = ((toUnlock + toClaim) + paymentAmount)
479479 let checks = [if (!(isForceStop))
480480 then true
481481 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
482482 then true
483483 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
484484 then true
485485 else (i.payments[0].assetId == l2AssetIdBytes))
486486 then true
487487 else throwErr(makeString(["payment assetId should be:", l2AssetIdString], " ")), if ((userLeasingAmount > 0))
488488 then true
489489 else throwErr("amount should be greater than 0"), if ((available >= userLeasingAmount))
490490 then true
491491 else throwErr("amount should be less or equal (payment + available) amount"), if ((userLeasingAmount >= paymentAmount))
492492 then true
493493 else throw("amount should be greater or equal payment amount"), if (isValidAddress(nodeAddress))
494494 then true
495495 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
496496 then true
497497 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
498498 if ((checks == checks))
499499 then {
500500 let $t01652416597 = getLeasingNodeData(nodeAddress)
501501 let nodeCurrentLeased = $t01652416597._1
502502 let nodeNextLeased = $t01652416597._2
503503 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
504504 let $t01666516751 = getUserLeasingData(nodeAddress, userAddress)
505505 let userCurrentLeased = $t01666516751._1
506506 let userNextLeased = $t01666516751._2
507507 let newUserNextLeased = (userNextLeased + userLeasingAmount)
508508 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
509509 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
510510 let newToClaim = min([toClaim, (toClaim + (toUnlock - fromUnlockedAmount))])
511511 let userTotalLocked = getUserTotalLocked(userAddress)
512512 let newUserTotalLocked = (userTotalLocked + userLeasingAmount)
513513 let unitsUnlockedActions = getUnlockUnitsAction(userAddress)
514514 ([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)
515515 }
516516 else throw("Strict value is not equal to itself.")
517517 }
518518
519519
520520 func getStakeFromPaymentActions (nodeAddress,userAddress,i) = {
521521 let checks = [if ((size(i.payments) == 1))
522522 then true
523523 else throwErr("payment size should be exactly 1")]
524524 if ((checks == checks))
525525 then getStakeActions(nodeAddress, userAddress, i.payments[0].amount, i)
526526 else throw("Strict value is not equal to itself.")
527527 }
528528
529529
530530 func getSetNewPeriodLengthActions (newPeriodLength) = {
531531 let check = [if ((newPeriodLength > 0))
532532 then true
533533 else throwErr("period length should be greater than 0")]
534534 if ((check == check))
535535 then if ((periodOffsetHeight == -1))
536536 then [IntegerEntry(keyPeriodLength, newPeriodLength), IntegerEntry(keyPeriodOffsetHeight, height)]
537537 else [IntegerEntry(keyPeriodOffsetId, (currentPeriodId + 1)), IntegerEntry(keyPeriodOffsetHeight, nextPeriodHeight), IntegerEntry(keyPeriodLength, newPeriodLength)]
538538 else throw("Strict value is not equal to itself.")
539539 }
540540
541541
542542 func getUnitsClaimData (userAddress) = {
543543 let $t01863618721 = calculateUnitsToClaim(userAddress)
544544 let unlockedUnitNow = $t01863618721._1
545545 let l2ToBurnNow = $t01863618721._2
546546 let currentBlock = $t01863618721._3
547547 let unlockedUnitsPrev = valueOrElse(getInteger(this, keyUnlockedUnits(userAddress)), 0)
548548 let unitsToSend = (unlockedUnitNow + unlockedUnitsPrev)
549549 let l2ToBurnPrev = valueOrElse(getInteger(this, keyL2ToBurn(userAddress)), 0)
550550 let l2ToBurn = (l2ToBurnPrev + l2ToBurnNow)
551551 let totalUnitsClaimed = valueOrElse(getInteger(this, keyTotalUnitsClaimed(userAddress)), 0)
552552 let totalL2Burned = valueOrElse(getInteger(this, keyL2BurnedTotal(userAddress)), 0)
553553 $Tuple5(unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, currentBlock)
554554 }
555555
556556
557557 func getClaimUnitsActions (userAddress) = {
558558 let $t01931319421 = getUnitsClaimData(userAddress)
559559 let unitsToSend = $t01931319421._1
560560 let totalUnitsClaimed = $t01931319421._2
561561 let l2ToBurn = $t01931319421._3
562562 let totalL2Burned = $t01931319421._4
563563 let claimedBlock = $t01931319421._5
564564 let check = [if ((unitsToSend > 0))
565565 then true
566566 else throwErr("nothing to claim")]
567567 if ((check == check))
568568 then {
569569 let burnAction = match l2AssetIdBytes {
570570 case id: ByteVector =>
571571 [Burn(id, l2ToBurn)]
572572 case _ =>
573573 nil
574574 }
575575 ([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)
576576 }
577577 else throw("Strict value is not equal to itself.")
578578 }
579579
580580
581581 @Callable(i)
582582 func setNewPeriodLength (newPeriodLength) = {
583583 let checks = [if (isInAdminList(toString(i.caller)))
584584 then true
585585 else throwErr("caller is not in adminList")]
586586 if ((checks == checks))
587587 then getSetNewPeriodLengthActions(newPeriodLength)
588588 else throw("Strict value is not equal to itself.")
589589 }
590590
591591
592592
593593 @Callable(i)
594594 func claimUnits () = {
595595 let userAddress = toString(i.caller)
596596 getClaimUnitsActions(userAddress)
597597 }
598598
599599
600600
601601 @Callable(i)
602602 func setForceStopFlag (stop) = {
603603 let check = [if (isInAdminList(toString(i.caller)))
604604 then true
605605 else throwErr("caller is not in adminList")]
606606 if ((check == check))
607607 then [BooleanEntry(keyForceStop, stop)]
608608 else throw("Strict value is not equal to itself.")
609609 }
610610
611611
612612
613613 @Callable(i)
614614 func setForceOutStopFlag (stop) = {
615615 let check = [if (isInAdminList(toString(i.caller)))
616616 then true
617617 else throwErr("caller is not in adminList")]
618618 if ((check == check))
619619 then [BooleanEntry(keyForceOutStop, stop)]
620620 else throw("Strict value is not equal to itself.")
621621 }
622622
623623
624624
625625 @Callable(i)
626626 func getNodeDataREADONLY (nodeAddress) = {
627627 let $t02115321217 = getLeasingNodeData(nodeAddress)
628628 let currentLease = $t02115321217._1
629629 let nextLeased = $t02115321217._2
630630 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
631631 }
632632
633633
634634
635635 @Callable(i)
636636 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
637637 let $t02158721664 = getUserLeasingData(nodeAddress, userAddress)
638638 let currentLease = $t02158721664._1
639639 let nextLeased = $t02158721664._2
640640 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
641641 }
642642
643643
644644
645645 @Callable(i)
646646 func getUserDataREADONLY (userAddress) = {
647- let $t02222222282 = getUserToClaimBalance(userAddress)
648- let toClaim = $t02222222282._1
649- let toUnlock = $t02222222282._2
647+ let $t02225922319 = getUserToClaimBalance(userAddress)
648+ let toClaim = $t02225922319._1
649+ let toUnlock = $t02225922319._2
650650 let userTotalLocked = getUserTotalLocked(userAddress)
651- let $t02234522453 = getUnitsClaimData(userAddress)
652- let unitsToSend = $t02234522453._1
653- let totalUnitsClaimed = $t02234522453._2
654- let l2ToBurn = $t02234522453._3
655- let totalL2Burned = $t02234522453._4
656- let claimedBlock = $t02234522453._5
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
657657 let unitsPerBlockScale16 = valueOrElse(getInteger(this, keyUnitsPerBlockScale16), 0)
658- $Tuple2(nil, $Tuple12(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock, unitsPerBlockScale16))
658+ let remainingblocks = max([0, ((unitsClaimStartHeight + unitsClaimInterval) - height)])
659+ $Tuple2(nil, $Tuple13(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock, unitsPerBlockScale16, remainingblocks))
659660 }
660661
661662
662663
663664 @Callable(i)
664665 func leaseByAddress (nodeAddress,userAddress) = getStakeFromPaymentActions(nodeAddress, userAddress, i)
665666
666667
667668
668669 @Callable(i)
669670 func lease (nodeAddress) = {
670671 let userAddress = toString(i.caller)
671672 getStakeFromPaymentActions(nodeAddress, userAddress, i)
672673 }
673674
674675
675676
676677 @Callable(i)
677678 func leaseFromLocked (nodeAddress,amount) = {
678679 let userAddress = toString(i.caller)
679680 getStakeActions(nodeAddress, userAddress, amount, i)
680681 }
681682
682683
683684
684685 @Callable(i)
685686 func cancelLease (nodeAddress,amount) = {
686687 let userAddress = toString(i.caller)
687688 getUnstakeActions(nodeAddress, userAddress, amount)
688689 }
689690
690691
691692
692693 @Callable(i)
693694 func claim (amount) = {
694695 let userAddress = toString(i.caller)
695696 getClaimUnlockedActions(userAddress, amount)
696697 }
697698
698699
699700
700701 @Callable(i)
701702 func claimAll () = {
702703 let userAddress = toString(i.caller)
703- let $t02376623826 = getUserToClaimBalance(userAddress)
704- let toClaim = $t02376623826._1
705- let toUnlock = $t02376623826._2
704+ let $t02392023980 = getUserToClaimBalance(userAddress)
705+ let toClaim = $t02392023980._1
706+ let toUnlock = $t02392023980._2
706707 let checks = [if ((toClaim > 0))
707708 then true
708709 else throwErr("nothing to claim")]
709710 if ((checks == checks))
710711 then getClaimUnlockedActions(userAddress, toClaim)
711712 else throw("Strict value is not equal to itself.")
712713 }
713714
714715
715716
716717 @Callable(i)
717718 func stakeFor (userAddress) = getStakeForActions(userAddress, i)
718719
719720
720721
721722 @Callable(i)
722723 func startUnitsVesting (unitsClaimInterval) = {
723724 let totalL2 = 100000000000000000
724725 let totalUnits = i.payments[0].amount
725726 let unitsPerBlockScale16 = (fraction(totalUnits, scale16, totalL2) / unitsClaimInterval)
726727 let check = [if (isInAdminList(toString(i.caller)))
727728 then true
728729 else throwErr("caller is not in adminList"), if ((size(i.payments) == 1))
729730 then true
730731 else throwErr("should be 1 payment"), if ((unitsPerBlockScale16 > 0))
731732 then true
732733 else throwErr("units per block should be greated than 0")]
733734 if ((check == check))
734735 then [IntegerEntry(keyUnitsPerBlockScale16, unitsPerBlockScale16), IntegerEntry(keyUnitsClaimStartHeight, height), IntegerEntry(keyUnitsClaimInterval, unitsClaimInterval), StringEntry(keyUnitsAssetId, assetBytesToString(i.payments[0].assetId))]
735736 else throw("Strict value is not equal to itself.")
736737 }
737738
738739
739740
740741 @Callable(i)
741742 func voteForTxId (txId) = {
742743 let callerAddressString = toBase58String(i.caller.bytes)
743744 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
744745 let result = [StringEntry(keyAllowedTxId(), txId)]
745746 let allowedTxIdOption = getString(this, keyAllowedTxId())
746747 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
747748 then true
748749 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
749750 then true
750751 else (value(allowedTxIdOption) != txId))
751752 then true
752753 else throwErr((txId + " is already allowed"))]
753754 if ((err == err))
754755 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
755756 else throw("Strict value is not equal to itself.")
756757 }
757758
758759
759760 @Verifier(tx)
760761 func verify () = {
761762 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
762763 let byOwner = if ((size(getAdminsList()) >= QUORUM))
763764 then false
764765 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
765766 if (byAdmins)
766767 then true
767768 else byOwner
768769 }
769770

github/deemru/w8io/026f985 
90.35 ms