tx · 7b3RZ7EZ8Uyzx33igwnuK789aF1BYufyP9UxUmbDRPgH

3PEV7YB8caXLgQPCuKHtWtFSDTjgtbAxgqZ:  -0.05000000 Waves

2024.02.28 09:42 [4061535] smart account 3PEV7YB8caXLgQPCuKHtWtFSDTjgtbAxgqZ > SELF 0.00000000 Waves

{ "type": 13, "id": "7b3RZ7EZ8Uyzx33igwnuK789aF1BYufyP9UxUmbDRPgH", "fee": 5000000, "feeAssetId": null, "timestamp": 1709102237109, "version": 2, "chainId": 87, "sender": "3PEV7YB8caXLgQPCuKHtWtFSDTjgtbAxgqZ", "senderPublicKey": "5erVrXGwDf4uTNPpGnGNKjHcwFUTztTpFTvj8ZBrLq57", "proofs": [ "3rMcTUDzZSYBhqzymH1J8yzU7HBKWhUdPhauM6yUdCBvnSD4heXF579MXGJnZCbcumAtTqaix1LLhaALkM1MJHLM" ], "script": "base64:BgI6CAISAwoBARIDCgEBEgASAwoBCBIDCgEBEgMKAQgSAwoBCBIECgIICBIECgIYERIDCgEIEgASAwoBCEMADGNvbnRyYWN0RmlsZQIRbDJtcF9zdGFraW5nLnJpZGUAA1NFUAICX18ABnNjYWxlOACAwtcvAAdzY2FsZTE4AICAkLu61q3wDQANc2NhbGUxOEJpZ0ludAkAtgIBBQdzY2FsZTE4ABJBRERSRVNTX0JZVEVTX1NJWkUAGgANQkxPQ0tTX0lOX0RBWQCgCwEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAATa2V5RW1pc3Npb25QZXJCbG9jawkAuQkCCQDMCAICAiVzCQDMCAICEGVtaXNzaW9uUGVyQmxvY2sFA25pbAUDU0VQABlrZXlFbWlzc2lvblBlcmlvZEluQmxvY2tzCQC5CQIJAMwIAgICJXMJAMwIAgIWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwUDbmlsBQNTRVAADWtleVN0YXJ0QmxvY2sJALkJAgkAzAgCAgIlcwkAzAgCAgpzdGFydEJsb2NrBQNuaWwFA1NFUAAQa2V5VG90YWxMcEFtb3VudAkAuQkCCQDMCAICAiVzCQDMCAICDXRvdGFsTHBBbW91bnQFA25pbAUDU0VQABNrZXlUb3RhbEFzc2V0QW1vdW50CQC5CQIJAMwIAgICJXMJAMwIAgIQdG90YWxBc3NldEFtb3VudAUDbmlsBQNTRVAAFmtleVRvdGFsTG9ja2VkTHBBbW91bnQJALkJAgkAzAgCAgIlcwkAzAgCAhN0b3RhbExvY2tlZExwQW1vdW50BQNuaWwFA1NFUAAVa2V5V2l0aGRyYXdMb2NrSGVpZ2h0CQC5CQIJAMwIAgICJXMJAMwIAgISd2l0aGRyYXdMb2NrSGVpZ2h0BQNuaWwFA1NFUAEPa2V5VXNlckxwQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIMdXNlckxwQW1vdW50CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEVa2V5VXNlckxvY2tlZExwQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgISdXNlckxvY2tlZExwQW1vdW50CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAETa2V5VXNlclN0YWtpbmdOb2RlcwELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICEHVzZXJTdGFraW5nTm9kZXMJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARlrZXlVc2VyU3Rha2luZ05vZGVzU2hhcmVzAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIWdXNlclN0YWtpbmdOb2Rlc1NoYXJlcwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITdG90YWxBc3NldFdpdGhkcmF3bgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdG90YWxBc3NldFN0YWtlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABCmtleUhpc3RvcnkDBHR5cGULdXNlckFkZHJlc3MEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQR0eXBlCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJANgEAQUEdHhJZAUDbmlsBQNTRVABDWZvcm1hdEhpc3RvcnkEC3RvdGFsUHJvZml0BXByaWNlEHRvdGFsQXNzZXRBbW91bnQNdG90YWxMcEFtb3VudAkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQULdG90YWxQcm9maXQJAMwIAgkApgMBBQVwcmljZQkAzAgCCQCkAwEFEHRvdGFsQXNzZXRBbW91bnQJAMwIAgkApAMBBQ10b3RhbExwQW1vdW50BQNuaWwFA1NFUAANdG90YWxMcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRBrZXlUb3RhbExwQW1vdW50AAAAEHRvdGFsQXNzZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUTa2V5VG90YWxBc3NldEFtb3VudAAAABN0b3RhbExvY2tlZExwQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFmtleVRvdGFsTG9ja2VkTHBBbW91bnQAAAANYXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQprZXlBc3NldElkAgVXQVZFUwAMYXNzZXRJZEJ5dGVzAwkAAAIFDWFzc2V0SWRTdHJpbmcCBVdBVkVTBQR1bml0CQDZBAEFDWFzc2V0SWRTdHJpbmcAFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5RW1pc3Npb25QZXJpb2RJbkJsb2NrcwUNQkxPQ0tTX0lOX0RBWQAQZW1pc3Npb25QZXJCbG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRNrZXlFbWlzc2lvblBlckJsb2NrAAAAEWVtaXNzaW9uUGVyUGVyaW9kCQBoAgUQZW1pc3Npb25QZXJCbG9jawUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwASd2l0aGRyYXdMb2NrSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFWtleVdpdGhkcmF3TG9ja0hlaWdodAAAAA9BRE1JTl9MSVNUX1NJWkUABQAGUVVPUlVNAAMAEVRYSURfQllURVNfTEVOR1RIACABGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAglhbGxvd1R4SWQJAMwIAgUEdHhJZAUDbmlsBQNTRVABEGtleUZ1bGxBZG1pblZvdGUCBnByZWZpeAxhZG1pbkFkZHJlc3MJALkJAgkAzAgCBQZwcmVmaXgJAMwIAgUMYWRtaW5BZGRyZXNzBQNuaWwFA1NFUAETa2V5QWRtaW5BZGRyZXNzTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhBhZG1pbkFkZHJlc3NMaXN0BQNuaWwFA1NFUAEOa2V5QWxsb3dlZFR4SWQACQC5CQIJAMwIAgICJXMJAMwIAgIEdHhJZAUDbmlsBQNTRVABDGdldEFkbWluVm90ZQIGcHJlZml4BWFkbWluBAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQ1nZXRBZG1pbnNMaXN0AAQHJG1hdGNoMAkAnQgCBQR0aGlzCQETa2V5QWRtaW5BZGRyZXNzTGlzdAADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQC1CQIFAXMFA1NFUAUDbmlsAQ1pc0luQWRtaW5MaXN0AQdhZGRyZXNzCQEPY29udGFpbnNFbGVtZW50AgkBDWdldEFkbWluc0xpc3QABQdhZGRyZXNzARJnZW5Wb3Rlc0tleXNIZWxwZXICAWEMYWRtaW5BZGRyZXNzBAskdDAzNzUxMzc3NQUBYQQGcmVzdWx0CAULJHQwMzc1MTM3NzUCXzEEBnByZWZpeAgFCyR0MDM3NTEzNzc1Al8yCQCUCgIJAM0IAgUGcmVzdWx0CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUMYWRtaW5BZGRyZXNzBQZwcmVmaXgBDGdlblZvdGVzS2V5cwEJa2V5UHJlZml4BAlhZG1pbkxpc3QJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAQLJHQwMzkyMjQwMDYKAAIkbAkBDWdldEFkbWluc0xpc3QACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFCWtleVByZWZpeAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQESZ2VuVm90ZXNLZXlzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQGcmVzdWx0CAULJHQwMzkyMjQwMDYCXzEEBnByZWZpeAgFCyR0MDM5MjI0MDA2Al8yBQZyZXN1bHQBEGNvdW50Vm90ZXNIZWxwZXICBnJlc3VsdAd2b3RlS2V5CQBkAgUGcmVzdWx0CQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAEKY291bnRWb3RlcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY291bnRWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBEGNsZWFyVm90ZXNIZWxwZXICBnJlc3VsdANrZXkJAM0IAgUGcmVzdWx0CQELRGVsZXRlRW50cnkBBQNrZXkBE2dldENsZWFyVm90ZUVudHJpZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNsZWFyVm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAQx2b3RlSU5URVJOQUwEE2NhbGxlckFkZHJlc3NTdHJpbmcJa2V5UHJlZml4CG1pblZvdGVzCnZvdGVSZXN1bHQEB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBBBhZG1pbkN1cnJlbnRWb3RlCQEMZ2V0QWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBANlcnIDCQEBIQEJAQ1pc0luQWRtaW5MaXN0AQUTY2FsbGVyQWRkcmVzc1N0cmluZwkBCHRocm93RXJyAQkArAICCQCsAgICCUFkZHJlc3M6IAUTY2FsbGVyQWRkcmVzc1N0cmluZwISIG5vdCBpbiBBZG1pbiBsaXN0AwkAAAIFEGFkbWluQ3VycmVudFZvdGUAAQkBCHRocm93RXJyAQkArAICBQd2b3RlS2V5AhIgeW91IGFscmVhZHkgdm90ZWQFBHVuaXQDCQAAAgUDZXJyBQNlcnIEBXZvdGVzCQEKY291bnRWb3RlcwEFCWtleVByZWZpeAMJAGcCCQBkAgUFdm90ZXMAAQUIbWluVm90ZXMEEGNsZWFyVm90ZUVudHJpZXMJARNnZXRDbGVhclZvdGVFbnRyaWVzAQUJa2V5UHJlZml4CQDOCAIFEGNsZWFyVm90ZUVudHJpZXMFCnZvdGVSZXN1bHQJAMwIAgkBDEludGVnZXJFbnRyeQIFB3ZvdGVLZXkAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARlzdHJpbmdMaXN0VG9JbnRMaXN0SGVscGVyAgNhY2MFdmFsdWUJAM0IAgUDYWNjCQENcGFyc2VJbnRWYWx1ZQEFBXZhbHVlARhjYWxjVG90YWxQcm9maXRGb3JIZWlnaHQBAWgECnN0YXJ0QmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUNa2V5U3RhcnRCbG9jawUGaGVpZ2h0BAtzdGFydFBlcmlvZAkAawMFCnN0YXJ0QmxvY2sAAQUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwQOZWxhcHNlZFBlcmlvZHMJAGUCCQBpAgUBaAUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwULc3RhcnRQZXJpb2QJAJYDAQkAzAgCAAAJAMwIAgkAaAIFEWVtaXNzaW9uUGVyUGVyaW9kBQ5lbGFwc2VkUGVyaW9kcwUDbmlsAQ9jYWxjVG90YWxQcm9maXQACQEYY2FsY1RvdGFsUHJvZml0Rm9ySGVpZ2h0AQUGaGVpZ2h0ARRnZXRNYXhBc3NldEF2YWlsYWJsZQAEByRtYXRjaDAFDGFzc2V0SWRCeXRlcwMJAAECBQckbWF0Y2gwAgRVbml0BAF1BQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDwBwIFBHRoaXMFAWIJAAIBAgtNYXRjaCBlcnJvcgErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAEGnRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0CQBkAgUQdG90YWxBc3NldEFtb3VudAkBD2NhbGNUb3RhbFByb2ZpdAAEC3RvdGFsQW1vdW50CQCXAwEJAMwIAgUadG90YWxBc3NldEFtb3VudFdpdGhQcm9maXQJAMwIAgkBFGdldE1heEFzc2V0QXZhaWxhYmxlAAUDbmlsAwkAAAIFDXRvdGFsTHBBbW91bnQAAAAABQt0b3RhbEFtb3VudAEPZ2V0Q3VycmVudFByaWNlAAMJAQIhPQIFDXRvdGFsTHBBbW91bnQAAAkAvAIDCQC2AgEJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAUNc2NhbGUxOEJpZ0ludAkAtgIBBQ10b3RhbExwQW1vdW50BQ1zY2FsZTE4QmlnSW50ARJnZXRSZW1haW5pbmdCbG9ja3MAAwkAAAIFEGVtaXNzaW9uUGVyQmxvY2sAAAAACQBrAwkAZQIJARRnZXRNYXhBc3NldEF2YWlsYWJsZQAJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAABBRBlbWlzc2lvblBlckJsb2NrARdnZXRVc2VyU3Rha2luZ05vZGVzRGF0YQELdXNlckFkZHJlc3MECG5vZGVzUmF3CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJARNrZXlVc2VyU3Rha2luZ05vZGVzAQULdXNlckFkZHJlc3MCAAQJc2hhcmVzUmF3CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJARlrZXlVc2VyU3Rha2luZ05vZGVzU2hhcmVzAQULdXNlckFkZHJlc3MCAAQJbm9kZXNMaXN0AwkAAAIFCG5vZGVzUmF3AgAFA25pbAkAtQkCBQhub2Rlc1JhdwUDU0VQBBBzaGFyZXNTdHJpbmdMaXN0AwkAAAIFCXNoYXJlc1JhdwIABQNuaWwJALUJAgUJc2hhcmVzUmF3BQNTRVAECnNoYXJlc0xpc3QKAAIkbAUQc2hhcmVzU3RyaW5nTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEZc3RyaW5nTGlzdFRvSW50TGlzdEhlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUCQCUCgIFCW5vZGVzTGlzdAUKc2hhcmVzTGlzdAEPY2FsY0Fzc2V0RnJvbUxwAQhscEFtb3VudAkAlgMBCQDMCAIAAAkAzAgCCQCgAwEJALwCAwkAtgIBBQhscEFtb3VudAkBD2dldEN1cnJlbnRQcmljZQAFDXNjYWxlMThCaWdJbnQFA25pbAEPY2FsY0xwRnJvbUFzc2V0AQthc3NldEFtb3VudAkAlgMBCQDMCAIAAAkAzAgCCQCgAwEJALwCAwkAtgIBBQthc3NldEFtb3VudAUNc2NhbGUxOEJpZ0ludAkBD2dldEN1cnJlbnRQcmljZQAFA25pbAEPZ2V0VXNlckxwQW1vdW50AQt1c2VyQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPa2V5VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MAAAEVZ2V0VXNlckxvY2tlZExwQW1vdW50AQt1c2VyQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEVa2V5VXNlckxvY2tlZExwQW1vdW50AQULdXNlckFkZHJlc3MAAAEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBC3VzZXJBZGRyZXNzBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwkBD2NhbGNBc3NldEZyb21McAEFDHVzZXJMcEFtb3VudAEbZ2V0Q2xlYXJTdGFraW5nTm9kZXNBY3Rpb25zAQt1c2VyQWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQETa2V5VXNlclN0YWtpbmdOb2RlcwEFC3VzZXJBZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJARlrZXlVc2VyU3Rha2luZ05vZGVzU2hhcmVzAQULdXNlckFkZHJlc3MFA25pbAEPZ2V0U3Rha2VBY3Rpb25zAgFpC3VzZXJBZGRyZXNzBAZjaGVja3MJAMwIAgMDCQAAAgUSd2l0aGRyYXdMb2NrSGVpZ2h0AAAGCQBmAgUSd2l0aGRyYXdMb2NrSGVpZ2h0BQZoZWlnaHQGCQEIdGhyb3dFcnIBAg9zdGFrZSBpcyBsb2NrZWQJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAhhzaG91bGQgaW5jbHVkZSAxIHBheW1lbnQJAMwIAgMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDGFzc2V0SWRCeXRlcwYJAQh0aHJvd0VycgEJAKwCAgIVcGF5bWVudCBzaG91bGQgYmUgaW4gBQ1hc3NldElkU3RyaW5nCQDMCAIDCQBmAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAYCJ3BheW1lbnQgYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAAAIJAMgBAQkA2QQBBQt1c2VyQWRkcmVzcwUSQUREUkVTU19CWVRFU19TSVpFBgkBCHRocm93RXJyAQIZdXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA1wYXltZW50QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQPcGF5bWVudExwQW1vdW50CQEPY2FsY0xwRnJvbUFzc2V0AQUNcGF5bWVudEFtb3VudAQMdXNlckxwQW1vdW50CQEPZ2V0VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MEFXVzZXJUb3RhbFN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwAABBBuZXdUb3RhbExwQW1vdW50CQBkAgUNdG90YWxMcEFtb3VudAUPcGF5bWVudExwQW1vdW50BBNuZXdUb3RhbEFzc2V0QW1vdW50CQEPY2FsY0Fzc2V0RnJvbUxwAQUQbmV3VG90YWxMcEFtb3VudAQPbmV3VXNlckxwQW1vdW50CQBkAgUMdXNlckxwQW1vdW50BQ9wYXltZW50THBBbW91bnQEGG5ld1VzZXJUb3RhbFN0YWtlZEFtb3VudAkAZAIFFXVzZXJUb3RhbFN0YWtlZEFtb3VudAUNcGF5bWVudEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5SGlzdG9yeQMCBXN0YWtlBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAkBDWZvcm1hdEhpc3RvcnkECQEPY2FsY1RvdGFsUHJvZml0AAkBD2dldEN1cnJlbnRQcmljZQAFDXRvdGFsTHBBbW91bnQFEHRvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQFEG5ld1RvdGFsTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFE25ld1RvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwUPbmV3VXNlckxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwUYbmV3VXNlclRvdGFsU3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgESZ2V0V2l0aGRyYXdBY3Rpb25zAgFpFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQFY2hlY2sJAMwIAgMDCQAAAgUSd2l0aGRyYXdMb2NrSGVpZ2h0AAAGCQBmAgUSd2l0aGRyYXdMb2NrSGVpZ2h0BQZoZWlnaHQGCQEIdGhyb3dFcnIBAhJ3aXRoZHJhdyBpcyBsb2NrZWQJAMwIAgMJAGYCBRVscEFzc2V0V2l0aGRyYXdBbW91bnQAAAYJAQh0aHJvd0VycgECH0xQIGFtb3VudCBzaG91bGQgYmUgbW9yZSB0aGFuIDAJAMwIAgMJAGcCBQx1c2VyTHBBbW91bnQFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAYJAQh0aHJvd0VycgEJAKwCAgkArAICAihjYW5ub3Qgd2l0aGRyYXcgbW9yZSB0aGFuIGF2YWlsYWJsZSBMUCAoCQCkAwEFDHVzZXJMcEFtb3VudAIBKQUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawQPbmV3VXNlckxwQW1vdW50CQBlAgUMdXNlckxwQW1vdW50BRVscEFzc2V0V2l0aGRyYXdBbW91bnQEE3dpdGhkcmF3QXNzZXRBbW91bnQJAQ9jYWxjQXNzZXRGcm9tTHABBRVscEFzc2V0V2l0aGRyYXdBbW91bnQEEG5ld1RvdGFsTHBBbW91bnQJAGUCBQ10b3RhbExwQW1vdW50BRVscEFzc2V0V2l0aGRyYXdBbW91bnQEE25ld1RvdGFsQXNzZXRBbW91bnQJAQ9jYWxjQXNzZXRGcm9tTHABBRBuZXdUb3RhbExwQW1vdW50BBd1c2VyVG90YWxBc3NldFdpdGhkcmF3bgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEaa2V5VXNlclRvdGFsQXNzZXRXaXRoZHJhd24BBQt1c2VyQWRkcmVzcwAABBpuZXdVc2VyVG90YWxBc3NldFdpdGhkcmF3bgkAZAIFF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduBRN3aXRoZHJhd0Fzc2V0QW1vdW50BBdjbGVhclN0YWtpbmdOb2Rlc0FjdGlvbgMJAAACBQ9uZXdVc2VyTHBBbW91bnQAAAkBG2dldENsZWFyU3Rha2luZ05vZGVzQWN0aW9ucwEFC3VzZXJBZGRyZXNzBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5SGlzdG9yeQMCCHdpdGhkcmF3BQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAkBDWZvcm1hdEhpc3RvcnkECQEPY2FsY1RvdGFsUHJvZml0AAkBD2dldEN1cnJlbnRQcmljZQAFDXRvdGFsTHBBbW91bnQFEHRvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQFEG5ld1RvdGFsTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFE25ld1RvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwUPbmV3VXNlckxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5VXNlclRvdGFsQXNzZXRXaXRoZHJhd24BBQt1c2VyQWRkcmVzcwUabmV3VXNlclRvdGFsQXNzZXRXaXRoZHJhd24JAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFE3dpdGhkcmF3QXNzZXRBbW91bnQFDGFzc2V0SWRCeXRlcwUDbmlsBRdjbGVhclN0YWtpbmdOb2Rlc0FjdGlvbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEYZ2V0U2V0U3Rha2luZ05vZGVBY3Rpb25zAwt1c2VyQWRkcmVzcwtub2RlQWRkcmVzcwlub2RlU2hhcmUEBWNoZWNrCQDMCAIDAwkAAAIFEndpdGhkcmF3TG9ja0hlaWdodAAABgkAZgIFEndpdGhkcmF3TG9ja0hlaWdodAUGaGVpZ2h0BgkBCHRocm93RXJyAQIfY2hhbmdpbmcgc3Rha2luZyBub2RlIGlzIGxvY2tlZAkAzAgCAwkAAAIJAMgBAQkA2QQBBQt1c2VyQWRkcmVzcwUSQUREUkVTU19CWVRFU19TSVpFBgkBCHRocm93RXJyAQIZdXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZAkAzAgCAwkAAAIJAMgBAQkA2QQBBQtub2RlQWRkcmVzcwUSQUREUkVTU19CWVRFU19TSVpFBgkBCHRocm93RXJyAQIZbm9kZSBhZGRyZXNzIGlzIG5vdCB2YWxpZAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQELU3RyaW5nRW50cnkCCQETa2V5VXNlclN0YWtpbmdOb2RlcwEFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQEZa2V5VXNlclN0YWtpbmdOb2Rlc1NoYXJlcwEFC3VzZXJBZGRyZXNzCQCkAwEFCW5vZGVTaGFyZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuDAFpARNzZXRFbWlzc2lvblBlckJsb2NrARBlbWlzc2lvblBlckJsb2NrBAVjaGVjawkAzAgCAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlUb3RhbEFzc2V0QW1vdW50CQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5RW1pc3Npb25QZXJCbG9jawkAlgMBCQDMCAIAAAkAzAgCBRBlbWlzc2lvblBlckJsb2NrBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARlzZXRFbWlzc2lvblBlcmlvZEluQmxvY2tzAQFwBAVjaGVjawkAzAgCAwkAZgIFAXAAAAYJAQh0aHJvd0VycgECKGVtaXNzaW9uIHBlcmlvZCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAAACCAUBaQZjYWxsZXIFBHRoaXMGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5VG90YWxBc3NldEFtb3VudAkBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFGWtleUVtaXNzaW9uUGVyaW9kSW5CbG9ja3MFAXAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBD2dldFN0YWtlQWN0aW9ucwIFAWkFC3VzZXJBZGRyZXNzAWkBCHN0YWtlRm9yAQt1c2VyQWRkcmVzcwkBD2dldFN0YWtlQWN0aW9ucwIFAWkFC3VzZXJBZGRyZXNzAWkBCHdpdGhkcmF3ARN3aXRoZHJhd0Fzc2V0QW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBJscEFtb3VudFRvV2l0aGRyYXcJAQ9jYWxjTHBGcm9tQXNzZXQBBRN3aXRoZHJhd0Fzc2V0QW1vdW50BBx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBBQt1c2VyQWRkcmVzcwQWbWluV2l0aGRyYXdBc3NldEFtb3VudAkAoAMBCQC9AgQJAQ9nZXRDdXJyZW50UHJpY2UACQC2AgEAAQUNc2NhbGUxOEJpZ0ludAUHQ0VJTElORwQFY2hlY2sJAMwIAgMJAGYCBRN3aXRoZHJhd0Fzc2V0QW1vdW50AAAGCQEIdGhyb3dFcnIBAiV3aXRoZHJhdyBhbW91bnQgc2hvdWxkIGJlIG1vcmUgdGhhbiAwCQDMCAIDCQBnAgUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwUTd2l0aGRyYXdBc3NldEFtb3VudAYJAQh0aHJvd0VycgEJAKwCAgkArAICAiVjYW5ub3Qgd2l0aGRyYXcgbW9yZSB0aGFuIGF2YWlsYWJsZSAoCQCkAwEFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcCASkJAMwIAgMJAGcCBRN3aXRoZHJhd0Fzc2V0QW1vdW50BRZtaW5XaXRoZHJhd0Fzc2V0QW1vdW50BgkBCHRocm93RXJyAQkArAICCQCsAgICJHdpdGhkcmF3IGFtb3VudCBpcyB0b28gc21hbGwuIE1pbjogKAkApAMBBRZtaW5XaXRoZHJhd0Fzc2V0QW1vdW50AgEpBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQESZ2V0V2l0aGRyYXdBY3Rpb25zAgUBaQkAlwMBCQDMCAIFDHVzZXJMcEFtb3VudAkAzAgCCQBkAgUSbHBBbW91bnRUb1dpdGhkcmF3AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5zZXRTdGFraW5nTm9kZQELbm9kZUFkZHJlc3MEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBGGdldFNldFN0YWtpbmdOb2RlQWN0aW9ucwMFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwBkAWkBFnN0YWtlQW5kU2V0U3Rha2luZ05vZGUBC25vZGVBZGRyZXNzBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJAM4IAgkBD2dldFN0YWtlQWN0aW9ucwIFAWkFC3VzZXJBZGRyZXNzCQEYZ2V0U2V0U3Rha2luZ05vZGVBY3Rpb25zAwULdXNlckFkZHJlc3MFC25vZGVBZGRyZXNzAGQBaQESc3Rha2VGb3JTd2FwSEVMUEVSAgt1c2VyQWRkcmVzcwtub2RlQWRkcmVzcwQFY2hlY2sJAMwIAgMJAAACCQClCAEIBQFpDG9yaWdpbkNhbGxlcgULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBAi1pLm9yaWdpbkNhbGxlciBzaG91bGQgYmUgZXF1YWwgdG8gdXNlckFkZHJlc3MFA25pbAMJAAACBQVjaGVjawUFY2hlY2sEFXNldFN0YWtpbmdOb2RlQWN0aW9ucwMJAAACBQtub2RlQWRkcmVzcwIA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BgIncGF5bWVudCBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIDCQAAAgkAkAMBBQthZGRyZXNzTGlzdAkAkAMBBQphbW91bnRMaXN0BgkBCHRocm93RXJyAQItYWRkcmVzc0xpc3Qgc2hvdWxkIGJlIHNhbWUgc2l6ZSBhcyBhbW91bnRMaXN0CQDMCAIDCQBnAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFDWFtb3VudExpc3RTdW0GCQEIdGhyb3dFcnIBAi1wYXltZW50IGFtb3VudCBpcyBsZXNzIHRoYW4gc3VtIG9mIGFtb3VudExpc3QFA25pbAMJAAACBQVjaGVjawUFY2hlY2sKARZnZXRBaXJkcm9wU3RhdGVDaGFuZ2VzAgVhY2N1bQthc3NldEFtb3VudAQNJHQwMTU2NzMxNTcyNAUFYWNjdW0EBnJlc3VsdAgFDSR0MDE1NjczMTU3MjQCXzEEBWluZGV4CAUNJHQwMTU2NzMxNTcyNAJfMgQHdG90YWxMcAgFDSR0MDE1NjczMTU3MjQCXzMEDXByb2Nlc3NlZExpc3QIBQ0kdDAxNTY3MzE1NzI0Al80BA1hZGRyZXNzU3RyaW5nCQCRAwIFC2FkZHJlc3NMaXN0BQVpbmRleAQHYWRkcmVzcwQHJG1hdGNoMAkApggBBQ1hZGRyZXNzU3RyaW5nAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEA2FkcgUHJG1hdGNoMAUDYWRyCQEIdGhyb3dFcnIBAh5pbnZhbGlkIGFkZHJlc3MgaW4gYWRkcmVzc0xpc3QEAmNoCQDMCAIDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQ1wcm9jZXNzZWRMaXN0BQdhZGRyZXNzBgkBCHRocm93RXJyAQIgZHVwbGljYXRlIGFkZHJlc3MgaXMgYWRkcmVzc0xpc3QFA25pbAMJAAACBQJjaAUCY2gEDWFkZGVkTHBBbW91bnQJAQ9jYWxjTHBGcm9tQXNzZXQBBQthc3NldEFtb3VudAQPdXNlckxvY2tlZExwS2V5CQEVa2V5VXNlckxvY2tlZExwQW1vdW50AQUNYWRkcmVzc1N0cmluZwQLb2xkTHBBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUPdXNl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b2NrZWRMcEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5VG90YWxBc3NldEFtb3VudAUNbmV3VG90YWxBc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa2V5U3RhcnRCbG9jawUGaGVpZ2h0BQNuaWwFDmFpcmRyb3BFbnRyaWVzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFWdldFVzZXJBc3NldHNSRUFET05MWQELdXNlckFkZHJlc3MEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBJ1c2VyTG9ja2VkTHBBbW91bnQJARVnZXRVc2VyTG9ja2VkTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQVdXNlckxvY2tlZEFzc2V0QW1vdW50CQEPY2FsY0Fzc2V0RnJvbUxwAQUSdXNlckxvY2tlZExwQW1vdW50BBx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBBQt1c2VyQWRkcmVzcwQVdXNlclRvdGFsU3Rha2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARdrZXlVc2VyVG90YWxBc3NldFN0YWtlZAEFC3VzZXJBZGRyZXNzAAAEF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARprZXlVc2VyVG90YWxBc3NldFdpdGhkcmF3bgEFC3VzZXJBZGRyZXNzAAAEDSR0MDE3OTU1MTgwNDcJARdnZXRVc2VyU3Rha2luZ05vZGVzRGF0YQEFC3VzZXJBZGRyZXNzBBR1c2VyU3Rha2luZ05vZGVzTGlzdAgFDSR0MDE3OTU1MTgwNDcCXzEEGXVzZXJTdGFraW5nTm9kZVNoYXJlc0xpc3QIBQ0kdDAxNzk1NTE4MDQ3Al8yCQCUCgIFA25pbAkAnAoKBQx1c2VyTHBBbW91bnQFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcJAQ9nZXRDdXJyZW50UHJpY2UABRV1c2VyVG90YWxTdGFrZWRBbW91bnQFF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduBRJ1c2VyTG9ja2VkTHBBbW91bnQFFXVzZXJMb2NrZWRBc3NldEFtb3VudAUUdXNlclN0YWtpbmdOb2Rlc0xpc3QFGXVzZXJTdGFraW5nTm9kZVNoYXJlc0xpc3QJARJnZXRSZW1haW5pbmdCbG9ja3MAAWkBFmdldFRvdGFsQXNzZXRzUkVBRE9OTFkACQCUCgIFA25pbAkAmAoGBQ10b3RhbExwQW1vdW50CQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAJAQ9nZXRDdXJyZW50UHJpY2UABRN0b3RhbExvY2tlZExwQW1vdW50CQEPY2FsY0Fzc2V0RnJvbUxwAQUTdG90YWxMb2NrZWRMcEFtb3VudAkBEmdldFJlbWFpbmluZ0Jsb2NrcwABaQELdm90ZUZvclR4SWQBBHR4SWQEE2NhbGxlckFkZHJlc3NTdHJpbmcJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJa2V5UHJlZml4CQEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQUEdHhJZAQGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBbGxvd2VkVHhJZAAFBHR4SWQFA25pbAQRYWxsb3dlZFR4SWRPcHRpb24JAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAQDZXJyCQDMCAIDCQAAAgkAyAEBCQDZBAEFBHR4SWQFEVRYSURfQllURVNfTEVOR1RIBgkBCHRocm93RXJyAQkArAICBQR0eElkAhIgaXMgbm90IHZhbGlkIHR4SWQJAMwIAgMDCQAAAgURYWxsb3dlZFR4SWRPcHRpb24FBHVuaXQGCQECIT0CCQEFdmFsdWUBBRFhbGxvd2VkVHhJZE9wdGlvbgUEdHhJZAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAITIGlzIGFscmVhZHkgYWxsb3dlZAUDbmlsAwkAAAIFA2VycgUDZXJyCQEMdm90ZUlOVEVSTkFMBAUTY2FsbGVyQWRkcmVzc1N0cmluZwUJa2V5UHJlZml4BQZRVU9SVU0FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgC/IHmQ", "height": 4061535, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: E2j68buFYjT77SjLtnE7QmT8qZe7u54oteYM711rNWRx Next: none Diff:
OldNewDifferences
297297
298298
299299 func getStakeActions (i,userAddress) = {
300- let checks = [if ((size(i.payments) == 1))
300+ let checks = [if (if ((withdrawLockHeight == 0))
301+ then true
302+ else (withdrawLockHeight > height))
303+ then true
304+ else throwErr("stake is locked"), if ((size(i.payments) == 1))
301305 then true
302306 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
303307 then true
325329 func getWithdrawActions (i,lpAssetWithdrawAmount) = {
326330 let userAddress = toString(i.caller)
327331 let userLpAmount = getUserLpAmount(userAddress)
328- let check = [if ((lpAssetWithdrawAmount > 0))
332+ let check = [if (if ((withdrawLockHeight == 0))
333+ then true
334+ else (withdrawLockHeight > height))
335+ then true
336+ else throwErr("withdraw is locked"), if ((lpAssetWithdrawAmount > 0))
329337 then true
330338 else throwErr("LP amount should be more than 0"), if ((userLpAmount >= lpAssetWithdrawAmount))
331339 then true
348356
349357
350358 func getSetStakingNodeActions (userAddress,nodeAddress,nodeShare) = {
351- let check = [if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
359+ let check = [if (if ((withdrawLockHeight == 0))
360+ then true
361+ else (withdrawLockHeight > height))
362+ then true
363+ else throwErr("changing staking node is locked"), if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
352364 then true
353365 else throwErr("user address is not valid"), if ((size(fromBase58String(nodeAddress)) == ADDRESS_BYTES_SIZE))
354366 then true
405417 let lpAmountToWithdraw = calcLpFromAsset(withdrawAssetAmount)
406418 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
407419 let minWithdrawAssetAmount = toInt(fraction(getCurrentPrice(), toBigInt(1), scale18BigInt, CEILING))
408- let check = [if (if ((withdrawLockHeight == 0))
409- then true
410- else (withdrawLockHeight > height))
411- then true
412- else throwErr(makeString(["withdraw is locked at height:", toString(withdrawLockHeight)], " ")), if ((withdrawAssetAmount > 0))
420+ let check = [if ((withdrawAssetAmount > 0))
413421 then true
414422 else throwErr("withdraw amount should be more than 0"), if ((userAvailableAssetToWithdraw >= withdrawAssetAmount))
415423 then true
476484
477485 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90)
478486 }
479- let check = [if ((size(i.payments) == 1))
487+ let check = [if (if ((withdrawLockHeight == 0))
488+ then true
489+ else (withdrawLockHeight > height))
490+ then true
491+ else throwErr("airdrop is locked:"), if ((size(i.payments) == 1))
480492 then true
481493 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
482494 then true
490502 if ((check == check))
491503 then {
492504 func getAirdropStateChanges (accum,assetAmount) = {
493- let $t01542815479 = accum
494- let result = $t01542815479._1
495- let index = $t01542815479._2
496- let totalLp = $t01542815479._3
497- let processedList = $t01542815479._4
505+ let $t01567315724 = accum
506+ let result = $t01567315724._1
507+ let index = $t01567315724._2
508+ let totalLp = $t01567315724._3
509+ let processedList = $t01567315724._4
498510 let addressString = addressList[index]
499511 let address = match addressFromString(addressString) {
500512 case adr: Address =>
515527 else throw("Strict value is not equal to itself.")
516528 }
517529
518- let $t01624316360 = {
530+ let $t01648816605 = {
519531 let $l = amountList
520532 let $s = size($l)
521533 let $acc0 = $Tuple4(nil, 0, 0, nil)
529541
530542 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90)
531543 }
532- let airdropEntries = $t01624316360._1
533- let _a = $t01624316360._2
534- let addedTotalLockedLpAmount = $t01624316360._3
535- let _b = $t01624316360._4
544+ let airdropEntries = $t01648816605._1
545+ let _a = $t01648816605._2
546+ let addedTotalLockedLpAmount = $t01648816605._3
547+ let _b = $t01648816605._4
536548 let newTotalAsset = calcAssetFromLp((totalLpAmount + addedTotalLockedLpAmount))
537549 ([IntegerEntry(keyTotalLockedLpAmount, (totalLockedLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalLpAmount, (totalLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalAssetAmount, newTotalAsset), IntegerEntry(keyStartBlock, height)] ++ airdropEntries)
538550 }
549561 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
550562 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
551563 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
552- let $t01771017802 = getUserStakingNodesData(userAddress)
553- let userStakingNodesList = $t01771017802._1
554- let userStakingNodeSharesList = $t01771017802._2
564+ let $t01795518047 = getUserStakingNodesData(userAddress)
565+ let userStakingNodesList = $t01795518047._1
566+ let userStakingNodeSharesList = $t01795518047._2
555567 $Tuple2(nil, $Tuple10(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn, userLockedLpAmount, userLockedAssetAmount, userStakingNodesList, userStakingNodeSharesList, getRemainingBlocks()))
556568 }
557569
581593 }
582594
583595
584-@Verifier(tx)
585-func verify () = {
586- let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
587- let byOwner = if ((size(getAdminsList()) >= QUORUM))
588- then false
589- else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
590- if (byAdmins)
591- then true
592- else byOwner
593- }
594-
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFile = "l2mp_staking.ride"
55
66 let SEP = "__"
77
88 let scale8 = 100000000
99
1010 let scale18 = 1000000000000000000
1111
1212 let scale18BigInt = toBigInt(scale18)
1313
1414 let ADDRESS_BYTES_SIZE = 26
1515
1616 let BLOCKS_IN_DAY = 1440
1717
1818 func throwErr (msg) = throw(((contractFile + ": ") + msg))
1919
2020
2121 let keyAssetId = makeString(["%s", "assetId"], SEP)
2222
2323 let keyEmissionPerBlock = makeString(["%s", "emissionPerBlock"], SEP)
2424
2525 let keyEmissionPeriodInBlocks = makeString(["%s", "emissionPeriodInBlocks"], SEP)
2626
2727 let keyStartBlock = makeString(["%s", "startBlock"], SEP)
2828
2929 let keyTotalLpAmount = makeString(["%s", "totalLpAmount"], SEP)
3030
3131 let keyTotalAssetAmount = makeString(["%s", "totalAssetAmount"], SEP)
3232
3333 let keyTotalLockedLpAmount = makeString(["%s", "totalLockedLpAmount"], SEP)
3434
3535 let keyWithdrawLockHeight = makeString(["%s", "withdrawLockHeight"], SEP)
3636
3737 func keyUserLpAmount (userAddress) = makeString(["%s%s", "userLpAmount", userAddress], SEP)
3838
3939
4040 func keyUserLockedLpAmount (userAddress) = makeString(["%s%s", "userLockedLpAmount", userAddress], SEP)
4141
4242
4343 func keyUserStakingNodes (userAddress) = makeString(["%s%s", "userStakingNodes", userAddress], SEP)
4444
4545
4646 func keyUserStakingNodesShares (userAddress) = makeString(["%s%s", "userStakingNodesShares", userAddress], SEP)
4747
4848
4949 func keyUserTotalAssetWithdrawn (userAddress) = makeString(["%s%s", "totalAssetWithdrawn", userAddress], SEP)
5050
5151
5252 func keyUserTotalAssetStaked (userAddress) = makeString(["%s%s", "totalAssetStaked", userAddress], SEP)
5353
5454
5555 func keyHistory (type,userAddress,txId) = makeString(["%s%s%s", type, userAddress, toBase58String(txId)], SEP)
5656
5757
5858 func formatHistory (totalProfit,price,totalAssetAmount,totalLpAmount) = makeString(["%d%d%d%d", toString(totalProfit), toString(price), toString(totalAssetAmount), toString(totalLpAmount)], SEP)
5959
6060
6161 let totalLpAmount = valueOrElse(getInteger(this, keyTotalLpAmount), 0)
6262
6363 let totalAssetAmount = valueOrElse(getInteger(this, keyTotalAssetAmount), 0)
6464
6565 let totalLockedLpAmount = valueOrElse(getInteger(this, keyTotalLockedLpAmount), 0)
6666
6767 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
6868
6969 let assetIdBytes = if ((assetIdString == "WAVES"))
7070 then unit
7171 else fromBase58String(assetIdString)
7272
7373 let emissionPeriodInBlocks = valueOrElse(getInteger(this, keyEmissionPeriodInBlocks), BLOCKS_IN_DAY)
7474
7575 let emissionPerBlock = valueOrElse(getInteger(this, keyEmissionPerBlock), 0)
7676
7777 let emissionPerPeriod = (emissionPerBlock * emissionPeriodInBlocks)
7878
7979 let withdrawLockHeight = valueOrElse(getInteger(this, keyWithdrawLockHeight), 0)
8080
8181 let ADMIN_LIST_SIZE = 5
8282
8383 let QUORUM = 3
8484
8585 let TXID_BYTES_LENGTH = 32
8686
8787 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
8888
8989
9090 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
9191
9292
9393 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
9494
9595
9696 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
9797
9898
9999 func getAdminVote (prefix,admin) = {
100100 let voteKey = keyFullAdminVote(prefix, admin)
101101 valueOrElse(getInteger(voteKey), 0)
102102 }
103103
104104
105105 func getAdminsList () = match getString(this, keyAdminAddressList()) {
106106 case s: String =>
107107 split(s, SEP)
108108 case _ =>
109109 nil
110110 }
111111
112112
113113 func isInAdminList (address) = containsElement(getAdminsList(), address)
114114
115115
116116 func genVotesKeysHelper (a,adminAddress) = {
117117 let $t037513775 = a
118118 let result = $t037513775._1
119119 let prefix = $t037513775._2
120120 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
121121 }
122122
123123
124124 func genVotesKeys (keyPrefix) = {
125125 let adminList = keyAdminAddressList()
126126 let $t039224006 = {
127127 let $l = getAdminsList()
128128 let $s = size($l)
129129 let $acc0 = $Tuple2(nil, keyPrefix)
130130 func $f0_1 ($a,$i) = if (($i >= $s))
131131 then $a
132132 else genVotesKeysHelper($a, $l[$i])
133133
134134 func $f0_2 ($a,$i) = if (($i >= $s))
135135 then $a
136136 else throw("List size exceeds 5")
137137
138138 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
139139 }
140140 let result = $t039224006._1
141141 let prefix = $t039224006._2
142142 result
143143 }
144144
145145
146146 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
147147
148148
149149 func countVotes (prefix) = {
150150 let votes = genVotesKeys(prefix)
151151 let $l = votes
152152 let $s = size($l)
153153 let $acc0 = 0
154154 func $f0_1 ($a,$i) = if (($i >= $s))
155155 then $a
156156 else countVotesHelper($a, $l[$i])
157157
158158 func $f0_2 ($a,$i) = if (($i >= $s))
159159 then $a
160160 else throw("List size exceeds 5")
161161
162162 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
163163 }
164164
165165
166166 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
167167
168168
169169 func getClearVoteEntries (prefix) = {
170170 let votes = genVotesKeys(prefix)
171171 let $l = votes
172172 let $s = size($l)
173173 let $acc0 = nil
174174 func $f0_1 ($a,$i) = if (($i >= $s))
175175 then $a
176176 else clearVotesHelper($a, $l[$i])
177177
178178 func $f0_2 ($a,$i) = if (($i >= $s))
179179 then $a
180180 else throw("List size exceeds 5")
181181
182182 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
183183 }
184184
185185
186186 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
187187 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
188188 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
189189 let err = if (!(isInAdminList(callerAddressString)))
190190 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
191191 else if ((adminCurrentVote == 1))
192192 then throwErr((voteKey + " you already voted"))
193193 else unit
194194 if ((err == err))
195195 then {
196196 let votes = countVotes(keyPrefix)
197197 if (((votes + 1) >= minVotes))
198198 then {
199199 let clearVoteEntries = getClearVoteEntries(keyPrefix)
200200 (clearVoteEntries ++ voteResult)
201201 }
202202 else [IntegerEntry(voteKey, 1)]
203203 }
204204 else throw("Strict value is not equal to itself.")
205205 }
206206
207207
208208 func stringListToIntListHelper (acc,value) = (acc :+ parseIntValue(value))
209209
210210
211211 func calcTotalProfitForHeight (h) = {
212212 let startBlock = valueOrElse(getInteger(this, keyStartBlock), height)
213213 let startPeriod = fraction(startBlock, 1, emissionPeriodInBlocks)
214214 let elapsedPeriods = ((h / emissionPeriodInBlocks) - startPeriod)
215215 max([0, (emissionPerPeriod * elapsedPeriods)])
216216 }
217217
218218
219219 func calcTotalProfit () = calcTotalProfitForHeight(height)
220220
221221
222222 func getMaxAssetAvailable () = match assetIdBytes {
223223 case u: Unit =>
224224 wavesBalance(this).available
225225 case b: ByteVector =>
226226 assetBalance(this, b)
227227 case _ =>
228228 throw("Match error")
229229 }
230230
231231
232232 func getTotalAssetAmountWithProfitOrMaxAvailable () = {
233233 let totalAssetAmountWithProfit = (totalAssetAmount + calcTotalProfit())
234234 let totalAmount = min([totalAssetAmountWithProfit, getMaxAssetAvailable()])
235235 if ((totalLpAmount == 0))
236236 then 0
237237 else totalAmount
238238 }
239239
240240
241241 func getCurrentPrice () = if ((totalLpAmount != 0))
242242 then fraction(toBigInt(getTotalAssetAmountWithProfitOrMaxAvailable()), scale18BigInt, toBigInt(totalLpAmount))
243243 else scale18BigInt
244244
245245
246246 func getRemainingBlocks () = if ((emissionPerBlock == 0))
247247 then 0
248248 else fraction((getMaxAssetAvailable() - getTotalAssetAmountWithProfitOrMaxAvailable()), 1, emissionPerBlock)
249249
250250
251251 func getUserStakingNodesData (userAddress) = {
252252 let nodesRaw = valueOrElse(getString(this, keyUserStakingNodes(userAddress)), "")
253253 let sharesRaw = valueOrElse(getString(this, keyUserStakingNodesShares(userAddress)), "")
254254 let nodesList = if ((nodesRaw == ""))
255255 then nil
256256 else split(nodesRaw, SEP)
257257 let sharesStringList = if ((sharesRaw == ""))
258258 then nil
259259 else split(sharesRaw, SEP)
260260 let sharesList = {
261261 let $l = sharesStringList
262262 let $s = size($l)
263263 let $acc0 = nil
264264 func $f0_1 ($a,$i) = if (($i >= $s))
265265 then $a
266266 else stringListToIntListHelper($a, $l[$i])
267267
268268 func $f0_2 ($a,$i) = if (($i >= $s))
269269 then $a
270270 else throw("List size exceeds 20")
271271
272272 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
273273 }
274274 $Tuple2(nodesList, sharesList)
275275 }
276276
277277
278278 func calcAssetFromLp (lpAmount) = max([0, toInt(fraction(toBigInt(lpAmount), getCurrentPrice(), scale18BigInt))])
279279
280280
281281 func calcLpFromAsset (assetAmount) = max([0, toInt(fraction(toBigInt(assetAmount), scale18BigInt, getCurrentPrice()))])
282282
283283
284284 func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
285285
286286
287287 func getUserLockedLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLockedLpAmount(userAddress)), 0)
288288
289289
290290 func getUserAvailableAssetsToWithdraw (userAddress) = {
291291 let userLpAmount = getUserLpAmount(userAddress)
292292 calcAssetFromLp(userLpAmount)
293293 }
294294
295295
296296 func getClearStakingNodesActions (userAddress) = [DeleteEntry(keyUserStakingNodes(userAddress)), DeleteEntry(keyUserStakingNodesShares(userAddress))]
297297
298298
299299 func getStakeActions (i,userAddress) = {
300- let checks = [if ((size(i.payments) == 1))
300+ let checks = [if (if ((withdrawLockHeight == 0))
301+ then true
302+ else (withdrawLockHeight > height))
303+ then true
304+ else throwErr("stake is locked"), if ((size(i.payments) == 1))
301305 then true
302306 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
303307 then true
304308 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
305309 then true
306310 else "payment amount should be greater than 0", if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
307311 then true
308312 else throwErr("user address is not valid")]
309313 if ((checks == checks))
310314 then {
311315 let paymentAmount = i.payments[0].amount
312316 let paymentLpAmount = calcLpFromAsset(paymentAmount)
313317 let userLpAmount = getUserLpAmount(userAddress)
314318 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
315319 let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
316320 let newTotalAssetAmount = calcAssetFromLp(newTotalLpAmount)
317321 let newUserLpAmount = (userLpAmount + paymentLpAmount)
318322 let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
319323 [StringEntry(keyHistory("stake", userAddress, i.transactionId), formatHistory(calcTotalProfit(), getCurrentPrice(), totalLpAmount, totalAssetAmount)), IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetStaked(userAddress), newUserTotalStakedAmount), IntegerEntry(keyStartBlock, height)]
320324 }
321325 else throw("Strict value is not equal to itself.")
322326 }
323327
324328
325329 func getWithdrawActions (i,lpAssetWithdrawAmount) = {
326330 let userAddress = toString(i.caller)
327331 let userLpAmount = getUserLpAmount(userAddress)
328- let check = [if ((lpAssetWithdrawAmount > 0))
332+ let check = [if (if ((withdrawLockHeight == 0))
333+ then true
334+ else (withdrawLockHeight > height))
335+ then true
336+ else throwErr("withdraw is locked"), if ((lpAssetWithdrawAmount > 0))
329337 then true
330338 else throwErr("LP amount should be more than 0"), if ((userLpAmount >= lpAssetWithdrawAmount))
331339 then true
332340 else throwErr((("cannot withdraw more than available LP (" + toString(userLpAmount)) + ")"))]
333341 if ((check == check))
334342 then {
335343 let newUserLpAmount = (userLpAmount - lpAssetWithdrawAmount)
336344 let withdrawAssetAmount = calcAssetFromLp(lpAssetWithdrawAmount)
337345 let newTotalLpAmount = (totalLpAmount - lpAssetWithdrawAmount)
338346 let newTotalAssetAmount = calcAssetFromLp(newTotalLpAmount)
339347 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
340348 let newUserTotalAssetWithdrawn = (userTotalAssetWithdrawn + withdrawAssetAmount)
341349 let clearStakingNodesAction = if ((newUserLpAmount == 0))
342350 then getClearStakingNodesActions(userAddress)
343351 else nil
344352 ([StringEntry(keyHistory("withdraw", userAddress, i.transactionId), formatHistory(calcTotalProfit(), getCurrentPrice(), totalLpAmount, totalAssetAmount)), IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)] ++ clearStakingNodesAction)
345353 }
346354 else throw("Strict value is not equal to itself.")
347355 }
348356
349357
350358 func getSetStakingNodeActions (userAddress,nodeAddress,nodeShare) = {
351- let check = [if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
359+ let check = [if (if ((withdrawLockHeight == 0))
360+ then true
361+ else (withdrawLockHeight > height))
362+ then true
363+ else throwErr("changing staking node is locked"), if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
352364 then true
353365 else throwErr("user address is not valid"), if ((size(fromBase58String(nodeAddress)) == ADDRESS_BYTES_SIZE))
354366 then true
355367 else throwErr("node address is not valid")]
356368 if ((check == check))
357369 then [StringEntry(keyUserStakingNodes(userAddress), nodeAddress), StringEntry(keyUserStakingNodesShares(userAddress), toString(nodeShare))]
358370 else throw("Strict value is not equal to itself.")
359371 }
360372
361373
362374 @Callable(i)
363375 func setEmissionPerBlock (emissionPerBlock) = {
364376 let check = [if ((i.caller == this))
365377 then true
366378 else throwErr("permission denied")]
367379 if ((check == check))
368380 then [IntegerEntry(keyTotalAssetAmount, getTotalAssetAmountWithProfitOrMaxAvailable()), IntegerEntry(keyStartBlock, height), IntegerEntry(keyEmissionPerBlock, max([0, emissionPerBlock]))]
369381 else throw("Strict value is not equal to itself.")
370382 }
371383
372384
373385
374386 @Callable(i)
375387 func setEmissionPeriodInBlocks (p) = {
376388 let check = [if ((p > 0))
377389 then true
378390 else throwErr("emission period should be greater than 0"), if ((i.caller == this))
379391 then true
380392 else throwErr("permission denied")]
381393 if ((check == check))
382394 then [IntegerEntry(keyTotalAssetAmount, getTotalAssetAmountWithProfitOrMaxAvailable()), IntegerEntry(keyStartBlock, height), IntegerEntry(keyEmissionPeriodInBlocks, p)]
383395 else throw("Strict value is not equal to itself.")
384396 }
385397
386398
387399
388400 @Callable(i)
389401 func stake () = {
390402 let userAddress = toString(i.caller)
391403 getStakeActions(i, userAddress)
392404 }
393405
394406
395407
396408 @Callable(i)
397409 func stakeFor (userAddress) = getStakeActions(i, userAddress)
398410
399411
400412
401413 @Callable(i)
402414 func withdraw (withdrawAssetAmount) = {
403415 let userAddress = toString(i.caller)
404416 let userLpAmount = getUserLpAmount(userAddress)
405417 let lpAmountToWithdraw = calcLpFromAsset(withdrawAssetAmount)
406418 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
407419 let minWithdrawAssetAmount = toInt(fraction(getCurrentPrice(), toBigInt(1), scale18BigInt, CEILING))
408- let check = [if (if ((withdrawLockHeight == 0))
409- then true
410- else (withdrawLockHeight > height))
411- then true
412- else throwErr(makeString(["withdraw is locked at height:", toString(withdrawLockHeight)], " ")), if ((withdrawAssetAmount > 0))
420+ let check = [if ((withdrawAssetAmount > 0))
413421 then true
414422 else throwErr("withdraw amount should be more than 0"), if ((userAvailableAssetToWithdraw >= withdrawAssetAmount))
415423 then true
416424 else throwErr((("cannot withdraw more than available (" + toString(userAvailableAssetToWithdraw)) + ")")), if ((withdrawAssetAmount >= minWithdrawAssetAmount))
417425 then true
418426 else throwErr((("withdraw amount is too small. Min: (" + toString(minWithdrawAssetAmount)) + ")"))]
419427 if ((check == check))
420428 then getWithdrawActions(i, min([userLpAmount, (lpAmountToWithdraw + 1)]))
421429 else throw("Strict value is not equal to itself.")
422430 }
423431
424432
425433
426434 @Callable(i)
427435 func setStakingNode (nodeAddress) = {
428436 let userAddress = toString(i.caller)
429437 getSetStakingNodeActions(userAddress, nodeAddress, 100)
430438 }
431439
432440
433441
434442 @Callable(i)
435443 func stakeAndSetStakingNode (nodeAddress) = {
436444 let userAddress = toString(i.caller)
437445 (getStakeActions(i, userAddress) ++ getSetStakingNodeActions(userAddress, nodeAddress, 100))
438446 }
439447
440448
441449
442450 @Callable(i)
443451 func stakeForSwapHELPER (userAddress,nodeAddress) = {
444452 let check = [if ((toString(i.originCaller) == userAddress))
445453 then true
446454 else throwErr("i.originCaller should be equal to userAddress")]
447455 if ((check == check))
448456 then {
449457 let setStakingNodeActions = if ((nodeAddress == ""))
450458 then nil
451459 else getSetStakingNodeActions(userAddress, nodeAddress, 100)
452460 (getStakeActions(i, userAddress) ++ setStakingNodeActions)
453461 }
454462 else throw("Strict value is not equal to itself.")
455463 }
456464
457465
458466
459467 @Callable(i)
460468 func airdrop (addressList,amountList) = {
461469 func sum (accum,next) = if ((0 > next))
462470 then throwErr("negative amount value in amountList")
463471 else (accum + next)
464472
465473 let amountListSum = {
466474 let $l = amountList
467475 let $s = size($l)
468476 let $acc0 = 0
469477 func $f0_1 ($a,$i) = if (($i >= $s))
470478 then $a
471479 else sum($a, $l[$i])
472480
473481 func $f0_2 ($a,$i) = if (($i >= $s))
474482 then $a
475483 else throw("List size exceeds 90")
476484
477485 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90)
478486 }
479- let check = [if ((size(i.payments) == 1))
487+ let check = [if (if ((withdrawLockHeight == 0))
488+ then true
489+ else (withdrawLockHeight > height))
490+ then true
491+ else throwErr("airdrop is locked:"), if ((size(i.payments) == 1))
480492 then true
481493 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
482494 then true
483495 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
484496 then true
485497 else "payment amount should be greater than 0", if ((size(addressList) == size(amountList)))
486498 then true
487499 else throwErr("addressList should be same size as amountList"), if ((i.payments[0].amount >= amountListSum))
488500 then true
489501 else throwErr("payment amount is less than sum of amountList")]
490502 if ((check == check))
491503 then {
492504 func getAirdropStateChanges (accum,assetAmount) = {
493- let $t01542815479 = accum
494- let result = $t01542815479._1
495- let index = $t01542815479._2
496- let totalLp = $t01542815479._3
497- let processedList = $t01542815479._4
505+ let $t01567315724 = accum
506+ let result = $t01567315724._1
507+ let index = $t01567315724._2
508+ let totalLp = $t01567315724._3
509+ let processedList = $t01567315724._4
498510 let addressString = addressList[index]
499511 let address = match addressFromString(addressString) {
500512 case adr: Address =>
501513 adr
502514 case _ =>
503515 throwErr("invalid address in addressList")
504516 }
505517 let ch = [if (!(containsElement(processedList, address)))
506518 then true
507519 else throwErr("duplicate address is addressList")]
508520 if ((ch == ch))
509521 then {
510522 let addedLpAmount = calcLpFromAsset(assetAmount)
511523 let userLockedLpKey = keyUserLockedLpAmount(addressString)
512524 let oldLpAmount = valueOrElse(getInteger(this, userLockedLpKey), 0)
513525 $Tuple4((result :+ IntegerEntry(userLockedLpKey, (oldLpAmount + addedLpAmount))), (index + 1), (totalLp + addedLpAmount), (processedList :+ address))
514526 }
515527 else throw("Strict value is not equal to itself.")
516528 }
517529
518- let $t01624316360 = {
530+ let $t01648816605 = {
519531 let $l = amountList
520532 let $s = size($l)
521533 let $acc0 = $Tuple4(nil, 0, 0, nil)
522534 func $f1_1 ($a,$i) = if (($i >= $s))
523535 then $a
524536 else getAirdropStateChanges($a, $l[$i])
525537
526538 func $f1_2 ($a,$i) = if (($i >= $s))
527539 then $a
528540 else throw("List size exceeds 90")
529541
530542 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90)
531543 }
532- let airdropEntries = $t01624316360._1
533- let _a = $t01624316360._2
534- let addedTotalLockedLpAmount = $t01624316360._3
535- let _b = $t01624316360._4
544+ let airdropEntries = $t01648816605._1
545+ let _a = $t01648816605._2
546+ let addedTotalLockedLpAmount = $t01648816605._3
547+ let _b = $t01648816605._4
536548 let newTotalAsset = calcAssetFromLp((totalLpAmount + addedTotalLockedLpAmount))
537549 ([IntegerEntry(keyTotalLockedLpAmount, (totalLockedLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalLpAmount, (totalLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalAssetAmount, newTotalAsset), IntegerEntry(keyStartBlock, height)] ++ airdropEntries)
538550 }
539551 else throw("Strict value is not equal to itself.")
540552 }
541553
542554
543555
544556 @Callable(i)
545557 func getUserAssetsREADONLY (userAddress) = {
546558 let userLpAmount = getUserLpAmount(userAddress)
547559 let userLockedLpAmount = getUserLockedLpAmount(userAddress)
548560 let userLockedAssetAmount = calcAssetFromLp(userLockedLpAmount)
549561 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
550562 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
551563 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
552- let $t01771017802 = getUserStakingNodesData(userAddress)
553- let userStakingNodesList = $t01771017802._1
554- let userStakingNodeSharesList = $t01771017802._2
564+ let $t01795518047 = getUserStakingNodesData(userAddress)
565+ let userStakingNodesList = $t01795518047._1
566+ let userStakingNodeSharesList = $t01795518047._2
555567 $Tuple2(nil, $Tuple10(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn, userLockedLpAmount, userLockedAssetAmount, userStakingNodesList, userStakingNodeSharesList, getRemainingBlocks()))
556568 }
557569
558570
559571
560572 @Callable(i)
561573 func getTotalAssetsREADONLY () = $Tuple2(nil, $Tuple6(totalLpAmount, getTotalAssetAmountWithProfitOrMaxAvailable(), getCurrentPrice(), totalLockedLpAmount, calcAssetFromLp(totalLockedLpAmount), getRemainingBlocks()))
562574
563575
564576
565577 @Callable(i)
566578 func voteForTxId (txId) = {
567579 let callerAddressString = toBase58String(i.caller.bytes)
568580 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
569581 let result = [StringEntry(keyAllowedTxId(), txId)]
570582 let allowedTxIdOption = getString(this, keyAllowedTxId())
571583 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
572584 then true
573585 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
574586 then true
575587 else (value(allowedTxIdOption) != txId))
576588 then true
577589 else throwErr((txId + " is already allowed"))]
578590 if ((err == err))
579591 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
580592 else throw("Strict value is not equal to itself.")
581593 }
582594
583595
584-@Verifier(tx)
585-func verify () = {
586- let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
587- let byOwner = if ((size(getAdminsList()) >= QUORUM))
588- then false
589- else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
590- if (byAdmins)
591- then true
592- else byOwner
593- }
594-

github/deemru/w8io/6500d08 
67.45 ms