tx · 6Vuk1Cyykzh3aLD34UKE3CvGpBQYNkDTgvSMZLCe3gEm

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.02000000 Waves

2024.02.28 15:30 [2996078] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "6Vuk1Cyykzh3aLD34UKE3CvGpBQYNkDTgvSMZLCe3gEm", "fee": 2000000, "feeAssetId": null, "timestamp": 1709123403267, "version": 2, "chainId": 84, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "5pv5LPyAu94FWC6UCyjCzrN62Verj73sN91hzf7nkroUiBK7G8EtwfBWTbJyeuJgeoibTXp7eKj2YSwMZwAHU9YE" ], "script": "base64:BgI/CAISAwoBARIDCgEEEgMKAQgSBAoCCAgSAwoBCBIECgIICBIDCgEIEgQKAggBEgQKAggBEgMKAQESABIDCgEINgAMY29udHJhY3RGaWxlAhFsMm1wX2xlYXNpbmcucmlkZQADU0VQAgJfXwEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAAMa2V5Rm9yY2VTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIJZm9yY2VTdG9wBQNuaWwFA1NFUAARa2V5UGVyaW9kT2Zmc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAghvZmZzZXRJZAUDbmlsBQNTRVAAFWtleVBlcmlvZE9mZnNldEhlaWdodAkAuQkCCQDMCAICAiVzCQDMCAICDG9mZnNldEhlaWdodAUDbmlsBQNTRVAAD2tleVBlcmlvZExlbmd0aAkAuQkCCQDMCAICAiVzCQDMCAICDHBlcmlvZExlbmd0aAUDbmlsBQNTRVAADnBlcmlvZE9mZnNldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtleVBlcmlvZE9mZnNldElkAAAADHBlcmlvZExlbmd0aAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9rZXlQZXJpb2RMZW5ndGgAkE4AEnBlcmlvZE9mZnNldEhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRVrZXlQZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAPY3VycmVudFBlcmlvZElkAwMJAGYCBQZoZWlnaHQFEnBlcmlvZE9mZnNldEhlaWdodAkBAiE9AgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEHCQBkAgkAaQIJAGUCBQZoZWlnaHQFEnBlcmlvZE9mZnNldEhlaWdodAUMcGVyaW9kTGVuZ3RoBQ5wZXJpb2RPZmZzZXRJZAkAlgMBCQDMCAIAAAkAzAgCCQBlAgUOcGVyaW9kT2Zmc2V0SWQAAQUDbmlsABNjdXJyZW50UGVyaW9kSGVpZ2h0AwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BAAAJAGQCBRJwZXJpb2RPZmZzZXRIZWlnaHQJAGgCCQBlAgUPY3VycmVudFBlcmlvZElkBQ5wZXJpb2RPZmZzZXRJZAUMcGVyaW9kTGVuZ3RoABBuZXh0UGVyaW9kSGVpZ2h0AwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BAAAJAGQCBRNjdXJyZW50UGVyaW9kSGVpZ2h0BQxwZXJpb2RMZW5ndGgBEmtleUxlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MJALkJAgkAzAgCAgIlcwkAzAgCBQtub2RlQWRkcmVzcwUDbmlsBQNTRVABFmtleVVzZXJMZWFzaW5nTm9kZURhdGECC3VzZXJBZGRyZXNzC25vZGVBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCBQtub2RlQWRkcmVzcwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABDmtleVVzZXJUb0NsYWltAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIHdG9DbGFpbQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABEmtleVVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICD3VzZXJUb3RhbExvY2tlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFmtleU5vZGVMZWFzaW5nQnlIZWlnaHQBC25vZGVBZGRyZXNzBAFoAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BAAAFBmhlaWdodAkAuQkCCQDMCAICBCVzJWQJAMwIAgULbm9kZUFkZHJlc3MJAMwIAgkApAMBBQFoBQNuaWwFA1NFUAEWa2V5VXNlckxlYXNpbmdCeUhlaWdodAILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEAWgDCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEAAAUGaGVpZ2h0CQC5CQIJAMwIAgIGJXMlcyVkCQDMCAIFC25vZGVBZGRyZXNzCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAKQDAQUBaAUDbmlsBQNTRVAADWFzc2V0SWRTdHJpbmcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUKa2V5QXNzZXRJZAIFV0FWRVMADGFzc2V0SWRCeXRlcwMJAAACBQ1hc3NldElkU3RyaW5nAgVXQVZFUwUEdW5pdAkA2QQBBQ1hc3NldElkU3RyaW5nAAtpc0ZvcmNlU3RvcAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrZXlGb3JjZVN0b3AHAQ5pc1ZhbGlkQWRkcmVzcwEHYWRkcmVzcwQHJG1hdGNoMAkApggBBQdhZGRyZXNzAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGBwAPQURNSU5fTElTVF9TSVpFAAUABlFVT1JVTQADABFUWElEX0JZVEVTX0xFTkdUSAAgARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBHR4SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIJYWxsb3dUeElkCQDMCAIFBHR4SWQFA25pbAUDU0VQARBrZXlGdWxsQWRtaW5Wb3RlAgZwcmVmaXgMYWRtaW5BZGRyZXNzCQC5CQIJAMwIAgUGcHJlZml4CQDMCAIFDGFkbWluQWRkcmVzcwUDbmlsBQNTRVABE2tleUFkbWluQWRkcmVzc0xpc3QACQC5CQIJAMwIAgICJXMJAMwIAgIQYWRtaW5BZGRyZXNzTGlzdAUDbmlsBQNTRVABDmtleUFsbG93ZWRUeElkAAkAuQkCCQDMCAICAiVzCQDMCAICBHR4SWQFA25pbAUDU0VQAQxnZXRBZG1pblZvdGUCBnByZWZpeAVhZG1pbgQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFBWFkbWluCQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAENZ2V0QWRtaW5zTGlzdAAEByRtYXRjaDAJAJ0IAgUEdGhpcwkBE2tleUFkbWluQWRkcmVzc0xpc3QAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkAtQkCBQFzBQNTRVAFA25pbAENaXNJbkFkbWluTGlzdAEHYWRkcmVzcwkBD2NvbnRhaW5zRWxlbWVudAIJAQ1nZXRBZG1pbnNMaXN0AAUHYWRkcmVzcwESZ2VuVm90ZXNLZXlzSGVscGVyAgFhDGFkbWluQWRkcmVzcwQLJHQwMzQ0ODM0NzIFAWEEBnJlc3VsdAgFCyR0MDM0NDgzNDcyAl8xBAZwcmVmaXgIBQskdDAzNDQ4MzQ3MgJfMgkAlAoCCQDNCAIFBnJlc3VsdAkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFDGFkbWluQWRkcmVzcwUGcHJlZml4AQxnZW5Wb3Rlc0tleXMBCWtleVByZWZpeAQJYWRtaW5MaXN0CQETa2V5QWRtaW5BZGRyZXNzTGlzdAAECyR0MDM2MTkzNzAzCgACJGwJAQ1nZXRBZG1pbnNMaXN0AAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQlrZXlQcmVmaXgKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEmdlblZvdGVzS2V5c0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUEBnJlc3VsdAgFCyR0MDM2MTkzNzAzAl8xBAZwcmVmaXgIBQskdDAzNjE5MzcwMwJfMgUGcmVzdWx0ARBjb3VudFZvdGVzSGVscGVyAgZyZXN1bHQHdm90ZUtleQkAZAIFBnJlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABCmNvdW50Vm90ZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNvdW50Vm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFARBjbGVhclZvdGVzSGVscGVyAgZyZXN1bHQDa2V5CQDNCAIFBnJlc3VsdAkBC0RlbGV0ZUVudHJ5AQUDa2V5ARNnZXRDbGVhclZvdGVFbnRyaWVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjbGVhclZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEMdm90ZUlOVEVSTkFMBBNjYWxsZXJBZGRyZXNzU3RyaW5nCWtleVByZWZpeAhtaW5Wb3Rlcwp2b3RlUmVzdWx0BAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQQYWRtaW5DdXJyZW50Vm90ZQkBDGdldEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQDZXJyAwkBASEBCQENaXNJbkFkbWluTGlzdAEFE2NhbGxlckFkZHJlc3NTdHJpbmcJAQh0aHJvd0VycgEJAKwCAgkArAICAglBZGRyZXNzOiAFE2NhbGxlckFkZHJlc3NTdHJpbmcCEiBub3QgaW4gQWRtaW4gbGlzdAMJAAACBRBhZG1pbkN1cnJlbnRWb3RlAAEJAQh0aHJvd0VycgEJAKwCAgUHdm90ZUtleQISIHlvdSBhbHJlYWR5IHZvdGVkBQR1bml0AwkAAAIFA2VycgUDZXJyBAV2b3RlcwkBCmNvdW50Vm90ZXMBBQlrZXlQcmVmaXgDCQBnAgkAZAIFBXZvdGVzAAEFCG1pblZvdGVzBBBjbGVhclZvdGVFbnRyaWVzCQETZ2V0Q2xlYXJWb3RlRW50cmllcwEFCWtleVByZWZpeAkAzggCBRBjbGVhclZvdGVFbnRyaWVzBQp2b3RlUmVzdWx0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd2b3RlS2V5AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZ2V0TGVhc2luZ05vZGVFbnRyeQMLbm9kZUFkZHJlc3MNY3VycmVudExlYXNlZApuZXh0TGVhc2VkBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFDWN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUKbmV4dExlYXNlZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIJARJrZXlMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldExlYXNpbmdOb2RlRGF0YQELbm9kZUFkZHJlc3MEGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQESa2V5TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEByRtYXRjaDAFGGxlYXNpbmdOb2RlRGF0YVN0cmluZ1JhdwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAmRzBQckbWF0Y2gwBAhkYXRhTGlzdAkAtQkCBQJkcwUDU0VQBBFub2RlQ3VycmVudFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEEEW5vZGVDdXJyZW50TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQObm9kZU5leHRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAADBA5ub2RlTmV4dExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAQDAwkAZgIFDm5vZGVOZXh0UGVyaW9kBQZoZWlnaHQGCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEJAJQKAgURbm9kZUN1cnJlbnRMZWFzZWQFDm5vZGVOZXh0TGVhc2VkCQCUCgIFDm5vZGVOZXh0TGVhc2VkBQ5ub2RlTmV4dExlYXNlZAkAlAoCAAAAAAETZ2V0VXNlckxlYXNpbmdFbnRyeQQLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MRdXNlckN1cnJlbnRMZWFzZWQOdXNlck5leHRMZWFzZWQEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgIIJWQlZCVkJWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQURdXNlckN1cnJlbnRMZWFzZWQJAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUOdXNlck5leHRMZWFzZWQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwULdmFsdWVTdHJpbmcBEmdldFVzZXJMZWFzaW5nRGF0YQILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MEGGxlYXNpbmdVc2VyRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEWa2V5VXNlckxlYXNpbmdOb2RlRGF0YQIFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwQHJG1hdGNoMAUYbGVhc2luZ1VzZXJEYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEEXVzZXJDdXJyZW50UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAQQRdXNlckN1cnJlbnRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAACBA51c2VyTmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMEDnVzZXJOZXh0TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUOdXNlck5leHRQZXJpb2QFBmhlaWdodAYJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAlAoCBRF1c2VyQ3VycmVudExlYXNlZAUOdXNlck5leHRMZWFzZWQJAJQKAgUOdXNlck5leHRMZWFzZWQFDnVzZXJOZXh0TGVhc2VkCQCUCgIAAAAAARNnZXRVc2VyVG9DbGFpbUVudHJ5Awt1c2VyQWRkcmVzcwd0b0NsYWltCHRvVW5sb2NrBAt2YWx1ZVN0cmluZwkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQUTY3VycmVudFBlcmlvZEhlaWdodAkAzAgCCQCkAwEFB3RvQ2xhaW0JAMwIAgkApAMBBRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUIdG9VbmxvY2sFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwULdmFsdWVTdHJpbmcBFWdldFVzZXJUb0NsYWltQmFsYW5jZQELdXNlckFkZHJlc3MEGHVzZXJUb0NsYWltRGF0YVN0cmluZ1JhdwkAnQgCBQR0aGlzCQEOa2V5VXNlclRvQ2xhaW0BBQt1c2VyQWRkcmVzcwQHJG1hdGNoMAUYdXNlclRvQ2xhaW1EYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEDWN1cnJlbnRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAABBAd0b0NsYWltCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAgQKbmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMECHRvVW5sb2NrCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUKbmV4dFBlcmlvZAUGaGVpZ2h0BgkAAAIFD2N1cnJlbnRQZXJpb2RJZAAACQCUCgIFB3RvQ2xhaW0FCHRvVW5sb2NrCQCUCgIJAGQCBQd0b0NsYWltBQh0b1VubG9jawAACQCUCgIAAAAAARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQILdXNlckFkZHJlc3MPdXNlclRvdGFsTG9ja2VkCQEMSW50ZWdlckVudHJ5AgkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBQ91c2VyVG90YWxMb2NrZWQBEmdldFVzZXJUb3RhbExvY2tlZAELdXNlckFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEmtleVVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzAAABEWdldFVuc3Rha2VBY3Rpb25zAwtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcw11bnN0YWtlQW1vdW50BAskdDA4NzQzODgxNgkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBBFub2RlQ3VycmVudExlYXNlZAgFCyR0MDg3NDM4ODE2Al8xBA5ub2RlTmV4dExlYXNlZAgFCyR0MDg3NDM4ODE2Al8yBAskdDA4ODIxODkwNwkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQRdXNlckN1cnJlbnRMZWFzZWQIBQskdDA4ODIxODkwNwJfMQQOdXNlck5leHRMZWFzZWQIBQskdDA4ODIxODkwNwJfMgQGY2hlY2tzCQDMCAIDCQEBIQEFC2lzRm9yY2VTdG9wBgkBCHRocm93RXJyAQIdY29udHJhY3QgaXMgdGVtcG9yYXJ5IHN0b3BwZWQJAMwIAgMJAGYCBQ11bnN0YWtlQW1vdW50AAAGCQEIdGhyb3dFcnIBAid1bnN0YWtlIGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQ51c2VyTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAYJAQh0aHJvd0VycgECOXVuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHVzZXIgc3Rha2VkIGFtb3VudAkAzAgCAwkAZwIFDm5vZGVOZXh0TGVhc2VkBQ11bnN0YWtlQW1vdW50BgkBCHRocm93RXJyAQI5dW5zdGFrZSBhbW91bnQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgbm9kZSBzdGFrZWQgYW1vdW50CQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQtub2RlQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhpub2RlIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQtub2RlQWRkcmVzcwUDbmlsAgEgCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQt1c2VyQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhp1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEEG5ld05vZGVOZXh0TGVhc2UJAGUCBQ5ub2RlTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAQRbmV3VXNlck5leHRMZWFzZWQJAGUCBQ51c2VyTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAQLJHQwOTcyMDk3ODAJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFCyR0MDk3MjA5NzgwAl8xBAh0b1VubG9jawgFCyR0MDk3MjA5NzgwAl8yBAtuZXdUb1VubG9jawkAZAIFCHRvVW5sb2NrBQ11bnN0YWtlQW1vdW50BA91c2VyVG90YWxMb2NrZWQJARJnZXRVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwQSbmV3VXNlclRvdGFsTG9ja2VkCQBlAgUPdXNlclRvdGFsTG9ja2VkBQ11bnN0YWtlQW1vdW50CQDMCAIJARNnZXRMZWFzaW5nTm9kZUVudHJ5AwULbm9kZUFkZHJlc3MFEW5vZGVDdXJyZW50TGVhc2VkBRBuZXdOb2RlTmV4dExlYXNlCQDMCAIJARNnZXRVc2VyTGVhc2luZ0VudHJ5BAULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRF1c2VyQ3VycmVudExlYXNlZAURbmV3VXNlck5leHRMZWFzZWQJAMwIAgkBE2dldFVzZXJUb0NsYWltRW50cnkDBQt1c2VyQWRkcmVzcwUHdG9DbGFpbQULbmV3VG9VbmxvY2sJAMwIAgkBF2dldFVzZXJUb3RhbExvY2tlZEVudHJ5AgULdXNlckFkZHJlc3MFEm5ld1VzZXJUb3RhbExvY2tlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleU5vZGVMZWFzaW5nQnlIZWlnaHQBBQtub2RlQWRkcmVzcwUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleVVzZXJMZWFzaW5nQnlIZWlnaHQCBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFEW5ld1VzZXJOZXh0TGVhc2VkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BF2dldENsYWltVW5sb2NrZWRBY3Rpb25zAgt1c2VyQWRkcmVzcwtjbGFpbUFtb3VudAQNJHQwMTA1MDkxMDU2OQkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTA1MDkxMDU2OQJfMQQIdG9VbmxvY2sIBQ0kdDAxMDUwOTEwNTY5Al8yBAZjaGVja3MJAMwIAgMJAQEhAQULaXNGb3JjZVN0b3AGCQEIdGhyb3dFcnIBAh1jb250cmFjdCBpcyB0ZW1wb3Jhcnkgc3RvcHBlZAkAzAgCAwkAZgIFC2NsYWltQW1vdW50AAAGCQEIdGhyb3dFcnIBAiVjbGFpbSBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIDCQBnAgUHdG9DbGFpbQULY2xhaW1BbW91bnQGCQEIdGhyb3dFcnIBAjRjbGFpbSBhbW91bnQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdW5sb2NrZWQgYW1vdW50CQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQt1c2VyQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhp1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MECm5ld1RvQ2xhaW0JAGUCBQd0b0NsYWltBQtjbGFpbUFtb3VudAkAzAgCCQETZ2V0VXNlclRvQ2xhaW1FbnRyeQMFC3VzZXJBZGRyZXNzBQpuZXdUb0NsYWltBQh0b1VubG9jawkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQt1c2VyQWRkcmVzcwULY2xhaW1BbW91bnQFDGFzc2V0SWRCeXRlcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ9nZXRTdGFrZUFjdGlvbnMEC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzEXVzZXJMZWFzaW5nQW1vdW50AWkEDSR0MDExMzMwMTEzOTAJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDExMzMwMTEzOTACXzEECHRvVW5sb2NrCAUNJHQwMTEzMzAxMTM5MAJfMgQNcGF5bWVudEFtb3VudAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAAAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECWF2YWlsYWJsZQkAZAIJAGQCBQh0b1VubG9jawUHdG9DbGFpbQUNcGF5bWVudEFtb3VudAQGY2hlY2tzCQDMCAIDCQEBIQEFC2lzRm9yY2VTdG9wBgkBCHRocm93RXJyAQIdY29udHJhY3QgaXMgdGVtcG9yYXJ5IHN0b3BwZWQJAMwIAgMJAGcCAAEJAJADAQgFAWkIcGF5bWVudHMGCQEIdGhyb3dFcnIBAhFtYXhpbXVtIDEgcGF5bWVudAkAzAgCAwMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAGCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQxhc3NldElkQnl0ZXMGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIacGF5bWVudCBhc3NldElkIHNob3VsZCBiZToJAMwIAgUNYXNzZXRJZFN0cmluZwUDbmlsAgEgCQDMCAIDCQBmAgURdXNlckxlYXNpbmdBbW91bnQAAAYJAQh0aHJvd0VycgECH2Ftb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAGcCBQlhdmFpbGFibGUFEXVzZXJMZWFzaW5nQW1vdW50BgkBCHRocm93RXJyAQI7YW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIChwYXltZW50ICsgYXZhaWxhYmxlKSBhbW91bnQJAMwIAgMJAGcCBRF1c2VyTGVhc2luZ0Ftb3VudAUNcGF5bWVudEFtb3VudAYJAAIBAjBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgb3IgZXF1YWwgcGF5bWVudCBhbW91bnQJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC25vZGVBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGm5vZGUgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC25vZGVBZGRyZXNzBQNuaWwCASAJAMwIAgMJAQ5pc1ZhbGlkQWRkcmVzcwEFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQ6CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwCASAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQNJHQwMTI0NjExMjUzNAkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBBFub2RlQ3VycmVudExlYXNlZAgFDSR0MDEyNDYxMTI1MzQCXzEEDm5vZGVOZXh0TGVhc2VkCAUNJHQwMTI0NjExMjUzNAJfMgQQbmV3Tm9kZU5leHRMZWFzZQkAZAIFDm5vZGVOZXh0TGVhc2VkBRF1c2VyTGVhc2luZ0Ftb3VudAQNJHQwMTI2MDIxMjY4OAkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQRdXNlckN1cnJlbnRMZWFzZWQIBQ0kdDAxMjYwMjEyNjg4Al8xBA51c2VyTmV4dExlYXNlZAgFDSR0MDEyNjAyMTI2ODgCXzIEEW5ld1VzZXJOZXh0TGVhc2VkCQBkAgUOdXNlck5leHRMZWFzZWQFEXVzZXJMZWFzaW5nQW1vdW50BBJmcm9tVW5sb2NrZWRBbW91bnQJAGUCBRF1c2VyTGVhc2luZ0Ftb3VudAUNcGF5bWVudEFtb3VudAQLbmV3VG9VbmxvY2sJAJYDAQkAzAgCAAAJAMwIAgkAZQIFCHRvVW5sb2NrBRJmcm9tVW5sb2NrZWRBbW91bnQFA25pbAQKbmV3VG9DbGFpbQkAlwMBCQDMCAIFB3RvQ2xhaW0JAMwIAgkAZAIFB3RvQ2xhaW0JAGUCBQh0b1VubG9jawUSZnJvbVVubG9ja2VkQW1vdW50BQNuaWwED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzBBJuZXdVc2VyVG90YWxMb2NrZWQJAGQCBQ91c2VyVG90YWxMb2NrZWQFEXVzZXJMZWFzaW5nQW1vdW50CQDMCAIJARNnZXRMZWFzaW5nTm9kZUVudHJ5AwULbm9kZUFkZHJlc3MFEW5vZGVDdXJyZW50TGVhc2VkBRBuZXdOb2RlTmV4dExlYXNlCQDMCAIJARNnZXRVc2VyTGVhc2luZ0VudHJ5BAULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRF1c2VyQ3VycmVudExlYXNlZAURbmV3VXNlck5leHRMZWFzZWQJAMwIAgkBE2dldFVzZXJUb0NsYWltRW50cnkDBQt1c2VyQWRkcmVzcwUKbmV3VG9DbGFpbQULbmV3VG9VbmxvY2sJAMwIAgkBF2dldFVzZXJUb3RhbExvY2tlZEVudHJ5AgULdXNlckFkZHJlc3MFEm5ld1VzZXJUb3RhbExvY2tlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleU5vZGVMZWFzaW5nQnlIZWlnaHQBBQtub2RlQWRkcmVzcwUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleVVzZXJMZWFzaW5nQnlIZWlnaHQCBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFEW5ld1VzZXJOZXh0TGVhc2VkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BGmdldFN0YWtlRnJvbVBheW1lbnRBY3Rpb25zAwtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwFpBAZjaGVja3MJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAiBwYXltZW50IHNpemUgc2hvdWxkIGJlIGV4YWN0bHkgMQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEPZ2V0U3Rha2VBY3Rpb25zBAULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUBaQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEcZ2V0U2V0TmV3UGVyaW9kTGVuZ3RoQWN0aW9ucwEPbmV3UGVyaW9kTGVuZ3RoBAVjaGVjawkAzAgCAwkAZgIFD25ld1BlcmlvZExlbmd0aAAABgkBCHRocm93RXJyAQImcGVyaW9kIGxlbmd0aCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAFA25pbAMJAAACBQVjaGVjawUFY2hlY2sDCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tleVBlcmlvZExlbmd0aAUPbmV3UGVyaW9kTGVuZ3RoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVrZXlQZXJpb2RPZmZzZXRIZWlnaHQFBmhlaWdodAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrZXlQZXJpb2RPZmZzZXRJZAkAZAIFD2N1cnJlbnRQZXJpb2RJZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVrZXlQZXJpb2RPZmZzZXRIZWlnaHQFEG5leHRQZXJpb2RIZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tleVBlcmlvZExlbmd0aAUPbmV3UGVyaW9kTGVuZ3RoBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4MAWkBEnNldE5ld1BlcmlvZExlbmd0aAEPbmV3UGVyaW9kTGVuZ3RoBAZjaGVja3MJAMwIAgMJAQ1pc0luQWRtaW5MaXN0AQkApQgBCAUBaQZjYWxsZXIGCQEIdGhyb3dFcnIBAhpjYWxsZXIgaXMgbm90IGluIGFkbWluTGlzdAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEcZ2V0U2V0TmV3UGVyaW9kTGVuZ3RoQWN0aW9ucwEFD25ld1BlcmlvZExlbmd0aAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBzZXRGb3JjZVN0b3BGbGFnAQRzdG9wBAVjaGVjawkAzAgCAwkBDWlzSW5BZG1pbkxpc3QBCQClCAEIBQFpBmNhbGxlcgYJAQh0aHJvd0VycgECGmNhbGxlciBpcyBub3QgaW4gYWRtaW5MaXN0BQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrZXlGb3JjZVN0b3AFBHN0b3AFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNnZXROb2RlRGF0YVJFQURPTkxZAQtub2RlQWRkcmVzcwQNJHQwMTUxMzExNTE5NQkBEmdldExlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBAxjdXJyZW50TGVhc2UIBQ0kdDAxNTEzMTE1MTk1Al8xBApuZXh0TGVhc2VkCAUNJHQwMTUxMzExNTE5NQJfMgkAlAoCBQNuaWwJAJcKBQUTY3VycmVudFBlcmlvZEhlaWdodAUMY3VycmVudExlYXNlBRBuZXh0UGVyaW9kSGVpZ2h0BQpuZXh0TGVhc2VkBQZoZWlnaHQBaQEaZ2V0VXNlckxlYXNpbmdEYXRhUkVBRE9OTFkCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzBA0kdDAxNTU2NTE1NjQyCQESZ2V0VXNlckxlYXNpbmdEYXRhAgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBAxjdXJyZW50TGVhc2UIBQ0kdDAxNTU2NTE1NjQyAl8xBApuZXh0TGVhc2VkCAUNJHQwMTU1NjUxNTY0MgJfMgkAlAoCBQNuaWwJAJcKBQUTY3VycmVudFBlcmlvZEhlaWdodAUMY3VycmVudExlYXNlBRBuZXh0UGVyaW9kSGVpZ2h0BQpuZXh0TGVhc2VkBQZoZWlnaHQBaQETZ2V0VXNlckRhdGFSRUFET05MWQELdXNlckFkZHJlc3MEDSR0MDE2MDA1MTYwNjUJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDE2MDA1MTYwNjUCXzEECHRvVW5sb2NrCAUNJHQwMTYwMDUxNjA2NQJfMgQPdXNlclRvdGFsTG9ja2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MJAJQKAgUDbmlsCQCYCgYFE2N1cnJlbnRQZXJpb2RIZWlnaHQFB3RvQ2xhaW0FEG5leHRQZXJpb2RIZWlnaHQFCHRvVW5sb2NrBQ91c2VyVG90YWxMb2NrZWQFBmhlaWdodAFpAQ5sZWFzZUJ5QWRkcmVzcwILbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MJARpnZXRTdGFrZUZyb21QYXltZW50QWN0aW9ucwMFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUBaQFpAQVsZWFzZQELbm9kZUFkZHJlc3MEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBGmdldFN0YWtlRnJvbVBheW1lbnRBY3Rpb25zAwULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQFpAWkBD2xlYXNlRnJvbUxvY2tlZAILbm9kZUFkZHJlc3MGYW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJAQ9nZXRTdGFrZUFjdGlvbnMEBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFBmFtb3VudAUBaQFpAQtjYW5jZWxMZWFzZQILbm9kZUFkZHJlc3MGYW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARFnZXRVbnN0YWtlQWN0aW9ucwMFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUGYW1vdW50AWkBBWNsYWltAQZhbW91bnQEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBF2dldENsYWltVW5sb2NrZWRBY3Rpb25zAgULdXNlckFkZHJlc3MFBmFtb3VudAFpAQhjbGFpbUFsbAAEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQNJHQwMTcwNzkxNzEzOQkBFWdldFVzZXJUb0NsYWltQmFsYW5jZQEFC3VzZXJBZGRyZXNzBAd0b0NsYWltCAUNJHQwMTcwNzkxNzEzOQJfMQQIdG9VbmxvY2sIBQ0kdDAxNzA3OTE3MTM5Al8yBAZjaGVja3MJAMwIAgMJAGYCBQd0b0NsYWltAAAGCQEIdGhyb3dFcnIBAhBub3RoaW5nIHRvIGNsYWltBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwIFC3VzZXJBZGRyZXNzBQd0b0NsYWltCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3ZvdGVGb3JUeElkAQR0eElkBBNjYWxsZXJBZGRyZXNzU3RyaW5nCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMECWtleVByZWZpeAkBGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEFBHR4SWQEBnJlc3VsdAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5QWxsb3dlZFR4SWQABQR0eElkBQNuaWwEEWFsbG93ZWRUeElkT3B0aW9uCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAAEA2VycgkAzAgCAwkAAAIJAMgBAQkA2QQBBQR0eElkBRFUWElEX0JZVEVTX0xFTkdUSAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAISIGlzIG5vdCB2YWxpZCB0eElkCQDMCAIDAwkAAAIFEWFsbG93ZWRUeElkT3B0aW9uBQR1bml0BgkBAiE9AgkBBXZhbHVlAQURYWxsb3dlZFR4SWRPcHRpb24FBHR4SWQGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEyBpcyBhbHJlYWR5IGFsbG93ZWQFA25pbAMJAAACBQNlcnIFA2VycgkBDHZvdGVJTlRFUk5BTAQFE2NhbGxlckFkZHJlc3NTdHJpbmcFCWtleVByZWZpeAUGUVVPUlVNBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAhieUFkbWlucwkAAAIIBQJ0eAJpZAkA2QQBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAACAAQHYnlPd25lcgMJAGcCCQCQAwEJAQ1nZXRBZG1pbnNMaXN0AAUGUVVPUlVNBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQMFCGJ5QWRtaW5zBgUHYnlPd25lcp6e/fQ=", "height": 2996078, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EC5cKbZcMw8SvPwc9G5Yaya3kyyGaF88bt4oEMT6zFiX Next: 4oYKDus71AaoZRVdt7isQQQUYVm8mkAiPyWkHUn1UgbG Diff:
OldNewDifferences
226226 let nodeNextLeased = parseIntValue(dataList[4])
227227 if (if ((nodeNextPeriod > height))
228228 then true
229- else (currentPeriodId == 0))
229+ else (periodOffsetHeight == -1))
230230 then $Tuple2(nodeCurrentLeased, nodeNextLeased)
231231 else $Tuple2(nodeNextLeased, nodeNextLeased)
232232 case _ =>
252252 let userNextLeased = parseIntValue(dataList[4])
253253 if (if ((userNextPeriod > height))
254254 then true
255- else (currentPeriodId == 0))
255+ else (periodOffsetHeight == -1))
256256 then $Tuple2(userCurrentLeased, userNextLeased)
257257 else $Tuple2(userNextLeased, userNextLeased)
258258 case _ =>
294294
295295
296296 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
297- let $t087358808 = getLeasingNodeData(nodeAddress)
298- let nodeCurrentLeased = $t087358808._1
299- let nodeNextLeased = $t087358808._2
300- let $t088138899 = getUserLeasingData(nodeAddress, userAddress)
301- let userCurrentLeased = $t088138899._1
302- let userNextLeased = $t088138899._2
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
303303 let checks = [if (!(isForceStop))
304304 then true
305305 else throwErr("contract is temporary stopped"), if ((unstakeAmount > 0))
317317 then {
318318 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
319319 let newUserNextLeased = (userNextLeased - unstakeAmount)
320- let $t097129772 = getUserToClaimBalance(userAddress)
321- let toClaim = $t097129772._1
322- let toUnlock = $t097129772._2
320+ let $t097209780 = getUserToClaimBalance(userAddress)
321+ let toClaim = $t097209780._1
322+ let toUnlock = $t097209780._2
323323 let newToUnlock = (toUnlock + unstakeAmount)
324324 let userTotalLocked = getUserTotalLocked(userAddress)
325325 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
330330
331331
332332 func getClaimUnlockedActions (userAddress,claimAmount) = {
333- let $t01050110561 = getUserToClaimBalance(userAddress)
334- let toClaim = $t01050110561._1
335- let toUnlock = $t01050110561._2
333+ let $t01050910569 = getUserToClaimBalance(userAddress)
334+ let toClaim = $t01050910569._1
335+ let toUnlock = $t01050910569._2
336336 let checks = [if (!(isForceStop))
337337 then true
338338 else throwErr("contract is temporary stopped"), if ((claimAmount > 0))
352352
353353
354354 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
355- let $t01132211382 = getUserToClaimBalance(userAddress)
356- let toClaim = $t01132211382._1
357- let toUnlock = $t01132211382._2
355+ let $t01133011390 = getUserToClaimBalance(userAddress)
356+ let toClaim = $t01133011390._1
357+ let toUnlock = $t01133011390._2
358358 let paymentAmount = if ((size(i.payments) == 0))
359359 then 0
360360 else i.payments[0].amount
380380 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
381381 if ((checks == checks))
382382 then {
383- let $t01245312526 = getLeasingNodeData(nodeAddress)
384- let nodeCurrentLeased = $t01245312526._1
385- let nodeNextLeased = $t01245312526._2
383+ let $t01246112534 = getLeasingNodeData(nodeAddress)
384+ let nodeCurrentLeased = $t01246112534._1
385+ let nodeNextLeased = $t01246112534._2
386386 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
387- let $t01259412680 = getUserLeasingData(nodeAddress, userAddress)
388- let userCurrentLeased = $t01259412680._1
389- let userNextLeased = $t01259412680._2
387+ let $t01260212688 = getUserLeasingData(nodeAddress, userAddress)
388+ let userCurrentLeased = $t01260212688._1
389+ let userNextLeased = $t01260212688._2
390390 let newUserNextLeased = (userNextLeased + userLeasingAmount)
391391 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
392392 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
447447
448448 @Callable(i)
449449 func getNodeDataREADONLY (nodeAddress) = {
450- let $t01512315187 = getLeasingNodeData(nodeAddress)
451- let currentLease = $t01512315187._1
452- let nextLeased = $t01512315187._2
450+ let $t01513115195 = getLeasingNodeData(nodeAddress)
451+ let currentLease = $t01513115195._1
452+ let nextLeased = $t01513115195._2
453453 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
454454 }
455455
457457
458458 @Callable(i)
459459 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
460- let $t01555715634 = getUserLeasingData(nodeAddress, userAddress)
461- let currentLease = $t01555715634._1
462- let nextLeased = $t01555715634._2
460+ let $t01556515642 = getUserLeasingData(nodeAddress, userAddress)
461+ let currentLease = $t01556515642._1
462+ let nextLeased = $t01556515642._2
463463 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
464464 }
465465
467467
468468 @Callable(i)
469469 func getUserDataREADONLY (userAddress) = {
470- let $t01599716057 = getUserToClaimBalance(userAddress)
471- let toClaim = $t01599716057._1
472- let toUnlock = $t01599716057._2
470+ let $t01600516065 = getUserToClaimBalance(userAddress)
471+ let toClaim = $t01600516065._1
472+ let toUnlock = $t01600516065._2
473473 let userTotalLocked = getUserTotalLocked(userAddress)
474474 $Tuple2(nil, $Tuple6(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height))
475475 }
516516 @Callable(i)
517517 func claimAll () = {
518518 let userAddress = toString(i.caller)
519- let $t01707117131 = getUserToClaimBalance(userAddress)
520- let toClaim = $t01707117131._1
521- let toUnlock = $t01707117131._2
519+ let $t01707917139 = getUserToClaimBalance(userAddress)
520+ let toClaim = $t01707917139._1
521+ let toUnlock = $t01707917139._2
522522 let checks = [if ((toClaim > 0))
523523 then true
524524 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
3333 let currentPeriodHeight = if ((periodOffsetHeight == -1))
3434 then 0
3535 else (periodOffsetHeight + ((currentPeriodId - periodOffsetId) * periodLength))
3636
3737 let nextPeriodHeight = if ((periodOffsetHeight == -1))
3838 then 0
3939 else (currentPeriodHeight + periodLength)
4040
4141 func keyLeasingNodeData (nodeAddress) = makeString(["%s", nodeAddress], SEP)
4242
4343
4444 func keyUserLeasingNodeData (userAddress,nodeAddress) = makeString(["%s%s", nodeAddress, userAddress], SEP)
4545
4646
4747 func keyUserToClaim (userAddress) = makeString(["%s%s", "toClaim", userAddress], SEP)
4848
4949
5050 func keyUserTotalLocked (userAddress) = makeString(["%s%s", "userTotalLocked", userAddress], SEP)
5151
5252
5353 func keyNodeLeasingByHeight (nodeAddress) = {
5454 let h = if ((periodOffsetHeight == -1))
5555 then 0
5656 else height
5757 makeString(["%s%d", nodeAddress, toString(h)], SEP)
5858 }
5959
6060
6161 func keyUserLeasingByHeight (nodeAddress,userAddress) = {
6262 let h = if ((periodOffsetHeight == -1))
6363 then 0
6464 else height
6565 makeString(["%s%s%d", nodeAddress, userAddress, toString(h)], SEP)
6666 }
6767
6868
6969 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
7070
7171 let assetIdBytes = if ((assetIdString == "WAVES"))
7272 then unit
7373 else fromBase58String(assetIdString)
7474
7575 let isForceStop = valueOrElse(getBoolean(this, keyForceStop), false)
7676
7777 func isValidAddress (address) = match addressFromString(address) {
7878 case a: Address =>
7979 true
8080 case _ =>
8181 false
8282 }
8383
8484
8585 let ADMIN_LIST_SIZE = 5
8686
8787 let QUORUM = 3
8888
8989 let TXID_BYTES_LENGTH = 32
9090
9191 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
9292
9393
9494 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
9595
9696
9797 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
9898
9999
100100 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
101101
102102
103103 func getAdminVote (prefix,admin) = {
104104 let voteKey = keyFullAdminVote(prefix, admin)
105105 valueOrElse(getInteger(voteKey), 0)
106106 }
107107
108108
109109 func getAdminsList () = match getString(this, keyAdminAddressList()) {
110110 case s: String =>
111111 split(s, SEP)
112112 case _ =>
113113 nil
114114 }
115115
116116
117117 func isInAdminList (address) = containsElement(getAdminsList(), address)
118118
119119
120120 func genVotesKeysHelper (a,adminAddress) = {
121121 let $t034483472 = a
122122 let result = $t034483472._1
123123 let prefix = $t034483472._2
124124 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
125125 }
126126
127127
128128 func genVotesKeys (keyPrefix) = {
129129 let adminList = keyAdminAddressList()
130130 let $t036193703 = {
131131 let $l = getAdminsList()
132132 let $s = size($l)
133133 let $acc0 = $Tuple2(nil, keyPrefix)
134134 func $f0_1 ($a,$i) = if (($i >= $s))
135135 then $a
136136 else genVotesKeysHelper($a, $l[$i])
137137
138138 func $f0_2 ($a,$i) = if (($i >= $s))
139139 then $a
140140 else throw("List size exceeds 5")
141141
142142 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
143143 }
144144 let result = $t036193703._1
145145 let prefix = $t036193703._2
146146 result
147147 }
148148
149149
150150 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
151151
152152
153153 func countVotes (prefix) = {
154154 let votes = genVotesKeys(prefix)
155155 let $l = votes
156156 let $s = size($l)
157157 let $acc0 = 0
158158 func $f0_1 ($a,$i) = if (($i >= $s))
159159 then $a
160160 else countVotesHelper($a, $l[$i])
161161
162162 func $f0_2 ($a,$i) = if (($i >= $s))
163163 then $a
164164 else throw("List size exceeds 5")
165165
166166 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
167167 }
168168
169169
170170 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
171171
172172
173173 func getClearVoteEntries (prefix) = {
174174 let votes = genVotesKeys(prefix)
175175 let $l = votes
176176 let $s = size($l)
177177 let $acc0 = nil
178178 func $f0_1 ($a,$i) = if (($i >= $s))
179179 then $a
180180 else clearVotesHelper($a, $l[$i])
181181
182182 func $f0_2 ($a,$i) = if (($i >= $s))
183183 then $a
184184 else throw("List size exceeds 5")
185185
186186 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
187187 }
188188
189189
190190 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
191191 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
192192 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
193193 let err = if (!(isInAdminList(callerAddressString)))
194194 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
195195 else if ((adminCurrentVote == 1))
196196 then throwErr((voteKey + " you already voted"))
197197 else unit
198198 if ((err == err))
199199 then {
200200 let votes = countVotes(keyPrefix)
201201 if (((votes + 1) >= minVotes))
202202 then {
203203 let clearVoteEntries = getClearVoteEntries(keyPrefix)
204204 (clearVoteEntries ++ voteResult)
205205 }
206206 else [IntegerEntry(voteKey, 1)]
207207 }
208208 else throw("Strict value is not equal to itself.")
209209 }
210210
211211
212212 func getLeasingNodeEntry (nodeAddress,currentLeased,nextLeased) = {
213213 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(currentLeased), toString(nextPeriodHeight), toString(nextLeased)], SEP)
214214 StringEntry(keyLeasingNodeData(nodeAddress), valueString)
215215 }
216216
217217
218218 func getLeasingNodeData (nodeAddress) = {
219219 let leasingNodeDataStringRaw = getString(this, keyLeasingNodeData(nodeAddress))
220220 match leasingNodeDataStringRaw {
221221 case ds: String =>
222222 let dataList = split(ds, SEP)
223223 let nodeCurrentPeriod = parseIntValue(dataList[1])
224224 let nodeCurrentLeased = parseIntValue(dataList[2])
225225 let nodeNextPeriod = parseIntValue(dataList[3])
226226 let nodeNextLeased = parseIntValue(dataList[4])
227227 if (if ((nodeNextPeriod > height))
228228 then true
229- else (currentPeriodId == 0))
229+ else (periodOffsetHeight == -1))
230230 then $Tuple2(nodeCurrentLeased, nodeNextLeased)
231231 else $Tuple2(nodeNextLeased, nodeNextLeased)
232232 case _ =>
233233 $Tuple2(0, 0)
234234 }
235235 }
236236
237237
238238 func getUserLeasingEntry (nodeAddress,userAddress,userCurrentLeased,userNextLeased) = {
239239 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(userCurrentLeased), toString(nextPeriodHeight), toString(userNextLeased)], SEP)
240240 StringEntry(keyUserLeasingNodeData(userAddress, nodeAddress), valueString)
241241 }
242242
243243
244244 func getUserLeasingData (nodeAddress,userAddress) = {
245245 let leasingUserDataStringRaw = getString(this, keyUserLeasingNodeData(userAddress, nodeAddress))
246246 match leasingUserDataStringRaw {
247247 case ds: String =>
248248 let dataList = split(ds, SEP)
249249 let userCurrentPeriod = parseIntValue(dataList[1])
250250 let userCurrentLeased = parseIntValue(dataList[2])
251251 let userNextPeriod = parseIntValue(dataList[3])
252252 let userNextLeased = parseIntValue(dataList[4])
253253 if (if ((userNextPeriod > height))
254254 then true
255- else (currentPeriodId == 0))
255+ else (periodOffsetHeight == -1))
256256 then $Tuple2(userCurrentLeased, userNextLeased)
257257 else $Tuple2(userNextLeased, userNextLeased)
258258 case _ =>
259259 $Tuple2(0, 0)
260260 }
261261 }
262262
263263
264264 func getUserToClaimEntry (userAddress,toClaim,toUnlock) = {
265265 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(toClaim), toString(nextPeriodHeight), toString(toUnlock)], SEP)
266266 StringEntry(keyUserToClaim(userAddress), valueString)
267267 }
268268
269269
270270 func getUserToClaimBalance (userAddress) = {
271271 let userToClaimDataStringRaw = getString(this, keyUserToClaim(userAddress))
272272 match userToClaimDataStringRaw {
273273 case ds: String =>
274274 let dataList = split(ds, SEP)
275275 let currentPeriod = parseIntValue(dataList[1])
276276 let toClaim = parseIntValue(dataList[2])
277277 let nextPeriod = parseIntValue(dataList[3])
278278 let toUnlock = parseIntValue(dataList[4])
279279 if (if ((nextPeriod > height))
280280 then true
281281 else (currentPeriodId == 0))
282282 then $Tuple2(toClaim, toUnlock)
283283 else $Tuple2((toClaim + toUnlock), 0)
284284 case _ =>
285285 $Tuple2(0, 0)
286286 }
287287 }
288288
289289
290290 func getUserTotalLockedEntry (userAddress,userTotalLocked) = IntegerEntry(keyUserTotalLocked(userAddress), userTotalLocked)
291291
292292
293293 func getUserTotalLocked (userAddress) = valueOrElse(getInteger(this, keyUserTotalLocked(userAddress)), 0)
294294
295295
296296 func getUnstakeActions (nodeAddress,userAddress,unstakeAmount) = {
297- let $t087358808 = getLeasingNodeData(nodeAddress)
298- let nodeCurrentLeased = $t087358808._1
299- let nodeNextLeased = $t087358808._2
300- let $t088138899 = getUserLeasingData(nodeAddress, userAddress)
301- let userCurrentLeased = $t088138899._1
302- let userNextLeased = $t088138899._2
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
303303 let checks = [if (!(isForceStop))
304304 then true
305305 else throwErr("contract is temporary stopped"), if ((unstakeAmount > 0))
306306 then true
307307 else throwErr("unstake amount should be greater than 0"), if ((userNextLeased >= unstakeAmount))
308308 then true
309309 else throwErr("unstake amount should be less or equal user staked amount"), if ((nodeNextLeased >= unstakeAmount))
310310 then true
311311 else throwErr("unstake amount should be less or equal node staked amount"), if (isValidAddress(nodeAddress))
312312 then true
313313 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
314314 then true
315315 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
316316 if ((checks == checks))
317317 then {
318318 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
319319 let newUserNextLeased = (userNextLeased - unstakeAmount)
320- let $t097129772 = getUserToClaimBalance(userAddress)
321- let toClaim = $t097129772._1
322- let toUnlock = $t097129772._2
320+ let $t097209780 = getUserToClaimBalance(userAddress)
321+ let toClaim = $t097209780._1
322+ let toUnlock = $t097209780._2
323323 let newToUnlock = (toUnlock + unstakeAmount)
324324 let userTotalLocked = getUserTotalLocked(userAddress)
325325 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
326326 [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)]
327327 }
328328 else throw("Strict value is not equal to itself.")
329329 }
330330
331331
332332 func getClaimUnlockedActions (userAddress,claimAmount) = {
333- let $t01050110561 = getUserToClaimBalance(userAddress)
334- let toClaim = $t01050110561._1
335- let toUnlock = $t01050110561._2
333+ let $t01050910569 = getUserToClaimBalance(userAddress)
334+ let toClaim = $t01050910569._1
335+ let toUnlock = $t01050910569._2
336336 let checks = [if (!(isForceStop))
337337 then true
338338 else throwErr("contract is temporary stopped"), if ((claimAmount > 0))
339339 then true
340340 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
341341 then true
342342 else throwErr("claim amount should be less or equal unlocked amount"), if (isValidAddress(userAddress))
343343 then true
344344 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
345345 if ((checks == checks))
346346 then {
347347 let newToClaim = (toClaim - claimAmount)
348348 [getUserToClaimEntry(userAddress, newToClaim, toUnlock), ScriptTransfer(addressFromStringValue(userAddress), claimAmount, assetIdBytes)]
349349 }
350350 else throw("Strict value is not equal to itself.")
351351 }
352352
353353
354354 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
355- let $t01132211382 = getUserToClaimBalance(userAddress)
356- let toClaim = $t01132211382._1
357- let toUnlock = $t01132211382._2
355+ let $t01133011390 = getUserToClaimBalance(userAddress)
356+ let toClaim = $t01133011390._1
357+ let toUnlock = $t01133011390._2
358358 let paymentAmount = if ((size(i.payments) == 0))
359359 then 0
360360 else i.payments[0].amount
361361 let available = ((toUnlock + toClaim) + paymentAmount)
362362 let checks = [if (!(isForceStop))
363363 then true
364364 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
365365 then true
366366 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
367367 then true
368368 else (i.payments[0].assetId == assetIdBytes))
369369 then true
370370 else throwErr(makeString(["payment assetId should be:", assetIdString], " ")), if ((userLeasingAmount > 0))
371371 then true
372372 else throwErr("amount should be greater than 0"), if ((available >= userLeasingAmount))
373373 then true
374374 else throwErr("amount should be less or equal (payment + available) amount"), if ((userLeasingAmount >= paymentAmount))
375375 then true
376376 else throw("amount should be greater or equal payment amount"), if (isValidAddress(nodeAddress))
377377 then true
378378 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
379379 then true
380380 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
381381 if ((checks == checks))
382382 then {
383- let $t01245312526 = getLeasingNodeData(nodeAddress)
384- let nodeCurrentLeased = $t01245312526._1
385- let nodeNextLeased = $t01245312526._2
383+ let $t01246112534 = getLeasingNodeData(nodeAddress)
384+ let nodeCurrentLeased = $t01246112534._1
385+ let nodeNextLeased = $t01246112534._2
386386 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
387- let $t01259412680 = getUserLeasingData(nodeAddress, userAddress)
388- let userCurrentLeased = $t01259412680._1
389- let userNextLeased = $t01259412680._2
387+ let $t01260212688 = getUserLeasingData(nodeAddress, userAddress)
388+ let userCurrentLeased = $t01260212688._1
389+ let userNextLeased = $t01260212688._2
390390 let newUserNextLeased = (userNextLeased + userLeasingAmount)
391391 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
392392 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
393393 let newToClaim = min([toClaim, (toClaim + (toUnlock - fromUnlockedAmount))])
394394 let userTotalLocked = getUserTotalLocked(userAddress)
395395 let newUserTotalLocked = (userTotalLocked + userLeasingAmount)
396396 [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)]
397397 }
398398 else throw("Strict value is not equal to itself.")
399399 }
400400
401401
402402 func getStakeFromPaymentActions (nodeAddress,userAddress,i) = {
403403 let checks = [if ((size(i.payments) == 1))
404404 then true
405405 else throwErr("payment size should be exactly 1")]
406406 if ((checks == checks))
407407 then getStakeActions(nodeAddress, userAddress, i.payments[0].amount, i)
408408 else throw("Strict value is not equal to itself.")
409409 }
410410
411411
412412 func getSetNewPeriodLengthActions (newPeriodLength) = {
413413 let check = [if ((newPeriodLength > 0))
414414 then true
415415 else throwErr("period length should be greater than 0")]
416416 if ((check == check))
417417 then if ((periodOffsetHeight == -1))
418418 then [IntegerEntry(keyPeriodLength, newPeriodLength), IntegerEntry(keyPeriodOffsetHeight, height)]
419419 else [IntegerEntry(keyPeriodOffsetId, (currentPeriodId + 1)), IntegerEntry(keyPeriodOffsetHeight, nextPeriodHeight), IntegerEntry(keyPeriodLength, newPeriodLength)]
420420 else throw("Strict value is not equal to itself.")
421421 }
422422
423423
424424 @Callable(i)
425425 func setNewPeriodLength (newPeriodLength) = {
426426 let checks = [if (isInAdminList(toString(i.caller)))
427427 then true
428428 else throwErr("caller is not in adminList")]
429429 if ((checks == checks))
430430 then getSetNewPeriodLengthActions(newPeriodLength)
431431 else throw("Strict value is not equal to itself.")
432432 }
433433
434434
435435
436436 @Callable(i)
437437 func setForceStopFlag (stop) = {
438438 let check = [if (isInAdminList(toString(i.caller)))
439439 then true
440440 else throwErr("caller is not in adminList")]
441441 if ((check == check))
442442 then [BooleanEntry(keyForceStop, stop)]
443443 else throw("Strict value is not equal to itself.")
444444 }
445445
446446
447447
448448 @Callable(i)
449449 func getNodeDataREADONLY (nodeAddress) = {
450- let $t01512315187 = getLeasingNodeData(nodeAddress)
451- let currentLease = $t01512315187._1
452- let nextLeased = $t01512315187._2
450+ let $t01513115195 = getLeasingNodeData(nodeAddress)
451+ let currentLease = $t01513115195._1
452+ let nextLeased = $t01513115195._2
453453 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
454454 }
455455
456456
457457
458458 @Callable(i)
459459 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
460- let $t01555715634 = getUserLeasingData(nodeAddress, userAddress)
461- let currentLease = $t01555715634._1
462- let nextLeased = $t01555715634._2
460+ let $t01556515642 = getUserLeasingData(nodeAddress, userAddress)
461+ let currentLease = $t01556515642._1
462+ let nextLeased = $t01556515642._2
463463 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
464464 }
465465
466466
467467
468468 @Callable(i)
469469 func getUserDataREADONLY (userAddress) = {
470- let $t01599716057 = getUserToClaimBalance(userAddress)
471- let toClaim = $t01599716057._1
472- let toUnlock = $t01599716057._2
470+ let $t01600516065 = getUserToClaimBalance(userAddress)
471+ let toClaim = $t01600516065._1
472+ let toUnlock = $t01600516065._2
473473 let userTotalLocked = getUserTotalLocked(userAddress)
474474 $Tuple2(nil, $Tuple6(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height))
475475 }
476476
477477
478478
479479 @Callable(i)
480480 func leaseByAddress (nodeAddress,userAddress) = getStakeFromPaymentActions(nodeAddress, userAddress, i)
481481
482482
483483
484484 @Callable(i)
485485 func lease (nodeAddress) = {
486486 let userAddress = toString(i.caller)
487487 getStakeFromPaymentActions(nodeAddress, userAddress, i)
488488 }
489489
490490
491491
492492 @Callable(i)
493493 func leaseFromLocked (nodeAddress,amount) = {
494494 let userAddress = toString(i.caller)
495495 getStakeActions(nodeAddress, userAddress, amount, i)
496496 }
497497
498498
499499
500500 @Callable(i)
501501 func cancelLease (nodeAddress,amount) = {
502502 let userAddress = toString(i.caller)
503503 getUnstakeActions(nodeAddress, userAddress, amount)
504504 }
505505
506506
507507
508508 @Callable(i)
509509 func claim (amount) = {
510510 let userAddress = toString(i.caller)
511511 getClaimUnlockedActions(userAddress, amount)
512512 }
513513
514514
515515
516516 @Callable(i)
517517 func claimAll () = {
518518 let userAddress = toString(i.caller)
519- let $t01707117131 = getUserToClaimBalance(userAddress)
520- let toClaim = $t01707117131._1
521- let toUnlock = $t01707117131._2
519+ let $t01707917139 = getUserToClaimBalance(userAddress)
520+ let toClaim = $t01707917139._1
521+ let toUnlock = $t01707917139._2
522522 let checks = [if ((toClaim > 0))
523523 then true
524524 else throwErr("nothing to claim")]
525525 if ((checks == checks))
526526 then getClaimUnlockedActions(userAddress, toClaim)
527527 else throw("Strict value is not equal to itself.")
528528 }
529529
530530
531531
532532 @Callable(i)
533533 func voteForTxId (txId) = {
534534 let callerAddressString = toBase58String(i.caller.bytes)
535535 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
536536 let result = [StringEntry(keyAllowedTxId(), txId)]
537537 let allowedTxIdOption = getString(this, keyAllowedTxId())
538538 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
539539 then true
540540 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
541541 then true
542542 else (value(allowedTxIdOption) != txId))
543543 then true
544544 else throwErr((txId + " is already allowed"))]
545545 if ((err == err))
546546 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
547547 else throw("Strict value is not equal to itself.")
548548 }
549549
550550
551551 @Verifier(tx)
552552 func verify () = {
553553 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
554554 let byOwner = if ((size(getAdminsList()) >= QUORUM))
555555 then false
556556 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
557557 if (byAdmins)
558558 then true
559559 else byOwner
560560 }
561561

github/deemru/w8io/169f3d6 
70.89 ms