tx · 4oYKDus71AaoZRVdt7isQQQUYVm8mkAiPyWkHUn1UgbG

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.02000000 Waves

2024.02.28 15:43 [2996092] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "4oYKDus71AaoZRVdt7isQQQUYVm8mkAiPyWkHUn1UgbG", "fee": 2000000, "feeAssetId": null, "timestamp": 1709124211289, "version": 2, "chainId": 84, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "k9qZtBXFLFffKCa5KEC5dRxLJigVZGgVc2JA1ZbawbS5fdeGGvLM1t7HBJw4tWfRAY7ZHtpENT5wdyxCsT3U5ni" ], "script": "base64:BgI/CAISAwoBARIDCgEEEgMKAQgSBAoCCAgSAwoBCBIECgIICBIDCgEIEgQKAggBEgQKAggBEgMKAQESABIDCgEINgAMY29udHJhY3RGaWxlAhFsMm1wX2xlYXNpbmcucmlkZQADU0VQAgJfXwEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAAMa2V5Rm9yY2VTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIJZm9yY2VTdG9wBQNuaWwFA1NFUAARa2V5UGVyaW9kT2Zmc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAghvZmZzZXRJZAUDbmlsBQNTRVAAFWtleVBlcmlvZE9mZnNldEhlaWdodAkAuQkCCQDMCAICAiVzCQDMCAICDG9mZnNldEhlaWdodAUDbmlsBQNTRVAAD2tleVBlcmlvZExlbmd0aAkAuQkCCQDMCAICAiVzCQDMCAICDHBlcmlvZExlbmd0aAUDbmlsBQNTRVAADnBlcmlvZE9mZnNldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtleVBlcmlvZE9mZnNldElkAAAADHBlcmlvZExlbmd0aAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9rZXlQZXJpb2RMZW5ndGgAkE4AEnBlcmlvZE9mZnNldEhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRVrZXlQZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAPY3VycmVudFBlcmlvZElkAwMJAGYCBQZoZWlnaHQFEnBlcmlvZE9mZnNldEhlaWdodAkBAiE9AgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEHCQBkAgkAaQIJAGUCBQZoZWlnaHQFEnBlcmlvZE9mZnNldEhlaWdodAUMcGVyaW9kTGVuZ3RoBQ5wZXJpb2RPZmZzZXRJZAkAlgMBCQDMCAIAAAkAzAgCCQBlAgUOcGVyaW9kT2Zmc2V0SWQAAQUDbmlsABNjdXJyZW50UGVyaW9kSGVpZ2h0AwMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQYDCQAAAgUPY3VycmVudFBlcmlvZElkAAAJAGYCBRJwZXJpb2RPZmZzZXRIZWlnaHQFBmhlaWdodAcAAAkAZAIFEnBlcmlvZE9mZnNldEhlaWdodAkAaAIJAGUCBQ9jdXJyZW50UGVyaW9kSWQFDnBlcmlvZE9mZnNldElkBQxwZXJpb2RMZW5ndGgAEG5leHRQZXJpb2RIZWlnaHQDAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BBgMJAAACBQ9jdXJyZW50UGVyaW9kSWQAAAkAZgIFEnBlcmlvZE9mZnNldEhlaWdodAUGaGVpZ2h0BwAACQBkAgUTY3VycmVudFBlcmlvZEhlaWdodAUMcGVyaW9kTGVuZ3RoARJrZXlMZWFzaW5nTm9kZURhdGEBC25vZGVBZGRyZXNzCQC5CQIJAMwIAgICJXMJAMwIAgULbm9kZUFkZHJlc3MFA25pbAUDU0VQARZrZXlVc2VyTGVhc2luZ05vZGVEYXRhAgt1c2VyQWRkcmVzcwtub2RlQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgULbm9kZUFkZHJlc3MJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQAQ5rZXlVc2VyVG9DbGFpbQELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICB3RvQ2xhaW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARJrZXlVc2VyVG90YWxMb2NrZWQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg91c2VyVG90YWxMb2NrZWQJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQtub2RlQWRkcmVzcwQBaAMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAABQZoZWlnaHQJALkJAgkAzAgCAgQlcyVkCQDMCAIFC25vZGVBZGRyZXNzCQDMCAIJAKQDAQUBaAUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nQnlIZWlnaHQCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzBAFoAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BAAAFBmhlaWdodAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQCkAwEFAWgFA25pbAUDU0VQAA1hc3NldElkU3RyaW5nCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFCmtleUFzc2V0SWQCBVdBVkVTAAxhc3NldElkQnl0ZXMDCQAAAgUNYXNzZXRJZFN0cmluZwIFV0FWRVMFBHVuaXQJANkEAQUNYXNzZXRJZFN0cmluZwALaXNGb3JjZVN0b3AJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa2V5Rm9yY2VTdG9wBwEOaXNWYWxpZEFkZHJlc3MBB2FkZHJlc3MEByRtYXRjaDAJAKYIAQUHYWRkcmVzcwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgcAD0FETUlOX0xJU1RfU0laRQAFAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwBDWlzSW5BZG1pbkxpc3QBB2FkZHJlc3MJAQ9jb250YWluc0VsZW1lbnQCCQENZ2V0QWRtaW5zTGlzdAAFB2FkZHJlc3MBEmdlblZvdGVzS2V5c0hlbHBlcgIBYQxhZG1pbkFkZHJlc3MECyR0MDM1NjIzNTg2BQFhBAZyZXN1bHQIBQskdDAzNTYyMzU4NgJfMQQGcHJlZml4CAULJHQwMzU2MjM1ODYCXzIJAJQKAgkAzQgCBQZyZXN1bHQJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQxhZG1pbkFkZHJlc3MFBnByZWZpeAEMZ2VuVm90ZXNLZXlzAQlrZXlQcmVmaXgECWFkbWluTGlzdAkBE2tleUFkbWluQWRkcmVzc0xpc3QABAskdDAzNzMzMzgxNwoAAiRsCQENZ2V0QWRtaW5zTGlzdAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAZyZXN1bHQIBQskdDAzNzMzMzgxNwJfMQQGcHJlZml4CAULJHQwMzczMzM4MTcCXzIFBnJlc3VsdAEQY291bnRWb3Rlc0hlbHBlcgIGcmVzdWx0B3ZvdGVLZXkJAGQCBQZyZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQpjb3VudFZvdGVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjb3VudFZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEQY2xlYXJWb3Rlc0hlbHBlcgIGcmVzdWx0A2tleQkAzQgCBQZyZXN1bHQJAQtEZWxldGVFbnRyeQEFA2tleQETZ2V0Q2xlYXJWb3RlRW50cmllcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2xlYXJWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2dldExlYXNpbmdOb2RlRW50cnkDC25vZGVBZGRyZXNzDWN1cnJlbnRMZWFzZWQKbmV4dExlYXNlZAQLdmFsdWVTdHJpbmcJALkJAgkAzAgCAgglZCVkJWQlZAkAzAgCCQCkAwEFE2N1cnJlbnRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBQ1jdXJyZW50TGVhc2VkCQDMCAIJAKQDAQUQbmV4dFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFCm5leHRMZWFzZWQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQESa2V5TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MFC3ZhbHVlU3RyaW5nARJnZXRMZWFzaW5nTm9kZURhdGEBC25vZGVBZGRyZXNzBBhsZWFzaW5nTm9kZURhdGFTdHJpbmdSYXcJAJ0IAgUEdGhpcwkBEmtleUxlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBAckbWF0Y2gwBRhsZWFzaW5nTm9kZURhdGFTdHJpbmdSYXcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAJkcwUHJG1hdGNoMAQIZGF0YUxpc3QJALUJAgUCZHMFA1NFUAQRbm9kZUN1cnJlbnRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAABBBFub2RlQ3VycmVudExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAIEDm5vZGVOZXh0UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAwQObm9kZU5leHRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAAEAwMJAGYCBQ5ub2RlTmV4dFBlcmlvZAUGaGVpZ2h0BgkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BCQCUCgIFEW5vZGVDdXJyZW50TGVhc2VkBQ5ub2RlTmV4dExlYXNlZAkAlAoCBQ5ub2RlTmV4dExlYXNlZAUObm9kZU5leHRMZWFzZWQJAJQKAgAAAAABE2dldFVzZXJMZWFzaW5nRW50cnkEC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzEXVzZXJDdXJyZW50TGVhc2VkDnVzZXJOZXh0TGVhc2VkBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFEXVzZXJDdXJyZW50TGVhc2VkCQDMCAIJAKQDAQUQbmV4dFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFDnVzZXJOZXh0TGVhc2VkBQNuaWwFA1NFUAkBC1N0cmluZ0VudHJ5AgkBFmtleVVzZXJMZWFzaW5nTm9kZURhdGECBQt1c2VyQWRkcmVzcwULbm9kZUFkZHJlc3MFC3ZhbHVlU3RyaW5nARJnZXRVc2VyTGVhc2luZ0RhdGECC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzBBhsZWFzaW5nVXNlckRhdGFTdHJpbmdSYXcJAJ0IAgUEdGhpcwkBFmtleVVzZXJMZWFzaW5nTm9kZURhdGECBQt1c2VyQWRkcmVzcwULbm9kZUFkZHJlc3MEByRtYXRjaDAFGGxlYXNpbmdVc2VyRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBBF1c2VyQ3VycmVudFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEEEXVzZXJDdXJyZW50TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQOdXNlck5leHRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAADBA51c2VyTmV4dExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAQDAwkAZgIFDnVzZXJOZXh0UGVyaW9kBQZoZWlnaHQGCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEJAJQKAgURdXNlckN1cnJlbnRMZWFzZWQFDnVzZXJOZXh0TGVhc2VkCQCUCgIFDnVzZXJOZXh0TGVhc2VkBQ51c2VyTmV4dExlYXNlZAkAlAoCAAAAAAETZ2V0VXNlclRvQ2xhaW1FbnRyeQMLdXNlckFkZHJlc3MHdG9DbGFpbQh0b1VubG9jawQLdmFsdWVTdHJpbmcJALkJAgkAzAgCAgglZCVkJWQlZAkAzAgCCQCkAwEFE2N1cnJlbnRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBQd0b0NsYWltCQDMCAIJAKQDAQUQbmV4dFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFCHRvVW5sb2NrBQNuaWwFA1NFUAkBC1N0cmluZ0VudHJ5AgkBDmtleVVzZXJUb0NsYWltAQULdXNlckFkZHJlc3MFC3ZhbHVlU3RyaW5nARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBC3VzZXJBZGRyZXNzBBh1c2VyVG9DbGFpbURhdGFTdHJpbmdSYXcJAJ0IAgUEdGhpcwkBDmtleVVzZXJUb0NsYWltAQULdXNlckFkZHJlc3MEByRtYXRjaDAFGHVzZXJUb0NsYWltRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBA1jdXJyZW50UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAQQHdG9DbGFpbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAIECm5leHRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAADBAh0b1VubG9jawkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAQDAwkAZgIFCm5leHRQZXJpb2QFBmhlaWdodAYJAAACBQ9jdXJyZW50UGVyaW9kSWQAAAkAlAoCBQd0b0NsYWltBQh0b1VubG9jawkAlAoCCQBkAgUHdG9DbGFpbQUIdG9VbmxvY2sAAAkAlAoCAAAAAAEXZ2V0VXNlclRvdGFsTG9ja2VkRW50cnkCC3VzZXJBZGRyZXNzD3VzZXJUb3RhbExvY2tlZAkBDEludGVnZXJFbnRyeQIJARJrZXlVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwUPdXNlclRvdGFsTG9ja2VkARJnZXRVc2VyVG90YWxMb2NrZWQBC3VzZXJBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARJrZXlVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwAAARFnZXRVbnN0YWtlQWN0aW9ucwMLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MNdW5zdGFrZUFtb3VudAQLJHQwODg1Nzg5MzAJARJnZXRMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQRbm9kZUN1cnJlbnRMZWFzZWQIBQskdDA4ODU3ODkzMAJfMQQObm9kZU5leHRMZWFzZWQIBQskdDA4ODU3ODkzMAJfMgQLJHQwODkzNTkwMjEJARJnZXRVc2VyTGVhc2luZ0RhdGECBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MEEXVzZXJDdXJyZW50TGVhc2VkCAULJHQwODkzNTkwMjECXzEEDnVzZXJOZXh0TGVhc2VkCAULJHQwODkzNTkwMjECXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQBmAgUNdW5zdGFrZUFtb3VudAAABgkBCHRocm93RXJyAQIndW5zdGFrZSBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIDCQBnAgUOdXNlck5leHRMZWFzZWQFDXVuc3Rha2VBbW91bnQGCQEIdGhyb3dFcnIBAjl1bnN0YWtlIGFtb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB1c2VyIHN0YWtlZCBhbW91bnQJAMwIAgMJAGcCBQ5ub2RlTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAYJAQh0aHJvd0VycgECOXVuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIG5vZGUgc3Rha2VkIGFtb3VudAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULbm9kZUFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIabm9kZSBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULbm9kZUFkZHJlc3MFA25pbAIBIAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBBBuZXdOb2RlTmV4dExlYXNlCQBlAgUObm9kZU5leHRMZWFzZWQFDXVuc3Rha2VBbW91bnQEEW5ld1VzZXJOZXh0TGVhc2VkCQBlAgUOdXNlck5leHRMZWFzZWQFDXVuc3Rha2VBbW91bnQECyR0MDk4MzQ5ODk0CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQskdDA5ODM0OTg5NAJfMQQIdG9VbmxvY2sIBQskdDA5ODM0OTg5NAJfMgQLbmV3VG9VbmxvY2sJAGQCBQh0b1VubG9jawUNdW5zdGFrZUFtb3VudAQPdXNlclRvdGFsTG9ja2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MEEm5ld1VzZXJUb3RhbExvY2tlZAkAZQIFD3VzZXJUb3RhbExvY2tlZAUNdW5zdGFrZUFtb3VudAkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFB3RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwILdXNlckFkZHJlc3MLY2xhaW1BbW91bnQEDSR0MDEwNjIzMTA2ODMJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDEwNjIzMTA2ODMCXzEECHRvVW5sb2NrCAUNJHQwMTA2MjMxMDY4MwJfMgQGY2hlY2tzCQDMCAIDCQEBIQEFC2lzRm9yY2VTdG9wBgkBCHRocm93RXJyAQIdY29udHJhY3QgaXMgdGVtcG9yYXJ5IHN0b3BwZWQJAMwIAgMJAGYCBQtjbGFpbUFtb3VudAAABgkBCHRocm93RXJyAQIlY2xhaW0gYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAZwIFB3RvQ2xhaW0FC2NsYWltQW1vdW50BgkBCHRocm93RXJyAQI0Y2xhaW0gYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHVubG9ja2VkIGFtb3VudAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBApuZXdUb0NsYWltCQBlAgUHdG9DbGFpbQULY2xhaW1BbW91bnQJAMwIAgkBE2dldFVzZXJUb0NsYWltRW50cnkDBQt1c2VyQWRkcmVzcwUKbmV3VG9DbGFpbQUIdG9VbmxvY2sJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQULdXNlckFkZHJlc3MFC2NsYWltQW1vdW50BQxhc3NldElkQnl0ZXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEPZ2V0U3Rha2VBY3Rpb25zBAtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcxF1c2VyTGVhc2luZ0Ftb3VudAFpBA0kdDAxMTQ0NDExNTA0CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxMTQ0NDExNTA0Al8xBAh0b1VubG9jawgFDSR0MDExNDQ0MTE1MDQCXzIEDXBheW1lbnRBbW91bnQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAAAAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAlhdmFpbGFibGUJAGQCCQBkAgUIdG9VbmxvY2sFB3RvQ2xhaW0FDXBheW1lbnRBbW91bnQEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQBnAgABCQCQAwEIBQFpCHBheW1lbnRzBgkBCHRocm93RXJyAQIRbWF4aW11bSAxIHBheW1lbnQJAMwIAgMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMYXNzZXRJZEJ5dGVzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnBheW1lbnQgYXNzZXRJZCBzaG91bGQgYmU6CQDMCAIFDWFzc2V0SWRTdHJpbmcFA25pbAIBIAkAzAgCAwkAZgIFEXVzZXJMZWFzaW5nQW1vdW50AAAGCQEIdGhyb3dFcnIBAh9hbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIDCQBnAgUJYXZhaWxhYmxlBRF1c2VyTGVhc2luZ0Ftb3VudAYJAQh0aHJvd0VycgECO2Ftb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCAocGF5bWVudCArIGF2YWlsYWJsZSkgYW1vdW50CQDMCAIDCQBnAgURdXNlckxlYXNpbmdBbW91bnQFDXBheW1lbnRBbW91bnQGCQACAQIwYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIG9yIGVxdWFsIHBheW1lbnQgYW1vdW50CQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQtub2RlQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhpub2RlIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQtub2RlQWRkcmVzcwUDbmlsAgEgCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQt1c2VyQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhp1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDSR0MDEyNTc1MTI2NDgJARJnZXRMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQRbm9kZUN1cnJlbnRMZWFzZWQIBQ0kdDAxMjU3NTEyNjQ4Al8xBA5ub2RlTmV4dExlYXNlZAgFDSR0MDEyNTc1MTI2NDgCXzIEEG5ld05vZGVOZXh0TGVhc2UJAGQCBQ5ub2RlTmV4dExlYXNlZAURdXNlckxlYXNpbmdBbW91bnQEDSR0MDEyNzE2MTI4MDIJARJnZXRVc2VyTGVhc2luZ0RhdGECBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MEEXVzZXJDdXJyZW50TGVhc2VkCAUNJHQwMTI3MTYxMjgwMgJfMQQOdXNlck5leHRMZWFzZWQIBQ0kdDAxMjcxNjEyODAyAl8yBBFuZXdVc2VyTmV4dExlYXNlZAkAZAIFDnVzZXJOZXh0TGVhc2VkBRF1c2VyTGVhc2luZ0Ftb3VudAQSZnJvbVVubG9ja2VkQW1vdW50CQBlAgURdXNlckxlYXNpbmdBbW91bnQFDXBheW1lbnRBbW91bnQEC25ld1RvVW5sb2NrCQCWAwEJAMwIAgAACQDMCAIJAGUCBQh0b1VubG9jawUSZnJvbVVubG9ja2VkQW1vdW50BQNuaWwECm5ld1RvQ2xhaW0JAJcDAQkAzAgCBQd0b0NsYWltCQDMCAIJAGQCBQd0b0NsYWltCQBlAgUIdG9VbmxvY2sFEmZyb21VbmxvY2tlZEFtb3VudAUDbmlsBA91c2VyVG90YWxMb2NrZWQJARJnZXRVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwQSbmV3VXNlclRvdGFsTG9ja2VkCQBkAgUPdXNlclRvdGFsTG9ja2VkBRF1c2VyTGVhc2luZ0Ftb3VudAkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARpnZXRTdGFrZUZyb21QYXltZW50QWN0aW9ucwMLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MBaQQGY2hlY2tzCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIgcGF5bWVudCBzaXplIHNob3VsZCBiZSBleGFjdGx5IDEFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBD2dldFN0YWtlQWN0aW9ucwQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFAWkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BHGdldFNldE5ld1BlcmlvZExlbmd0aEFjdGlvbnMBD25ld1BlcmlvZExlbmd0aAQFY2hlY2sJAMwIAgMJAGYCBQ9uZXdQZXJpb2RMZW5ndGgAAAYJAQh0aHJvd0VycgECJnBlcmlvZCBsZW5ndGggc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlQZXJpb2RMZW5ndGgFD25ld1BlcmlvZExlbmd0aAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0BQZoZWlnaHQFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa2V5UGVyaW9kT2Zmc2V0SWQJAGQCBQ9jdXJyZW50UGVyaW9kSWQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0BRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlQZXJpb2RMZW5ndGgFD25ld1BlcmlvZExlbmd0aAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuDAFpARJzZXROZXdQZXJpb2RMZW5ndGgBD25ld1BlcmlvZExlbmd0aAQGY2hlY2tzCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBHGdldFNldE5ld1BlcmlvZExlbmd0aEFjdGlvbnMBBQ9uZXdQZXJpb2RMZW5ndGgJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQc2V0Rm9yY2VTdG9wRmxhZwEEc3RvcAQFY2hlY2sJAMwIAgMJAQ1pc0luQWRtaW5MaXN0AQkApQgBCAUBaQZjYWxsZXIGCQEIdGhyb3dFcnIBAhpjYWxsZXIgaXMgbm90IGluIGFkbWluTGlzdAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa2V5Rm9yY2VTdG9wBQRzdG9wBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETZ2V0Tm9kZURhdGFSRUFET05MWQELbm9kZUFkZHJlc3MEDSR0MDE1MjQ1MTUzMDkJARJnZXRMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQMY3VycmVudExlYXNlCAUNJHQwMTUyNDUxNTMwOQJfMQQKbmV4dExlYXNlZAgFDSR0MDE1MjQ1MTUzMDkCXzIJAJQKAgUDbmlsCQCXCgUFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDGN1cnJlbnRMZWFzZQUQbmV4dFBlcmlvZEhlaWdodAUKbmV4dExlYXNlZAUGaGVpZ2h0AWkBGmdldFVzZXJMZWFzaW5nRGF0YVJFQURPTkxZAgtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwQNJHQwMTU2NzkxNTc1NgkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQMY3VycmVudExlYXNlCAUNJHQwMTU2NzkxNTc1NgJfMQQKbmV4dExlYXNlZAgFDSR0MDE1Njc5MTU3NTYCXzIJAJQKAgUDbmlsCQCXCgUFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDGN1cnJlbnRMZWFzZQUQbmV4dFBlcmlvZEhlaWdodAUKbmV4dExlYXNlZAUGaGVpZ2h0AWkBE2dldFVzZXJEYXRhUkVBRE9OTFkBC3VzZXJBZGRyZXNzBA0kdDAxNjExOTE2MTc5CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxNjExOTE2MTc5Al8xBAh0b1VubG9jawgFDSR0MDE2MTE5MTYxNzkCXzIED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzCQCUCgIFA25pbAkAmAoGBRNjdXJyZW50UGVyaW9kSGVpZ2h0BQd0b0NsYWltBRBuZXh0UGVyaW9kSGVpZ2h0BQh0b1VubG9jawUPdXNlclRvdGFsTG9ja2VkBQZoZWlnaHQBaQEObGVhc2VCeUFkZHJlc3MCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzCQEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFAWkBaQEFbGVhc2UBC25vZGVBZGRyZXNzBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARpnZXRTdGFrZUZyb21QYXltZW50QWN0aW9ucwMFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUBaQFpAQ9sZWFzZUZyb21Mb2NrZWQCC25vZGVBZGRyZXNzBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEPZ2V0U3Rha2VBY3Rpb25zBAULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQZhbW91bnQFAWkBaQELY2FuY2VsTGVhc2UCC25vZGVBZGRyZXNzBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQERZ2V0VW5zdGFrZUFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFBmFtb3VudAFpAQVjbGFpbQEGYW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwIFC3VzZXJBZGRyZXNzBQZhbW91bnQBaQEIY2xhaW1BbGwABAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDSR0MDE3MTkzMTcyNTMJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDE3MTkzMTcyNTMCXzEECHRvVW5sb2NrCAUNJHQwMTcxOTMxNzI1MwJfMgQGY2hlY2tzCQDMCAIDCQBmAgUHdG9DbGFpbQAABgkBCHRocm93RXJyAQIQbm90aGluZyB0byBjbGFpbQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCBQt1c2VyQWRkcmVzcwUHdG9DbGFpbQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt2b3RlRm9yVHhJZAEEdHhJZAQTY2FsbGVyQWRkcmVzc1N0cmluZwkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBAlrZXlQcmVmaXgJARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBQR0eElkBAZyZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUFsbG93ZWRUeElkAAUEdHhJZAUDbmlsBBFhbGxvd2VkVHhJZE9wdGlvbgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQABANlcnIJAMwIAgMJAAACCQDIAQEJANkEAQUEdHhJZAURVFhJRF9CWVRFU19MRU5HVEgGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEiBpcyBub3QgdmFsaWQgdHhJZAkAzAgCAwMJAAACBRFhbGxvd2VkVHhJZE9wdGlvbgUEdW5pdAYJAQIhPQIJAQV2YWx1ZQEFEWFsbG93ZWRUeElkT3B0aW9uBQR0eElkBgkBCHRocm93RXJyAQkArAICBQR0eElkAhMgaXMgYWxyZWFkeSBhbGxvd2VkBQNuaWwDCQAAAgUDZXJyBQNlcnIJAQx2b3RlSU5URVJOQUwEBRNjYWxsZXJBZGRyZXNzU3RyaW5nBQlrZXlQcmVmaXgFBlFVT1JVTQUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQIYnlBZG1pbnMJAAACCAUCdHgCaWQJANkEAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQAAgAEB2J5T3duZXIDCQBnAgkAkAMBCQENZ2V0QWRtaW5zTGlzdAAFBlFVT1JVTQcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkDBQhieUFkbWlucwYFB2J5T3duZXJHASw9", "height": 2996092, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6Vuk1Cyykzh3aLD34UKE3CvGpBQYNkDTgvSMZLCe3gEm Next: CLyiMgWuJ6HyXx8KisjU7xsDap9ownmuqWCHfxWqQtQD Diff:
OldNewDifferences
3030 then (((height - periodOffsetHeight) / periodLength) + periodOffsetId)
3131 else max([0, (periodOffsetId - 1)])
3232
33-let currentPeriodHeight = if ((periodOffsetHeight == -1))
33+let currentPeriodHeight = if (if ((periodOffsetHeight == -1))
34+ then true
35+ else if ((currentPeriodId == 0))
36+ then (periodOffsetHeight > height)
37+ else false)
3438 then 0
3539 else (periodOffsetHeight + ((currentPeriodId - periodOffsetId) * periodLength))
3640
37-let nextPeriodHeight = if ((periodOffsetHeight == -1))
41+let nextPeriodHeight = if (if ((periodOffsetHeight == -1))
42+ then true
43+ else if ((currentPeriodId == 0))
44+ then (periodOffsetHeight > height)
45+ else false)
3846 then 0
3947 else (currentPeriodHeight + periodLength)
4048
118126
119127
120128 func genVotesKeysHelper (a,adminAddress) = {
121- let $t034483472 = a
122- let result = $t034483472._1
123- let prefix = $t034483472._2
129+ let $t035623586 = a
130+ let result = $t035623586._1
131+ let prefix = $t035623586._2
124132 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
125133 }
126134
127135
128136 func genVotesKeys (keyPrefix) = {
129137 let adminList = keyAdminAddressList()
130- let $t036193703 = {
138+ let $t037333817 = {
131139 let $l = getAdminsList()
132140 let $s = size($l)
133141 let $acc0 = $Tuple2(nil, keyPrefix)
141149
142150 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
143151 }
144- let result = $t036193703._1
145- let prefix = $t036193703._2
152+ let result = $t037333817._1
153+ let prefix = $t037333817._2
146154 result
147155 }
148156
294302
295303
296304 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
297- let $t087438816 = getLeasingNodeData(nodeAddress)
298- let nodeCurrentLeased = $t087438816._1
299- let nodeNextLeased = $t087438816._2
300- let $t088218907 = getUserLeasingData(nodeAddress, userAddress)
301- let userCurrentLeased = $t088218907._1
302- let userNextLeased = $t088218907._2
305+ let $t088578930 = getLeasingNodeData(nodeAddress)
306+ let nodeCurrentLeased = $t088578930._1
307+ let nodeNextLeased = $t088578930._2
308+ let $t089359021 = getUserLeasingData(nodeAddress, userAddress)
309+ let userCurrentLeased = $t089359021._1
310+ let userNextLeased = $t089359021._2
303311 let checks = [if (!(isForceStop))
304312 then true
305313 else throwErr("contract is temporary stopped"), if ((unstakeAmount > 0))
317325 then {
318326 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
319327 let newUserNextLeased = (userNextLeased - unstakeAmount)
320- let $t097209780 = getUserToClaimBalance(userAddress)
321- let toClaim = $t097209780._1
322- let toUnlock = $t097209780._2
328+ let $t098349894 = getUserToClaimBalance(userAddress)
329+ let toClaim = $t098349894._1
330+ let toUnlock = $t098349894._2
323331 let newToUnlock = (toUnlock + unstakeAmount)
324332 let userTotalLocked = getUserTotalLocked(userAddress)
325333 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
330338
331339
332340 func getClaimUnlockedActions (userAddress,claimAmount) = {
333- let $t01050910569 = getUserToClaimBalance(userAddress)
334- let toClaim = $t01050910569._1
335- let toUnlock = $t01050910569._2
341+ let $t01062310683 = getUserToClaimBalance(userAddress)
342+ let toClaim = $t01062310683._1
343+ let toUnlock = $t01062310683._2
336344 let checks = [if (!(isForceStop))
337345 then true
338346 else throwErr("contract is temporary stopped"), if ((claimAmount > 0))
352360
353361
354362 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
355- let $t01133011390 = getUserToClaimBalance(userAddress)
356- let toClaim = $t01133011390._1
357- let toUnlock = $t01133011390._2
363+ let $t01144411504 = getUserToClaimBalance(userAddress)
364+ let toClaim = $t01144411504._1
365+ let toUnlock = $t01144411504._2
358366 let paymentAmount = if ((size(i.payments) == 0))
359367 then 0
360368 else i.payments[0].amount
380388 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
381389 if ((checks == checks))
382390 then {
383- let $t01246112534 = getLeasingNodeData(nodeAddress)
384- let nodeCurrentLeased = $t01246112534._1
385- let nodeNextLeased = $t01246112534._2
391+ let $t01257512648 = getLeasingNodeData(nodeAddress)
392+ let nodeCurrentLeased = $t01257512648._1
393+ let nodeNextLeased = $t01257512648._2
386394 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
387- let $t01260212688 = getUserLeasingData(nodeAddress, userAddress)
388- let userCurrentLeased = $t01260212688._1
389- let userNextLeased = $t01260212688._2
395+ let $t01271612802 = getUserLeasingData(nodeAddress, userAddress)
396+ let userCurrentLeased = $t01271612802._1
397+ let userNextLeased = $t01271612802._2
390398 let newUserNextLeased = (userNextLeased + userLeasingAmount)
391399 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
392400 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
447455
448456 @Callable(i)
449457 func getNodeDataREADONLY (nodeAddress) = {
450- let $t01513115195 = getLeasingNodeData(nodeAddress)
451- let currentLease = $t01513115195._1
452- let nextLeased = $t01513115195._2
458+ let $t01524515309 = getLeasingNodeData(nodeAddress)
459+ let currentLease = $t01524515309._1
460+ let nextLeased = $t01524515309._2
453461 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
454462 }
455463
457465
458466 @Callable(i)
459467 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
460- let $t01556515642 = getUserLeasingData(nodeAddress, userAddress)
461- let currentLease = $t01556515642._1
462- let nextLeased = $t01556515642._2
468+ let $t01567915756 = getUserLeasingData(nodeAddress, userAddress)
469+ let currentLease = $t01567915756._1
470+ let nextLeased = $t01567915756._2
463471 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
464472 }
465473
467475
468476 @Callable(i)
469477 func getUserDataREADONLY (userAddress) = {
470- let $t01600516065 = getUserToClaimBalance(userAddress)
471- let toClaim = $t01600516065._1
472- let toUnlock = $t01600516065._2
478+ let $t01611916179 = getUserToClaimBalance(userAddress)
479+ let toClaim = $t01611916179._1
480+ let toUnlock = $t01611916179._2
473481 let userTotalLocked = getUserTotalLocked(userAddress)
474482 $Tuple2(nil, $Tuple6(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height))
475483 }
516524 @Callable(i)
517525 func claimAll () = {
518526 let userAddress = toString(i.caller)
519- let $t01707917139 = getUserToClaimBalance(userAddress)
520- let toClaim = $t01707917139._1
521- let toUnlock = $t01707917139._2
527+ let $t01719317253 = getUserToClaimBalance(userAddress)
528+ let toClaim = $t01719317253._1
529+ let toUnlock = $t01719317253._2
522530 let checks = [if ((toClaim > 0))
523531 then true
524532 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 func throwErr (msg) = throw(((contractFile + ": ") + msg))
99
1010
1111 let keyAssetId = makeString(["%s", "assetId"], SEP)
1212
1313 let keyForceStop = makeString(["%s", "forceStop"], SEP)
1414
1515 let keyPeriodOffsetId = makeString(["%s", "offsetId"], SEP)
1616
1717 let keyPeriodOffsetHeight = makeString(["%s", "offsetHeight"], SEP)
1818
1919 let keyPeriodLength = makeString(["%s", "periodLength"], SEP)
2020
2121 let periodOffsetId = valueOrElse(getInteger(this, keyPeriodOffsetId), 0)
2222
2323 let periodLength = valueOrElse(getInteger(this, keyPeriodLength), 10000)
2424
2525 let periodOffsetHeight = valueOrElse(getInteger(this, keyPeriodOffsetHeight), -1)
2626
2727 let currentPeriodId = if (if ((height > periodOffsetHeight))
2828 then (periodOffsetHeight != -1)
2929 else false)
3030 then (((height - periodOffsetHeight) / periodLength) + periodOffsetId)
3131 else max([0, (periodOffsetId - 1)])
3232
33-let currentPeriodHeight = if ((periodOffsetHeight == -1))
33+let currentPeriodHeight = if (if ((periodOffsetHeight == -1))
34+ then true
35+ else if ((currentPeriodId == 0))
36+ then (periodOffsetHeight > height)
37+ else false)
3438 then 0
3539 else (periodOffsetHeight + ((currentPeriodId - periodOffsetId) * periodLength))
3640
37-let nextPeriodHeight = if ((periodOffsetHeight == -1))
41+let nextPeriodHeight = if (if ((periodOffsetHeight == -1))
42+ then true
43+ else if ((currentPeriodId == 0))
44+ then (periodOffsetHeight > height)
45+ else false)
3846 then 0
3947 else (currentPeriodHeight + periodLength)
4048
4149 func keyLeasingNodeData (nodeAddress) = makeString(["%s", nodeAddress], SEP)
4250
4351
4452 func keyUserLeasingNodeData (userAddress,nodeAddress) = makeString(["%s%s", nodeAddress, userAddress], SEP)
4553
4654
4755 func keyUserToClaim (userAddress) = makeString(["%s%s", "toClaim", userAddress], SEP)
4856
4957
5058 func keyUserTotalLocked (userAddress) = makeString(["%s%s", "userTotalLocked", userAddress], SEP)
5159
5260
5361 func keyNodeLeasingByHeight (nodeAddress) = {
5462 let h = if ((periodOffsetHeight == -1))
5563 then 0
5664 else height
5765 makeString(["%s%d", nodeAddress, toString(h)], SEP)
5866 }
5967
6068
6169 func keyUserLeasingByHeight (nodeAddress,userAddress) = {
6270 let h = if ((periodOffsetHeight == -1))
6371 then 0
6472 else height
6573 makeString(["%s%s%d", nodeAddress, userAddress, toString(h)], SEP)
6674 }
6775
6876
6977 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
7078
7179 let assetIdBytes = if ((assetIdString == "WAVES"))
7280 then unit
7381 else fromBase58String(assetIdString)
7482
7583 let isForceStop = valueOrElse(getBoolean(this, keyForceStop), false)
7684
7785 func isValidAddress (address) = match addressFromString(address) {
7886 case a: Address =>
7987 true
8088 case _ =>
8189 false
8290 }
8391
8492
8593 let ADMIN_LIST_SIZE = 5
8694
8795 let QUORUM = 3
8896
8997 let TXID_BYTES_LENGTH = 32
9098
9199 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
92100
93101
94102 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
95103
96104
97105 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
98106
99107
100108 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
101109
102110
103111 func getAdminVote (prefix,admin) = {
104112 let voteKey = keyFullAdminVote(prefix, admin)
105113 valueOrElse(getInteger(voteKey), 0)
106114 }
107115
108116
109117 func getAdminsList () = match getString(this, keyAdminAddressList()) {
110118 case s: String =>
111119 split(s, SEP)
112120 case _ =>
113121 nil
114122 }
115123
116124
117125 func isInAdminList (address) = containsElement(getAdminsList(), address)
118126
119127
120128 func genVotesKeysHelper (a,adminAddress) = {
121- let $t034483472 = a
122- let result = $t034483472._1
123- let prefix = $t034483472._2
129+ let $t035623586 = a
130+ let result = $t035623586._1
131+ let prefix = $t035623586._2
124132 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
125133 }
126134
127135
128136 func genVotesKeys (keyPrefix) = {
129137 let adminList = keyAdminAddressList()
130- let $t036193703 = {
138+ let $t037333817 = {
131139 let $l = getAdminsList()
132140 let $s = size($l)
133141 let $acc0 = $Tuple2(nil, keyPrefix)
134142 func $f0_1 ($a,$i) = if (($i >= $s))
135143 then $a
136144 else genVotesKeysHelper($a, $l[$i])
137145
138146 func $f0_2 ($a,$i) = if (($i >= $s))
139147 then $a
140148 else throw("List size exceeds 5")
141149
142150 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
143151 }
144- let result = $t036193703._1
145- let prefix = $t036193703._2
152+ let result = $t037333817._1
153+ let prefix = $t037333817._2
146154 result
147155 }
148156
149157
150158 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
151159
152160
153161 func countVotes (prefix) = {
154162 let votes = genVotesKeys(prefix)
155163 let $l = votes
156164 let $s = size($l)
157165 let $acc0 = 0
158166 func $f0_1 ($a,$i) = if (($i >= $s))
159167 then $a
160168 else countVotesHelper($a, $l[$i])
161169
162170 func $f0_2 ($a,$i) = if (($i >= $s))
163171 then $a
164172 else throw("List size exceeds 5")
165173
166174 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
167175 }
168176
169177
170178 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
171179
172180
173181 func getClearVoteEntries (prefix) = {
174182 let votes = genVotesKeys(prefix)
175183 let $l = votes
176184 let $s = size($l)
177185 let $acc0 = nil
178186 func $f0_1 ($a,$i) = if (($i >= $s))
179187 then $a
180188 else clearVotesHelper($a, $l[$i])
181189
182190 func $f0_2 ($a,$i) = if (($i >= $s))
183191 then $a
184192 else throw("List size exceeds 5")
185193
186194 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
187195 }
188196
189197
190198 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
191199 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
192200 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
193201 let err = if (!(isInAdminList(callerAddressString)))
194202 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
195203 else if ((adminCurrentVote == 1))
196204 then throwErr((voteKey + " you already voted"))
197205 else unit
198206 if ((err == err))
199207 then {
200208 let votes = countVotes(keyPrefix)
201209 if (((votes + 1) >= minVotes))
202210 then {
203211 let clearVoteEntries = getClearVoteEntries(keyPrefix)
204212 (clearVoteEntries ++ voteResult)
205213 }
206214 else [IntegerEntry(voteKey, 1)]
207215 }
208216 else throw("Strict value is not equal to itself.")
209217 }
210218
211219
212220 func getLeasingNodeEntry (nodeAddress,currentLeased,nextLeased) = {
213221 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(currentLeased), toString(nextPeriodHeight), toString(nextLeased)], SEP)
214222 StringEntry(keyLeasingNodeData(nodeAddress), valueString)
215223 }
216224
217225
218226 func getLeasingNodeData (nodeAddress) = {
219227 let leasingNodeDataStringRaw = getString(this, keyLeasingNodeData(nodeAddress))
220228 match leasingNodeDataStringRaw {
221229 case ds: String =>
222230 let dataList = split(ds, SEP)
223231 let nodeCurrentPeriod = parseIntValue(dataList[1])
224232 let nodeCurrentLeased = parseIntValue(dataList[2])
225233 let nodeNextPeriod = parseIntValue(dataList[3])
226234 let nodeNextLeased = parseIntValue(dataList[4])
227235 if (if ((nodeNextPeriod > height))
228236 then true
229237 else (periodOffsetHeight == -1))
230238 then $Tuple2(nodeCurrentLeased, nodeNextLeased)
231239 else $Tuple2(nodeNextLeased, nodeNextLeased)
232240 case _ =>
233241 $Tuple2(0, 0)
234242 }
235243 }
236244
237245
238246 func getUserLeasingEntry (nodeAddress,userAddress,userCurrentLeased,userNextLeased) = {
239247 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(userCurrentLeased), toString(nextPeriodHeight), toString(userNextLeased)], SEP)
240248 StringEntry(keyUserLeasingNodeData(userAddress, nodeAddress), valueString)
241249 }
242250
243251
244252 func getUserLeasingData (nodeAddress,userAddress) = {
245253 let leasingUserDataStringRaw = getString(this, keyUserLeasingNodeData(userAddress, nodeAddress))
246254 match leasingUserDataStringRaw {
247255 case ds: String =>
248256 let dataList = split(ds, SEP)
249257 let userCurrentPeriod = parseIntValue(dataList[1])
250258 let userCurrentLeased = parseIntValue(dataList[2])
251259 let userNextPeriod = parseIntValue(dataList[3])
252260 let userNextLeased = parseIntValue(dataList[4])
253261 if (if ((userNextPeriod > height))
254262 then true
255263 else (periodOffsetHeight == -1))
256264 then $Tuple2(userCurrentLeased, userNextLeased)
257265 else $Tuple2(userNextLeased, userNextLeased)
258266 case _ =>
259267 $Tuple2(0, 0)
260268 }
261269 }
262270
263271
264272 func getUserToClaimEntry (userAddress,toClaim,toUnlock) = {
265273 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(toClaim), toString(nextPeriodHeight), toString(toUnlock)], SEP)
266274 StringEntry(keyUserToClaim(userAddress), valueString)
267275 }
268276
269277
270278 func getUserToClaimBalance (userAddress) = {
271279 let userToClaimDataStringRaw = getString(this, keyUserToClaim(userAddress))
272280 match userToClaimDataStringRaw {
273281 case ds: String =>
274282 let dataList = split(ds, SEP)
275283 let currentPeriod = parseIntValue(dataList[1])
276284 let toClaim = parseIntValue(dataList[2])
277285 let nextPeriod = parseIntValue(dataList[3])
278286 let toUnlock = parseIntValue(dataList[4])
279287 if (if ((nextPeriod > height))
280288 then true
281289 else (currentPeriodId == 0))
282290 then $Tuple2(toClaim, toUnlock)
283291 else $Tuple2((toClaim + toUnlock), 0)
284292 case _ =>
285293 $Tuple2(0, 0)
286294 }
287295 }
288296
289297
290298 func getUserTotalLockedEntry (userAddress,userTotalLocked) = IntegerEntry(keyUserTotalLocked(userAddress), userTotalLocked)
291299
292300
293301 func getUserTotalLocked (userAddress) = valueOrElse(getInteger(this, keyUserTotalLocked(userAddress)), 0)
294302
295303
296304 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
297- let $t087438816 = getLeasingNodeData(nodeAddress)
298- let nodeCurrentLeased = $t087438816._1
299- let nodeNextLeased = $t087438816._2
300- let $t088218907 = getUserLeasingData(nodeAddress, userAddress)
301- let userCurrentLeased = $t088218907._1
302- let userNextLeased = $t088218907._2
305+ let $t088578930 = getLeasingNodeData(nodeAddress)
306+ let nodeCurrentLeased = $t088578930._1
307+ let nodeNextLeased = $t088578930._2
308+ let $t089359021 = getUserLeasingData(nodeAddress, userAddress)
309+ let userCurrentLeased = $t089359021._1
310+ let userNextLeased = $t089359021._2
303311 let checks = [if (!(isForceStop))
304312 then true
305313 else throwErr("contract is temporary stopped"), if ((unstakeAmount > 0))
306314 then true
307315 else throwErr("unstake amount should be greater than 0"), if ((userNextLeased >= unstakeAmount))
308316 then true
309317 else throwErr("unstake amount should be less or equal user staked amount"), if ((nodeNextLeased >= unstakeAmount))
310318 then true
311319 else throwErr("unstake amount should be less or equal node staked amount"), if (isValidAddress(nodeAddress))
312320 then true
313321 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
314322 then true
315323 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
316324 if ((checks == checks))
317325 then {
318326 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
319327 let newUserNextLeased = (userNextLeased - unstakeAmount)
320- let $t097209780 = getUserToClaimBalance(userAddress)
321- let toClaim = $t097209780._1
322- let toUnlock = $t097209780._2
328+ let $t098349894 = getUserToClaimBalance(userAddress)
329+ let toClaim = $t098349894._1
330+ let toUnlock = $t098349894._2
323331 let newToUnlock = (toUnlock + unstakeAmount)
324332 let userTotalLocked = getUserTotalLocked(userAddress)
325333 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
326334 [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)]
327335 }
328336 else throw("Strict value is not equal to itself.")
329337 }
330338
331339
332340 func getClaimUnlockedActions (userAddress,claimAmount) = {
333- let $t01050910569 = getUserToClaimBalance(userAddress)
334- let toClaim = $t01050910569._1
335- let toUnlock = $t01050910569._2
341+ let $t01062310683 = getUserToClaimBalance(userAddress)
342+ let toClaim = $t01062310683._1
343+ let toUnlock = $t01062310683._2
336344 let checks = [if (!(isForceStop))
337345 then true
338346 else throwErr("contract is temporary stopped"), if ((claimAmount > 0))
339347 then true
340348 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
341349 then true
342350 else throwErr("claim amount should be less or equal unlocked amount"), if (isValidAddress(userAddress))
343351 then true
344352 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
345353 if ((checks == checks))
346354 then {
347355 let newToClaim = (toClaim - claimAmount)
348356 [getUserToClaimEntry(userAddress, newToClaim, toUnlock), ScriptTransfer(addressFromStringValue(userAddress), claimAmount, assetIdBytes)]
349357 }
350358 else throw("Strict value is not equal to itself.")
351359 }
352360
353361
354362 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
355- let $t01133011390 = getUserToClaimBalance(userAddress)
356- let toClaim = $t01133011390._1
357- let toUnlock = $t01133011390._2
363+ let $t01144411504 = getUserToClaimBalance(userAddress)
364+ let toClaim = $t01144411504._1
365+ let toUnlock = $t01144411504._2
358366 let paymentAmount = if ((size(i.payments) == 0))
359367 then 0
360368 else i.payments[0].amount
361369 let available = ((toUnlock + toClaim) + paymentAmount)
362370 let checks = [if (!(isForceStop))
363371 then true
364372 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
365373 then true
366374 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
367375 then true
368376 else (i.payments[0].assetId == assetIdBytes))
369377 then true
370378 else throwErr(makeString(["payment assetId should be:", assetIdString], " ")), if ((userLeasingAmount > 0))
371379 then true
372380 else throwErr("amount should be greater than 0"), if ((available >= userLeasingAmount))
373381 then true
374382 else throwErr("amount should be less or equal (payment + available) amount"), if ((userLeasingAmount >= paymentAmount))
375383 then true
376384 else throw("amount should be greater or equal payment amount"), if (isValidAddress(nodeAddress))
377385 then true
378386 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
379387 then true
380388 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
381389 if ((checks == checks))
382390 then {
383- let $t01246112534 = getLeasingNodeData(nodeAddress)
384- let nodeCurrentLeased = $t01246112534._1
385- let nodeNextLeased = $t01246112534._2
391+ let $t01257512648 = getLeasingNodeData(nodeAddress)
392+ let nodeCurrentLeased = $t01257512648._1
393+ let nodeNextLeased = $t01257512648._2
386394 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
387- let $t01260212688 = getUserLeasingData(nodeAddress, userAddress)
388- let userCurrentLeased = $t01260212688._1
389- let userNextLeased = $t01260212688._2
395+ let $t01271612802 = getUserLeasingData(nodeAddress, userAddress)
396+ let userCurrentLeased = $t01271612802._1
397+ let userNextLeased = $t01271612802._2
390398 let newUserNextLeased = (userNextLeased + userLeasingAmount)
391399 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
392400 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
393401 let newToClaim = min([toClaim, (toClaim + (toUnlock - fromUnlockedAmount))])
394402 let userTotalLocked = getUserTotalLocked(userAddress)
395403 let newUserTotalLocked = (userTotalLocked + userLeasingAmount)
396404 [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)]
397405 }
398406 else throw("Strict value is not equal to itself.")
399407 }
400408
401409
402410 func getStakeFromPaymentActions (nodeAddress,userAddress,i) = {
403411 let checks = [if ((size(i.payments) == 1))
404412 then true
405413 else throwErr("payment size should be exactly 1")]
406414 if ((checks == checks))
407415 then getStakeActions(nodeAddress, userAddress, i.payments[0].amount, i)
408416 else throw("Strict value is not equal to itself.")
409417 }
410418
411419
412420 func getSetNewPeriodLengthActions (newPeriodLength) = {
413421 let check = [if ((newPeriodLength > 0))
414422 then true
415423 else throwErr("period length should be greater than 0")]
416424 if ((check == check))
417425 then if ((periodOffsetHeight == -1))
418426 then [IntegerEntry(keyPeriodLength, newPeriodLength), IntegerEntry(keyPeriodOffsetHeight, height)]
419427 else [IntegerEntry(keyPeriodOffsetId, (currentPeriodId + 1)), IntegerEntry(keyPeriodOffsetHeight, nextPeriodHeight), IntegerEntry(keyPeriodLength, newPeriodLength)]
420428 else throw("Strict value is not equal to itself.")
421429 }
422430
423431
424432 @Callable(i)
425433 func setNewPeriodLength (newPeriodLength) = {
426434 let checks = [if (isInAdminList(toString(i.caller)))
427435 then true
428436 else throwErr("caller is not in adminList")]
429437 if ((checks == checks))
430438 then getSetNewPeriodLengthActions(newPeriodLength)
431439 else throw("Strict value is not equal to itself.")
432440 }
433441
434442
435443
436444 @Callable(i)
437445 func setForceStopFlag (stop) = {
438446 let check = [if (isInAdminList(toString(i.caller)))
439447 then true
440448 else throwErr("caller is not in adminList")]
441449 if ((check == check))
442450 then [BooleanEntry(keyForceStop, stop)]
443451 else throw("Strict value is not equal to itself.")
444452 }
445453
446454
447455
448456 @Callable(i)
449457 func getNodeDataREADONLY (nodeAddress) = {
450- let $t01513115195 = getLeasingNodeData(nodeAddress)
451- let currentLease = $t01513115195._1
452- let nextLeased = $t01513115195._2
458+ let $t01524515309 = getLeasingNodeData(nodeAddress)
459+ let currentLease = $t01524515309._1
460+ let nextLeased = $t01524515309._2
453461 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
454462 }
455463
456464
457465
458466 @Callable(i)
459467 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
460- let $t01556515642 = getUserLeasingData(nodeAddress, userAddress)
461- let currentLease = $t01556515642._1
462- let nextLeased = $t01556515642._2
468+ let $t01567915756 = getUserLeasingData(nodeAddress, userAddress)
469+ let currentLease = $t01567915756._1
470+ let nextLeased = $t01567915756._2
463471 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
464472 }
465473
466474
467475
468476 @Callable(i)
469477 func getUserDataREADONLY (userAddress) = {
470- let $t01600516065 = getUserToClaimBalance(userAddress)
471- let toClaim = $t01600516065._1
472- let toUnlock = $t01600516065._2
478+ let $t01611916179 = getUserToClaimBalance(userAddress)
479+ let toClaim = $t01611916179._1
480+ let toUnlock = $t01611916179._2
473481 let userTotalLocked = getUserTotalLocked(userAddress)
474482 $Tuple2(nil, $Tuple6(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height))
475483 }
476484
477485
478486
479487 @Callable(i)
480488 func leaseByAddress (nodeAddress,userAddress) = getStakeFromPaymentActions(nodeAddress, userAddress, i)
481489
482490
483491
484492 @Callable(i)
485493 func lease (nodeAddress) = {
486494 let userAddress = toString(i.caller)
487495 getStakeFromPaymentActions(nodeAddress, userAddress, i)
488496 }
489497
490498
491499
492500 @Callable(i)
493501 func leaseFromLocked (nodeAddress,amount) = {
494502 let userAddress = toString(i.caller)
495503 getStakeActions(nodeAddress, userAddress, amount, i)
496504 }
497505
498506
499507
500508 @Callable(i)
501509 func cancelLease (nodeAddress,amount) = {
502510 let userAddress = toString(i.caller)
503511 getUnstakeActions(nodeAddress, userAddress, amount)
504512 }
505513
506514
507515
508516 @Callable(i)
509517 func claim (amount) = {
510518 let userAddress = toString(i.caller)
511519 getClaimUnlockedActions(userAddress, amount)
512520 }
513521
514522
515523
516524 @Callable(i)
517525 func claimAll () = {
518526 let userAddress = toString(i.caller)
519- let $t01707917139 = getUserToClaimBalance(userAddress)
520- let toClaim = $t01707917139._1
521- let toUnlock = $t01707917139._2
527+ let $t01719317253 = getUserToClaimBalance(userAddress)
528+ let toClaim = $t01719317253._1
529+ let toUnlock = $t01719317253._2
522530 let checks = [if ((toClaim > 0))
523531 then true
524532 else throwErr("nothing to claim")]
525533 if ((checks == checks))
526534 then getClaimUnlockedActions(userAddress, toClaim)
527535 else throw("Strict value is not equal to itself.")
528536 }
529537
530538
531539
532540 @Callable(i)
533541 func voteForTxId (txId) = {
534542 let callerAddressString = toBase58String(i.caller.bytes)
535543 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
536544 let result = [StringEntry(keyAllowedTxId(), txId)]
537545 let allowedTxIdOption = getString(this, keyAllowedTxId())
538546 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
539547 then true
540548 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
541549 then true
542550 else (value(allowedTxIdOption) != txId))
543551 then true
544552 else throwErr((txId + " is already allowed"))]
545553 if ((err == err))
546554 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
547555 else throw("Strict value is not equal to itself.")
548556 }
549557
550558
551559 @Verifier(tx)
552560 func verify () = {
553561 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
554562 let byOwner = if ((size(getAdminsList()) >= QUORUM))
555563 then false
556564 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
557565 if (byAdmins)
558566 then true
559567 else byOwner
560568 }
561569

github/deemru/w8io/026f985 
60.20 ms