tx · 2aHiTM93eoXBAJnpwC9aJS21Cd9ADmT53cs6neZdKAT7

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.02100000 Waves

2024.09.17 11:07 [3287404] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "2aHiTM93eoXBAJnpwC9aJS21Cd9ADmT53cs6neZdKAT7", "fee": 2100000, "feeAssetId": null, "timestamp": 1726560436624, "version": 2, "chainId": 84, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "4pecaPdCWvHq1AcbteKCDwcPK9prPtpBcLu8dshKgBbGuK9qLNb6indmWBBgNWk8T2PG8EgrCnZsWcB5bfbhGgsg" ], "script": "base64:BgI/CAISAwoBARIDCgEEEgMKAQgSBAoCCAgSAwoBCBIECgIICBIDCgEIEgQKAggBEgQKAggBEgMKAQESABIDCgEINgAMY29udHJhY3RGaWxlAhFsMm1wX2xlYXNpbmcucmlkZQADU0VQAgJfXwEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAAMa2V5Rm9yY2VTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIJZm9yY2VTdG9wBQNuaWwFA1NFUAARa2V5UGVyaW9kT2Zmc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAghvZmZzZXRJZAUDbmlsBQNTRVAAFWtleVBlcmlvZE9mZnNldEhlaWdodAkAuQkCCQDMCAICAiVzCQDMCAICDG9mZnNldEhlaWdodAUDbmlsBQNTRVAAD2tleVBlcmlvZExlbmd0aAkAuQkCCQDMCAICAiVzCQDMCAICDHBlcmlvZExlbmd0aAUDbmlsBQNTRVAADnBlcmlvZE9mZnNldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtleVBlcmlvZE9mZnNldElkAAAADHBlcmlvZExlbmd0aAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9rZXlQZXJpb2RMZW5ndGgAkE4AEnBlcmlvZE9mZnNldEhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRVrZXlQZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAPY3VycmVudFBlcmlvZElkAwMJAGYCBQZoZWlnaHQFEnBlcmlvZE9mZnNldEhlaWdodAkBAiE9AgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEHCQBkAgkAaQIJAGUCBQZoZWlnaHQFEnBlcmlvZE9mZnNldEhlaWdodAUMcGVyaW9kTGVuZ3RoBQ5wZXJpb2RPZmZzZXRJZAkAlgMBCQDMCAIAAAkAzAgCCQBlAgUOcGVyaW9kT2Zmc2V0SWQAAQUDbmlsABNjdXJyZW50UGVyaW9kSGVpZ2h0AwMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQYDCQAAAgUPY3VycmVudFBlcmlvZElkAAAJAGYCBRJwZXJpb2RPZmZzZXRIZWlnaHQFBmhlaWdodAcAAAkAZAIFEnBlcmlvZE9mZnNldEhlaWdodAkAaAIJAGUCBQ9jdXJyZW50UGVyaW9kSWQFDnBlcmlvZE9mZnNldElkBQxwZXJpb2RMZW5ndGgAEG5leHRQZXJpb2RIZWlnaHQDAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BBgMJAAACBQ9jdXJyZW50UGVyaW9kSWQAAAkAZgIFEnBlcmlvZE9mZnNldEhlaWdodAUGaGVpZ2h0BwAACQBkAgUTY3VycmVudFBlcmlvZEhlaWdodAUMcGVyaW9kTGVuZ3RoARJrZXlMZWFzaW5nTm9kZURhdGEBC25vZGVBZGRyZXNzCQC5CQIJAMwIAgICJXMJAMwIAgULbm9kZUFkZHJlc3MFA25pbAUDU0VQARZrZXlVc2VyTGVhc2luZ05vZGVEYXRhAgt1c2VyQWRkcmVzcwtub2RlQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgULbm9kZUFkZHJlc3MJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQAQ5rZXlVc2VyVG9DbGFpbQELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICB3RvQ2xhaW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARJrZXlVc2VyVG90YWxMb2NrZWQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg91c2VyVG90YWxMb2NrZWQJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQtub2RlQWRkcmVzcwQBaAMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAABQZoZWlnaHQJALkJAgkAzAgCAgQlcyVkCQDMCAIFC25vZGVBZGRyZXNzCQDMCAIJAKQDAQUBaAUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nQnlIZWlnaHQCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzBAFoAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BAAAFBmhlaWdodAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQCkAwEFAWgFA25pbAUDU0VQAA1hc3NldElkU3RyaW5nCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFCmtleUFzc2V0SWQCBVdBVkVTAAxhc3NldElkQnl0ZXMDCQAAAgUNYXNzZXRJZFN0cmluZwIFV0FWRVMFBHVuaXQJANkEAQUNYXNzZXRJZFN0cmluZwALaXNGb3JjZVN0b3AJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa2V5Rm9yY2VTdG9wBwEOaXNWYWxpZEFkZHJlc3MBB2FkZHJlc3MEByRtYXRjaDAJAKYIAQUHYWRkcmVzcwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgcAD0FETUlOX0xJU1RfU0laRQAFAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwBDWlzSW5BZG1pbkxpc3QBB2FkZHJlc3MJAQ9jb250YWluc0VsZW1lbnQCCQENZ2V0QWRtaW5zTGlzdAAFB2FkZHJlc3MBEmdlblZvdGVzS2V5c0hlbHBlcgIBYQxhZG1pbkFkZHJlc3MECyR0MDM1NjIzNTg2BQFhBAZyZXN1bHQIBQskdDAzNTYyMzU4NgJfMQQGcHJlZml4CAULJHQwMzU2MjM1ODYCXzIJAJQKAgkAzQgCBQZyZXN1bHQJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQxhZG1pbkFkZHJlc3MFBnByZWZpeAEMZ2VuVm90ZXNLZXlzAQlrZXlQcmVmaXgECWFkbWluTGlzdAkBE2tleUFkbWluQWRkcmVzc0xpc3QABAskdDAzNzMzMzgxNwoAAiRsCQENZ2V0QWRtaW5zTGlzdAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAZyZXN1bHQIBQskdDAzNzMzMzgxNwJfMQQGcHJlZml4CAULJHQwMzczMzM4MTcCXzIFBnJlc3VsdAEQY291bnRWb3Rlc0hlbHBlcgIGcmVzdWx0B3ZvdGVLZXkJAGQCBQZyZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQpjb3VudFZvdGVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjb3VudFZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEQY2xlYXJWb3Rlc0hlbHBlcgIGcmVzdWx0A2tleQkAzQgCBQZyZXN1bHQJAQtEZWxldGVFbnRyeQEFA2tleQETZ2V0Q2xlYXJWb3RlRW50cmllcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2xlYXJWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2dldExlYXNpbmdOb2RlRW50cnkDC25vZGVBZGRyZXNzDWN1cnJlbnRMZWFzZWQKbmV4dExlYXNlZAQLdmFsdWVTdHJpbmcJALkJAgkAzAgCAgglZCVkJWQlZAkAzAgCCQCkAwEFE2N1cnJlbnRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBQ1jdXJyZW50TGVhc2VkCQDMCAIJAKQDAQUQbmV4dFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFCm5leHRMZWFzZWQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQESa2V5TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MFC3ZhbHVlU3RyaW5nARJnZXRMZWFzaW5nTm9kZURhdGEBC25vZGVBZGRyZXNzBBhsZWFzaW5nTm9kZURhdGFTdHJpbmdSYXcJAJ0IAgUEdGhpcwkBEmtleUxlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBAckbWF0Y2gwBRhsZWFzaW5nTm9kZURhdGFTdHJpbmdSYXcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAJkcwUHJG1hdGNoMAQIZGF0YUxpc3QJALUJAgUCZHMFA1NFUAQRbm9kZUN1cnJlbnRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAABBBFub2RlQ3VycmVudExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAIEDm5vZGVOZXh0UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAwQObm9kZU5leHRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAAEAwMJAGYCBQ5ub2RlTmV4dFBlcmlvZAUGaGVpZ2h0BgkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BCQCUCgIFEW5vZGVDdXJyZW50TGVhc2VkBQ5ub2RlTmV4dExlYXNlZAkAlAoCBQ5ub2RlTmV4dExlYXNlZAUObm9kZU5leHRMZWFzZWQJAJQKAgAAAAABE2dldFVzZXJMZWFzaW5nRW50cnkEC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzEXVzZXJDdXJyZW50TGVhc2VkDnVzZXJOZXh0TGVhc2VkBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFEXVzZXJDdXJyZW50TGVhc2VkCQDMCAIJAKQDAQUQbmV4dFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFDnVzZXJOZXh0TGVhc2VkBQNuaWwFA1NFUAkBC1N0cmluZ0VudHJ5AgkBFmtleVVzZXJMZWFzaW5nTm9kZURhdGECBQt1c2VyQWRkcmVzcwULbm9kZUFkZHJlc3MFC3ZhbHVlU3RyaW5nARJnZXRVc2VyTGVhc2luZ0RhdGECC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzBBhsZWFzaW5nVXNlckRhdGFTdHJpbmdSYXcJAJ0IAgUEdGhpcwkBFmtleVVzZXJMZWFzaW5nTm9kZURhdGECBQt1c2VyQWRkcmVzcwULbm9kZUFkZHJlc3MEByRtYXRjaDAFGGxlYXNpbmdVc2VyRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBBF1c2VyQ3VycmVudFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEEEXVzZXJDdXJyZW50TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQOdXNlck5leHRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAADBA51c2VyTmV4dExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAQDAwkAZgIFDnVzZXJOZXh0UGVyaW9kBQZoZWlnaHQGCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEJAJQKAgURdXNlckN1cnJlbnRMZWFzZWQFDnVzZXJOZXh0TGVhc2VkCQCUCgIFDnVzZXJOZXh0TGVhc2VkBQ51c2VyTmV4dExlYXNlZAkAlAoCAAAAAAETZ2V0VXNlclRvQ2xhaW1FbnRyeQMLdXNlckFkZHJlc3MHdG9DbGFpbQh0b1VubG9jawQLdmFsdWVTdHJpbmcJALkJAgkAzAgCAgglZCVkJWQlZAkAzAgCCQCkAwEFE2N1cnJlbnRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBQd0b0NsYWltCQDMCAIJAKQDAQUQbmV4dFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFCHRvVW5sb2NrBQNuaWwFA1NFUAkBC1N0cmluZ0VudHJ5AgkBDmtleVVzZXJUb0NsYWltAQULdXNlckFkZHJlc3MFC3ZhbHVlU3RyaW5nARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBC3VzZXJBZGRyZXNzBBh1c2VyVG9DbGFpbURhdGFTdHJpbmdSYXcJAJ0IAgUEdGhpcwkBDmtleVVzZXJUb0NsYWltAQULdXNlckFkZHJlc3MEByRtYXRjaDAFGHVzZXJUb0NsYWltRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBA1jdXJyZW50UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAQQHdG9DbGFpbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAIECm5leHRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAADBAh0b1VubG9jawkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAQDAwkAZgIFCm5leHRQZXJpb2QFBmhlaWdodAYJAAACBQ9jdXJyZW50UGVyaW9kSWQAAAkAlAoCBQd0b0NsYWltBQh0b1VubG9jawkAlAoCCQBkAgUHdG9DbGFpbQUIdG9VbmxvY2sAAAkAlAoCAAAAAAEXZ2V0VXNlclRvdGFsTG9ja2VkRW50cnkCC3VzZXJBZGRyZXNzD3VzZXJUb3RhbExvY2tlZAkBDEludGVnZXJFbnRyeQIJARJrZXlVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwUPdXNlclRvdGFsTG9ja2VkARJnZXRVc2VyVG90YWxMb2NrZWQBC3VzZXJBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARJrZXlVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwAAARFnZXRVbnN0YWtlQWN0aW9ucwMLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MNdW5zdGFrZUFtb3VudAQLJHQwODg1Nzg5MzAJARJnZXRMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQRbm9kZUN1cnJlbnRMZWFzZWQIBQskdDA4ODU3ODkzMAJfMQQObm9kZU5leHRMZWFzZWQIBQskdDA4ODU3ODkzMAJfMgQLJHQwODkzNTkwMjEJARJnZXRVc2VyTGVhc2luZ0RhdGECBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MEEXVzZXJDdXJyZW50TGVhc2VkCAULJHQwODkzNTkwMjECXzEEDnVzZXJOZXh0TGVhc2VkCAULJHQwODkzNTkwMjECXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQBmAgUNdW5zdGFrZUFtb3VudAAABgkBCHRocm93RXJyAQIndW5zdGFrZSBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIDCQBnAgUOdXNlck5leHRMZWFzZWQFDXVuc3Rha2VBbW91bnQGCQEIdGhyb3dFcnIBAjl1bnN0YWtlIGFtb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB1c2VyIHN0YWtlZCBhbW91bnQJAMwIAgMJAGcCBQ5ub2RlTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAYJAQh0aHJvd0VycgECOXVuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIG5vZGUgc3Rha2VkIGFtb3VudAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULbm9kZUFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIabm9kZSBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULbm9kZUFkZHJlc3MFA25pbAIBIAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBBBuZXdOb2RlTmV4dExlYXNlCQBlAgUObm9kZU5leHRMZWFzZWQFDXVuc3Rha2VBbW91bnQEEW5ld1VzZXJOZXh0TGVhc2VkCQBlAgUOdXNlck5leHRMZWFzZWQFDXVuc3Rha2VBbW91bnQECyR0MDk4MzQ5ODk0CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQskdDA5ODM0OTg5NAJfMQQIdG9VbmxvY2sIBQskdDA5ODM0OTg5NAJfMgQLbmV3VG9VbmxvY2sJAGQCBQh0b1VubG9jawUNdW5zdGFrZUFtb3VudAQPdXNlclRvdGFsTG9ja2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MEEm5ld1VzZXJUb3RhbExvY2tlZAkAZQIFD3VzZXJUb3RhbExvY2tlZAUNdW5zdGFrZUFtb3VudAkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFB3RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwILdXNlckFkZHJlc3MLY2xhaW1BbW91bnQEDSR0MDEwNjIzMTA2ODMJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDEwNjIzMTA2ODMCXzEECHRvVW5sb2NrCAUNJHQwMTA2MjMxMDY4MwJfMgQGY2hlY2tzCQDMCAIDCQEBIQEFC2lzRm9yY2VTdG9wBgkBCHRocm93RXJyAQIdY29udHJhY3QgaXMgdGVtcG9yYXJ5IHN0b3BwZWQJAMwIAgMJAGYCBQtjbGFpbUFtb3VudAAABgkBCHRocm93RXJyAQIlY2xhaW0gYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAZwIFB3RvQ2xhaW0FC2NsYWltQW1vdW50BgkBCHRocm93RXJyAQI0Y2xhaW0gYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHVubG9ja2VkIGFtb3VudAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBApuZXdUb0NsYWltCQBlAgUHdG9DbGFpbQULY2xhaW1BbW91bnQJAMwIAgkBE2dldFVzZXJUb0NsYWltRW50cnkDBQt1c2VyQWRkcmVzcwUKbmV3VG9DbGFpbQUIdG9VbmxvY2sJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQULdXNlckFkZHJlc3MFC2NsYWltQW1vdW50BQxhc3NldElkQnl0ZXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEPZ2V0U3Rha2VBY3Rpb25zBAtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcxF1c2VyTGVhc2luZ0Ftb3VudAFpBA0kdDAxMTQ0NDExNTA0CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxMTQ0NDExNTA0Al8xBAh0b1VubG9jawgFDSR0MDExNDQ0MTE1MDQCXzIEDXBheW1lbnRBbW91bnQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAAAAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAlhdmFpbGFibGUJAGQCCQBkAgUIdG9VbmxvY2sFB3RvQ2xhaW0FDXBheW1lbnRBbW91bnQEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQBnAgABCQCQAwEIBQFpCHBheW1lbnRzBgkBCHRocm93RXJyAQIRbWF4aW11bSAxIHBheW1lbnQJAMwIAgMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMYXNzZXRJZEJ5dGVzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnBheW1lbnQgYXNzZXRJZCBzaG91bGQgYmU6CQDMCAIFDWFzc2V0SWRTdHJpbmcFA25pbAIBIAkAzAgCAwkAZgIFEXVzZXJMZWFzaW5nQW1vdW50AAAGCQEIdGhyb3dFcnIBAh9hbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIDCQBnAgUJYXZhaWxhYmxlBRF1c2VyTGVhc2luZ0Ftb3VudAYJAQh0aHJvd0VycgECO2Ftb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCAocGF5bWVudCArIGF2YWlsYWJsZSkgYW1vdW50CQDMCAIDCQBnAgURdXNlckxlYXNpbmdBbW91bnQFDXBheW1lbnRBbW91bnQGCQACAQIwYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIG9yIGVxdWFsIHBheW1lbnQgYW1vdW50CQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQtub2RlQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhpub2RlIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQtub2RlQWRkcmVzcwUDbmlsAgEgCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQt1c2VyQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhp1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDSR0MDEyNTc1MTI2NDgJARJnZXRMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQRbm9kZUN1cnJlbnRMZWFzZWQIBQ0kdDAxMjU3NTEyNjQ4Al8xBA5ub2RlTmV4dExlYXNlZAgFDSR0MDEyNTc1MTI2NDgCXzIEEG5ld05vZGVOZXh0TGVhc2UJAGQCBQ5ub2RlTmV4dExlYXNlZAURdXNlckxlYXNpbmdBbW91bnQEDSR0MDEyNzE2MTI4MDIJARJnZXRVc2VyTGVhc2luZ0RhdGECBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MEEXVzZXJDdXJyZW50TGVhc2VkCAUNJHQwMTI3MTYxMjgwMgJfMQQOdXNlck5leHRMZWFzZWQIBQ0kdDAxMjcxNjEyODAyAl8yBBFuZXdVc2VyTmV4dExlYXNlZAkAZAIFDnVzZXJOZXh0TGVhc2VkBRF1c2VyTGVhc2luZ0Ftb3VudAQSZnJvbVVubG9ja2VkQW1vdW50CQBlAgURdXNlckxlYXNpbmdBbW91bnQFDXBheW1lbnRBbW91bnQEC25ld1RvVW5sb2NrCQCWAwEJAMwIAgAACQDMCAIJAGUCBQh0b1VubG9jawUSZnJvbVVubG9ja2VkQW1vdW50BQNuaWwECm5ld1RvQ2xhaW0JAJcDAQkAzAgCBQd0b0NsYWltCQDMCAIJAGQCBQd0b0NsYWltCQBlAgUIdG9VbmxvY2sFEmZyb21VbmxvY2tlZEFtb3VudAUDbmlsBA91c2VyVG90YWxMb2NrZWQJARJnZXRVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwQSbmV3VXNlclRvdGFsTG9ja2VkCQBkAgUPdXNlclRvdGFsTG9ja2VkBRF1c2VyTGVhc2luZ0Ftb3VudAkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARpnZXRTdGFrZUZyb21QYXltZW50QWN0aW9ucwMLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MBaQQGY2hlY2tzCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIgcGF5bWVudCBzaXplIHNob3VsZCBiZSBleGFjdGx5IDEFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBD2dldFN0YWtlQWN0aW9ucwQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFAWkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BHGdldFNldE5ld1BlcmlvZExlbmd0aEFjdGlvbnMBD25ld1BlcmlvZExlbmd0aAQFY2hlY2sJAMwIAgMJAGYCBQ9uZXdQZXJpb2RMZW5ndGgAAAYJAQh0aHJvd0VycgECJnBlcmlvZCBsZW5ndGggc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlQZXJpb2RMZW5ndGgFD25ld1BlcmlvZExlbmd0aAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0BQZoZWlnaHQFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa2V5UGVyaW9kT2Zmc2V0SWQJAGQCBQ9jdXJyZW50UGVyaW9kSWQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0BRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlQZXJpb2RMZW5ndGgFD25ld1BlcmlvZExlbmd0aAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuDAFpARJzZXROZXdQZXJpb2RMZW5ndGgBD25ld1BlcmlvZExlbmd0aAQGY2hlY2tzCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBHGdldFNldE5ld1BlcmlvZExlbmd0aEFjdGlvbnMBBQ9uZXdQZXJpb2RMZW5ndGgJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQc2V0Rm9yY2VTdG9wRmxhZwEEc3RvcAQFY2hlY2sJAMwIAgMJAQ1pc0luQWRtaW5MaXN0AQkApQgBCAUBaQZjYWxsZXIGCQEIdGhyb3dFcnIBAhpjYWxsZXIgaXMgbm90IGluIGFkbWluTGlzdAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa2V5Rm9yY2VTdG9wBQRzdG9wBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETZ2V0Tm9kZURhdGFSRUFET05MWQELbm9kZUFkZHJlc3MEDSR0MDE1MjQ1MTUzMDkJARJnZXRMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQMY3VycmVudExlYXNlCAUNJHQwMTUyNDUxNTMwOQJfMQQKbmV4dExlYXNlZAgFDSR0MDE1MjQ1MTUzMDkCXzIJAJQKAgUDbmlsCQCXCgUFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDGN1cnJlbnRMZWFzZQUQbmV4dFBlcmlvZEhlaWdodAUKbmV4dExlYXNlZAUGaGVpZ2h0AWkBGmdldFVzZXJMZWFzaW5nRGF0YVJFQURPTkxZAgtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwQNJHQwMTU2NzkxNTc1NgkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQMY3VycmVudExlYXNlCAUNJHQwMTU2NzkxNTc1NgJfMQQKbmV4dExlYXNlZAgFDSR0MDE1Njc5MTU3NTYCXzIJAJQKAgUDbmlsCQCXCgUFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDGN1cnJlbnRMZWFzZQUQbmV4dFBlcmlvZEhlaWdodAUKbmV4dExlYXNlZAUGaGVpZ2h0AWkBE2dldFVzZXJEYXRhUkVBRE9OTFkBC3VzZXJBZGRyZXNzBA0kdDAxNjExOTE2MTc5CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxNjExOTE2MTc5Al8xBAh0b1VubG9jawgFDSR0MDE2MTE5MTYxNzkCXzIED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzCQCUCgIFA25pbAkAmAoGBRNjdXJyZW50UGVyaW9kSGVpZ2h0BQd0b0NsYWltBRBuZXh0UGVyaW9kSGVpZ2h0BQh0b1VubG9jawUPdXNlclRvdGFsTG9ja2VkBQZoZWlnaHQBaQEObGVhc2VCeUFkZHJlc3MCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzCQEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFAWkBaQEFbGVhc2UBC25vZGVBZGRyZXNzBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARpnZXRTdGFrZUZyb21QYXltZW50QWN0aW9ucwMFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUBaQFpAQ9sZWFzZUZyb21Mb2NrZWQCC25vZGVBZGRyZXNzBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEPZ2V0U3Rha2VBY3Rpb25zBAULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQZhbW91bnQFAWkBaQELY2FuY2VsTGVhc2UCC25vZGVBZGRyZXNzBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQERZ2V0VW5zdGFrZUFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFBmFtb3VudAFpAQVjbGFpbQEGYW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwIFC3VzZXJBZGRyZXNzBQZhbW91bnQBaQEIY2xhaW1BbGwABAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDSR0MDE3MTkzMTcyNTMJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDE3MTkzMTcyNTMCXzEECHRvVW5sb2NrCAUNJHQwMTcxOTMxNzI1MwJfMgQGY2hlY2tzCQDMCAIDCQBmAgUHdG9DbGFpbQAABgkBCHRocm93RXJyAQIQbm90aGluZyB0byBjbGFpbQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCBQt1c2VyQWRkcmVzcwUHdG9DbGFpbQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt2b3RlRm9yVHhJZAEEdHhJZAQTY2FsbGVyQWRkcmVzc1N0cmluZwkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBAlrZXlQcmVmaXgJARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBQR0eElkBAZyZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUFsbG93ZWRUeElkAAUEdHhJZAUDbmlsBBFhbGxvd2VkVHhJZE9wdGlvbgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQABANlcnIJAMwIAgMJAAACCQDIAQEJANkEAQUEdHhJZAURVFhJRF9CWVRFU19MRU5HVEgGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEiBpcyBub3QgdmFsaWQgdHhJZAkAzAgCAwMJAAACBRFhbGxvd2VkVHhJZE9wdGlvbgUEdW5pdAYJAQIhPQIJAQV2YWx1ZQEFEWFsbG93ZWRUeElkT3B0aW9uBQR0eElkBgkBCHRocm93RXJyAQkArAICBQR0eElkAhMgaXMgYWxyZWFkeSBhbGxvd2VkBQNuaWwDCQAAAgUDZXJyBQNlcnIJAQx2b3RlSU5URVJOQUwEBRNjYWxsZXJBZGRyZXNzU3RyaW5nBQlrZXlQcmVmaXgFBlFVT1JVTQUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQIYnlBZG1pbnMJAAACCAUCdHgCaWQJANkEAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQAAgAEB2J5T3duZXIDCQBnAgkAkAMBCQENZ2V0QWRtaW5zTGlzdAAFBlFVT1JVTQcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkDBQhieUFkbWlucwYFB2J5T3duZXJHASw9", "height": 3287404, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5xUjWKDszSkm11CKLqrnpLNkHBYLMDJQEGhwgH9AXmQg Next: FoDgahN94S9LP76DLx2JtwEovakdu2j9T8RJbqA5BtK7 Diff:
OldNewDifferences
1111 let keyAssetId = makeString(["%s", "assetId"], SEP)
1212
1313 let keyForceStop = makeString(["%s", "forceStop"], SEP)
14-
15-let keyForceOutStop = makeString(["%s", "forceOutStop"], SEP)
1614
1715 let keyPeriodOffsetId = makeString(["%s", "offsetId"], SEP)
1816
8482
8583 let isForceStop = valueOrElse(getBoolean(this, keyForceStop), false)
8684
87-let isForceOutStop = valueOrElse(getBoolean(this, keyForceOutStop), false)
88-
8985 func isValidAddress (address) = match addressFromString(address) {
9086 case a: Address =>
9187 true
130126
131127
132128 func genVotesKeysHelper (a,adminAddress) = {
133- let $t036963720 = a
134- let result = $t036963720._1
135- let prefix = $t036963720._2
129+ let $t035623586 = a
130+ let result = $t035623586._1
131+ let prefix = $t035623586._2
136132 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
137133 }
138134
139135
140136 func genVotesKeys (keyPrefix) = {
141137 let adminList = keyAdminAddressList()
142- let $t038673951 = {
138+ let $t037333817 = {
143139 let $l = getAdminsList()
144140 let $s = size($l)
145141 let $acc0 = $Tuple2(nil, keyPrefix)
153149
154150 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
155151 }
156- let result = $t038673951._1
157- let prefix = $t038673951._2
152+ let result = $t037333817._1
153+ let prefix = $t037333817._2
158154 result
159155 }
160156
306302
307303
308304 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
309- let $t089919064 = getLeasingNodeData(nodeAddress)
310- let nodeCurrentLeased = $t089919064._1
311- let nodeNextLeased = $t089919064._2
312- let $t090699155 = getUserLeasingData(nodeAddress, userAddress)
313- let userCurrentLeased = $t090699155._1
314- let userNextLeased = $t090699155._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
315311 let checks = [if (!(isForceStop))
316312 then true
317- else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
318- then true
319- else throwErr("unstake is temporary disabled"), if ((unstakeAmount > 0))
313+ else throwErr("contract is temporary stopped"), if ((unstakeAmount > 0))
320314 then true
321315 else throwErr("unstake amount should be greater than 0"), if ((userNextLeased >= unstakeAmount))
322316 then true
331325 then {
332326 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
333327 let newUserNextLeased = (userNextLeased - unstakeAmount)
334- let $t01003910099 = getUserToClaimBalance(userAddress)
335- let toClaim = $t01003910099._1
336- let toUnlock = $t01003910099._2
328+ let $t098349894 = getUserToClaimBalance(userAddress)
329+ let toClaim = $t098349894._1
330+ let toUnlock = $t098349894._2
337331 let newToUnlock = (toUnlock + unstakeAmount)
338332 let userTotalLocked = getUserTotalLocked(userAddress)
339333 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
344338
345339
346340 func getClaimUnlockedActions (userAddress,claimAmount) = {
347- let $t01082810888 = getUserToClaimBalance(userAddress)
348- let toClaim = $t01082810888._1
349- let toUnlock = $t01082810888._2
341+ let $t01062310683 = getUserToClaimBalance(userAddress)
342+ let toClaim = $t01062310683._1
343+ let toUnlock = $t01062310683._2
350344 let checks = [if (!(isForceStop))
351345 then true
352- else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
353- then true
354- else throwErr("claim is temporary disabled"), if ((claimAmount > 0))
346+ else throwErr("contract is temporary stopped"), if ((claimAmount > 0))
355347 then true
356348 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
357349 then true
368360
369361
370362 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
371- let $t01171811778 = getUserToClaimBalance(userAddress)
372- let toClaim = $t01171811778._1
373- let toUnlock = $t01171811778._2
363+ let $t01144411504 = getUserToClaimBalance(userAddress)
364+ let toClaim = $t01144411504._1
365+ let toUnlock = $t01144411504._2
374366 let paymentAmount = if ((size(i.payments) == 0))
375367 then 0
376368 else i.payments[0].amount
396388 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
397389 if ((checks == checks))
398390 then {
399- let $t01284912922 = getLeasingNodeData(nodeAddress)
400- let nodeCurrentLeased = $t01284912922._1
401- let nodeNextLeased = $t01284912922._2
391+ let $t01257512648 = getLeasingNodeData(nodeAddress)
392+ let nodeCurrentLeased = $t01257512648._1
393+ let nodeNextLeased = $t01257512648._2
402394 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
403- let $t01299013076 = getUserLeasingData(nodeAddress, userAddress)
404- let userCurrentLeased = $t01299013076._1
405- let userNextLeased = $t01299013076._2
395+ let $t01271612802 = getUserLeasingData(nodeAddress, userAddress)
396+ let userCurrentLeased = $t01271612802._1
397+ let userNextLeased = $t01271612802._2
406398 let newUserNextLeased = (userNextLeased + userLeasingAmount)
407399 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
408400 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
462454
463455
464456 @Callable(i)
465-func setForceOutStopFlag (stop) = {
466- let check = [if (isInAdminList(toString(i.caller)))
467- then true
468- else throwErr("caller is not in adminList")]
469- if ((check == check))
470- then [BooleanEntry(keyForceOutStop, stop)]
471- else throw("Strict value is not equal to itself.")
472- }
473-
474-
475-
476-@Callable(i)
477457 func getNodeDataREADONLY (nodeAddress) = {
478- let $t01574915813 = getLeasingNodeData(nodeAddress)
479- let currentLease = $t01574915813._1
480- let nextLeased = $t01574915813._2
458+ let $t01524515309 = getLeasingNodeData(nodeAddress)
459+ let currentLease = $t01524515309._1
460+ let nextLeased = $t01524515309._2
481461 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
482462 }
483463
485465
486466 @Callable(i)
487467 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
488- let $t01618316260 = getUserLeasingData(nodeAddress, userAddress)
489- let currentLease = $t01618316260._1
490- let nextLeased = $t01618316260._2
468+ let $t01567915756 = getUserLeasingData(nodeAddress, userAddress)
469+ let currentLease = $t01567915756._1
470+ let nextLeased = $t01567915756._2
491471 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
492472 }
493473
495475
496476 @Callable(i)
497477 func getUserDataREADONLY (userAddress) = {
498- let $t01662316683 = getUserToClaimBalance(userAddress)
499- let toClaim = $t01662316683._1
500- let toUnlock = $t01662316683._2
478+ let $t01611916179 = getUserToClaimBalance(userAddress)
479+ let toClaim = $t01611916179._1
480+ let toUnlock = $t01611916179._2
501481 let userTotalLocked = getUserTotalLocked(userAddress)
502482 $Tuple2(nil, $Tuple6(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height))
503483 }
544524 @Callable(i)
545525 func claimAll () = {
546526 let userAddress = toString(i.caller)
547- let $t01769717757 = getUserToClaimBalance(userAddress)
548- let toClaim = $t01769717757._1
549- let toUnlock = $t01769717757._2
527+ let $t01719317253 = getUserToClaimBalance(userAddress)
528+ let toClaim = $t01719317253._1
529+ let toUnlock = $t01719317253._2
550530 let checks = [if ((toClaim > 0))
551531 then true
552532 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)
14-
15-let keyForceOutStop = makeString(["%s", "forceOutStop"], SEP)
1614
1715 let keyPeriodOffsetId = makeString(["%s", "offsetId"], SEP)
1816
1917 let keyPeriodOffsetHeight = makeString(["%s", "offsetHeight"], SEP)
2018
2119 let keyPeriodLength = makeString(["%s", "periodLength"], SEP)
2220
2321 let periodOffsetId = valueOrElse(getInteger(this, keyPeriodOffsetId), 0)
2422
2523 let periodLength = valueOrElse(getInteger(this, keyPeriodLength), 10000)
2624
2725 let periodOffsetHeight = valueOrElse(getInteger(this, keyPeriodOffsetHeight), -1)
2826
2927 let currentPeriodId = if (if ((height > periodOffsetHeight))
3028 then (periodOffsetHeight != -1)
3129 else false)
3230 then (((height - periodOffsetHeight) / periodLength) + periodOffsetId)
3331 else max([0, (periodOffsetId - 1)])
3432
3533 let currentPeriodHeight = if (if ((periodOffsetHeight == -1))
3634 then true
3735 else if ((currentPeriodId == 0))
3836 then (periodOffsetHeight > height)
3937 else false)
4038 then 0
4139 else (periodOffsetHeight + ((currentPeriodId - periodOffsetId) * periodLength))
4240
4341 let nextPeriodHeight = if (if ((periodOffsetHeight == -1))
4442 then true
4543 else if ((currentPeriodId == 0))
4644 then (periodOffsetHeight > height)
4745 else false)
4846 then 0
4947 else (currentPeriodHeight + periodLength)
5048
5149 func keyLeasingNodeData (nodeAddress) = makeString(["%s", nodeAddress], SEP)
5250
5351
5452 func keyUserLeasingNodeData (userAddress,nodeAddress) = makeString(["%s%s", nodeAddress, userAddress], SEP)
5553
5654
5755 func keyUserToClaim (userAddress) = makeString(["%s%s", "toClaim", userAddress], SEP)
5856
5957
6058 func keyUserTotalLocked (userAddress) = makeString(["%s%s", "userTotalLocked", userAddress], SEP)
6159
6260
6361 func keyNodeLeasingByHeight (nodeAddress) = {
6462 let h = if ((periodOffsetHeight == -1))
6563 then 0
6664 else height
6765 makeString(["%s%d", nodeAddress, toString(h)], SEP)
6866 }
6967
7068
7169 func keyUserLeasingByHeight (nodeAddress,userAddress) = {
7270 let h = if ((periodOffsetHeight == -1))
7371 then 0
7472 else height
7573 makeString(["%s%s%d", nodeAddress, userAddress, toString(h)], SEP)
7674 }
7775
7876
7977 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
8078
8179 let assetIdBytes = if ((assetIdString == "WAVES"))
8280 then unit
8381 else fromBase58String(assetIdString)
8482
8583 let isForceStop = valueOrElse(getBoolean(this, keyForceStop), false)
8684
87-let isForceOutStop = valueOrElse(getBoolean(this, keyForceOutStop), false)
88-
8985 func isValidAddress (address) = match addressFromString(address) {
9086 case a: Address =>
9187 true
9288 case _ =>
9389 false
9490 }
9591
9692
9793 let ADMIN_LIST_SIZE = 5
9894
9995 let QUORUM = 3
10096
10197 let TXID_BYTES_LENGTH = 32
10298
10399 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
104100
105101
106102 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
107103
108104
109105 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
110106
111107
112108 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
113109
114110
115111 func getAdminVote (prefix,admin) = {
116112 let voteKey = keyFullAdminVote(prefix, admin)
117113 valueOrElse(getInteger(voteKey), 0)
118114 }
119115
120116
121117 func getAdminsList () = match getString(this, keyAdminAddressList()) {
122118 case s: String =>
123119 split(s, SEP)
124120 case _ =>
125121 nil
126122 }
127123
128124
129125 func isInAdminList (address) = containsElement(getAdminsList(), address)
130126
131127
132128 func genVotesKeysHelper (a,adminAddress) = {
133- let $t036963720 = a
134- let result = $t036963720._1
135- let prefix = $t036963720._2
129+ let $t035623586 = a
130+ let result = $t035623586._1
131+ let prefix = $t035623586._2
136132 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
137133 }
138134
139135
140136 func genVotesKeys (keyPrefix) = {
141137 let adminList = keyAdminAddressList()
142- let $t038673951 = {
138+ let $t037333817 = {
143139 let $l = getAdminsList()
144140 let $s = size($l)
145141 let $acc0 = $Tuple2(nil, keyPrefix)
146142 func $f0_1 ($a,$i) = if (($i >= $s))
147143 then $a
148144 else genVotesKeysHelper($a, $l[$i])
149145
150146 func $f0_2 ($a,$i) = if (($i >= $s))
151147 then $a
152148 else throw("List size exceeds 5")
153149
154150 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
155151 }
156- let result = $t038673951._1
157- let prefix = $t038673951._2
152+ let result = $t037333817._1
153+ let prefix = $t037333817._2
158154 result
159155 }
160156
161157
162158 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
163159
164160
165161 func countVotes (prefix) = {
166162 let votes = genVotesKeys(prefix)
167163 let $l = votes
168164 let $s = size($l)
169165 let $acc0 = 0
170166 func $f0_1 ($a,$i) = if (($i >= $s))
171167 then $a
172168 else countVotesHelper($a, $l[$i])
173169
174170 func $f0_2 ($a,$i) = if (($i >= $s))
175171 then $a
176172 else throw("List size exceeds 5")
177173
178174 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
179175 }
180176
181177
182178 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
183179
184180
185181 func getClearVoteEntries (prefix) = {
186182 let votes = genVotesKeys(prefix)
187183 let $l = votes
188184 let $s = size($l)
189185 let $acc0 = nil
190186 func $f0_1 ($a,$i) = if (($i >= $s))
191187 then $a
192188 else clearVotesHelper($a, $l[$i])
193189
194190 func $f0_2 ($a,$i) = if (($i >= $s))
195191 then $a
196192 else throw("List size exceeds 5")
197193
198194 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
199195 }
200196
201197
202198 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
203199 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
204200 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
205201 let err = if (!(isInAdminList(callerAddressString)))
206202 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
207203 else if ((adminCurrentVote == 1))
208204 then throwErr((voteKey + " you already voted"))
209205 else unit
210206 if ((err == err))
211207 then {
212208 let votes = countVotes(keyPrefix)
213209 if (((votes + 1) >= minVotes))
214210 then {
215211 let clearVoteEntries = getClearVoteEntries(keyPrefix)
216212 (clearVoteEntries ++ voteResult)
217213 }
218214 else [IntegerEntry(voteKey, 1)]
219215 }
220216 else throw("Strict value is not equal to itself.")
221217 }
222218
223219
224220 func getLeasingNodeEntry (nodeAddress,currentLeased,nextLeased) = {
225221 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(currentLeased), toString(nextPeriodHeight), toString(nextLeased)], SEP)
226222 StringEntry(keyLeasingNodeData(nodeAddress), valueString)
227223 }
228224
229225
230226 func getLeasingNodeData (nodeAddress) = {
231227 let leasingNodeDataStringRaw = getString(this, keyLeasingNodeData(nodeAddress))
232228 match leasingNodeDataStringRaw {
233229 case ds: String =>
234230 let dataList = split(ds, SEP)
235231 let nodeCurrentPeriod = parseIntValue(dataList[1])
236232 let nodeCurrentLeased = parseIntValue(dataList[2])
237233 let nodeNextPeriod = parseIntValue(dataList[3])
238234 let nodeNextLeased = parseIntValue(dataList[4])
239235 if (if ((nodeNextPeriod > height))
240236 then true
241237 else (periodOffsetHeight == -1))
242238 then $Tuple2(nodeCurrentLeased, nodeNextLeased)
243239 else $Tuple2(nodeNextLeased, nodeNextLeased)
244240 case _ =>
245241 $Tuple2(0, 0)
246242 }
247243 }
248244
249245
250246 func getUserLeasingEntry (nodeAddress,userAddress,userCurrentLeased,userNextLeased) = {
251247 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(userCurrentLeased), toString(nextPeriodHeight), toString(userNextLeased)], SEP)
252248 StringEntry(keyUserLeasingNodeData(userAddress, nodeAddress), valueString)
253249 }
254250
255251
256252 func getUserLeasingData (nodeAddress,userAddress) = {
257253 let leasingUserDataStringRaw = getString(this, keyUserLeasingNodeData(userAddress, nodeAddress))
258254 match leasingUserDataStringRaw {
259255 case ds: String =>
260256 let dataList = split(ds, SEP)
261257 let userCurrentPeriod = parseIntValue(dataList[1])
262258 let userCurrentLeased = parseIntValue(dataList[2])
263259 let userNextPeriod = parseIntValue(dataList[3])
264260 let userNextLeased = parseIntValue(dataList[4])
265261 if (if ((userNextPeriod > height))
266262 then true
267263 else (periodOffsetHeight == -1))
268264 then $Tuple2(userCurrentLeased, userNextLeased)
269265 else $Tuple2(userNextLeased, userNextLeased)
270266 case _ =>
271267 $Tuple2(0, 0)
272268 }
273269 }
274270
275271
276272 func getUserToClaimEntry (userAddress,toClaim,toUnlock) = {
277273 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(toClaim), toString(nextPeriodHeight), toString(toUnlock)], SEP)
278274 StringEntry(keyUserToClaim(userAddress), valueString)
279275 }
280276
281277
282278 func getUserToClaimBalance (userAddress) = {
283279 let userToClaimDataStringRaw = getString(this, keyUserToClaim(userAddress))
284280 match userToClaimDataStringRaw {
285281 case ds: String =>
286282 let dataList = split(ds, SEP)
287283 let currentPeriod = parseIntValue(dataList[1])
288284 let toClaim = parseIntValue(dataList[2])
289285 let nextPeriod = parseIntValue(dataList[3])
290286 let toUnlock = parseIntValue(dataList[4])
291287 if (if ((nextPeriod > height))
292288 then true
293289 else (currentPeriodId == 0))
294290 then $Tuple2(toClaim, toUnlock)
295291 else $Tuple2((toClaim + toUnlock), 0)
296292 case _ =>
297293 $Tuple2(0, 0)
298294 }
299295 }
300296
301297
302298 func getUserTotalLockedEntry (userAddress,userTotalLocked) = IntegerEntry(keyUserTotalLocked(userAddress), userTotalLocked)
303299
304300
305301 func getUserTotalLocked (userAddress) = valueOrElse(getInteger(this, keyUserTotalLocked(userAddress)), 0)
306302
307303
308304 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
309- let $t089919064 = getLeasingNodeData(nodeAddress)
310- let nodeCurrentLeased = $t089919064._1
311- let nodeNextLeased = $t089919064._2
312- let $t090699155 = getUserLeasingData(nodeAddress, userAddress)
313- let userCurrentLeased = $t090699155._1
314- let userNextLeased = $t090699155._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
315311 let checks = [if (!(isForceStop))
316312 then true
317- else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
318- then true
319- else throwErr("unstake is temporary disabled"), if ((unstakeAmount > 0))
313+ else throwErr("contract is temporary stopped"), if ((unstakeAmount > 0))
320314 then true
321315 else throwErr("unstake amount should be greater than 0"), if ((userNextLeased >= unstakeAmount))
322316 then true
323317 else throwErr("unstake amount should be less or equal user staked amount"), if ((nodeNextLeased >= unstakeAmount))
324318 then true
325319 else throwErr("unstake amount should be less or equal node staked amount"), if (isValidAddress(nodeAddress))
326320 then true
327321 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
328322 then true
329323 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
330324 if ((checks == checks))
331325 then {
332326 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
333327 let newUserNextLeased = (userNextLeased - unstakeAmount)
334- let $t01003910099 = getUserToClaimBalance(userAddress)
335- let toClaim = $t01003910099._1
336- let toUnlock = $t01003910099._2
328+ let $t098349894 = getUserToClaimBalance(userAddress)
329+ let toClaim = $t098349894._1
330+ let toUnlock = $t098349894._2
337331 let newToUnlock = (toUnlock + unstakeAmount)
338332 let userTotalLocked = getUserTotalLocked(userAddress)
339333 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
340334 [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)]
341335 }
342336 else throw("Strict value is not equal to itself.")
343337 }
344338
345339
346340 func getClaimUnlockedActions (userAddress,claimAmount) = {
347- let $t01082810888 = getUserToClaimBalance(userAddress)
348- let toClaim = $t01082810888._1
349- let toUnlock = $t01082810888._2
341+ let $t01062310683 = getUserToClaimBalance(userAddress)
342+ let toClaim = $t01062310683._1
343+ let toUnlock = $t01062310683._2
350344 let checks = [if (!(isForceStop))
351345 then true
352- else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
353- then true
354- else throwErr("claim is temporary disabled"), if ((claimAmount > 0))
346+ else throwErr("contract is temporary stopped"), if ((claimAmount > 0))
355347 then true
356348 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
357349 then true
358350 else throwErr("claim amount should be less or equal unlocked amount"), if (isValidAddress(userAddress))
359351 then true
360352 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
361353 if ((checks == checks))
362354 then {
363355 let newToClaim = (toClaim - claimAmount)
364356 [getUserToClaimEntry(userAddress, newToClaim, toUnlock), ScriptTransfer(addressFromStringValue(userAddress), claimAmount, assetIdBytes)]
365357 }
366358 else throw("Strict value is not equal to itself.")
367359 }
368360
369361
370362 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
371- let $t01171811778 = getUserToClaimBalance(userAddress)
372- let toClaim = $t01171811778._1
373- let toUnlock = $t01171811778._2
363+ let $t01144411504 = getUserToClaimBalance(userAddress)
364+ let toClaim = $t01144411504._1
365+ let toUnlock = $t01144411504._2
374366 let paymentAmount = if ((size(i.payments) == 0))
375367 then 0
376368 else i.payments[0].amount
377369 let available = ((toUnlock + toClaim) + paymentAmount)
378370 let checks = [if (!(isForceStop))
379371 then true
380372 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
381373 then true
382374 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
383375 then true
384376 else (i.payments[0].assetId == assetIdBytes))
385377 then true
386378 else throwErr(makeString(["payment assetId should be:", assetIdString], " ")), if ((userLeasingAmount > 0))
387379 then true
388380 else throwErr("amount should be greater than 0"), if ((available >= userLeasingAmount))
389381 then true
390382 else throwErr("amount should be less or equal (payment + available) amount"), if ((userLeasingAmount >= paymentAmount))
391383 then true
392384 else throw("amount should be greater or equal payment amount"), if (isValidAddress(nodeAddress))
393385 then true
394386 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
395387 then true
396388 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
397389 if ((checks == checks))
398390 then {
399- let $t01284912922 = getLeasingNodeData(nodeAddress)
400- let nodeCurrentLeased = $t01284912922._1
401- let nodeNextLeased = $t01284912922._2
391+ let $t01257512648 = getLeasingNodeData(nodeAddress)
392+ let nodeCurrentLeased = $t01257512648._1
393+ let nodeNextLeased = $t01257512648._2
402394 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
403- let $t01299013076 = getUserLeasingData(nodeAddress, userAddress)
404- let userCurrentLeased = $t01299013076._1
405- let userNextLeased = $t01299013076._2
395+ let $t01271612802 = getUserLeasingData(nodeAddress, userAddress)
396+ let userCurrentLeased = $t01271612802._1
397+ let userNextLeased = $t01271612802._2
406398 let newUserNextLeased = (userNextLeased + userLeasingAmount)
407399 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
408400 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
409401 let newToClaim = min([toClaim, (toClaim + (toUnlock - fromUnlockedAmount))])
410402 let userTotalLocked = getUserTotalLocked(userAddress)
411403 let newUserTotalLocked = (userTotalLocked + userLeasingAmount)
412404 [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)]
413405 }
414406 else throw("Strict value is not equal to itself.")
415407 }
416408
417409
418410 func getStakeFromPaymentActions (nodeAddress,userAddress,i) = {
419411 let checks = [if ((size(i.payments) == 1))
420412 then true
421413 else throwErr("payment size should be exactly 1")]
422414 if ((checks == checks))
423415 then getStakeActions(nodeAddress, userAddress, i.payments[0].amount, i)
424416 else throw("Strict value is not equal to itself.")
425417 }
426418
427419
428420 func getSetNewPeriodLengthActions (newPeriodLength) = {
429421 let check = [if ((newPeriodLength > 0))
430422 then true
431423 else throwErr("period length should be greater than 0")]
432424 if ((check == check))
433425 then if ((periodOffsetHeight == -1))
434426 then [IntegerEntry(keyPeriodLength, newPeriodLength), IntegerEntry(keyPeriodOffsetHeight, height)]
435427 else [IntegerEntry(keyPeriodOffsetId, (currentPeriodId + 1)), IntegerEntry(keyPeriodOffsetHeight, nextPeriodHeight), IntegerEntry(keyPeriodLength, newPeriodLength)]
436428 else throw("Strict value is not equal to itself.")
437429 }
438430
439431
440432 @Callable(i)
441433 func setNewPeriodLength (newPeriodLength) = {
442434 let checks = [if (isInAdminList(toString(i.caller)))
443435 then true
444436 else throwErr("caller is not in adminList")]
445437 if ((checks == checks))
446438 then getSetNewPeriodLengthActions(newPeriodLength)
447439 else throw("Strict value is not equal to itself.")
448440 }
449441
450442
451443
452444 @Callable(i)
453445 func setForceStopFlag (stop) = {
454446 let check = [if (isInAdminList(toString(i.caller)))
455447 then true
456448 else throwErr("caller is not in adminList")]
457449 if ((check == check))
458450 then [BooleanEntry(keyForceStop, stop)]
459451 else throw("Strict value is not equal to itself.")
460452 }
461453
462454
463455
464456 @Callable(i)
465-func setForceOutStopFlag (stop) = {
466- let check = [if (isInAdminList(toString(i.caller)))
467- then true
468- else throwErr("caller is not in adminList")]
469- if ((check == check))
470- then [BooleanEntry(keyForceOutStop, stop)]
471- else throw("Strict value is not equal to itself.")
472- }
473-
474-
475-
476-@Callable(i)
477457 func getNodeDataREADONLY (nodeAddress) = {
478- let $t01574915813 = getLeasingNodeData(nodeAddress)
479- let currentLease = $t01574915813._1
480- let nextLeased = $t01574915813._2
458+ let $t01524515309 = getLeasingNodeData(nodeAddress)
459+ let currentLease = $t01524515309._1
460+ let nextLeased = $t01524515309._2
481461 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
482462 }
483463
484464
485465
486466 @Callable(i)
487467 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
488- let $t01618316260 = getUserLeasingData(nodeAddress, userAddress)
489- let currentLease = $t01618316260._1
490- let nextLeased = $t01618316260._2
468+ let $t01567915756 = getUserLeasingData(nodeAddress, userAddress)
469+ let currentLease = $t01567915756._1
470+ let nextLeased = $t01567915756._2
491471 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
492472 }
493473
494474
495475
496476 @Callable(i)
497477 func getUserDataREADONLY (userAddress) = {
498- let $t01662316683 = getUserToClaimBalance(userAddress)
499- let toClaim = $t01662316683._1
500- let toUnlock = $t01662316683._2
478+ let $t01611916179 = getUserToClaimBalance(userAddress)
479+ let toClaim = $t01611916179._1
480+ let toUnlock = $t01611916179._2
501481 let userTotalLocked = getUserTotalLocked(userAddress)
502482 $Tuple2(nil, $Tuple6(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height))
503483 }
504484
505485
506486
507487 @Callable(i)
508488 func leaseByAddress (nodeAddress,userAddress) = getStakeFromPaymentActions(nodeAddress, userAddress, i)
509489
510490
511491
512492 @Callable(i)
513493 func lease (nodeAddress) = {
514494 let userAddress = toString(i.caller)
515495 getStakeFromPaymentActions(nodeAddress, userAddress, i)
516496 }
517497
518498
519499
520500 @Callable(i)
521501 func leaseFromLocked (nodeAddress,amount) = {
522502 let userAddress = toString(i.caller)
523503 getStakeActions(nodeAddress, userAddress, amount, i)
524504 }
525505
526506
527507
528508 @Callable(i)
529509 func cancelLease (nodeAddress,amount) = {
530510 let userAddress = toString(i.caller)
531511 getUnstakeActions(nodeAddress, userAddress, amount)
532512 }
533513
534514
535515
536516 @Callable(i)
537517 func claim (amount) = {
538518 let userAddress = toString(i.caller)
539519 getClaimUnlockedActions(userAddress, amount)
540520 }
541521
542522
543523
544524 @Callable(i)
545525 func claimAll () = {
546526 let userAddress = toString(i.caller)
547- let $t01769717757 = getUserToClaimBalance(userAddress)
548- let toClaim = $t01769717757._1
549- let toUnlock = $t01769717757._2
527+ let $t01719317253 = getUserToClaimBalance(userAddress)
528+ let toClaim = $t01719317253._1
529+ let toUnlock = $t01719317253._2
550530 let checks = [if ((toClaim > 0))
551531 then true
552532 else throwErr("nothing to claim")]
553533 if ((checks == checks))
554534 then getClaimUnlockedActions(userAddress, toClaim)
555535 else throw("Strict value is not equal to itself.")
556536 }
557537
558538
559539
560540 @Callable(i)
561541 func voteForTxId (txId) = {
562542 let callerAddressString = toBase58String(i.caller.bytes)
563543 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
564544 let result = [StringEntry(keyAllowedTxId(), txId)]
565545 let allowedTxIdOption = getString(this, keyAllowedTxId())
566546 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
567547 then true
568548 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
569549 then true
570550 else (value(allowedTxIdOption) != txId))
571551 then true
572552 else throwErr((txId + " is already allowed"))]
573553 if ((err == err))
574554 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
575555 else throw("Strict value is not equal to itself.")
576556 }
577557
578558
579559 @Verifier(tx)
580560 func verify () = {
581561 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
582562 let byOwner = if ((size(getAdminsList()) >= QUORUM))
583563 then false
584564 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
585565 if (byAdmins)
586566 then true
587567 else byOwner
588568 }
589569

github/deemru/w8io/169f3d6 
66.97 ms