tx · EDS2JzwHfQLX9WX6Se6unA3uHm3JRq83rz1KVeNngGg9

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.02700000 Waves

2024.10.21 18:24 [3336781] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "EDS2JzwHfQLX9WX6Se6unA3uHm3JRq83rz1KVeNngGg9", "fee": 2700000, "feeAssetId": null, "timestamp": 1729524235882, "version": 1, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "h6H2MxKQwZEKxA66NavsMJcwzjU8ifGtkfkMp3ESWHhMwefR45pqsKfWRsGpUyryBW11nnhMvix4NGstbZ98bd8" ], "script": "base64:BgJQCAISAwoBARIAEgMKAQQSAwoBBBIDCgEIEgQKAggIEgMKAQgSBAoCCAgSAwoBCBIECgIIARIECgIIARIDCgEBEgASAwoBCBIDCgEBEgMKAQhPAAxjb250cmFjdEZpbGUCEWwybXBfbGVhc2luZy5yaWRlAANTRVACAl9fABJCTE9DS1NfSU5fSU5URVJWQUwA6AcABnNjYWxlOACAwtcvAAdzY2FsZTE2CQBoAgUGc2NhbGU4BQZzY2FsZTgBCHRocm93RXJyAQNtc2cJAAIBCQCsAgIJAKwCAgUMY29udHJhY3RGaWxlAgI6IAUDbXNnAAxrZXlMMkFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAAMa2V5Rm9yY2VTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIJZm9yY2VTdG9wBQNuaWwFA1NFUAAPa2V5Rm9yY2VPdXRTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIMZm9yY2VPdXRTdG9wBQNuaWwFA1NFUAAPa2V5VW5pdHNBc3NldElkCQC5CQIJAMwIAgICJXMJAMwIAgIMdW5pdHNBc3NldElkBQNuaWwFA1NFUAAXa2V5VW5pdHNQZXJCbG9ja1NjYWxlMTYJALkJAgkAzAgCAgIlcwkAzAgCAhR1bml0c1BlckJsb2NrU2NhbGUxNgUDbmlsBQNTRVAAEWtleVBlcmlvZE9mZnNldElkCQC5CQIJAMwIAgICJXMJAMwIAgIIb2Zmc2V0SWQFA25pbAUDU0VQABVrZXlQZXJpb2RPZmZzZXRIZWlnaHQJALkJAgkAzAgCAgIlcwkAzAgCAgxvZmZzZXRIZWlnaHQFA25pbAUDU0VQAA9rZXlQZXJpb2RMZW5ndGgJALkJAgkAzAgCAgIlcwkAzAgCAgxwZXJpb2RMZW5ndGgFA25pbAUDU0VQABhrZXlVbml0c0NsYWltU3RhcnRIZWlnaHQJALkJAgkAzAgCAgIlcwkAzAgCAhV1bml0c0NsYWltU3RhcnRIZWlnaHQFA25pbAUDU0VQABVrZXlVbml0c0NsYWltSW50ZXJ2YWwJALkJAgkAzAgCAgIlcwkAzAgCAhJ1bml0c0NsYWltSW50ZXJ2YWwFA25pbAUDU0VQAA5wZXJpb2RPZmZzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrZXlQZXJpb2RPZmZzZXRJZAAAAAxwZXJpb2RMZW5ndGgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUPa2V5UGVyaW9kTGVuZ3RoAJBOABJwZXJpb2RPZmZzZXRIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEAD2N1cnJlbnRQZXJpb2RJZAMDCQBmAgUGaGVpZ2h0BRJwZXJpb2RPZmZzZXRIZWlnaHQJAQIhPQIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BBwkAZAIJAGkCCQBlAgUGaGVpZ2h0BRJwZXJpb2RPZmZzZXRIZWlnaHQFDHBlcmlvZExlbmd0aAUOcGVyaW9kT2Zmc2V0SWQJAJYDAQkAzAgCAAAJAMwIAgkAZQIFDnBlcmlvZE9mZnNldElkAAEFA25pbAATY3VycmVudFBlcmlvZEhlaWdodAMDCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEGAwkAAAIFD2N1cnJlbnRQZXJpb2RJZAAACQBmAgUScGVyaW9kT2Zmc2V0SGVpZ2h0BQZoZWlnaHQHAAAJAGQCBRJwZXJpb2RPZmZzZXRIZWlnaHQJAGgCCQBlAgUPY3VycmVudFBlcmlvZElkBQ5wZXJpb2RPZmZzZXRJZAUMcGVyaW9kTGVuZ3RoABBuZXh0UGVyaW9kSGVpZ2h0AwMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQYDCQAAAgUPY3VycmVudFBlcmlvZElkAAAJAGYCBRJwZXJpb2RPZmZzZXRIZWlnaHQFBmhlaWdodAcAAAkAZAIFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDHBlcmlvZExlbmd0aAAVdW5pdHNDbGFpbVN0YXJ0SGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGGtleVVuaXRzQ2xhaW1TdGFydEhlaWdodAUGaGVpZ2h0ABJ1bml0c0NsYWltSW50ZXJ2YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVa2V5VW5pdHNDbGFpbUludGVydmFsAAABEmtleUxlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MJALkJAgkAzAgCAgIlcwkAzAgCBQtub2RlQWRkcmVzcwUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nTm9kZURhdGECC3VzZXJBZGRyZXNzC25vZGVBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABDmtleVVzZXJUb0NsYWltAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIHdG9DbGFpbQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABEmtleVVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICD3VzZXJUb3RhbExvY2tlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIRdW5pdHNDbGFpbWVkQmxvY2sJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARBrZXlVbmxvY2tlZFVuaXRzAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgINdW5sb2NrZWRVbml0cwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFGtleVRvdGFsVW5pdHNDbGFpbWVkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIRdG90YWxVbml0c0NsYWltZWQJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQAQtrZXlMMlRvQnVybgELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICCGwyVG9CdXJuCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEQa2V5TDJCdXJuZWRUb3RhbAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICDWwyQnVybmVkVG90YWwJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQtub2RlQWRkcmVzcwQBaAMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAABQZoZWlnaHQJALkJAgkAzAgCAgQlcyVkCQDMCAIFC25vZGVBZGRyZXNzCQDMCAIJAKQDAQUBaAUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nQnlIZWlnaHQCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzBAFoAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BAAAFBmhlaWdodAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQCkAwEFAWgFA25pbAUDU0VQARJhc3NldFN0cmluZ1RvQnl0ZXMBDWFzc2V0SWRTdHJpbmcDCQAAAgUNYXNzZXRJZFN0cmluZwIFV0FWRVMFBHVuaXQJANkEAQUNYXNzZXRJZFN0cmluZwESYXNzZXRCeXRlc1RvU3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQIFV0FWRVMAD2wyQXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQxrZXlMMkFzc2V0SWQCBVdBVkVTABJ1bml0c0Fzc2V0SWRTdHJpbmcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUPa2V5VW5pdHNBc3NldElkAgVXQVZFUwAObDJBc3NldElkQnl0ZXMJARJhc3NldFN0cmluZ1RvQnl0ZXMBBQ9sMkFzc2V0SWRTdHJpbmcAEXVuaXRzQXNzZXRJZEJ5dGVzCQESYXNzZXRTdHJpbmdUb0J5dGVzAQUSdW5pdHNBc3NldElkU3RyaW5nAAtpc0ZvcmNlU3RvcAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrZXlGb3JjZVN0b3AHAA5pc0ZvcmNlT3V0U3RvcAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ9rZXlGb3JjZU91dFN0b3AHAQ5pc1ZhbGlkQWRkcmVzcwEHYWRkcmVzcwQHJG1hdGNoMAkApggBBQdhZGRyZXNzAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwAPQURNSU5fTElTVF9TSVpFAAUABlFVT1JVTQADABFUWElEX0JZVEVTX0xFTkdUSAAgARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBHR4SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIJYWxsb3dUeElkCQDMCAIFBHR4SWQFA25pbAUDU0VQARBrZXlGdWxsQWRtaW5Wb3RlAgZwcmVmaXgMYWRtaW5BZGRyZXNzCQC5CQIJAMwIAgUGcHJlZml4CQDMCAIFDGFkbWluQWRkcmVzcwUDbmlsBQNTRVABE2tleUFkbWluQWRkcmVzc0xpc3QACQC5CQIJAMwIAgICJXMJAMwIAgIQYWRtaW5BZGRyZXNzTGlzdAUDbmlsBQNTRVABDmtleUFsbG93ZWRUeElkAAkAuQkCCQDMCAICAiVzCQDMCAICBHR4SWQFA25pbAUDU0VQAQxnZXRBZG1pblZvdGUCBnByZWZpeAVhZG1pbgQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFBWFkbWluCQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAENZ2V0QWRtaW5zTGlzdAAEByRtYXRjaDAJAJ0IAgUEdGhpcwkBE2tleUFkbWluQWRkcmVzc0xpc3QAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkAtQkCBQFzBQNTRVAFA25pbAENaXNJbkFkbWluTGlzdAEHYWRkcmVzcwkBD2NvbnRhaW5zRWxlbWVudAIJAQ1nZXRBZG1pbnNMaXN0AAUHYWRkcmVzcwESZ2VuVm90ZXNLZXlzSGVscGVyAgFhDGFkbWluQWRkcmVzcwQLJHQwNTE4NTUyMDkFAWEEBnJlc3VsdAgFCyR0MDUxODU1MjA5Al8xBAZwcmVmaXgIBQskdDA1MTg1NTIwOQJfMgkAlAoCCQDNCAIFBnJlc3VsdAkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFDGFkbWluQWRkcmVzcwUGcHJlZml4AQxnZW5Wb3Rlc0tleXMBCWtleVByZWZpeAQJYWRtaW5MaXN0CQETa2V5QWRtaW5BZGRyZXNzTGlzdAAECyR0MDUzNTY1NDQwCgACJGwJAQ1nZXRBZG1pbnNMaXN0AAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQlrZXlQcmVmaXgKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEmdlblZvdGVzS2V5c0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUEBnJlc3VsdAgFCyR0MDUzNTY1NDQwAl8xBAZwcmVmaXgIBQskdDA1MzU2NTQ0MAJfMgUGcmVzdWx0ARBjb3VudFZvdGVzSGVscGVyAgZyZXN1bHQHdm90ZUtleQkAZAIFBnJlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABCmNvdW50Vm90ZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNvdW50Vm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFARBjbGVhclZvdGVzSGVscGVyAgZyZXN1bHQDa2V5CQDNCAIFBnJlc3VsdAkBC0RlbGV0ZUVudHJ5AQUDa2V5ARNnZXRDbGVhclZvdGVFbnRyaWVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjbGVhclZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEMdm90ZUlOVEVSTkFMBBNjYWxsZXJBZGRyZXNzU3RyaW5nCWtleVByZWZpeAhtaW5Wb3Rlcwp2b3RlUmVzdWx0BAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQQYWRtaW5DdXJyZW50Vm90ZQkBDGdldEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQDZXJyAwkBASEBCQENaXNJbkFkbWluTGlzdAEFE2NhbGxlckFkZHJlc3NTdHJpbmcJAQh0aHJvd0VycgEJAKwCAgkArAICAglBZGRyZXNzOiAFE2NhbGxlckFkZHJlc3NTdHJpbmcCEiBub3QgaW4gQWRtaW4gbGlzdAMJAAACBRBhZG1pbkN1cnJlbnRWb3RlAAEJAQh0aHJvd0VycgEJAKwCAgUHdm90ZUtleQISIHlvdSBhbHJlYWR5IHZvdGVkBQR1bml0AwkAAAIFA2VycgUDZXJyBAV2b3RlcwkBCmNvdW50Vm90ZXMBBQlrZXlQcmVmaXgDCQBnAgkAZAIFBXZvdGVzAAEFCG1pblZvdGVzBBBjbGVhclZvdGVFbnRyaWVzCQETZ2V0Q2xlYXJWb3RlRW50cmllcwEFCWtleVByZWZpeAkAzggCBRBjbGVhclZvdGVFbnRyaWVzBQp2b3RlUmVzdWx0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd2b3RlS2V5AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZ2V0TGVhc2luZ05vZGVFbnRyeQMLbm9kZUFkZHJlc3MNY3VycmVudExlYXNlZApuZXh0TGVhc2VkBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFDWN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUKbmV4dExlYXNlZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIJARJrZXlMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldExlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MEGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQESa2V5TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEByRtYXRjaDAFGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBBFub2RlQ3VycmVudFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEEEW5vZGVDdXJyZW50TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQObm9kZU5leHRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAADBA5ub2RlTmV4dExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAQDAwkAZgIFDm5vZGVOZXh0UGVyaW9kBQZoZWlnaHQGCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEJAJQKAgURbm9kZUN1cnJlbnRMZWFzZWQFDm5vZGVOZXh0TGVhc2VkCQCUCgIFDm5vZGVOZXh0TGVhc2VkBQ5ub2RlTmV4dExlYXNlZAkAlAoCAAAAAAETZ2V0VXNlckxlYXNpbmdFbnRyeQQLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MRdXNlckN1cnJlbnRMZWFzZWQOdXNlck5leHRMZWFzZWQEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgIIJWQlZCVkJWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQURdXNlckN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUOdXNlck5leHRMZWFzZWQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldFVzZXJMZWFzaW5nRGF0YQILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEGGxlYXNpbmdVc2VyRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwQHJG1hdGNoMAUYbGVhc2luZ1VzZXJEYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEEXVzZXJDdXJyZW50UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAQQRdXNlckN1cnJlbnRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAACBA51c2VyTmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMEDnVzZXJOZXh0TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUOdXNlck5leHRQZXJpb2QFBmhlaWdodAYJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAlAoCBRF1c2VyQ3VycmVudExlYXNlZAUOdXNlck5leHRMZWFzZWQJAJQKAgUOdXNlck5leHRMZWFzZWQFDnVzZXJOZXh0TGVhc2VkCQCUCgIAAAAAARNnZXRVc2VyVG9DbGFpbUVudHJ5Awt1c2VyQWRkcmVzcwd0b0NsYWltCHRvVW5sb2NrBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFB3RvQ2xhaW0JAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUIdG9VbmxvY2sFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwULdmFsdWVTdHJpbmcBFWdldFVzZXJUb0NsYWltQmFsYW5jZQELdXNlckFkZHJlc3MEGHVzZXJUb0NsYWltRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwQHJG1hdGNoMAUYdXNlclRvQ2xhaW1EYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEDWN1cnJlbnRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAABBAd0b0NsYWltCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQKbmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMECHRvVW5sb2NrCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUKbmV4dFBlcmlvZAUGaGVpZ2h0BgkAAAIFD2N1cnJlbnRQZXJpb2RJZAAACQCUCgIFB3RvQ2xhaW0FCHRvVW5sb2NrCQCUCgIJAGQCBQd0b0NsYWltBQh0b1VubG9jawAACQCUCgIAAAAAARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQILdXNlckFkZHJlc3MPdXNlclRvdGFsTG9ja2VkCQEMSW50ZWdlckVudHJ5AgkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBQ91c2VyVG90YWxMb2NrZWQBEmdldFVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzAAABFWNhbGN1bGF0ZVVuaXRzVG9DbGFpbQELdXNlckFkZHJlc3MED2NsYWltZWRCbG9ja0tleQkBFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQULdXNlckFkZHJlc3MEDGNsYWltZWRCbG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9jbGFpbWVkQmxvY2tLZXkFFXVuaXRzQ2xhaW1TdGFydEhlaWdodAQUdW5pdHNQZXJCbG9ja1NjYWxlMTYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXa2V5VW5pdHNQZXJCbG9ja1NjYWxlMTYAAAQMY3VycmVudEJsb2NrCQCXAwEJAMwIAgkAZAIFFXVuaXRzQ2xhaW1TdGFydEhlaWdodAUSdW5pdHNDbGFpbUludGVydmFsCQDMCAIFBmhlaWdodAUDbmlsBAxibG9ja3NQYXNzZWQJAGUCBQxjdXJyZW50QmxvY2sFDGNsYWltZWRCbG9jawQMYW1vdW50U3Rha2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MECGwyVG9CdXJuCQBrAwUMYW1vdW50U3Rha2VkBQxibG9ja3NQYXNzZWQFEnVuaXRzQ2xhaW1JbnRlcnZhbAQPdW5pdHNUb0NsYWltTm93CQBrAwUIbDJUb0J1cm4FFHVuaXRzUGVyQmxvY2tTY2FsZTE2BQdzY2FsZTE2CQCVCgMFD3VuaXRzVG9DbGFpbU5vdwUIbDJUb0J1cm4FDGN1cnJlbnRCbG9jawEUZ2V0VW5sb2NrVW5pdHNBY3Rpb24BC3VzZXJBZGRyZXNzBA5rVW5sb2NrZWRVbml0cwkBEGtleVVubG9ja2VkVW5pdHMBBQt1c2VyQWRkcmVzcwQNdW5sb2NrZWRVbml0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rVW5sb2NrZWRVbml0cwAABAlrTDJUb0J1cm4JAQtrZXlMMlRvQnVybgEFC3VzZXJBZGRyZXNzBAhsMlRvQnVybgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQlrTDJUb0J1cm4AAAQNJHQwMTEzNjQxMTQ0OQkBFWNhbGN1bGF0ZVVuaXRzVG9DbGFpbQEFC3VzZXJBZGRyZXNzBA91bml0c1RvQ2xhaW1Ob3cIBQ0kdDAxMTM2NDExNDQ5Al8xBAtsMlRvQnVybk5vdwgFDSR0MDExMzY0MTE0NDkCXzIEDGN1cnJlbnRCbG9jawgFDSR0MDExMzY0MTE0NDkCXzMDCQBnAgAABQ91bml0c1RvQ2xhaW1Ob3cFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVVuaXRzQ2xhaW1lZEJsb2NrAQULdXNlckFkZHJlc3MFDGN1cnJlbnRCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0wyVG9CdXJuCQBkAgUIbDJUb0J1cm4FC2wyVG9CdXJuTm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5rVW5sb2NrZWRVbml0cwkAZAIFDXVubG9ja2VkVW5pdHMFD3VuaXRzVG9DbGFpbU5vdwUDbmlsARFnZXRVbnN0YWtlQWN0aW9ucwMLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MNdW5zdGFrZUFtb3VudAQNJHQwMTE4NDQxMTkxNwkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBBFub2RlQ3VycmVudExlYXNlZAgFDSR0MDExODQ0MTE5MTcCXzEEDm5vZGVOZXh0TGVhc2VkCAUNJHQwMTE4NDQxMTkxNwJfMgQNJHQwMTE5MjIxMjAwOAkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQRdXNlckN1cnJlbnRMZWFzZWQIBQ0kdDAxMTkyMjEyMDA4Al8xBA51c2VyTmV4dExlYXNlZAgFDSR0MDExOTIyMTIwMDgCXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQEBIQEFDmlzRm9yY2VPdXRTdG9wBgkBCHRocm93RXJyAQIddW5zdGFrZSBpcyB0ZW1wb3JhcnkgZGlzYWJsZWQJAMwIAgMJAGYCBQ11bnN0YWtlQW1vdW50AAAGCQEIdGhyb3dFcnIBAid1bnN0YWtlIGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQ51c2VyTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAYJAQh0aHJvd0VycgECOXVuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHVzZXIgc3Rha2VkIGFtb3VudAkAzAgCAwkAZwIFDm5vZGVOZXh0TGVhc2VkBQ11bnN0YWtlQW1vdW50BgkBCHRocm93RXJyAQI5dW5zdGFrZSBhbW91bnQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgbm9kZSBzdGFrZWQgYW1vdW50CQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQtub2RlQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhpub2RlIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQtub2RlQWRkcmVzcwUDbmlsAgEgCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQt1c2VyQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhp1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEEG5ld05vZGVOZXh0TGVhc2UJAGUCBQ5ub2RlTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAQRbmV3VXNlck5leHRMZWFzZWQJAGUCBQ51c2VyTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAQNJHQwMTI4OTIxMjk1MgkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTI4OTIxMjk1MgJfMQQIdG9VbmxvY2sIBQ0kdDAxMjg5MjEyOTUyAl8yBAtuZXdUb1VubG9jawkAZAIFCHRvVW5sb2NrBQ11bnN0YWtlQW1vdW50BA91c2VyVG90YWxMb2NrZWQJARJnZXRVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwQSbmV3VXNlclRvdGFsTG9ja2VkCQBlAgUPdXNlclRvdGFsTG9ja2VkBQ11bnN0YWtlQW1vdW50BBR1bml0c1VubG9ja2VkQWN0aW9ucwkBFGdldFVubG9ja1VuaXRzQWN0aW9uAQULdXNlckFkZHJlc3MJAM4IAgkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFB3RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsBRR1bml0c1VubG9ja2VkQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCC3VzZXJBZGRyZXNzC2NsYWltQW1vdW50BA0kdDAxMzc3MTEzODMxCQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxMzc3MTEzODMxAl8xBAh0b1VubG9jawgFDSR0MDEzNzcxMTM4MzECXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQEBIQEFDmlzRm9yY2VPdXRTdG9wBgkBCHRocm93RXJyAQIbY2xhaW0gaXMgdGVtcG9yYXJ5IGRpc2FibGVkCQDMCAIDCQBmAgULY2xhaW1BbW91bnQAAAYJAQh0aHJvd0VycgECJWNsYWltIGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQd0b0NsYWltBQtjbGFpbUFtb3VudAYJAQh0aHJvd0VycgECNGNsYWltIGFtb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB1bmxvY2tlZCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKbmV3VG9DbGFpbQkAZQIFB3RvQ2xhaW0FC2NsYWltQW1vdW50CQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FCHRvVW5sb2NrCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3VzZXJBZGRyZXNzBQtjbGFpbUFtb3VudAUObDJBc3NldElkQnl0ZXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgESZ2V0U3Rha2VGb3JBY3Rpb25zAgt1c2VyQWRkcmVzcwFpBA0kdDAxNDU5NzE0NjU3CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxNDU5NzE0NjU3Al8xBAh0b1VubG9jawgFDSR0MDE0NTk3MTQ2NTcCXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQBnAgABCQCQAwEIBQFpCHBheW1lbnRzBgkBCHRocm93RXJyAQIRbWF4aW11bSAxIHBheW1lbnQJAMwIAgMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUObDJBc3NldElkQnl0ZXMGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIacGF5bWVudCBhc3NldElkIHNob3VsZCBiZToJAMwIAgUPbDJBc3NldElkU3RyaW5nBQNuaWwCASAJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKbmV3VG9DbGFpbQkAZAIFB3RvQ2xhaW0ICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FCHRvVW5sb2NrBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD2dldFN0YWtlQWN0aW9ucwQLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MRdXNlckxlYXNpbmdBbW91bnQBaQQNJHQwMTUzODkxNTQ0OQkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTUzODkxNTQ0OQJfMQQIdG9VbmxvY2sIBQ0kdDAxNTM4OTE1NDQ5Al8yBA1wYXltZW50QW1vdW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQJYXZhaWxhYmxlCQBkAgkAZAIFCHRvVW5sb2NrBQd0b0NsYWltBQ1wYXltZW50QW1vdW50BAZjaGVja3MJAMwIAgMJAQEhAQULaXNGb3JjZVN0b3AGCQEIdGhyb3dFcnIBAh1jb250cmFjdCBpcyB0ZW1wb3Jhcnkgc3RvcHBlZAkAzAgCAwkAZwIAAQkAkAMBCAUBaQhwYXltZW50cwYJAQh0aHJvd0VycgECEW1heGltdW0gMSBwYXltZW50CQDMCAIDAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAYJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDmwyQXNzZXRJZEJ5dGVzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnBheW1lbnQgYXNzZXRJZCBzaG91bGQgYmU6CQDMCAIFD2wyQXNzZXRJZFN0cmluZwUDbmlsAgEgCQDMCAIDCQBmAgURdXNlckxlYXNpbmdBbW91bnQAAAYJAQh0aHJvd0VycgECH2Ftb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQlhdmFpbGFibGUFEXVzZXJMZWFzaW5nQW1vdW50BgkBCHRocm93RXJyAQI7YW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIChwYXltZW50ICsgYXZhaWxhYmxlKSBhbW91bnQJAMwIAgMJAGcCBRF1c2VyTGVhc2luZ0Ftb3VudAUNcGF5bWVudEFtb3VudAYJAAIBAjBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgb3IgZXF1YWwgcGF5bWVudCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC25vZGVBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGm5vZGUgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC25vZGVBZGRyZXNzBQNuaWwCASAJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQNJHQwMTY1MjQxNjU5NwkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBBFub2RlQ3VycmVudExlYXNlZAgFDSR0MDE2NTI0MTY1OTcCXzEEDm5vZGVOZXh0TGVhc2VkCAUNJHQwMTY1MjQxNjU5NwJfMgQQbmV3Tm9kZU5leHRMZWFzZQkAZAIFDm5vZGVOZXh0TGVhc2VkBRF1c2VyTGVhc2luZ0Ftb3VudAQNJHQwMTY2NjUxNjc1MQkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQRdXNlckN1cnJlbnRMZWFzZWQIBQ0kdDAxNjY2NTE2NzUxAl8xBA51c2VyTmV4dExlYXNlZAgFDSR0MDE2NjY1MTY3NTECXzIEEW5ld1VzZXJOZXh0TGVhc2VkCQBkAgUOdXNlck5leHRMZWFzZWQFEXVzZXJMZWFzaW5nQW1vdW50BBJmcm9tVW5sb2NrZWRBbW91bnQJAGUCBRF1c2VyTGVhc2luZ0Ftb3VudAUNcGF5bWVudEFtb3VudAQLbmV3VG9VbmxvY2sJAJYDAQkAzAgCAAAJAMwIAgkAZQIFCHRvVW5sb2NrBRJmcm9tVW5sb2NrZWRBbW91bnQFA25pbAQKbmV3VG9DbGFpbQkAlwMBCQDMCAIFB3RvQ2xhaW0JAMwIAgkAZAIFB3RvQ2xhaW0JAGUCBQh0b1VubG9jawUSZnJvbVVubG9ja2VkQW1vdW50BQNuaWwED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBBJuZXdVc2VyVG90YWxMb2NrZWQJAGQCBQ91c2VyVG90YWxMb2NrZWQFEXVzZXJMZWFzaW5nQW1vdW50BBR1bml0c1VubG9ja2VkQWN0aW9ucwkBFGdldFVubG9ja1VuaXRzQWN0aW9uAQULdXNlckFkZHJlc3MJAM4IAgkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsBRR1bml0c1VubG9ja2VkQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzAWkEBmNoZWNrcwkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECIHBheW1lbnQgc2l6ZSBzaG91bGQgYmUgZXhhY3RseSAxBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJAQ9nZXRTdGFrZUFjdGlvbnMEBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQFpCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARxnZXRTZXROZXdQZXJpb2RMZW5ndGhBY3Rpb25zAQ9uZXdQZXJpb2RMZW5ndGgEBWNoZWNrCQDMCAIDCQBmAgUPbmV3UGVyaW9kTGVuZ3RoAAAGCQEIdGhyb3dFcnIBAiZwZXJpb2QgbGVuZ3RoIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa2V5UGVyaW9kTGVuZ3RoBQ9uZXdQZXJpb2RMZW5ndGgJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVBlcmlvZE9mZnNldEhlaWdodAUGaGVpZ2h0BQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtleVBlcmlvZE9mZnNldElkCQBkAgUPY3VycmVudFBlcmlvZElkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleVBlcmlvZE9mZnNldEhlaWdodAUQbmV4dFBlcmlvZEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa2V5UGVyaW9kTGVuZ3RoBQ9uZXdQZXJpb2RMZW5ndGgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERZ2V0VW5pdHNDbGFpbURhdGEBC3VzZXJBZGRyZXNzBA0kdDAxODYzNjE4NzIxCQEVY2FsY3VsYXRlVW5pdHNUb0NsYWltAQULdXNlckFkZHJlc3MED3VubG9ja2VkVW5pdE5vdwgFDSR0MDE4NjM2MTg3MjECXzEEC2wyVG9CdXJuTm93CAUNJHQwMTg2MzYxODcyMQJfMgQMY3VycmVudEJsb2NrCAUNJHQwMTg2MzYxODcyMQJfMwQRdW5sb2NrZWRVbml0c1ByZXYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEGtleVVubG9ja2VkVW5pdHMBBQt1c2VyQWRkcmVzcwAABAt1bml0c1RvU2VuZAkAZAIFD3VubG9ja2VkVW5pdE5vdwURdW5sb2NrZWRVbml0c1ByZXYEDGwyVG9CdXJuUHJldgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQELa2V5TDJUb0J1cm4BBQt1c2VyQWRkcmVzcwAABAhsMlRvQnVybgkAZAIFDGwyVG9CdXJuUHJldgULbDJUb0J1cm5Ob3cEEXRvdGFsVW5pdHNDbGFpbWVkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARRrZXlUb3RhbFVuaXRzQ2xhaW1lZAEFC3VzZXJBZGRyZXNzAAAEDXRvdGFsTDJCdXJuZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEGtleUwyQnVybmVkVG90YWwBBQt1c2VyQWRkcmVzcwAACQCXCgUFC3VuaXRzVG9TZW5kBRF0b3RhbFVuaXRzQ2xhaW1lZAUIbDJUb0J1cm4FDXRvdGFsTDJCdXJuZWQFDGN1cnJlbnRCbG9jawEUZ2V0Q2xhaW1Vbml0c0FjdGlvbnMBC3VzZXJBZGRyZXNzBA0kdDAxOTMxMzE5NDIxCQERZ2V0VW5pdHNDbGFpbURhdGEBBQt1c2VyQWRkcmVzcwQLdW5pdHNUb1NlbmQIBQ0kdDAxOTMxMzE5NDIxAl8xBBF0b3RhbFVuaXRzQ2xhaW1lZAgFDSR0MDE5MzEzMTk0MjECXzIECGwyVG9CdXJuCAUNJHQwMTkzMTMxOTQyMQJfMwQNdG90YWxMMkJ1cm5lZAgFDSR0MDE5MzEzMTk0MjECXzQEDGNsYWltZWRCbG9jawgFDSR0MDE5MzEzMTk0MjECXzUEBWNoZWNrCQDMCAIDCQBmAgULdW5pdHNUb1NlbmQAAAYJAQh0aHJvd0VycgECEG5vdGhpbmcgdG8gY2xhaW0FA25pbAMJAAACBQVjaGVjawUFY2hlY2sECmJ1cm5BY3Rpb24EByRtYXRjaDAFDmwyQXNzZXRJZEJ5dGVzAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDMCAIJAQRCdXJuAgUCaWQFCGwyVG9CdXJuBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5VW5pdHNDbGFpbWVkQmxvY2sBBQt1c2VyQWRkcmVzcwUMY2xhaW1lZEJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5VG90YWxVbml0c0NsYWltZWQBBQt1c2VyQWRkcmVzcwkAZAIFEXRvdGFsVW5pdHNDbGFpbWVkBQt1bml0c1RvU2VuZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleUwyQnVybmVkVG90YWwBBQt1c2VyQWRkcmVzcwkAZAIFDXRvdGFsTDJCdXJuZWQFCGwyVG9CdXJuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQa2V5VW5sb2NrZWRVbml0cwEFC3VzZXJBZGRyZXNzAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtrZXlMMlRvQnVybgEFC3VzZXJBZGRyZXNzAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQULdXNlckFkZHJlc3MFC3VuaXRzVG9TZW5kBRF1bml0c0Fzc2V0SWRCeXRlcwUDbmlsBQpidXJuQWN0aW9uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuEAFpARJzZXROZXdQZXJpb2RMZW5ndGgBD25ld1BlcmlvZExlbmd0aAQGY2hlY2tzCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBHGdldFNldE5ld1BlcmlvZExlbmd0aEFjdGlvbnMBBQ9uZXdQZXJpb2RMZW5ndGgJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY2xhaW1Vbml0cwAEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBFGdldENsYWltVW5pdHNBY3Rpb25zAQULdXNlckFkZHJlc3MBaQEQc2V0Rm9yY2VTdG9wRmxhZwEEc3RvcAQFY2hlY2sJAMwIAgMJAQ1pc0luQWRtaW5MaXN0AQkApQgBCAUBaQZjYWxsZXIGCQEIdGhyb3dFcnIBAhpjYWxsZXIgaXMgbm90IGluIGFkbWluTGlzdAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa2V5Rm9yY2VTdG9wBQRzdG9wBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETc2V0Rm9yY2VPdXRTdG9wRmxhZwEEc3RvcAQFY2hlY2sJAMwIAgMJAQ1pc0luQWRtaW5MaXN0AQkApQgBCAUBaQZjYWxsZXIGCQEIdGhyb3dFcnIBAhpjYWxsZXIgaXMgbm90IGluIGFkbWluTGlzdAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMQm9vbGVhbkVudHJ5AgUPa2V5Rm9yY2VPdXRTdG9wBQRzdG9wBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETZ2V0Tm9kZURhdGFSRUFET05MWQELbm9kZUFkZHJlc3MEDSR0MDIxMTUzMjEyMTcJARJnZXRMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQMY3VycmVudExlYXNlCAUNJHQwMjExNTMyMTIxNwJfMQQKbmV4dExlYXNlZAgFDSR0MDIxMTUzMjEyMTcCXzIJAJQKAgUDbmlsCQCXCgUFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDGN1cnJlbnRMZWFzZQUQbmV4dFBlcmlvZEhlaWdodAUKbmV4dExlYXNlZAUGaGVpZ2h0AWkBGmdldFVzZXJMZWFzaW5nRGF0YVJFQURPTkxZAgtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwQNJHQwMjE1ODcyMTY2NAkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQMY3VycmVudExlYXNlCAUNJHQwMjE1ODcyMTY2NAJfMQQKbmV4dExlYXNlZAgFDSR0MDIxNTg3MjE2NjQCXzIJAJQKAgUDbmlsCQCXCgUFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDGN1cnJlbnRMZWFzZQUQbmV4dFBlcmlvZEhlaWdodAUKbmV4dExlYXNlZAUGaGVpZ2h0AWkBE2dldFVzZXJEYXRhUkVBRE9OTFkBC3VzZXJBZGRyZXNzBA0kdDAyMjIyMjIyMjgyCQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAyMjIyMjIyMjgyAl8xBAh0b1VubG9jawgFDSR0MDIyMjIyMjIyODICXzIED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBA0kdDAyMjM0NTIyNDUzCQERZ2V0VW5pdHNDbGFpbURhdGEBBQt1c2VyQWRkcmVzcwQLdW5pdHNUb1NlbmQIBQ0kdDAyMjM0NTIyNDUzAl8xBBF0b3RhbFVuaXRzQ2xhaW1lZAgFDSR0MDIyMzQ1MjI0NTMCXzIECGwyVG9CdXJuCAUNJHQwMjIzNDUyMjQ1MwJfMwQNdG90YWxMMkJ1cm5lZAgFDSR0MDIyMzQ1MjI0NTMCXzQEDGNsYWltZWRCbG9jawgFDSR0MDIyMzQ1MjI0NTMCXzUEFHVuaXRzUGVyQmxvY2tTY2FsZTE2CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFF2tleVVuaXRzUGVyQmxvY2tTY2FsZTE2AAAJAJQKAgUDbmlsCQCeCgwFE2N1cnJlbnRQZXJpb2RIZWlnaHQFB3RvQ2xhaW0FEG5leHRQZXJpb2RIZWlnaHQFCHRvVW5sb2NrBQ91c2VyVG90YWxMb2NrZWQFBmhlaWdodAULdW5pdHNUb1NlbmQFEXRvdGFsVW5pdHNDbGFpbWVkBQhsMlRvQnVybgUNdG90YWxMMkJ1cm5lZAUMY2xhaW1lZEJsb2NrBRR1bml0c1BlckJsb2NrU2NhbGUxNgFpAQ5sZWFzZUJ5QWRkcmVzcwILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MJARpnZXRTdGFrZUZyb21QYXltZW50QWN0aW9ucwMFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUBaQFpAQVsZWFzZQELbm9kZUFkZHJlc3MEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBGmdldFN0YWtlRnJvbVBheW1lbnRBY3Rpb25zAwULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQFpAWkBD2xlYXNlRnJvbUxvY2tlZAILbm9kZUFkZHJlc3MGYW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJAQ9nZXRTdGFrZUFjdGlvbnMEBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFBmFtb3VudAUBaQFpAQtjYW5jZWxMZWFzZQILbm9kZUFkZHJlc3MGYW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARFnZXRVbnN0YWtlQWN0aW9ucwMFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUGYW1vdW50AWkBBWNsYWltAQZhbW91bnQEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBF2dldENsYWltVW5sb2NrZWRBY3Rpb25zAgULdXNlckFkZHJlc3MFBmFtb3VudAFpAQhjbGFpbUFsbAAEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQNJHQwMjM3NjYyMzgyNgkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMjM3NjYyMzgyNgJfMQQIdG9VbmxvY2sIBQ0kdDAyMzc2NjIzODI2Al8yBAZjaGVja3MJAMwIAgMJAGYCBQd0b0NsYWltAAAGCQEIdGhyb3dFcnIBAhBub3RoaW5nIHRvIGNsYWltBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwIFC3VzZXJBZGRyZXNzBQd0b0NsYWltCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHN0YWtlRm9yAQt1c2VyQWRkcmVzcwkBEmdldFN0YWtlRm9yQWN0aW9ucwIFC3VzZXJBZGRyZXNzBQFpAWkBEXN0YXJ0VW5pdHNWZXN0aW5nARJ1bml0c0NsYWltSW50ZXJ2YWwEB3RvdGFsTDIAgICo7IWv0bEBBAp0b3RhbFVuaXRzCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQUdW5pdHNQZXJCbG9ja1NjYWxlMTYJAGkCCQBrAwUKdG90YWxVbml0cwUHc2NhbGUxNgUHdG90YWxMMgUSdW5pdHNDbGFpbUludGVydmFsBAVjaGVjawkAzAgCAwkBDWlzSW5BZG1pbkxpc3QBCQClCAEIBQFpBmNhbGxlcgYJAQh0aHJvd0VycgECGmNhbGxlciBpcyBub3QgaW4gYWRtaW5MaXN0CQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQITc2hvdWxkIGJlIDEgcGF5bWVudAkAzAgCAwkAZgIFFHVuaXRzUGVyQmxvY2tTY2FsZTE2AAAGCQEIdGhyb3dFcnIBAih1bml0cyBwZXIgYmxvY2sgc2hvdWxkIGJlIGdyZWF0ZWQgdGhhbiAwBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRdrZXlVbml0c1BlckJsb2NrU2NhbGUxNgUUdW5pdHNQZXJCbG9ja1NjYWxlMTYJAMwIAgkBDEludGVnZXJFbnRyeQIFGGtleVVuaXRzQ2xhaW1TdGFydEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVrZXlVbml0c0NsYWltSW50ZXJ2YWwFEnVuaXRzQ2xhaW1JbnRlcnZhbAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rZXlVbml0c0Fzc2V0SWQJARJhc3NldEJ5dGVzVG9TdHJpbmcBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt2b3RlRm9yVHhJZAEEdHhJZAQTY2FsbGVyQWRkcmVzc1N0cmluZwkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBAlrZXlQcmVmaXgJARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBQR0eElkBAZyZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUFsbG93ZWRUeElkAAUEdHhJZAUDbmlsBBFhbGxvd2VkVHhJZE9wdGlvbgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQABANlcnIJAMwIAgMJAAACCQDIAQEJANkEAQUEdHhJZAURVFhJRF9CWVRFU19MRU5HVEgGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEiBpcyBub3QgdmFsaWQgdHhJZAkAzAgCAwMJAAACBRFhbGxvd2VkVHhJZE9wdGlvbgUEdW5pdAYJAQIhPQIJAQV2YWx1ZQEFEWFsbG93ZWRUeElkT3B0aW9uBQR0eElkBgkBCHRocm93RXJyAQkArAICBQR0eElkAhMgaXMgYWxyZWFkeSBhbGxvd2VkBQNuaWwDCQAAAgUDZXJyBQNlcnIJAQx2b3RlSU5URVJOQUwEBRNjYWxsZXJBZGRyZXNzU3RyaW5nBQlrZXlQcmVmaXgFBlFVT1JVTQUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQIYnlBZG1pbnMJAAACCAUCdHgCaWQJANkEAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQAAgAEB2J5T3duZXIDCQBnAgkAkAMBCQENZ2V0QWRtaW5zTGlzdAAFBlFVT1JVTQcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkDBQhieUFkbWlucwYFB2J5T3duZXJkT/9s", "chainId": 84, "height": 3336781, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4mfmucrfLYY4DZbuAa3tZvDYz9f5Gsj1dzz1boPzd6bF Next: D2h3bfs4LSU8wi2sD7YJX2wv2ckFxpJcq8eomdf1uG1e Diff:
OldNewDifferences
644644
645645 @Callable(i)
646646 func getUserDataREADONLY (userAddress) = {
647- let $t02218022240 = getUserToClaimBalance(userAddress)
648- let toClaim = $t02218022240._1
649- let toUnlock = $t02218022240._2
647+ let $t02222222282 = getUserToClaimBalance(userAddress)
648+ let toClaim = $t02222222282._1
649+ let toUnlock = $t02222222282._2
650650 let userTotalLocked = getUserTotalLocked(userAddress)
651- let $t02230322411 = getUnitsClaimData(userAddress)
652- let unitsToSend = $t02230322411._1
653- let totalUnitsClaimed = $t02230322411._2
654- let l2ToBurn = $t02230322411._3
655- let totalL2Burned = $t02230322411._4
656- let claimedBlock = $t02230322411._5
657- $Tuple2(nil, $Tuple11(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock))
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
657+ let unitsPerBlockScale16 = valueOrElse(getInteger(this, keyUnitsPerBlockScale16), 0)
658+ $Tuple2(nil, $Tuple12(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock, unitsPerBlockScale16))
658659 }
659660
660661
699700 @Callable(i)
700701 func claimAll () = {
701702 let userAddress = toString(i.caller)
702- let $t02360323663 = getUserToClaimBalance(userAddress)
703- let toClaim = $t02360323663._1
704- let toUnlock = $t02360323663._2
703+ let $t02376623826 = getUserToClaimBalance(userAddress)
704+ let toClaim = $t02376623826._1
705+ let toUnlock = $t02376623826._2
705706 let checks = [if ((toClaim > 0))
706707 then true
707708 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 $t02218022240 = getUserToClaimBalance(userAddress)
648- let toClaim = $t02218022240._1
649- let toUnlock = $t02218022240._2
647+ let $t02222222282 = getUserToClaimBalance(userAddress)
648+ let toClaim = $t02222222282._1
649+ let toUnlock = $t02222222282._2
650650 let userTotalLocked = getUserTotalLocked(userAddress)
651- let $t02230322411 = getUnitsClaimData(userAddress)
652- let unitsToSend = $t02230322411._1
653- let totalUnitsClaimed = $t02230322411._2
654- let l2ToBurn = $t02230322411._3
655- let totalL2Burned = $t02230322411._4
656- let claimedBlock = $t02230322411._5
657- $Tuple2(nil, $Tuple11(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock))
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
657+ let unitsPerBlockScale16 = valueOrElse(getInteger(this, keyUnitsPerBlockScale16), 0)
658+ $Tuple2(nil, $Tuple12(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height, unitsToSend, totalUnitsClaimed, l2ToBurn, totalL2Burned, claimedBlock, unitsPerBlockScale16))
658659 }
659660
660661
661662
662663 @Callable(i)
663664 func leaseByAddress (nodeAddress,userAddress) = getStakeFromPaymentActions(nodeAddress, userAddress, i)
664665
665666
666667
667668 @Callable(i)
668669 func lease (nodeAddress) = {
669670 let userAddress = toString(i.caller)
670671 getStakeFromPaymentActions(nodeAddress, userAddress, i)
671672 }
672673
673674
674675
675676 @Callable(i)
676677 func leaseFromLocked (nodeAddress,amount) = {
677678 let userAddress = toString(i.caller)
678679 getStakeActions(nodeAddress, userAddress, amount, i)
679680 }
680681
681682
682683
683684 @Callable(i)
684685 func cancelLease (nodeAddress,amount) = {
685686 let userAddress = toString(i.caller)
686687 getUnstakeActions(nodeAddress, userAddress, amount)
687688 }
688689
689690
690691
691692 @Callable(i)
692693 func claim (amount) = {
693694 let userAddress = toString(i.caller)
694695 getClaimUnlockedActions(userAddress, amount)
695696 }
696697
697698
698699
699700 @Callable(i)
700701 func claimAll () = {
701702 let userAddress = toString(i.caller)
702- let $t02360323663 = getUserToClaimBalance(userAddress)
703- let toClaim = $t02360323663._1
704- let toUnlock = $t02360323663._2
703+ let $t02376623826 = getUserToClaimBalance(userAddress)
704+ let toClaim = $t02376623826._1
705+ let toUnlock = $t02376623826._2
705706 let checks = [if ((toClaim > 0))
706707 then true
707708 else throwErr("nothing to claim")]
708709 if ((checks == checks))
709710 then getClaimUnlockedActions(userAddress, toClaim)
710711 else throw("Strict value is not equal to itself.")
711712 }
712713
713714
714715
715716 @Callable(i)
716717 func stakeFor (userAddress) = getStakeForActions(userAddress, i)
717718
718719
719720
720721 @Callable(i)
721722 func startUnitsVesting (unitsClaimInterval) = {
722723 let totalL2 = 100000000000000000
723724 let totalUnits = i.payments[0].amount
724725 let unitsPerBlockScale16 = (fraction(totalUnits, scale16, totalL2) / unitsClaimInterval)
725726 let check = [if (isInAdminList(toString(i.caller)))
726727 then true
727728 else throwErr("caller is not in adminList"), if ((size(i.payments) == 1))
728729 then true
729730 else throwErr("should be 1 payment"), if ((unitsPerBlockScale16 > 0))
730731 then true
731732 else throwErr("units per block should be greated than 0")]
732733 if ((check == check))
733734 then [IntegerEntry(keyUnitsPerBlockScale16, unitsPerBlockScale16), IntegerEntry(keyUnitsClaimStartHeight, height), IntegerEntry(keyUnitsClaimInterval, unitsClaimInterval), StringEntry(keyUnitsAssetId, assetBytesToString(i.payments[0].assetId))]
734735 else throw("Strict value is not equal to itself.")
735736 }
736737
737738
738739
739740 @Callable(i)
740741 func voteForTxId (txId) = {
741742 let callerAddressString = toBase58String(i.caller.bytes)
742743 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
743744 let result = [StringEntry(keyAllowedTxId(), txId)]
744745 let allowedTxIdOption = getString(this, keyAllowedTxId())
745746 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
746747 then true
747748 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
748749 then true
749750 else (value(allowedTxIdOption) != txId))
750751 then true
751752 else throwErr((txId + " is already allowed"))]
752753 if ((err == err))
753754 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
754755 else throw("Strict value is not equal to itself.")
755756 }
756757
757758
758759 @Verifier(tx)
759760 func verify () = {
760761 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
761762 let byOwner = if ((size(getAdminsList()) >= QUORUM))
762763 then false
763764 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
764765 if (byAdmins)
765766 then true
766767 else byOwner
767768 }
768769

github/deemru/w8io/026f985 
79.75 ms