tx · 24A1mSKMLAyoGHWK9aRJsRp8HChXJF9GBtsXyxM61QGr

3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h:  -0.02300000 Waves

2024.10.15 15:53 [3327965] smart account 3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h > SELF 0.00000000 Waves

{ "type": 13, "id": "24A1mSKMLAyoGHWK9aRJsRp8HChXJF9GBtsXyxM61QGr", "fee": 2300000, "feeAssetId": null, "timestamp": 1728996855836, "version": 1, "sender": "3NCWFHDzdPHZC6636ZkMLNDup9mjpbTLs7h", "senderPublicKey": "3z8Q6Zu3KppVmn6fJJvrLc1Wo3krVHSvfaNcerm82md2", "proofs": [ "4So7VLaPsWT84LyL3UkWJfTwm5xhypEX4uR4DnJB91a2MP7TQYYqQv5DRZCv6jBPHnQTvZs5uhdmWJ5CiokN9QNV" ], "script": "base64:BgJLCAISAwoBARIAEgMKAQQSAwoBBBIDCgEIEgQKAggIEgMKAQgSBAoCCAgSAwoBCBIECgIIARIECgIIARIDCgEBEgASAwoBCBIDCgEIPwAMY29udHJhY3RGaWxlAhFsMm1wX2xlYXNpbmcucmlkZQADU0VQAgJfXwASQkxPQ0tTX0lOX0lOVEVSVkFMAOgHAAZzY2FsZTgAgMLXLwEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAAMa2V5Rm9yY2VTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIJZm9yY2VTdG9wBQNuaWwFA1NFUAAPa2V5Rm9yY2VPdXRTdG9wCQC5CQIJAMwIAgICJXMJAMwIAgIMZm9yY2VPdXRTdG9wBQNuaWwFA1NFUAARa2V5UGVyaW9kT2Zmc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAghvZmZzZXRJZAUDbmlsBQNTRVAAFWtleVBlcmlvZE9mZnNldEhlaWdodAkAuQkCCQDMCAICAiVzCQDMCAICDG9mZnNldEhlaWdodAUDbmlsBQNTRVAAD2tleVBlcmlvZExlbmd0aAkAuQkCCQDMCAICAiVzCQDMCAICDHBlcmlvZExlbmd0aAUDbmlsBQNTRVAADnBlcmlvZE9mZnNldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtleVBlcmlvZE9mZnNldElkAAAADHBlcmlvZExlbmd0aAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9rZXlQZXJpb2RMZW5ndGgAkE4AEnBlcmlvZE9mZnNldEhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRVrZXlQZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAPY3VycmVudFBlcmlvZElkAwMJAGYCBQZoZWlnaHQFEnBlcmlvZE9mZnNldEhlaWdodAkBAiE9AgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEHCQBkAgkAaQIJAGUCBQZoZWlnaHQFEnBlcmlvZE9mZnNldEhlaWdodAUMcGVyaW9kTGVuZ3RoBQ5wZXJpb2RPZmZzZXRJZAkAlgMBCQDMCAIAAAkAzAgCCQBlAgUOcGVyaW9kT2Zmc2V0SWQAAQUDbmlsABNjdXJyZW50UGVyaW9kSGVpZ2h0AwMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQYDCQAAAgUPY3VycmVudFBlcmlvZElkAAAJAGYCBRJwZXJpb2RPZmZzZXRIZWlnaHQFBmhlaWdodAcAAAkAZAIFEnBlcmlvZE9mZnNldEhlaWdodAkAaAIJAGUCBQ9jdXJyZW50UGVyaW9kSWQFDnBlcmlvZE9mZnNldElkBQxwZXJpb2RMZW5ndGgAEG5leHRQZXJpb2RIZWlnaHQDAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BBgMJAAACBQ9jdXJyZW50UGVyaW9kSWQAAAkAZgIFEnBlcmlvZE9mZnNldEhlaWdodAUGaGVpZ2h0BwAACQBkAgUTY3VycmVudFBlcmlvZEhlaWdodAUMcGVyaW9kTGVuZ3RoARJrZXlMZWFzaW5nTm9kZURhdGEBC25vZGVBZGRyZXNzCQC5CQIJAMwIAgICJXMJAMwIAgULbm9kZUFkZHJlc3MFA25pbAUDU0VQARZrZXlVc2VyTGVhc2luZ05vZGVEYXRhAgt1c2VyQWRkcmVzcwtub2RlQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgULbm9kZUFkZHJlc3MJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQAQ5rZXlVc2VyVG9DbGFpbQELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICB3RvQ2xhaW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARJrZXlVc2VyVG90YWxMb2NrZWQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg91c2VyVG90YWxMb2NrZWQJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQAQ9rZXlDbGFpbWVkQmxvY2sBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCAgxjbGFpbWVkQmxvY2sFA25pbAUDU0VQARRrZXlUb3RhbFVuaXRzQ2xhaW1lZAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAICEXRvdGFsVW5pdHNDbGFpbWVkBQNuaWwFA1NFUAEWa2V5Tm9kZUxlYXNpbmdCeUhlaWdodAELbm9kZUFkZHJlc3MEAWgDCQAAAgUScGVyaW9kT2Zmc2V0SGVpZ2h0AP///////////wEAAAUGaGVpZ2h0CQC5CQIJAMwIAgIEJXMlZAkAzAgCBQtub2RlQWRkcmVzcwkAzAgCCQCkAwEFAWgFA25pbAUDU0VQARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0Agtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwQBaAMJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQAABQZoZWlnaHQJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgULbm9kZUFkZHJlc3MJAMwIAgULdXNlckFkZHJlc3MJAMwIAgkApAMBBQFoBQNuaWwFA1NFUAANYXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQprZXlBc3NldElkAgVXQVZFUwAMYXNzZXRJZEJ5dGVzAwkAAAIFDWFzc2V0SWRTdHJpbmcCBVdBVkVTBQR1bml0CQDZBAEFDWFzc2V0SWRTdHJpbmcAC2lzRm9yY2VTdG9wCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtleUZvcmNlU3RvcAcADmlzRm9yY2VPdXRTdG9wCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFD2tleUZvcmNlT3V0U3RvcAcBDmlzVmFsaWRBZGRyZXNzAQdhZGRyZXNzBAckbWF0Y2gwCQCmCAEFB2FkZHJlc3MDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYHAA9BRE1JTl9MSVNUX1NJWkUABQAGUVVPUlVNAAMAEVRYSURfQllURVNfTEVOR1RIACABGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAglhbGxvd1R4SWQJAMwIAgUEdHhJZAUDbmlsBQNTRVABEGtleUZ1bGxBZG1pblZvdGUCBnByZWZpeAxhZG1pbkFkZHJlc3MJALkJAgkAzAgCBQZwcmVmaXgJAMwIAgUMYWRtaW5BZGRyZXNzBQNuaWwFA1NFUAETa2V5QWRtaW5BZGRyZXNzTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhBhZG1pbkFkZHJlc3NMaXN0BQNuaWwFA1NFUAEOa2V5QWxsb3dlZFR4SWQACQC5CQIJAMwIAgICJXMJAMwIAgIEdHhJZAUDbmlsBQNTRVABDGdldEFkbWluVm90ZQIGcHJlZml4BWFkbWluBAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQ1nZXRBZG1pbnNMaXN0AAQHJG1hdGNoMAkAnQgCBQR0aGlzCQETa2V5QWRtaW5BZGRyZXNzTGlzdAADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQC1CQIFAXMFA1NFUAUDbmlsAQ1pc0luQWRtaW5MaXN0AQdhZGRyZXNzCQEPY29udGFpbnNFbGVtZW50AgkBDWdldEFkbWluc0xpc3QABQdhZGRyZXNzARJnZW5Wb3Rlc0tleXNIZWxwZXICAWEMYWRtaW5BZGRyZXNzBAskdDAzOTY4Mzk5MgUBYQQGcmVzdWx0CAULJHQwMzk2ODM5OTICXzEEBnByZWZpeAgFCyR0MDM5NjgzOTkyAl8yCQCUCgIJAM0IAgUGcmVzdWx0CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUMYWRtaW5BZGRyZXNzBQZwcmVmaXgBDGdlblZvdGVzS2V5cwEJa2V5UHJlZml4BAlhZG1pbkxpc3QJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAQLJHQwNDEzOTQyMjMKAAIkbAkBDWdldEFkbWluc0xpc3QACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFCWtleVByZWZpeAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQESZ2VuVm90ZXNLZXlzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQGcmVzdWx0CAULJHQwNDEzOTQyMjMCXzEEBnByZWZpeAgFCyR0MDQxMzk0MjIzAl8yBQZyZXN1bHQBEGNvdW50Vm90ZXNIZWxwZXICBnJlc3VsdAd2b3RlS2V5CQBkAgUGcmVzdWx0CQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAEKY291bnRWb3RlcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY291bnRWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBEGNsZWFyVm90ZXNIZWxwZXICBnJlc3VsdANrZXkJAM0IAgUGcmVzdWx0CQELRGVsZXRlRW50cnkBBQNrZXkBE2dldENsZWFyVm90ZUVudHJpZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNsZWFyVm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAQx2b3RlSU5URVJOQUwEE2NhbGxlckFkZHJlc3NTdHJpbmcJa2V5UHJlZml4CG1pblZvdGVzCnZvdGVSZXN1bHQEB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBBBhZG1pbkN1cnJlbnRWb3RlCQEMZ2V0QWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBANlcnIDCQEBIQEJAQ1pc0luQWRtaW5MaXN0AQUTY2FsbGVyQWRkcmVzc1N0cmluZwkBCHRocm93RXJyAQkArAICCQCsAgICCUFkZHJlc3M6IAUTY2FsbGVyQWRkcmVzc1N0cmluZwISIG5vdCBpbiBBZG1pbiBsaXN0AwkAAAIFEGFkbWluQ3VycmVudFZvdGUAAQkBCHRocm93RXJyAQkArAICBQd2b3RlS2V5AhIgeW91IGFscmVhZHkgdm90ZWQFBHVuaXQDCQAAAgUDZXJyBQNlcnIEBXZvdGVzCQEKY291bnRWb3RlcwEFCWtleVByZWZpeAMJAGcCCQBkAgUFdm90ZXMAAQUIbWluVm90ZXMEEGNsZWFyVm90ZUVudHJpZXMJARNnZXRDbGVhclZvdGVFbnRyaWVzAQUJa2V5UHJlZml4CQDOCAIFEGNsZWFyVm90ZUVudHJpZXMFCnZvdGVSZXN1bHQJAMwIAgkBDEludGVnZXJFbnRyeQIFB3ZvdGVLZXkAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARNnZXRMZWFzaW5nTm9kZUVudHJ5Awtub2RlQWRkcmVzcw1jdXJyZW50TGVhc2VkCm5leHRMZWFzZWQEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgIIJWQlZCVkJWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUNY3VycmVudExlYXNlZAkAzAgCCQCkAwEFEG5leHRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBQpuZXh0TGVhc2VkBQNuaWwFA1NFUAkBC1N0cmluZ0VudHJ5AgkBEmtleUxlYXNpbmdOb2RlRGF0YQEFC25vZGVBZGRyZXNzBQt2YWx1ZVN0cmluZwESZ2V0TGVhc2luZ05vZGVEYXRhAQtub2RlQWRkcmVzcwQYbGVhc2luZ05vZGVEYXRhU3RyaW5nUmF3CQCdCAIFBHRoaXMJARJrZXlMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQHJG1hdGNoMAUYbGVhc2luZ05vZGVEYXRhU3RyaW5nUmF3AwkAAQIFByRtYXRjaDACBlN0cmluZwQCZHMFByRtYXRjaDAECGRhdGFMaXN0CQC1CQIFAmRzBQNTRVAEEW5vZGVDdXJyZW50UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAQQRbm9kZUN1cnJlbnRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAACBA5ub2RlTmV4dFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAMEDm5vZGVOZXh0TGVhc2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QABAMDCQBmAgUObm9kZU5leHRQZXJpb2QFBmhlaWdodAYJAAACBRJwZXJpb2RPZmZzZXRIZWlnaHQA////////////AQkAlAoCBRFub2RlQ3VycmVudExlYXNlZAUObm9kZU5leHRMZWFzZWQJAJQKAgUObm9kZU5leHRMZWFzZWQFDm5vZGVOZXh0TGVhc2VkCQCUCgIAAAAAARNnZXRVc2VyTGVhc2luZ0VudHJ5BAtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcxF1c2VyQ3VycmVudExlYXNlZA51c2VyTmV4dExlYXNlZAQLdmFsdWVTdHJpbmcJALkJAgkAzAgCAgglZCVkJWQlZAkAzAgCCQCkAwEFE2N1cnJlbnRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBRF1c2VyQ3VycmVudExlYXNlZAkAzAgCCQCkAwEFEG5leHRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBQ51c2VyTmV4dExlYXNlZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIJARZrZXlVc2VyTGVhc2luZ05vZGVEYXRhAgULdXNlckFkZHJlc3MFC25vZGVBZGRyZXNzBQt2YWx1ZVN0cmluZwESZ2V0VXNlckxlYXNpbmdEYXRhAgtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwQYbGVhc2luZ1VzZXJEYXRhU3RyaW5nUmF3CQCdCAIFBHRoaXMJARZrZXlVc2VyTGVhc2luZ05vZGVEYXRhAgULdXNlckFkZHJlc3MFC25vZGVBZGRyZXNzBAckbWF0Y2gwBRhsZWFzaW5nVXNlckRhdGFTdHJpbmdSYXcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAJkcwUHJG1hdGNoMAQIZGF0YUxpc3QJALUJAgUCZHMFA1NFUAQRdXNlckN1cnJlbnRQZXJpb2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAABBBF1c2VyQ3VycmVudExlYXNlZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAIEDnVzZXJOZXh0UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAwQOdXNlck5leHRMZWFzZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAAEAwMJAGYCBQ51c2VyTmV4dFBlcmlvZAUGaGVpZ2h0BgkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BCQCUCgIFEXVzZXJDdXJyZW50TGVhc2VkBQ51c2VyTmV4dExlYXNlZAkAlAoCBQ51c2VyTmV4dExlYXNlZAUOdXNlck5leHRMZWFzZWQJAJQKAgAAAAABE2dldFVzZXJUb0NsYWltRW50cnkDC3VzZXJBZGRyZXNzB3RvQ2xhaW0IdG9VbmxvY2sEC3ZhbHVlU3RyaW5nCQC5CQIJAMwIAgIIJWQlZCVkJWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kSGVpZ2h0CQDMCAIJAKQDAQUHdG9DbGFpbQkAzAgCCQCkAwEFEG5leHRQZXJpb2RIZWlnaHQJAMwIAgkApAMBBQh0b1VubG9jawUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIJAQ5rZXlVc2VyVG9DbGFpbQEFC3VzZXJBZGRyZXNzBQt2YWx1ZVN0cmluZwEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQt1c2VyQWRkcmVzcwQYdXNlclRvQ2xhaW1EYXRhU3RyaW5nUmF3CQCdCAIFBHRoaXMJAQ5rZXlVc2VyVG9DbGFpbQEFC3VzZXJBZGRyZXNzBAckbWF0Y2gwBRh1c2VyVG9DbGFpbURhdGFTdHJpbmdSYXcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAJkcwUHJG1hdGNoMAQIZGF0YUxpc3QJALUJAgUCZHMFA1NFUAQNY3VycmVudFBlcmlvZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGRhdGFMaXN0AAEEB3RvQ2xhaW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAACBApuZXh0UGVyaW9kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIZGF0YUxpc3QAAwQIdG9VbmxvY2sJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhkYXRhTGlzdAAEAwMJAGYCBQpuZXh0UGVyaW9kBQZoZWlnaHQGCQAAAgUPY3VycmVudFBlcmlvZElkAAAJAJQKAgUHdG9DbGFpbQUIdG9VbmxvY2sJAJQKAgkAZAIFB3RvQ2xhaW0FCHRvVW5sb2NrAAAJAJQKAgAAAAABF2dldFVzZXJUb3RhbExvY2tlZEVudHJ5Agt1c2VyQWRkcmVzcw91c2VyVG90YWxMb2NrZWQJAQxJbnRlZ2VyRW50cnkCCQESa2V5VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MFD3VzZXJUb3RhbExvY2tlZAESZ2V0VXNlclRvdGFsTG9ja2VkAQt1c2VyQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQESa2V5VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MAAAERZ2V0VW5zdGFrZUFjdGlvbnMDC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzDXVuc3Rha2VBbW91bnQECyR0MDkyNjM5MzM2CQESZ2V0TGVhc2luZ05vZGVEYXRhAQULbm9kZUFkZHJlc3MEEW5vZGVDdXJyZW50TGVhc2VkCAULJHQwOTI2MzkzMzYCXzEEDm5vZGVOZXh0TGVhc2VkCAULJHQwOTI2MzkzMzYCXzIECyR0MDkzNDE5NDI3CQESZ2V0VXNlckxlYXNpbmdEYXRhAgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBBF1c2VyQ3VycmVudExlYXNlZAgFCyR0MDkzNDE5NDI3Al8xBA51c2VyTmV4dExlYXNlZAgFCyR0MDkzNDE5NDI3Al8yBAZjaGVja3MJAMwIAgMJAQEhAQULaXNGb3JjZVN0b3AGCQEIdGhyb3dFcnIBAh1jb250cmFjdCBpcyB0ZW1wb3Jhcnkgc3RvcHBlZAkAzAgCAwkBASEBBQ5pc0ZvcmNlT3V0U3RvcAYJAQh0aHJvd0VycgECHXVuc3Rha2UgaXMgdGVtcG9yYXJ5IGRpc2FibGVkCQDMCAIDCQBmAgUNdW5zdGFrZUFtb3VudAAABgkBCHRocm93RXJyAQIndW5zdGFrZSBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIDCQBnAgUOdXNlck5leHRMZWFzZWQFDXVuc3Rha2VBbW91bnQGCQEIdGhyb3dFcnIBAjl1bnN0YWtlIGFtb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB1c2VyIHN0YWtlZCBhbW91bnQJAMwIAgMJAGcCBQ5ub2RlTmV4dExlYXNlZAUNdW5zdGFrZUFtb3VudAYJAQh0aHJvd0VycgECOXVuc3Rha2UgYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIG5vZGUgc3Rha2VkIGFtb3VudAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULbm9kZUFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIabm9kZSBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULbm9kZUFkZHJlc3MFA25pbAIBIAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBBBuZXdOb2RlTmV4dExlYXNlCQBlAgUObm9kZU5leHRMZWFzZWQFDXVuc3Rha2VBbW91bnQEEW5ld1VzZXJOZXh0TGVhc2VkCQBlAgUOdXNlck5leHRMZWFzZWQFDXVuc3Rha2VBbW91bnQEDSR0MDEwMzExMTAzNzEJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDEwMzExMTAzNzECXzEECHRvVW5sb2NrCAUNJHQwMTAzMTExMDM3MQJfMgQLbmV3VG9VbmxvY2sJAGQCBQh0b1VubG9jawUNdW5zdGFrZUFtb3VudAQPdXNlclRvdGFsTG9ja2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MEEm5ld1VzZXJUb3RhbExvY2tlZAkAZQIFD3VzZXJUb3RhbExvY2tlZAUNdW5zdGFrZUFtb3VudAkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFB3RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwILdXNlckFkZHJlc3MLY2xhaW1BbW91bnQEDSR0MDExMTAwMTExNjAJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDExMTAwMTExNjACXzEECHRvVW5sb2NrCAUNJHQwMTExMDAxMTE2MAJfMgQGY2hlY2tzCQDMCAIDCQEBIQEFC2lzRm9yY2VTdG9wBgkBCHRocm93RXJyAQIdY29udHJhY3QgaXMgdGVtcG9yYXJ5IHN0b3BwZWQJAMwIAgMJAQEhAQUOaXNGb3JjZU91dFN0b3AGCQEIdGhyb3dFcnIBAhtjbGFpbSBpcyB0ZW1wb3JhcnkgZGlzYWJsZWQJAMwIAgMJAGYCBQtjbGFpbUFtb3VudAAABgkBCHRocm93RXJyAQIlY2xhaW0gYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAZwIFB3RvQ2xhaW0FC2NsYWltQW1vdW50BgkBCHRocm93RXJyAQI0Y2xhaW0gYW1vdW50IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHVubG9ja2VkIGFtb3VudAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBApuZXdUb0NsYWltCQBlAgUHdG9DbGFpbQULY2xhaW1BbW91bnQJAMwIAgkBE2dldFVzZXJUb0NsYWltRW50cnkDBQt1c2VyQWRkcmVzcwUKbmV3VG9DbGFpbQUIdG9VbmxvY2sJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQULdXNlckFkZHJlc3MFC2NsYWltQW1vdW50BQxhc3NldElkQnl0ZXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgESZ2V0U3Rha2VGb3JBY3Rpb25zAgt1c2VyQWRkcmVzcwFpBA0kdDAxMTkyNDExOTg0CQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxMTkyNDExOTg0Al8xBAh0b1VubG9jawgFDSR0MDExOTI0MTE5ODQCXzIEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQBnAgABCQCQAwEIBQFpCHBheW1lbnRzBgkBCHRocm93RXJyAQIRbWF4aW11bSAxIHBheW1lbnQJAMwIAgMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMYXNzZXRJZEJ5dGVzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnBheW1lbnQgYXNzZXRJZCBzaG91bGQgYmU6CQDMCAIFDWFzc2V0SWRTdHJpbmcFA25pbAIBIAkAzAgCAwkBDmlzVmFsaWRBZGRyZXNzAQULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIadXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZDoJAMwIAgULdXNlckFkZHJlc3MFA25pbAIBIAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBApuZXdUb0NsYWltCQBkAgUHdG9DbGFpbQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBE2dldFVzZXJUb0NsYWltRW50cnkDBQt1c2VyQWRkcmVzcwUKbmV3VG9DbGFpbQUIdG9VbmxvY2sFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEOY2FsY3VsYXRlQ2xhaW0BC3VzZXJBZGRyZXNzBA9jbGFpbWVkQmxvY2tLZXkJAQ9rZXlDbGFpbWVkQmxvY2sBBQt1c2VyQWRkcmVzcwQMY2xhaW1lZEJsb2NrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD2NsYWltZWRCbG9ja0tleQUGaGVpZ2h0BAxibG9ja3NQYXNzZWQJAGUCBQZoZWlnaHQFDGNsYWltZWRCbG9jawQMYW1vdW50U3Rha2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MECnRvQ2xhaW1Ob3cJAGkCCQBoAgUMYmxvY2tzUGFzc2VkCQBoAgUMYW1vdW50U3Rha2VkBQZzY2FsZTgFEkJMT0NLU19JTl9JTlRFUlZBTAUKdG9DbGFpbU5vdwEHc2V0VXNlcgILdXNlckFkZHJlc3MMY2xhaW1lZEJsb2NrBA9jbGFpbWVkQmxvY2tLZXkJAQ9rZXlDbGFpbWVkQmxvY2sBBQt1c2VyQWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUPY2xhaW1lZEJsb2NrS2V5BQxjbGFpbWVkQmxvY2sFA25pbAEPZ2V0U3Rha2VBY3Rpb25zBAtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcxF1c2VyTGVhc2luZ0Ftb3VudAFpBA0kdDAxMzI4MzEzMzQzCQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxMzI4MzEzMzQzAl8xBAh0b1VubG9jawgFDSR0MDEzMjgzMTMzNDMCXzIEDXBheW1lbnRBbW91bnQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAAAAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAlhdmFpbGFibGUJAGQCCQBkAgUIdG9VbmxvY2sFB3RvQ2xhaW0FDXBheW1lbnRBbW91bnQEBmNoZWNrcwkAzAgCAwkBASEBBQtpc0ZvcmNlU3RvcAYJAQh0aHJvd0VycgECHWNvbnRyYWN0IGlzIHRlbXBvcmFyeSBzdG9wcGVkCQDMCAIDCQBnAgABCQCQAwEIBQFpCHBheW1lbnRzBgkBCHRocm93RXJyAQIRbWF4aW11bSAxIHBheW1lbnQJAMwIAgMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMYXNzZXRJZEJ5dGVzBgkBCHRocm93RXJyAQkAuQkCCQDMCAICGnBheW1lbnQgYXNzZXRJZCBzaG91bGQgYmU6CQDMCAIFDWFzc2V0SWRTdHJpbmcFA25pbAIBIAkAzAgCAwkAZgIFEXVzZXJMZWFzaW5nQW1vdW50AAAGCQEIdGhyb3dFcnIBAh9hbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIDCQBnAgUJYXZhaWxhYmxlBRF1c2VyTGVhc2luZ0Ftb3VudAYJAQh0aHJvd0VycgECO2Ftb3VudCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCAocGF5bWVudCArIGF2YWlsYWJsZSkgYW1vdW50CQDMCAIDCQBnAgURdXNlckxlYXNpbmdBbW91bnQFDXBheW1lbnRBbW91bnQGCQACAQIwYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIG9yIGVxdWFsIHBheW1lbnQgYW1vdW50CQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQtub2RlQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhpub2RlIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQtub2RlQWRkcmVzcwUDbmlsAgEgCQDMCAIDCQEOaXNWYWxpZEFkZHJlc3MBBQt1c2VyQWRkcmVzcwYJAQh0aHJvd0VycgEJALkJAgkAzAgCAhp1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkOgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsAgEgBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDSR0MDE0NDE0MTQ0ODcJARJnZXRMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQRbm9kZUN1cnJlbnRMZWFzZWQIBQ0kdDAxNDQxNDE0NDg3Al8xBA5ub2RlTmV4dExlYXNlZAgFDSR0MDE0NDE0MTQ0ODcCXzIEEG5ld05vZGVOZXh0TGVhc2UJAGQCBQ5ub2RlTmV4dExlYXNlZAURdXNlckxlYXNpbmdBbW91bnQEDSR0MDE0NTU1MTQ2NDEJARJnZXRVc2VyTGVhc2luZ0RhdGECBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MEEXVzZXJDdXJyZW50TGVhc2VkCAUNJHQwMTQ1NTUxNDY0MQJfMQQOdXNlck5leHRMZWFzZWQIBQ0kdDAxNDU1NTE0NjQxAl8yBBFuZXdVc2VyTmV4dExlYXNlZAkAZAIFDnVzZXJOZXh0TGVhc2VkBRF1c2VyTGVhc2luZ0Ftb3VudAQSZnJvbVVubG9ja2VkQW1vdW50CQBlAgURdXNlckxlYXNpbmdBbW91bnQFDXBheW1lbnRBbW91bnQEC25ld1RvVW5sb2NrCQCWAwEJAMwIAgAACQDMCAIJAGUCBQh0b1VubG9jawUSZnJvbVVubG9ja2VkQW1vdW50BQNuaWwECm5ld1RvQ2xhaW0JAJcDAQkAzAgCBQd0b0NsYWltCQDMCAIJAGQCBQd0b0NsYWltCQBlAgUIdG9VbmxvY2sFEmZyb21VbmxvY2tlZEFtb3VudAUDbmlsBA91c2VyVG90YWxMb2NrZWQJARJnZXRVc2VyVG90YWxMb2NrZWQBBQt1c2VyQWRkcmVzcwQSbmV3VXNlclRvdGFsTG9ja2VkCQBkAgUPdXNlclRvdGFsTG9ja2VkBRF1c2VyTGVhc2luZ0Ftb3VudAkAzAgCCQETZ2V0TGVhc2luZ05vZGVFbnRyeQMFC25vZGVBZGRyZXNzBRFub2RlQ3VycmVudExlYXNlZAUQbmV3Tm9kZU5leHRMZWFzZQkAzAgCCQETZ2V0VXNlckxlYXNpbmdFbnRyeQQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwURdXNlckN1cnJlbnRMZWFzZWQFEW5ld1VzZXJOZXh0TGVhc2VkCQDMCAIJARNnZXRVc2VyVG9DbGFpbUVudHJ5AwULdXNlckFkZHJlc3MFCm5ld1RvQ2xhaW0FC25ld1RvVW5sb2NrCQDMCAIJARdnZXRVc2VyVG90YWxMb2NrZWRFbnRyeQIFC3VzZXJBZGRyZXNzBRJuZXdVc2VyVG90YWxMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOb2RlTGVhc2luZ0J5SGVpZ2h0AQULbm9kZUFkZHJlc3MFEG5ld05vZGVOZXh0TGVhc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGVhc2luZ0J5SGVpZ2h0AgULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBRFuZXdVc2VyTmV4dExlYXNlZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARpnZXRTdGFrZUZyb21QYXltZW50QWN0aW9ucwMLbm9kZUFkZHJlc3MLdXNlckFkZHJlc3MBaQQGY2hlY2tzCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIgcGF5bWVudCBzaXplIHNob3VsZCBiZSBleGFjdGx5IDEFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBD2dldFN0YWtlQWN0aW9ucwQFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFAWkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BHGdldFNldE5ld1BlcmlvZExlbmd0aEFjdGlvbnMBD25ld1BlcmlvZExlbmd0aAQFY2hlY2sJAMwIAgMJAGYCBQ9uZXdQZXJpb2RMZW5ndGgAAAYJAQh0aHJvd0VycgECJnBlcmlvZCBsZW5ndGggc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrAwkAAAIFEnBlcmlvZE9mZnNldEhlaWdodAD///////////8BCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlQZXJpb2RMZW5ndGgFD25ld1BlcmlvZExlbmd0aAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0BQZoZWlnaHQFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa2V5UGVyaW9kT2Zmc2V0SWQJAGQCBQ9jdXJyZW50UGVyaW9kSWQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5UGVyaW9kT2Zmc2V0SGVpZ2h0BRBuZXh0UGVyaW9kSGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlQZXJpb2RMZW5ndGgFD25ld1BlcmlvZExlbmd0aAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuDwFpARJzZXROZXdQZXJpb2RMZW5ndGgBD25ld1BlcmlvZExlbmd0aAQGY2hlY2tzCQDMCAIDCQENaXNJbkFkbWluTGlzdAEJAKUIAQgFAWkGY2FsbGVyBgkBCHRocm93RXJyAQIaY2FsbGVyIGlzIG5vdCBpbiBhZG1pbkxpc3QFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkBHGdldFNldE5ld1BlcmlvZExlbmd0aEFjdGlvbnMBBQ9uZXdQZXJpb2RMZW5ndGgJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJY2xhaW1Vbml0AAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAp0b0NsYWltTm93CQEOY2FsY3VsYXRlQ2xhaW0BBQt1c2VyQWRkcmVzcwQQdG90YWxVbml0Q2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEUa2V5VG90YWxVbml0c0NsYWltZWQBBQt1c2VyQWRkcmVzcwAABA10b3RhbEwyU3Rha2VkCQESZ2V0VXNlclRvdGFsTG9ja2VkAQULdXNlckFkZHJlc3MEBWNoZWNrCQDMCAIDCQBnAgUNdG90YWxMMlN0YWtlZAkAZAIFEHRvdGFsVW5pdENsYWltZWQFCnRvQ2xhaW1Ob3cGCQEIdGhyb3dFcnIBAhxDYW4ndCBjbGFpbSBtb3JlIHRoYW4gc3Rha2VkBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBA9jbGFpbWVkQmxvY2tLZXkJAQ9rZXlDbGFpbWVkQmxvY2sBBQt1c2VyQWRkcmVzcwQHYWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgUPY2xhaW1lZEJsb2NrS2V5BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlUb3RhbFVuaXRzQ2xhaW1lZAEFC3VzZXJBZGRyZXNzCQBkAgUQdG90YWxVbml0Q2xhaW1lZAUKdG9DbGFpbU5vdwUDbmlsBA10cmFuc2ZlclVuaXRzCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCnRvQ2xhaW1Ob3cFBHVuaXQJAM4IAgUHYWN0aW9ucwkAzAgCBQ10cmFuc2ZlclVuaXRzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQc2V0Rm9yY2VTdG9wRmxhZwEEc3RvcAQFY2hlY2sJAMwIAgMJAQ1pc0luQWRtaW5MaXN0AQkApQgBCAUBaQZjYWxsZXIGCQEIdGhyb3dFcnIBAhpjYWxsZXIgaXMgbm90IGluIGFkbWluTGlzdAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa2V5Rm9yY2VTdG9wBQRzdG9wBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETc2V0Rm9yY2VPdXRTdG9wRmxhZwEEc3RvcAQFY2hlY2sJAMwIAgMJAQ1pc0luQWRtaW5MaXN0AQkApQgBCAUBaQZjYWxsZXIGCQEIdGhyb3dFcnIBAhpjYWxsZXIgaXMgbm90IGluIGFkbWluTGlzdAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMQm9vbGVhbkVudHJ5AgUPa2V5Rm9yY2VPdXRTdG9wBQRzdG9wBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETZ2V0Tm9kZURhdGFSRUFET05MWQELbm9kZUFkZHJlc3MEDSR0MDE4MDM4MTgxMDIJARJnZXRMZWFzaW5nTm9kZURhdGEBBQtub2RlQWRkcmVzcwQMY3VycmVudExlYXNlCAUNJHQwMTgwMzgxODEwMgJfMQQKbmV4dExlYXNlZAgFDSR0MDE4MDM4MTgxMDICXzIJAJQKAgUDbmlsCQCXCgUFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDGN1cnJlbnRMZWFzZQUQbmV4dFBlcmlvZEhlaWdodAUKbmV4dExlYXNlZAUGaGVpZ2h0AWkBGmdldFVzZXJMZWFzaW5nRGF0YVJFQURPTkxZAgtub2RlQWRkcmVzcwt1c2VyQWRkcmVzcwQNJHQwMTg0NzIxODU0OQkBEmdldFVzZXJMZWFzaW5nRGF0YQIFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwQMY3VycmVudExlYXNlCAUNJHQwMTg0NzIxODU0OQJfMQQKbmV4dExlYXNlZAgFDSR0MDE4NDcyMTg1NDkCXzIJAJQKAgUDbmlsCQCXCgUFE2N1cnJlbnRQZXJpb2RIZWlnaHQFDGN1cnJlbnRMZWFzZQUQbmV4dFBlcmlvZEhlaWdodAUKbmV4dExlYXNlZAUGaGVpZ2h0AWkBE2dldFVzZXJEYXRhUkVBRE9OTFkBC3VzZXJBZGRyZXNzBA0kdDAxODkxMjE4OTcyCQEVZ2V0VXNlclRvQ2xhaW1CYWxhbmNlAQULdXNlckFkZHJlc3MEB3RvQ2xhaW0IBQ0kdDAxODkxMjE4OTcyAl8xBAh0b1VubG9jawgFDSR0MDE4OTEyMTg5NzICXzIED3VzZXJUb3RhbExvY2tlZAkBEmdldFVzZXJUb3RhbExvY2tlZAEFC3VzZXJBZGRyZXNzCQCUCgIFA25pbAkAmAoGBRNjdXJyZW50UGVyaW9kSGVpZ2h0BQd0b0NsYWltBRBuZXh0UGVyaW9kSGVpZ2h0BQh0b1VubG9jawUPdXNlclRvdGFsTG9ja2VkBQZoZWlnaHQBaQEObGVhc2VCeUFkZHJlc3MCC25vZGVBZGRyZXNzC3VzZXJBZGRyZXNzCQEaZ2V0U3Rha2VGcm9tUGF5bWVudEFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFAWkBaQEFbGVhc2UBC25vZGVBZGRyZXNzBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARpnZXRTdGFrZUZyb21QYXltZW50QWN0aW9ucwMFC25vZGVBZGRyZXNzBQt1c2VyQWRkcmVzcwUBaQFpAQ9sZWFzZUZyb21Mb2NrZWQCC25vZGVBZGRyZXNzBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEPZ2V0U3Rha2VBY3Rpb25zBAULbm9kZUFkZHJlc3MFC3VzZXJBZGRyZXNzBQZhbW91bnQFAWkBaQELY2FuY2VsTGVhc2UCC25vZGVBZGRyZXNzBmFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQERZ2V0VW5zdGFrZUFjdGlvbnMDBQtub2RlQWRkcmVzcwULdXNlckFkZHJlc3MFBmFtb3VudAFpAQVjbGFpbQEGYW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARdnZXRDbGFpbVVubG9ja2VkQWN0aW9ucwIFC3VzZXJBZGRyZXNzBQZhbW91bnQBaQEIY2xhaW1BbGwABAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDSR0MDE5OTg2MjAwNDYJARVnZXRVc2VyVG9DbGFpbUJhbGFuY2UBBQt1c2VyQWRkcmVzcwQHdG9DbGFpbQgFDSR0MDE5OTg2MjAwNDYCXzEECHRvVW5sb2NrCAUNJHQwMTk5ODYyMDA0NgJfMgQGY2hlY2tzCQDMCAIDCQBmAgUHdG9DbGFpbQAABgkBCHRocm93RXJyAQIQbm90aGluZyB0byBjbGFpbQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEXZ2V0Q2xhaW1VbmxvY2tlZEFjdGlvbnMCBQt1c2VyQWRkcmVzcwUHdG9DbGFpbQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhzdGFrZUZvcgELdXNlckFkZHJlc3MJARJnZXRTdGFrZUZvckFjdGlvbnMCBQt1c2VyQWRkcmVzcwUBaQFpAQt2b3RlRm9yVHhJZAEEdHhJZAQTY2FsbGVyQWRkcmVzc1N0cmluZwkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBAlrZXlQcmVmaXgJARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBQR0eElkBAZyZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUFsbG93ZWRUeElkAAUEdHhJZAUDbmlsBBFhbGxvd2VkVHhJZE9wdGlvbgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQABANlcnIJAMwIAgMJAAACCQDIAQEJANkEAQUEdHhJZAURVFhJRF9CWVRFU19MRU5HVEgGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEiBpcyBub3QgdmFsaWQgdHhJZAkAzAgCAwMJAAACBRFhbGxvd2VkVHhJZE9wdGlvbgUEdW5pdAYJAQIhPQIJAQV2YWx1ZQEFEWFsbG93ZWRUeElkT3B0aW9uBQR0eElkBgkBCHRocm93RXJyAQkArAICBQR0eElkAhMgaXMgYWxyZWFkeSBhbGxvd2VkBQNuaWwDCQAAAgUDZXJyBQNlcnIJAQx2b3RlSU5URVJOQUwEBRNjYWxsZXJBZGRyZXNzU3RyaW5nBQlrZXlQcmVmaXgFBlFVT1JVTQUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQIYnlBZG1pbnMJAAACCAUCdHgCaWQJANkEAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQAAgAEB2J5T3duZXIDCQBnAgkAkAMBCQENZ2V0QWRtaW5zTGlzdAAFBlFVT1JVTQcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkDBQhieUFkbWlucwYFB2J5T3duZXK7VPFg", "chainId": 84, "height": 3327965, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FoDgahN94S9LP76DLx2JtwEovakdu2j9T8RJbqA5BtK7 Next: none Diff:
OldNewDifferences
44 let contractFile = "l2mp_leasing.ride"
55
66 let SEP = "__"
7+
8+let BLOCKS_IN_INTERVAL = 1000
9+
10+let scale8 = 100000000
711
812 func throwErr (msg) = throw(((contractFile + ": ") + msg))
913
5862
5963
6064 func keyUserTotalLocked (userAddress) = makeString(["%s%s", "userTotalLocked", userAddress], SEP)
65+
66+
67+func keyClaimedBlock (userAddress) = makeString(["%s%s", userAddress, "claimedBlock"], SEP)
68+
69+
70+func keyTotalUnitsClaimed (userAddress) = makeString(["%s%s", userAddress, "totalUnitsClaimed"], SEP)
6171
6272
6373 func keyNodeLeasingByHeight (nodeAddress) = {
130140
131141
132142 func genVotesKeysHelper (a,adminAddress) = {
133- let $t036963720 = a
134- let result = $t036963720._1
135- let prefix = $t036963720._2
143+ let $t039683992 = a
144+ let result = $t039683992._1
145+ let prefix = $t039683992._2
136146 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
137147 }
138148
139149
140150 func genVotesKeys (keyPrefix) = {
141151 let adminList = keyAdminAddressList()
142- let $t038673951 = {
152+ let $t041394223 = {
143153 let $l = getAdminsList()
144154 let $s = size($l)
145155 let $acc0 = $Tuple2(nil, keyPrefix)
153163
154164 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
155165 }
156- let result = $t038673951._1
157- let prefix = $t038673951._2
166+ let result = $t041394223._1
167+ let prefix = $t041394223._2
158168 result
159169 }
160170
306316
307317
308318 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
319+ let $t092639336 = getLeasingNodeData(nodeAddress)
320+ let nodeCurrentLeased = $t092639336._1
321+ let nodeNextLeased = $t092639336._2
322+ let $t093419427 = getUserLeasingData(nodeAddress, userAddress)
323+ let userCurrentLeased = $t093419427._1
324+ let userNextLeased = $t093419427._2
315325 let checks = [if (!(isForceStop))
316326 then true
317327 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
331341 then {
332342 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
333343 let newUserNextLeased = (userNextLeased - unstakeAmount)
334- let $t01003910099 = getUserToClaimBalance(userAddress)
335- let toClaim = $t01003910099._1
336- let toUnlock = $t01003910099._2
344+ let $t01031110371 = getUserToClaimBalance(userAddress)
345+ let toClaim = $t01031110371._1
346+ let toUnlock = $t01031110371._2
337347 let newToUnlock = (toUnlock + unstakeAmount)
338348 let userTotalLocked = getUserTotalLocked(userAddress)
339349 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
344354
345355
346356 func getClaimUnlockedActions (userAddress,claimAmount) = {
347- let $t01082810888 = getUserToClaimBalance(userAddress)
348- let toClaim = $t01082810888._1
349- let toUnlock = $t01082810888._2
357+ let $t01110011160 = getUserToClaimBalance(userAddress)
358+ let toClaim = $t01110011160._1
359+ let toUnlock = $t01110011160._2
350360 let checks = [if (!(isForceStop))
351361 then true
352362 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
368378
369379
370380 func getStakeForActions (userAddress,i) = {
371- let $t01165211712 = getUserToClaimBalance(userAddress)
372- let toClaim = $t01165211712._1
373- let toUnlock = $t01165211712._2
381+ let $t01192411984 = getUserToClaimBalance(userAddress)
382+ let toClaim = $t01192411984._1
383+ let toUnlock = $t01192411984._2
374384 let checks = [if (!(isForceStop))
375385 then true
376386 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
391401 }
392402
393403
404+func calculateClaim (userAddress) = {
405+ let claimedBlockKey = keyClaimedBlock(userAddress)
406+ let claimedBlock = valueOrElse(getInteger(this, claimedBlockKey), height)
407+ let blocksPassed = (height - claimedBlock)
408+ let amountStaked = getUserTotalLocked(userAddress)
409+ let toClaimNow = ((blocksPassed * (amountStaked * scale8)) / BLOCKS_IN_INTERVAL)
410+ toClaimNow
411+ }
412+
413+
414+func setUser (userAddress,claimedBlock) = {
415+ let claimedBlockKey = keyClaimedBlock(userAddress)
416+[IntegerEntry(claimedBlockKey, claimedBlock)]
417+ }
418+
419+
394420 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
395- let $t01244012500 = getUserToClaimBalance(userAddress)
396- let toClaim = $t01244012500._1
397- let toUnlock = $t01244012500._2
421+ let $t01328313343 = getUserToClaimBalance(userAddress)
422+ let toClaim = $t01328313343._1
423+ let toUnlock = $t01328313343._2
398424 let paymentAmount = if ((size(i.payments) == 0))
399425 then 0
400426 else i.payments[0].amount
420446 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
421447 if ((checks == checks))
422448 then {
423- let $t01357113644 = getLeasingNodeData(nodeAddress)
424- let nodeCurrentLeased = $t01357113644._1
425- let nodeNextLeased = $t01357113644._2
449+ let $t01441414487 = getLeasingNodeData(nodeAddress)
450+ let nodeCurrentLeased = $t01441414487._1
451+ let nodeNextLeased = $t01441414487._2
426452 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
427- let $t01371213798 = getUserLeasingData(nodeAddress, userAddress)
428- let userCurrentLeased = $t01371213798._1
429- let userNextLeased = $t01371213798._2
453+ let $t01455514641 = getUserLeasingData(nodeAddress, userAddress)
454+ let userCurrentLeased = $t01455514641._1
455+ let userNextLeased = $t01455514641._2
430456 let newUserNextLeased = (userNextLeased + userLeasingAmount)
431457 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
432458 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
474500
475501
476502 @Callable(i)
503+func claimUnit () = {
504+ let userAddress = toString(i.caller)
505+ let toClaimNow = calculateClaim(userAddress)
506+ let totalUnitClaimed = valueOrElse(getInteger(this, keyTotalUnitsClaimed(userAddress)), 0)
507+ let totalL2Staked = getUserTotalLocked(userAddress)
508+ let check = [if ((totalL2Staked >= (totalUnitClaimed + toClaimNow)))
509+ then true
510+ else throwErr("Can't claim more than staked")]
511+ if ((check == check))
512+ then {
513+ let claimedBlockKey = keyClaimedBlock(userAddress)
514+ let actions = [IntegerEntry(claimedBlockKey, height), IntegerEntry(keyTotalUnitsClaimed(userAddress), (totalUnitClaimed + toClaimNow))]
515+ let transferUnits = ScriptTransfer(i.caller, toClaimNow, unit)
516+ (actions ++ [transferUnits])
517+ }
518+ else throw("Strict value is not equal to itself.")
519+ }
520+
521+
522+
523+@Callable(i)
477524 func setForceStopFlag (stop) = {
478525 let check = [if (isInAdminList(toString(i.caller)))
479526 then true
499546
500547 @Callable(i)
501548 func getNodeDataREADONLY (nodeAddress) = {
502- let $t01647116535 = getLeasingNodeData(nodeAddress)
503- let currentLease = $t01647116535._1
504- let nextLeased = $t01647116535._2
549+ let $t01803818102 = getLeasingNodeData(nodeAddress)
550+ let currentLease = $t01803818102._1
551+ let nextLeased = $t01803818102._2
505552 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
506553 }
507554
509556
510557 @Callable(i)
511558 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
512- let $t01690516982 = getUserLeasingData(nodeAddress, userAddress)
513- let currentLease = $t01690516982._1
514- let nextLeased = $t01690516982._2
559+ let $t01847218549 = getUserLeasingData(nodeAddress, userAddress)
560+ let currentLease = $t01847218549._1
561+ let nextLeased = $t01847218549._2
515562 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
516563 }
517564
519566
520567 @Callable(i)
521568 func getUserDataREADONLY (userAddress) = {
522- let $t01734517405 = getUserToClaimBalance(userAddress)
523- let toClaim = $t01734517405._1
524- let toUnlock = $t01734517405._2
569+ let $t01891218972 = getUserToClaimBalance(userAddress)
570+ let toClaim = $t01891218972._1
571+ let toUnlock = $t01891218972._2
525572 let userTotalLocked = getUserTotalLocked(userAddress)
526573 $Tuple2(nil, $Tuple6(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height))
527574 }
568615 @Callable(i)
569616 func claimAll () = {
570617 let userAddress = toString(i.caller)
571- let $t01841918479 = getUserToClaimBalance(userAddress)
572- let toClaim = $t01841918479._1
573- let toUnlock = $t01841918479._2
618+ let $t01998620046 = getUserToClaimBalance(userAddress)
619+ let toClaim = $t01998620046._1
620+ let toUnlock = $t01998620046._2
574621 let checks = [if ((toClaim > 0))
575622 then true
576623 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 = "__"
7+
8+let BLOCKS_IN_INTERVAL = 1000
9+
10+let scale8 = 100000000
711
812 func throwErr (msg) = throw(((contractFile + ": ") + msg))
913
1014
1115 let keyAssetId = makeString(["%s", "assetId"], SEP)
1216
1317 let keyForceStop = makeString(["%s", "forceStop"], SEP)
1418
1519 let keyForceOutStop = makeString(["%s", "forceOutStop"], SEP)
1620
1721 let keyPeriodOffsetId = makeString(["%s", "offsetId"], SEP)
1822
1923 let keyPeriodOffsetHeight = makeString(["%s", "offsetHeight"], SEP)
2024
2125 let keyPeriodLength = makeString(["%s", "periodLength"], SEP)
2226
2327 let periodOffsetId = valueOrElse(getInteger(this, keyPeriodOffsetId), 0)
2428
2529 let periodLength = valueOrElse(getInteger(this, keyPeriodLength), 10000)
2630
2731 let periodOffsetHeight = valueOrElse(getInteger(this, keyPeriodOffsetHeight), -1)
2832
2933 let currentPeriodId = if (if ((height > periodOffsetHeight))
3034 then (periodOffsetHeight != -1)
3135 else false)
3236 then (((height - periodOffsetHeight) / periodLength) + periodOffsetId)
3337 else max([0, (periodOffsetId - 1)])
3438
3539 let currentPeriodHeight = if (if ((periodOffsetHeight == -1))
3640 then true
3741 else if ((currentPeriodId == 0))
3842 then (periodOffsetHeight > height)
3943 else false)
4044 then 0
4145 else (periodOffsetHeight + ((currentPeriodId - periodOffsetId) * periodLength))
4246
4347 let nextPeriodHeight = if (if ((periodOffsetHeight == -1))
4448 then true
4549 else if ((currentPeriodId == 0))
4650 then (periodOffsetHeight > height)
4751 else false)
4852 then 0
4953 else (currentPeriodHeight + periodLength)
5054
5155 func keyLeasingNodeData (nodeAddress) = makeString(["%s", nodeAddress], SEP)
5256
5357
5458 func keyUserLeasingNodeData (userAddress,nodeAddress) = makeString(["%s%s", nodeAddress, userAddress], SEP)
5559
5660
5761 func keyUserToClaim (userAddress) = makeString(["%s%s", "toClaim", userAddress], SEP)
5862
5963
6064 func keyUserTotalLocked (userAddress) = makeString(["%s%s", "userTotalLocked", userAddress], SEP)
65+
66+
67+func keyClaimedBlock (userAddress) = makeString(["%s%s", userAddress, "claimedBlock"], SEP)
68+
69+
70+func keyTotalUnitsClaimed (userAddress) = makeString(["%s%s", userAddress, "totalUnitsClaimed"], SEP)
6171
6272
6373 func keyNodeLeasingByHeight (nodeAddress) = {
6474 let h = if ((periodOffsetHeight == -1))
6575 then 0
6676 else height
6777 makeString(["%s%d", nodeAddress, toString(h)], SEP)
6878 }
6979
7080
7181 func keyUserLeasingByHeight (nodeAddress,userAddress) = {
7282 let h = if ((periodOffsetHeight == -1))
7383 then 0
7484 else height
7585 makeString(["%s%s%d", nodeAddress, userAddress, toString(h)], SEP)
7686 }
7787
7888
7989 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
8090
8191 let assetIdBytes = if ((assetIdString == "WAVES"))
8292 then unit
8393 else fromBase58String(assetIdString)
8494
8595 let isForceStop = valueOrElse(getBoolean(this, keyForceStop), false)
8696
8797 let isForceOutStop = valueOrElse(getBoolean(this, keyForceOutStop), false)
8898
8999 func isValidAddress (address) = match addressFromString(address) {
90100 case a: Address =>
91101 true
92102 case _ =>
93103 false
94104 }
95105
96106
97107 let ADMIN_LIST_SIZE = 5
98108
99109 let QUORUM = 3
100110
101111 let TXID_BYTES_LENGTH = 32
102112
103113 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
104114
105115
106116 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
107117
108118
109119 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
110120
111121
112122 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
113123
114124
115125 func getAdminVote (prefix,admin) = {
116126 let voteKey = keyFullAdminVote(prefix, admin)
117127 valueOrElse(getInteger(voteKey), 0)
118128 }
119129
120130
121131 func getAdminsList () = match getString(this, keyAdminAddressList()) {
122132 case s: String =>
123133 split(s, SEP)
124134 case _ =>
125135 nil
126136 }
127137
128138
129139 func isInAdminList (address) = containsElement(getAdminsList(), address)
130140
131141
132142 func genVotesKeysHelper (a,adminAddress) = {
133- let $t036963720 = a
134- let result = $t036963720._1
135- let prefix = $t036963720._2
143+ let $t039683992 = a
144+ let result = $t039683992._1
145+ let prefix = $t039683992._2
136146 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
137147 }
138148
139149
140150 func genVotesKeys (keyPrefix) = {
141151 let adminList = keyAdminAddressList()
142- let $t038673951 = {
152+ let $t041394223 = {
143153 let $l = getAdminsList()
144154 let $s = size($l)
145155 let $acc0 = $Tuple2(nil, keyPrefix)
146156 func $f0_1 ($a,$i) = if (($i >= $s))
147157 then $a
148158 else genVotesKeysHelper($a, $l[$i])
149159
150160 func $f0_2 ($a,$i) = if (($i >= $s))
151161 then $a
152162 else throw("List size exceeds 5")
153163
154164 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
155165 }
156- let result = $t038673951._1
157- let prefix = $t038673951._2
166+ let result = $t041394223._1
167+ let prefix = $t041394223._2
158168 result
159169 }
160170
161171
162172 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
163173
164174
165175 func countVotes (prefix) = {
166176 let votes = genVotesKeys(prefix)
167177 let $l = votes
168178 let $s = size($l)
169179 let $acc0 = 0
170180 func $f0_1 ($a,$i) = if (($i >= $s))
171181 then $a
172182 else countVotesHelper($a, $l[$i])
173183
174184 func $f0_2 ($a,$i) = if (($i >= $s))
175185 then $a
176186 else throw("List size exceeds 5")
177187
178188 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
179189 }
180190
181191
182192 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
183193
184194
185195 func getClearVoteEntries (prefix) = {
186196 let votes = genVotesKeys(prefix)
187197 let $l = votes
188198 let $s = size($l)
189199 let $acc0 = nil
190200 func $f0_1 ($a,$i) = if (($i >= $s))
191201 then $a
192202 else clearVotesHelper($a, $l[$i])
193203
194204 func $f0_2 ($a,$i) = if (($i >= $s))
195205 then $a
196206 else throw("List size exceeds 5")
197207
198208 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
199209 }
200210
201211
202212 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
203213 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
204214 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
205215 let err = if (!(isInAdminList(callerAddressString)))
206216 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
207217 else if ((adminCurrentVote == 1))
208218 then throwErr((voteKey + " you already voted"))
209219 else unit
210220 if ((err == err))
211221 then {
212222 let votes = countVotes(keyPrefix)
213223 if (((votes + 1) >= minVotes))
214224 then {
215225 let clearVoteEntries = getClearVoteEntries(keyPrefix)
216226 (clearVoteEntries ++ voteResult)
217227 }
218228 else [IntegerEntry(voteKey, 1)]
219229 }
220230 else throw("Strict value is not equal to itself.")
221231 }
222232
223233
224234 func getLeasingNodeEntry (nodeAddress,currentLeased,nextLeased) = {
225235 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(currentLeased), toString(nextPeriodHeight), toString(nextLeased)], SEP)
226236 StringEntry(keyLeasingNodeData(nodeAddress), valueString)
227237 }
228238
229239
230240 func getLeasingNodeData (nodeAddress) = {
231241 let leasingNodeDataStringRaw = getString(this, keyLeasingNodeData(nodeAddress))
232242 match leasingNodeDataStringRaw {
233243 case ds: String =>
234244 let dataList = split(ds, SEP)
235245 let nodeCurrentPeriod = parseIntValue(dataList[1])
236246 let nodeCurrentLeased = parseIntValue(dataList[2])
237247 let nodeNextPeriod = parseIntValue(dataList[3])
238248 let nodeNextLeased = parseIntValue(dataList[4])
239249 if (if ((nodeNextPeriod > height))
240250 then true
241251 else (periodOffsetHeight == -1))
242252 then $Tuple2(nodeCurrentLeased, nodeNextLeased)
243253 else $Tuple2(nodeNextLeased, nodeNextLeased)
244254 case _ =>
245255 $Tuple2(0, 0)
246256 }
247257 }
248258
249259
250260 func getUserLeasingEntry (nodeAddress,userAddress,userCurrentLeased,userNextLeased) = {
251261 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(userCurrentLeased), toString(nextPeriodHeight), toString(userNextLeased)], SEP)
252262 StringEntry(keyUserLeasingNodeData(userAddress, nodeAddress), valueString)
253263 }
254264
255265
256266 func getUserLeasingData (nodeAddress,userAddress) = {
257267 let leasingUserDataStringRaw = getString(this, keyUserLeasingNodeData(userAddress, nodeAddress))
258268 match leasingUserDataStringRaw {
259269 case ds: String =>
260270 let dataList = split(ds, SEP)
261271 let userCurrentPeriod = parseIntValue(dataList[1])
262272 let userCurrentLeased = parseIntValue(dataList[2])
263273 let userNextPeriod = parseIntValue(dataList[3])
264274 let userNextLeased = parseIntValue(dataList[4])
265275 if (if ((userNextPeriod > height))
266276 then true
267277 else (periodOffsetHeight == -1))
268278 then $Tuple2(userCurrentLeased, userNextLeased)
269279 else $Tuple2(userNextLeased, userNextLeased)
270280 case _ =>
271281 $Tuple2(0, 0)
272282 }
273283 }
274284
275285
276286 func getUserToClaimEntry (userAddress,toClaim,toUnlock) = {
277287 let valueString = makeString(["%d%d%d%d", toString(currentPeriodHeight), toString(toClaim), toString(nextPeriodHeight), toString(toUnlock)], SEP)
278288 StringEntry(keyUserToClaim(userAddress), valueString)
279289 }
280290
281291
282292 func getUserToClaimBalance (userAddress) = {
283293 let userToClaimDataStringRaw = getString(this, keyUserToClaim(userAddress))
284294 match userToClaimDataStringRaw {
285295 case ds: String =>
286296 let dataList = split(ds, SEP)
287297 let currentPeriod = parseIntValue(dataList[1])
288298 let toClaim = parseIntValue(dataList[2])
289299 let nextPeriod = parseIntValue(dataList[3])
290300 let toUnlock = parseIntValue(dataList[4])
291301 if (if ((nextPeriod > height))
292302 then true
293303 else (currentPeriodId == 0))
294304 then $Tuple2(toClaim, toUnlock)
295305 else $Tuple2((toClaim + toUnlock), 0)
296306 case _ =>
297307 $Tuple2(0, 0)
298308 }
299309 }
300310
301311
302312 func getUserTotalLockedEntry (userAddress,userTotalLocked) = IntegerEntry(keyUserTotalLocked(userAddress), userTotalLocked)
303313
304314
305315 func getUserTotalLocked (userAddress) = valueOrElse(getInteger(this, keyUserTotalLocked(userAddress)), 0)
306316
307317
308318 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
319+ let $t092639336 = getLeasingNodeData(nodeAddress)
320+ let nodeCurrentLeased = $t092639336._1
321+ let nodeNextLeased = $t092639336._2
322+ let $t093419427 = getUserLeasingData(nodeAddress, userAddress)
323+ let userCurrentLeased = $t093419427._1
324+ let userNextLeased = $t093419427._2
315325 let checks = [if (!(isForceStop))
316326 then true
317327 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
318328 then true
319329 else throwErr("unstake is temporary disabled"), if ((unstakeAmount > 0))
320330 then true
321331 else throwErr("unstake amount should be greater than 0"), if ((userNextLeased >= unstakeAmount))
322332 then true
323333 else throwErr("unstake amount should be less or equal user staked amount"), if ((nodeNextLeased >= unstakeAmount))
324334 then true
325335 else throwErr("unstake amount should be less or equal node staked amount"), if (isValidAddress(nodeAddress))
326336 then true
327337 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
328338 then true
329339 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
330340 if ((checks == checks))
331341 then {
332342 let newNodeNextLease = (nodeNextLeased - unstakeAmount)
333343 let newUserNextLeased = (userNextLeased - unstakeAmount)
334- let $t01003910099 = getUserToClaimBalance(userAddress)
335- let toClaim = $t01003910099._1
336- let toUnlock = $t01003910099._2
344+ let $t01031110371 = getUserToClaimBalance(userAddress)
345+ let toClaim = $t01031110371._1
346+ let toUnlock = $t01031110371._2
337347 let newToUnlock = (toUnlock + unstakeAmount)
338348 let userTotalLocked = getUserTotalLocked(userAddress)
339349 let newUserTotalLocked = (userTotalLocked - unstakeAmount)
340350 [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)]
341351 }
342352 else throw("Strict value is not equal to itself.")
343353 }
344354
345355
346356 func getClaimUnlockedActions (userAddress,claimAmount) = {
347- let $t01082810888 = getUserToClaimBalance(userAddress)
348- let toClaim = $t01082810888._1
349- let toUnlock = $t01082810888._2
357+ let $t01110011160 = getUserToClaimBalance(userAddress)
358+ let toClaim = $t01110011160._1
359+ let toUnlock = $t01110011160._2
350360 let checks = [if (!(isForceStop))
351361 then true
352362 else throwErr("contract is temporary stopped"), if (!(isForceOutStop))
353363 then true
354364 else throwErr("claim is temporary disabled"), if ((claimAmount > 0))
355365 then true
356366 else throwErr("claim amount should be greater than 0"), if ((toClaim >= claimAmount))
357367 then true
358368 else throwErr("claim amount should be less or equal unlocked amount"), if (isValidAddress(userAddress))
359369 then true
360370 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
361371 if ((checks == checks))
362372 then {
363373 let newToClaim = (toClaim - claimAmount)
364374 [getUserToClaimEntry(userAddress, newToClaim, toUnlock), ScriptTransfer(addressFromStringValue(userAddress), claimAmount, assetIdBytes)]
365375 }
366376 else throw("Strict value is not equal to itself.")
367377 }
368378
369379
370380 func getStakeForActions (userAddress,i) = {
371- let $t01165211712 = getUserToClaimBalance(userAddress)
372- let toClaim = $t01165211712._1
373- let toUnlock = $t01165211712._2
381+ let $t01192411984 = getUserToClaimBalance(userAddress)
382+ let toClaim = $t01192411984._1
383+ let toUnlock = $t01192411984._2
374384 let checks = [if (!(isForceStop))
375385 then true
376386 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
377387 then true
378388 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
379389 then true
380390 else (i.payments[0].assetId == assetIdBytes))
381391 then true
382392 else throwErr(makeString(["payment assetId should be:", assetIdString], " ")), if (isValidAddress(userAddress))
383393 then true
384394 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
385395 if ((checks == checks))
386396 then {
387397 let newToClaim = (toClaim + i.payments[0].amount)
388398 [getUserToClaimEntry(userAddress, newToClaim, toUnlock)]
389399 }
390400 else throw("Strict value is not equal to itself.")
391401 }
392402
393403
404+func calculateClaim (userAddress) = {
405+ let claimedBlockKey = keyClaimedBlock(userAddress)
406+ let claimedBlock = valueOrElse(getInteger(this, claimedBlockKey), height)
407+ let blocksPassed = (height - claimedBlock)
408+ let amountStaked = getUserTotalLocked(userAddress)
409+ let toClaimNow = ((blocksPassed * (amountStaked * scale8)) / BLOCKS_IN_INTERVAL)
410+ toClaimNow
411+ }
412+
413+
414+func setUser (userAddress,claimedBlock) = {
415+ let claimedBlockKey = keyClaimedBlock(userAddress)
416+[IntegerEntry(claimedBlockKey, claimedBlock)]
417+ }
418+
419+
394420 func getStakeActions (nodeAddress,userAddress,userLeasingAmount,i) = {
395- let $t01244012500 = getUserToClaimBalance(userAddress)
396- let toClaim = $t01244012500._1
397- let toUnlock = $t01244012500._2
421+ let $t01328313343 = getUserToClaimBalance(userAddress)
422+ let toClaim = $t01328313343._1
423+ let toUnlock = $t01328313343._2
398424 let paymentAmount = if ((size(i.payments) == 0))
399425 then 0
400426 else i.payments[0].amount
401427 let available = ((toUnlock + toClaim) + paymentAmount)
402428 let checks = [if (!(isForceStop))
403429 then true
404430 else throwErr("contract is temporary stopped"), if ((1 >= size(i.payments)))
405431 then true
406432 else throwErr("maximum 1 payment"), if (if ((size(i.payments) == 0))
407433 then true
408434 else (i.payments[0].assetId == assetIdBytes))
409435 then true
410436 else throwErr(makeString(["payment assetId should be:", assetIdString], " ")), if ((userLeasingAmount > 0))
411437 then true
412438 else throwErr("amount should be greater than 0"), if ((available >= userLeasingAmount))
413439 then true
414440 else throwErr("amount should be less or equal (payment + available) amount"), if ((userLeasingAmount >= paymentAmount))
415441 then true
416442 else throw("amount should be greater or equal payment amount"), if (isValidAddress(nodeAddress))
417443 then true
418444 else throwErr(makeString(["node address is not valid:", nodeAddress], " ")), if (isValidAddress(userAddress))
419445 then true
420446 else throwErr(makeString(["user address is not valid:", userAddress], " "))]
421447 if ((checks == checks))
422448 then {
423- let $t01357113644 = getLeasingNodeData(nodeAddress)
424- let nodeCurrentLeased = $t01357113644._1
425- let nodeNextLeased = $t01357113644._2
449+ let $t01441414487 = getLeasingNodeData(nodeAddress)
450+ let nodeCurrentLeased = $t01441414487._1
451+ let nodeNextLeased = $t01441414487._2
426452 let newNodeNextLease = (nodeNextLeased + userLeasingAmount)
427- let $t01371213798 = getUserLeasingData(nodeAddress, userAddress)
428- let userCurrentLeased = $t01371213798._1
429- let userNextLeased = $t01371213798._2
453+ let $t01455514641 = getUserLeasingData(nodeAddress, userAddress)
454+ let userCurrentLeased = $t01455514641._1
455+ let userNextLeased = $t01455514641._2
430456 let newUserNextLeased = (userNextLeased + userLeasingAmount)
431457 let fromUnlockedAmount = (userLeasingAmount - paymentAmount)
432458 let newToUnlock = max([0, (toUnlock - fromUnlockedAmount)])
433459 let newToClaim = min([toClaim, (toClaim + (toUnlock - fromUnlockedAmount))])
434460 let userTotalLocked = getUserTotalLocked(userAddress)
435461 let newUserTotalLocked = (userTotalLocked + userLeasingAmount)
436462 [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)]
437463 }
438464 else throw("Strict value is not equal to itself.")
439465 }
440466
441467
442468 func getStakeFromPaymentActions (nodeAddress,userAddress,i) = {
443469 let checks = [if ((size(i.payments) == 1))
444470 then true
445471 else throwErr("payment size should be exactly 1")]
446472 if ((checks == checks))
447473 then getStakeActions(nodeAddress, userAddress, i.payments[0].amount, i)
448474 else throw("Strict value is not equal to itself.")
449475 }
450476
451477
452478 func getSetNewPeriodLengthActions (newPeriodLength) = {
453479 let check = [if ((newPeriodLength > 0))
454480 then true
455481 else throwErr("period length should be greater than 0")]
456482 if ((check == check))
457483 then if ((periodOffsetHeight == -1))
458484 then [IntegerEntry(keyPeriodLength, newPeriodLength), IntegerEntry(keyPeriodOffsetHeight, height)]
459485 else [IntegerEntry(keyPeriodOffsetId, (currentPeriodId + 1)), IntegerEntry(keyPeriodOffsetHeight, nextPeriodHeight), IntegerEntry(keyPeriodLength, newPeriodLength)]
460486 else throw("Strict value is not equal to itself.")
461487 }
462488
463489
464490 @Callable(i)
465491 func setNewPeriodLength (newPeriodLength) = {
466492 let checks = [if (isInAdminList(toString(i.caller)))
467493 then true
468494 else throwErr("caller is not in adminList")]
469495 if ((checks == checks))
470496 then getSetNewPeriodLengthActions(newPeriodLength)
471497 else throw("Strict value is not equal to itself.")
472498 }
473499
474500
475501
476502 @Callable(i)
503+func claimUnit () = {
504+ let userAddress = toString(i.caller)
505+ let toClaimNow = calculateClaim(userAddress)
506+ let totalUnitClaimed = valueOrElse(getInteger(this, keyTotalUnitsClaimed(userAddress)), 0)
507+ let totalL2Staked = getUserTotalLocked(userAddress)
508+ let check = [if ((totalL2Staked >= (totalUnitClaimed + toClaimNow)))
509+ then true
510+ else throwErr("Can't claim more than staked")]
511+ if ((check == check))
512+ then {
513+ let claimedBlockKey = keyClaimedBlock(userAddress)
514+ let actions = [IntegerEntry(claimedBlockKey, height), IntegerEntry(keyTotalUnitsClaimed(userAddress), (totalUnitClaimed + toClaimNow))]
515+ let transferUnits = ScriptTransfer(i.caller, toClaimNow, unit)
516+ (actions ++ [transferUnits])
517+ }
518+ else throw("Strict value is not equal to itself.")
519+ }
520+
521+
522+
523+@Callable(i)
477524 func setForceStopFlag (stop) = {
478525 let check = [if (isInAdminList(toString(i.caller)))
479526 then true
480527 else throwErr("caller is not in adminList")]
481528 if ((check == check))
482529 then [BooleanEntry(keyForceStop, stop)]
483530 else throw("Strict value is not equal to itself.")
484531 }
485532
486533
487534
488535 @Callable(i)
489536 func setForceOutStopFlag (stop) = {
490537 let check = [if (isInAdminList(toString(i.caller)))
491538 then true
492539 else throwErr("caller is not in adminList")]
493540 if ((check == check))
494541 then [BooleanEntry(keyForceOutStop, stop)]
495542 else throw("Strict value is not equal to itself.")
496543 }
497544
498545
499546
500547 @Callable(i)
501548 func getNodeDataREADONLY (nodeAddress) = {
502- let $t01647116535 = getLeasingNodeData(nodeAddress)
503- let currentLease = $t01647116535._1
504- let nextLeased = $t01647116535._2
549+ let $t01803818102 = getLeasingNodeData(nodeAddress)
550+ let currentLease = $t01803818102._1
551+ let nextLeased = $t01803818102._2
505552 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
506553 }
507554
508555
509556
510557 @Callable(i)
511558 func getUserLeasingDataREADONLY (nodeAddress,userAddress) = {
512- let $t01690516982 = getUserLeasingData(nodeAddress, userAddress)
513- let currentLease = $t01690516982._1
514- let nextLeased = $t01690516982._2
559+ let $t01847218549 = getUserLeasingData(nodeAddress, userAddress)
560+ let currentLease = $t01847218549._1
561+ let nextLeased = $t01847218549._2
515562 $Tuple2(nil, $Tuple5(currentPeriodHeight, currentLease, nextPeriodHeight, nextLeased, height))
516563 }
517564
518565
519566
520567 @Callable(i)
521568 func getUserDataREADONLY (userAddress) = {
522- let $t01734517405 = getUserToClaimBalance(userAddress)
523- let toClaim = $t01734517405._1
524- let toUnlock = $t01734517405._2
569+ let $t01891218972 = getUserToClaimBalance(userAddress)
570+ let toClaim = $t01891218972._1
571+ let toUnlock = $t01891218972._2
525572 let userTotalLocked = getUserTotalLocked(userAddress)
526573 $Tuple2(nil, $Tuple6(currentPeriodHeight, toClaim, nextPeriodHeight, toUnlock, userTotalLocked, height))
527574 }
528575
529576
530577
531578 @Callable(i)
532579 func leaseByAddress (nodeAddress,userAddress) = getStakeFromPaymentActions(nodeAddress, userAddress, i)
533580
534581
535582
536583 @Callable(i)
537584 func lease (nodeAddress) = {
538585 let userAddress = toString(i.caller)
539586 getStakeFromPaymentActions(nodeAddress, userAddress, i)
540587 }
541588
542589
543590
544591 @Callable(i)
545592 func leaseFromLocked (nodeAddress,amount) = {
546593 let userAddress = toString(i.caller)
547594 getStakeActions(nodeAddress, userAddress, amount, i)
548595 }
549596
550597
551598
552599 @Callable(i)
553600 func cancelLease (nodeAddress,amount) = {
554601 let userAddress = toString(i.caller)
555602 getUnstakeActions(nodeAddress, userAddress, amount)
556603 }
557604
558605
559606
560607 @Callable(i)
561608 func claim (amount) = {
562609 let userAddress = toString(i.caller)
563610 getClaimUnlockedActions(userAddress, amount)
564611 }
565612
566613
567614
568615 @Callable(i)
569616 func claimAll () = {
570617 let userAddress = toString(i.caller)
571- let $t01841918479 = getUserToClaimBalance(userAddress)
572- let toClaim = $t01841918479._1
573- let toUnlock = $t01841918479._2
618+ let $t01998620046 = getUserToClaimBalance(userAddress)
619+ let toClaim = $t01998620046._1
620+ let toUnlock = $t01998620046._2
574621 let checks = [if ((toClaim > 0))
575622 then true
576623 else throwErr("nothing to claim")]
577624 if ((checks == checks))
578625 then getClaimUnlockedActions(userAddress, toClaim)
579626 else throw("Strict value is not equal to itself.")
580627 }
581628
582629
583630
584631 @Callable(i)
585632 func stakeFor (userAddress) = getStakeForActions(userAddress, i)
586633
587634
588635
589636 @Callable(i)
590637 func voteForTxId (txId) = {
591638 let callerAddressString = toBase58String(i.caller.bytes)
592639 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
593640 let result = [StringEntry(keyAllowedTxId(), txId)]
594641 let allowedTxIdOption = getString(this, keyAllowedTxId())
595642 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
596643 then true
597644 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
598645 then true
599646 else (value(allowedTxIdOption) != txId))
600647 then true
601648 else throwErr((txId + " is already allowed"))]
602649 if ((err == err))
603650 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
604651 else throw("Strict value is not equal to itself.")
605652 }
606653
607654
608655 @Verifier(tx)
609656 func verify () = {
610657 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
611658 let byOwner = if ((size(getAdminsList()) >= QUORUM))
612659 then false
613660 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
614661 if (byAdmins)
615662 then true
616663 else byOwner
617664 }
618665

github/deemru/w8io/c3f4982 
106.79 ms