2024.04.17 09:31 [3066416] smart account 3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS > SELF 0.00000000 Waves

{ "type": 13, "id": "2TfAUi8mKJujJz9uxrxqcGeDcoLgnWZwsb9HkwwkmmxQ", "fee": 2400000, "feeAssetId": null, "timestamp": 1713335500639, "version": 2, "chainId": 84, "sender": "3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS", "senderPublicKey": "8h7G4haeVwXKNHXNHsWkC1miUp5CQtk3WmpBKazQPxRh", "proofs": [ "4gc7KcgVavWNrXRe5xXHoy8AFgte5ibBJUJNunMEeBysjxMSfzdmM6wBHfvuRbaSPp1pfEAWMEA2rS1urdCkRy6y" ], "script": "base64:BgI6CAISAwoBARIDCgEBEgASAwoBCBIDCgEBEgMKAQgSAwoBCBIECgIICBIECgIYERIDCgEIEgASAwoBCEMADGNvbnRyYWN0RmlsZQIRbDJtcF9zdGFraW5nLnJpZGUAA1NFUAICX18ABnNjYWxlOACAwtcvAAdzY2FsZTE4AICAkLu61q3wDQANc2NhbGUxOEJpZ0ludAkAtgIBBQdzY2FsZTE4ABJBRERSRVNTX0JZVEVTX1NJWkUAGgANQkxPQ0tTX0lOX0RBWQCgCwEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAATa2V5RW1pc3Npb25QZXJCbG9jawkAuQkCCQDMCAICAiVzCQDMCAICEGVtaXNzaW9uUGVyQmxvY2sFA25pbAUDU0VQABlrZXlFbWlzc2lvblBlcmlvZEluQmxvY2tzCQC5CQIJAMwIAgICJXMJAMwIAgIWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwUDbmlsBQNTRVAADWtleVN0YXJ0QmxvY2sJALkJAgkAzAgCAgIlcwkAzAgCAgpzdGFydEJsb2NrBQNuaWwFA1NFUAAQa2V5VG90YWxMcEFtb3VudAkAuQkCCQDMCAICAiVzCQDMCAICDXRvdGFsTHBBbW91bnQFA25pbAUDU0VQABNrZXlUb3RhbEFzc2V0QW1vdW50CQC5CQIJAMwIAgICJXMJAMwIAgIQdG90YWxBc3NldEFtb3VudAUDbmlsBQNTRVAAFmtleVRvdGFsTG9ja2VkTHBBbW91bnQJALkJAgkAzAgCAgIlcwkAzAgCAhN0b3RhbExvY2tlZExwQW1vdW50BQNuaWwFA1NFUAAVa2V5V2l0aGRyYXdMb2NrSGVpZ2h0CQC5CQIJAMwIAgICJXMJAMwIAgISd2l0aGRyYXdMb2NrSGVpZ2h0BQNuaWwFA1NFUAEPa2V5VXNlckxwQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIMdXNlckxwQW1vdW50CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEVa2V5VXNlckxvY2tlZExwQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgISdXNlckxvY2tlZExwQW1vdW50CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAETa2V5VXNlclN0YWtpbmdOb2RlcwELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICEHVzZXJTdGFraW5nTm9kZXMJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARlrZXlVc2VyU3Rha2luZ05vZGVzU2hhcmVzAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIWdXNlclN0YWtpbmdOb2Rlc1NoYXJlcwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITdG90YWxBc3NldFdpdGhkcmF3bgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdG90YWxBc3NldFN0YWtlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABCmtleUhpc3RvcnkDBHR5cGULdXNlckFkZHJlc3MEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQR0eXBlCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJANgEAQUEdHhJZAUDbmlsBQNTRVABDWZvcm1hdEhpc3RvcnkEC3RvdGFsUHJvZml0BXByaWNlEHRvdGFsQXNzZXRBbW91bnQNdG90YWxMcEFtb3VudAkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQULdG90YWxQcm9maXQJAMwIAgkApgMBBQVwcmljZQkAzAgCCQCkAwEFEHRvdGFsQXNzZXRBbW91bnQJAMwIAgkApAMBBQ10b3RhbExwQW1vdW50BQNuaWwFA1NFUAANdG90YWxMcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRBrZXlUb3RhbExwQW1vdW50AAAAEHRvdGFsQXNzZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUTa2V5VG90YWxBc3NldEFtb3VudAAAABN0b3RhbExvY2tlZExwQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFmtleVRvdGFsTG9ja2VkTHBBbW91bnQAAAANYXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQprZXlBc3NldElkAgVXQVZFUwAMYXNzZXRJZEJ5dGVzAwkAAAIFDWFzc2V0SWRTdHJpbmcCBVdBVkVTBQR1bml0CQDZBAEFDWFzc2V0SWRTdHJpbmcAFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5RW1pc3Npb25QZXJpb2RJbkJsb2NrcwUNQkxPQ0tTX0lOX0RBWQAQZW1pc3Npb25QZXJCbG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRNrZXlFbWlzc2lvblBlckJsb2NrAAAAEWVtaXNzaW9uUGVyUGVyaW9kCQBoAgUQZW1pc3Npb25QZXJCbG9jawUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwASd2l0aGRyYXdMb2NrSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFWtleVdpdGhkcmF3TG9ja0hlaWdodAAAAA9BRE1JTl9MSVNUX1NJWkUABQAGUVVPUlVNAAMAEVRYSURfQllURVNfTEVOR1RIACABGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAglhbGxvd1R4SWQJAMwIAgUEdHhJZAUDbmlsBQNTRVABEGtleUZ1bGxBZG1pblZvdGUCBnByZWZpeAxhZG1pbkFkZHJlc3MJALkJAgkAzAgCBQZwcmVmaXgJAMwIAgUMYWRtaW5BZGRyZXNzBQNuaWwFA1NFUAETa2V5QWRtaW5BZGRyZXNzTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhBhZG1pbkFkZHJlc3NMaXN0BQNuaWwFA1NFUAEOa2V5QWxsb3dlZFR4SWQACQC5CQIJAMwIAgICJXMJAMwIAgIEdHhJZAUDbmlsBQNTRVABDGdldEFkbWluVm90ZQIGcHJlZml4BWFkbWluBAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQ1nZXRBZG1pbnNMaXN0AAQHJG1hdGNoMAkAnQgCBQR0aGlzCQETa2V5QWRtaW5BZGRyZXNzTGlzdAADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQC1CQIFAXMFA1NFUAUDbmlsAQ1pc0luQWRtaW5MaXN0AQdhZGRyZXNzCQEPY29udGFpbnNFbGVtZW50AgkBDWdldEFkbWluc0xpc3QABQdhZGRyZXNzARJnZW5Wb3Rlc0tleXNIZWxwZXICAWEMYWRtaW5BZGRyZXNzBAskdDAzNzUxMzc3NQUBYQQGcmVzdWx0CAULJHQwMzc1MTM3NzUCXzEEBnByZWZpeAgFCyR0MDM3NTEzNzc1Al8yCQCUCgIJAM0IAgUGcmVzdWx0CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUMYWRtaW5BZGRyZXNzBQZwcmVmaXgBDGdlblZvdGVzS2V5cwEJa2V5UHJlZml4BAlhZG1pbkxpc3QJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAQLJHQwMzkyMjQwMDYKAAIkbAkBDWdldEFkbWluc0xpc3QACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFCWtleVByZWZpeAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQESZ2VuVm90ZXNLZXlzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQGcmVzdWx0CAULJHQwMzkyMjQwMDYCXzEEBnByZWZpeAgFCyR0MDM5MjI0MDA2Al8yBQZyZXN1bHQBEGNvdW50Vm90ZXNIZWxwZXICBnJlc3VsdAd2b3RlS2V5CQBkAgUGcmVzdWx0CQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAEKY291bnRWb3RlcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY291bnRWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBEGNsZWFyVm90ZXNIZWxwZXICBnJlc3VsdANrZXkJAM0IAgUGcmVzdWx0CQELRGVsZXRlRW50cnkBBQNrZXkBE2dldENsZWFyVm90ZUVudHJpZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNsZWFyVm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAQx2b3RlSU5URVJOQUwEE2NhbGxlckFkZHJlc3NTdHJpbmcJa2V5UHJlZml4CG1pblZvdGVzCnZvdGVSZXN1bHQEB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBBBhZG1pbkN1cnJlbnRWb3RlCQEMZ2V0QWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBANlcnIDCQEBIQEJAQ1pc0luQWRtaW5MaXN0AQUTY2FsbGVyQWRkcmVzc1N0cmluZwkBCHRocm93RXJyAQkArAICCQCsAgICCUFkZHJlc3M6IAUTY2FsbGVyQWRkcmVzc1N0cmluZwISIG5vdCBpbiBBZG1pbiBsaXN0AwkAAAIFEGFkbWluQ3VycmVudFZvdGUAAQkBCHRocm93RXJyAQkArAICBQd2b3RlS2V5AhIgeW91IGFscmVhZHkgdm90ZWQFBHVuaXQDCQAAAgUDZXJyBQNlcnIEBXZvdGVzCQEKY291bnRWb3RlcwEFCWtleVByZWZpeAMJAGcCCQBkAgUFdm90ZXMAAQUIbWluVm90ZXMEEGNsZWFyVm90ZUVudHJpZXMJARNnZXRDbGVhclZvdGVFbnRyaWVzAQUJa2V5UHJlZml4CQDOCAIFEGNsZWFyVm90ZUVudHJpZXMFCnZvdGVSZXN1bHQJAMwIAgkBDEludGVnZXJFbnRyeQIFB3ZvdGVLZXkAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARlzdHJpbmdMaXN0VG9JbnRMaXN0SGVscGVyAgNhY2MFdmFsdWUJAM0IAgUDYWNjCQENcGFyc2VJbnRWYWx1ZQEFBXZhbHVlARhjYWxjVG90YWxQcm9maXRGb3JIZWlnaHQBAWgECnN0YXJ0QmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUNa2V5U3RhcnRCbG9jawUGaGVpZ2h0BAtzdGFydFBlcmlvZAkAawMFCnN0YXJ0QmxvY2sAAQUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwQOZWxhcHNlZFBlcmlvZHMJAGUCCQBpAgUBaAUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwULc3RhcnRQZXJpb2QJAJYDAQkAzAgCAAAJAMwIAgkAaAIFEWVtaXNzaW9uUGVyUGVyaW9kBQ5lbGFwc2VkUGVyaW9kcwUDbmlsAQ9jYWxjVG90YWxQcm9maXQACQEYY2FsY1RvdGFsUHJvZml0Rm9ySGVpZ2h0AQUGaGVpZ2h0ARRnZXRNYXhBc3NldEF2YWlsYWJsZQAEByRtYXRjaDAFDGFzc2V0SWRCeXRlcwMJAAECBQckbWF0Y2gwAgRVbml0BAF1BQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDwBwIFBHRoaXMFAWIJAAIBAgtNYXRjaCBlcnJvcgErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAEGnRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0CQBkAgUQdG90YWxBc3NldEFtb3VudAkBD2NhbGNUb3RhbFByb2ZpdAAEC3RvdGFsQW1vdW50CQCXAwEJAMwIAgUadG90YWxBc3NldEFtb3VudFdpdGhQcm9maXQJAMwIAgkBFGdldE1heEFzc2V0QXZhaWxhYmxlAAUDbmlsAwkAAAIFDXRvdGFsTHBBbW91bnQAAAAABQt0b3RhbEFtb3VudAEPZ2V0Q3VycmVudFByaWNlAAMJAQIhPQIFDXRvdGFsTHBBbW91bnQAAAkAvAIDCQC2AgEJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAUNc2NhbGUxOEJpZ0ludAkAtgIBBQ10b3RhbExwQW1vdW50BQ1zY2FsZTE4QmlnSW50ARJnZXRSZW1haW5pbmdCbG9ja3MAAwkAAAIFEGVtaXNzaW9uUGVyQmxvY2sAAAAACQBrAwkAZQIJARRnZXRNYXhBc3NldEF2YWlsYWJsZQAJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAABBRBlbWlzc2lvblBlckJsb2NrARdnZXRVc2VyU3Rha2luZ05vZGVzRGF0YQELdXNlckFkZHJlc3MECG5vZGVzUmF3CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJARNrZXlVc2VyU3Rha2luZ05vZGVzAQULdXNlckFkZHJlc3MCAAQJc2hhcmVzUmF3CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJARlrZXlVc2VyU3Rha2luZ05vZGVzU2hhcmVzAQULdXNlckFkZHJlc3MCAAQJbm9kZXNMaXN0AwkAAAIFCG5vZGVzUmF3AgAFA25pbAkAtQkCBQhub2Rlc1JhdwUDU0VQBBBzaGFyZXNTdHJpbmdMaXN0AwkAAAIFCXNoYXJlc1JhdwIABQNuaWwJALUJAgUJc2hhcmVzUmF3BQNTRVAECnNoYXJlc0xpc3QKAAIkbAUQc2hhcmVzU3RyaW5nTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEZc3RyaW5nTGlzdFRvSW50TGlzdEhlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUCQCUCgIFCW5vZGVzTGlzdAUKc2hhcmVzTGlzdAEPY2FsY0Fzc2V0RnJvbUxwAQhscEFtb3VudAkAlgMBCQDMCAIAAAkAzAgCCQCgAwEJALwCAwkAtgIBBQhscEFtb3VudAkBD2dldEN1cnJlbnRQcmljZQAFDXNjYWxlMThCaWdJbnQFA25pbAEPY2FsY0xwRnJvbUFzc2V0AQthc3NldEFtb3VudAkAlgMBCQDMCAIAAAkAzAgCCQCgAwEJALwCAwkAtgIBBQthc3NldEFtb3VudAUNc2NhbGUxOEJpZ0ludAkBD2dldEN1cnJlbnRQcmljZQAFA25pbAEPZ2V0VXNlckxwQW1vdW50AQt1c2VyQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPa2V5VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MAAAEVZ2V0VXNlckxvY2tlZExwQW1vdW50AQt1c2VyQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEVa2V5VXNlckxvY2tlZExwQW1vdW50AQULdXNlckFkZHJlc3MAAAEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBC3VzZXJBZGRyZXNzBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwkBD2NhbGNBc3NldEZyb21McAEFDHVzZXJMcEFtb3VudAEbZ2V0Q2xlYXJTdGFraW5nTm9kZXNBY3Rpb25zAQt1c2VyQWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQETa2V5VXNlclN0YWtpbmdOb2RlcwEFC3VzZXJBZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJARlrZXlVc2VyU3Rha2luZ05vZGVzU2hhcmVzAQULdXNlckFkZHJlc3MFA25pbAEPZ2V0U3Rha2VBY3Rpb25zAgFpC3VzZXJBZGRyZXNzBAZjaGVja3MJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAhhzaG91bGQgaW5jbHVkZSAxIHBheW1lbnQJAMwIAgMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDGFzc2V0SWRCeXRlcwYJAQh0aHJvd0VycgEJAKwCAgIVcGF5bWVudCBzaG91bGQgYmUgaW4gBQ1hc3NldElkU3RyaW5nCQDMCAIDCQBmAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAYCJ3BheW1lbnQgYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAAAIJAMgBAQkA2QQBBQt1c2VyQWRkcmVzcwUSQUREUkVTU19CWVRFU19TSVpFBgkBCHRocm93RXJyAQIZdXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA1wYXltZW50QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQPcGF5bWVudExwQW1vdW50CQEPY2FsY0xwRnJvbUFzc2V0AQUNcGF5bWVudEFtb3VudAQMdXNlckxwQW1vdW50CQEPZ2V0VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MEFXVzZXJUb3RhbFN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwAABBBuZXdUb3RhbExwQW1vdW50CQBkAgUNdG90YWxMcEFtb3VudAUPcGF5bWVudExwQW1vdW50BBNuZXdUb3RhbEFzc2V0QW1vdW50CQEPY2FsY0Fzc2V0RnJvbUxwAQUQbmV3VG90YWxMcEFtb3VudAQPbmV3VXNlckxwQW1vdW50CQBkAgUMdXNlckxwQW1vdW50BQ9wYXltZW50THBBbW91bnQEGG5ld1VzZXJUb3RhbFN0YWtlZEFtb3VudAkAZAIFFXVzZXJUb3RhbFN0YWtlZEFtb3VudAUNcGF5bWVudEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5SGlzdG9yeQMCBXN0YWtlBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAkBDWZvcm1hdEhpc3RvcnkECQEPY2FsY1RvdGFsUHJvZml0AAkBD2dldEN1cnJlbnRQcmljZQAFDXRvdGFsTHBBbW91bnQFEHRvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQFEG5ld1RvdGFsTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFE25ld1RvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwUPbmV3VXNlckxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwUYbmV3VXNlclRvdGFsU3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgESZ2V0V2l0aGRyYXdBY3Rpb25zAgFpFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQFY2hlY2sJAMwIAgMJAGYCBRVscEFzc2V0V2l0aGRyYXdBbW91bnQAAAYJAQh0aHJvd0VycgECH0xQIGFtb3VudCBzaG91bGQgYmUgbW9yZSB0aGFuIDAJAMwIAgMJAGcCBQx1c2VyTHBBbW91bnQFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAYJAQh0aHJvd0VycgEJAKwCAgkArAICAihjYW5ub3Qgd2l0aGRyYXcgbW9yZSB0aGFuIGF2YWlsYWJsZSBMUCAoCQCkAwEFDHVzZXJMcEFtb3VudAIBKQUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawQPbmV3VXNlckxwQW1vdW50CQBlAgUMdXNlckxwQW1vdW50BRVscEFzc2V0V2l0aGRyYXdBbW91bnQEE3dpdGhkcmF3QXNzZXRBbW91bnQJAQ9jYWxjQXNzZXRGcm9tTHABBRVscEFzc2V0V2l0aGRyYXdBbW91bnQEEG5ld1RvdGFsTHBBbW91bnQJAGUCBQ10b3RhbExwQW1vdW50BRVscEFzc2V0V2l0aGRyYXdBbW91bnQEE25ld1RvdGFsQXNzZXRBbW91bnQJAQ9jYWxjQXNzZXRGcm9tTHABBRBuZXdUb3RhbExwQW1vdW50BBd1c2VyVG90YWxBc3NldFdpdGhkcmF3bgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEaa2V5VXNlclRvdGFsQXNzZXRXaXRoZHJhd24BBQt1c2VyQWRkcmVzcwAABBpuZXdVc2VyVG90YWxBc3NldFdpdGhkcmF3bgkAZAIFF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduBRN3aXRoZHJhd0Fzc2V0QW1vdW50BBdjbGVhclN0YWtpbmdOb2Rlc0FjdGlvbgMJAAACBQ9uZXdVc2VyTHBBbW91bnQAAAkBG2dldENsZWFyU3Rha2luZ05vZGVzQWN0aW9ucwEFC3VzZXJBZGRyZXNzBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5SGlzdG9yeQMCCHdpdGhkcmF3BQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAkBDWZvcm1hdEhpc3RvcnkECQEPY2FsY1RvdGFsUHJvZml0AAkBD2dldEN1cnJlbnRQcmljZQAFDXRvdGFsTHBBbW91bnQFEHRvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQFEG5ld1RvdGFsTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFE25ld1RvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwUPbmV3VXNlckxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5VXNlclRvdGFsQXNzZXRXaXRoZHJhd24BBQt1c2VyQWRkcmVzcwUabmV3VXNlclRvdGFsQXNzZXRXaXRoZHJhd24JAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFE3dpdGhkcmF3QXNzZXRBbW91bnQFDGFzc2V0SWRCeXRlcwUDbmlsBRdjbGVhclN0YWtpbmdOb2Rlc0FjdGlvbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEYZ2V0U2V0U3Rha2luZ05vZGVBY3Rpb25zAwt1c2VyQWRkcmVzcwtub2RlQWRkcmVzcwlub2RlU2hhcmUEBWNoZWNrCQDMCAIDCQAAAgkAyAEBCQDZBAEFC3VzZXJBZGRyZXNzBRJBRERSRVNTX0JZVEVTX1NJWkUGCQEIdGhyb3dFcnIBAhl1c2VyIGFkZHJlc3MgaXMgbm90IHZhbGlkCQDMCAIDCQAAAgkAyAEBCQDZBAEFC25vZGVBZGRyZXNzBRJBRERSRVNTX0JZVEVTX1NJWkUGCQEIdGhyb3dFcnIBAhlub2RlIGFkZHJlc3MgaXMgbm90IHZhbGlkBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlVc2VyU3Rha2luZ05vZGVzAQULdXNlckFkZHJlc3MFC25vZGVBZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARlrZXlVc2VyU3Rha2luZ05vZGVzU2hhcmVzAQULdXNlckFkZHJlc3MJAKQDAQUJbm9kZVNoYXJlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4MAWkBE3NldEVtaXNzaW9uUGVyQmxvY2sBEGVtaXNzaW9uUGVyQmxvY2sEBWNoZWNrCQDMCAIDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa2V5U3RhcnRCbG9jawUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlFbWlzc2lvblBlckJsb2NrCQCWAwEJAMwIAgAACQDMCAIFEGVtaXNzaW9uUGVyQmxvY2sFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGXNldEVtaXNzaW9uUGVyaW9kSW5CbG9ja3MBAXAEBWNoZWNrCQDMCAIDCQBmAgUBcAAABgkBCHRocm93RXJyAQIoZW1pc3Npb24gcGVyaW9kIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlUb3RhbEFzc2V0QW1vdW50CQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUZa2V5RW1pc3Npb25QZXJpb2RJbkJsb2NrcwUBcAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXN0YWtlAAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQEPZ2V0U3Rha2VBY3Rpb25zAgUBaQULdXNlckFkZHJlc3MBaQEIc3Rha2VGb3IBC3VzZXJBZGRyZXNzCQEPZ2V0U3Rha2VBY3Rpb25zAgUBaQULdXNlckFkZHJlc3MBaQEId2l0aGRyYXcBE3dpdGhkcmF3QXNzZXRBbW91bnQEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQMdXNlckxwQW1vdW50CQEPZ2V0VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MEEmxwQW1vdW50VG9XaXRoZHJhdwkBD2NhbGNMcEZyb21Bc3NldAEFE3dpdGhkcmF3QXNzZXRBbW91bnQEHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcJASBnZXRVc2VyQXZhaWxhYmxlQXNzZXRzVG9XaXRoZHJhdwEFC3VzZXJBZGRyZXNzBBZtaW5XaXRoZHJhd0Fzc2V0QW1vdW50CQCgAwEJAL0CBAkBD2dldEN1cnJlbnRQcmljZQAJALYCAQABBQ1zY2FsZTE4QmlnSW50BQdDRUlMSU5HBAVjaGVjawkAzAgCAwMJAAACBRJ3aXRoZHJhd0xvY2tIZWlnaHQAAAYJAGYCBRJ3aXRoZHJhd0xvY2tIZWlnaHQFBmhlaWdodAYJAQh0aHJvd0VycgEJALkJAgkAzAgCAh13aXRoZHJhdyBpcyBsb2NrZWQgYXQgaGVpZ2h0OgkAzAgCCQCkAwEFEndpdGhkcmF3TG9ja0hlaWdodAUDbmlsAgEgCQDMCAIDCQBmAgUTd2l0aGRyYXdBc3NldEFtb3VudAAABgkBCHRocm93RXJyAQIld2l0aGRyYXcgYW1vdW50IHNob3VsZCBiZSBtb3JlIHRoYW4gMAkAzAgCAwkAZwIFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcFE3dpdGhkcmF3QXNzZXRBbW91bnQGCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIlY2Fubm90IHdpdGhkcmF3IG1vcmUgdGhhbiBhdmFpbGFibGUgKAkApAMBBRx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3AgEpCQDMCAIDCQBnAgUTd2l0aGRyYXdBc3NldEFtb3VudAUWbWluV2l0aGRyYXdBc3NldEFtb3VudAYJAQh0aHJvd0VycgEJAKwCAgkArAICAiR3aXRoZHJhdyBhbW91bnQgaXMgdG9vIHNtYWxsLiBNaW46ICgJAKQDAQUWbWluV2l0aGRyYXdBc3NldEFtb3VudAIBKQUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkBEmdldFdpdGhkcmF3QWN0aW9ucwIFAWkJAJcDAQkAzAgCBQx1c2VyTHBBbW91bnQJAMwIAgkAZAIFEmxwQW1vdW50VG9XaXRoZHJhdwABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOc2V0U3Rha2luZ05vZGUBC25vZGVBZGRyZXNzBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJARhnZXRTZXRTdGFraW5nTm9kZUFjdGlvbnMDBQt1c2VyQWRkcmVzcwULbm9kZUFkZHJlc3MAZAFpARZzdGFrZUFuZFNldFN0YWtpbmdOb2RlAQtub2RlQWRkcmVzcwQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQDOCAIJAQ9nZXRTdGFrZUFjdGlvbnMCBQFpBQt1c2VyQWRkcmVzcwkBGGdldFNldFN0YWtpbmdOb2RlQWN0aW9ucwMFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwBkAWkBEnN0YWtlRm9yU3dhcEhFTFBFUgILdXNlckFkZHJlc3MLbm9kZUFkZHJlc3MEBWNoZWNrCQDMCAIDCQAAAgkApQgBCAUBaQxvcmlnaW5DYWxsZXIFC3VzZXJBZGRyZXNzBgkBCHRocm93RXJyAQItaS5vcmlnaW5DYWxsZXIgc2hvdWxkIGJlIGVxdWFsIHRvIHVzZXJBZGRyZXNzBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBBVzZXRTdGFraW5nTm9kZUFjdGlvbnMDCQAAAgULbm9kZUFkZHJlc3MCAAUDbmlsCQEYZ2V0U2V0U3Rha2luZ05vZGVBY3Rpb25zAwULdXNlckFkZHJlc3MFC25vZGVBZGRyZXNzAGQJAM4IAgkBD2dldFN0YWtlQWN0aW9ucwIFAWkFC3VzZXJBZGRyZXNzBRVzZXRTdGFraW5nTm9kZUFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90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ZiBhbW91bnRMaXN0BQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCgEWZ2V0QWlyZHJvcFN0YXRlQ2hhbmdlcwIFYWNjdW0LYXNzZXRBbW91bnQEDSR0MDE1NDI4MTU0NzkFBWFjY3VtBAZyZXN1bHQIBQ0kdDAxNTQyODE1NDc5Al8xBAVpbmRleAgFDSR0MDE1NDI4MTU0NzkCXzIEB3RvdGFsTHAIBQ0kdDAxNTQyODE1NDc5Al8zBA1wcm9jZXNzZWRMaXN0CAUNJHQwMTU0MjgxNTQ3OQJfNAQNYWRkcmVzc1N0cmluZwkAkQMCBQthZGRyZXNzTGlzdAUFaW5kZXgEB2FkZHJlc3MEByRtYXRjaDAJAKYIAQUNYWRkcmVzc1N0cmluZwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBANhZHIFByRtYXRjaDAFA2FkcgkBCHRocm93RXJyAQIeaW52YWxpZCBhZGRyZXNzIGluIGFkZHJlc3NMaXN0BAJjaAkAzAgCAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUNcHJvY2Vzc2VkTGlzdAUHYWRkcmVzcwYJAQh0aHJvd0VycgECIGR1cGxpY2F0ZSBhZGRyZXNzIGlzIGFkZHJlc3NMaXN0BQNuaWwDCQAAAgUCY2gFAmNoBA1hZGRlZExwQW1vdW50CQEPY2FsY0xwRnJvbUFzc2V0AQULYXNzZXRBbW91bnQED3VzZXJMb2NrZWRMcEtleQkBFWtleVVzZXJMb2NrZWRMcEFtb3VudAEFDWFkZHJlc3NTdHJpbmcEC29sZExwQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD3VzZXJMb2NrZWRMcEtleQAACQCWCgQJAM0IAgUGcmVzdWx0CQEMSW50ZWdlckVudHJ5AgUPdXNlckxvY2tlZExwS2V5CQBkAgULb2xkTHBBbW91bnQFDWFkZGVkTHBBbW91bnQJAGQCBQVpbmRleAABCQBkAgUHdG90YWxMcAUNYWRkZWRMcEFtb3VudAkAzQgCBQ1wcm9jZXNzZWRMaXN0BQdhZGRyZXNzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAxNjI0MzE2MzYwCgACJGwFCmFtb3VudExpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAAAAAAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEWZ2V0QWlyZHJvcFN0YXRlQ2hhbmdlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgOTAJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoEDmFpcmRyb3BFbnRyaWVzCAUNJHQwMTYyNDMxNjM2MAJfMQQCX2EIBQ0kdDAxNjI0MzE2MzYwAl8yBBhhZGRlZFRvdGFsTG9ja2VkTHBBbW91bnQIBQ0kdDAxNjI0MzE2MzYwAl8zBAJfYggFDSR0MDE2MjQzMTYzNjACXzQEDW5ld1RvdGFsQXNzZXQJAQ9jYWxjQXNzZXRGcm9tTHABCQBkAgUNdG90YWxMcEFtb3VudAUYYWRkZWRUb3RhbExvY2tlZExwQW1vdW50CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFFmtleVRvdGFsTG9ja2VkTHBBbW91bnQJAGQCBRN0b3RhbExvY2tlZExwQW1vdW50BRhhZGRlZFRvdGFsTG9ja2VkTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQJAGQCBQ10b3RhbExwQW1vdW50BRhhZGRlZFRvdGFsTG9ja2VkTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFDW5ld1RvdGFsQXNzZXQJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAUDbmlsBQ5haXJkcm9wRW50cmllcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVnZXRVc2VyQXNzZXRzUkVBRE9OTFkBC3VzZXJBZGRyZXNzBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQSdXNlckxvY2tlZExwQW1vdW50CQEVZ2V0VXNlckxvY2tlZExwQW1vdW50AQULdXNlckFkZHJlc3MEFXVzZXJMb2NrZWRBc3NldEFtb3VudAkBD2NhbGNBc3NldEZyb21McAEFEnVzZXJMb2NrZWRMcEFtb3VudAQcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwkBIGdldFVzZXJBdmFpbGFibGVBc3NldHNUb1dpdGhkcmF3AQULdXNlckFkZHJlc3MEFXVzZXJUb3RhbFN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwAABBd1c2VyVG90YWxBc3NldFdpdGhkcmF3bgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEaa2V5VXNlclRvdGFsQXNzZXRXaXRoZHJhd24BBQt1c2VyQWRkcmVzcwAABA0kdDAxNzcxMDE3ODAyCQEXZ2V0VXNlclN0YWtpbmdOb2Rlc0RhdGEBBQt1c2VyQWRkcmVzcwQUdXNlclN0YWtpbmdOb2Rlc0xpc3QIBQ0kdDAxNzcxMDE3ODAyAl8xBBl1c2VyU3Rha2luZ05vZGVTaGFyZXNMaXN0CAUNJHQwMTc3MTAxNzgwMgJfMgkAlAoCBQNuaWwJAJwKCgUMdXNlckxwQW1vdW50BRx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQEPZ2V0Q3VycmVudFByaWNlAAUVdXNlclRvdGFsU3Rha2VkQW1vdW50BRd1c2VyVG90YWxBc3NldFdpdGhkcmF3bgUSdXNlckxvY2tlZExwQW1vdW50BRV1c2VyTG9ja2VkQXNzZXRBbW91bnQFFHVzZXJTdGFraW5nTm9kZXNMaXN0BRl1c2VyU3Rha2luZ05vZGVTaGFyZXNMaXN0CQESZ2V0UmVtYWluaW5nQmxvY2tzAAFpARZnZXRUb3RhbEFzc2V0c1JFQURPTkxZAAkAlAoCBQNuaWwJAJgKBgUNdG90YWxMcEFtb3VudAkBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUACQEPZ2V0Q3VycmVudFByaWNlAAUTdG90YWxMb2NrZWRMcEFtb3VudAkBD2NhbGNBc3NldEZyb21McAEFE3RvdGFsTG9ja2VkTHBBbW91bnQJARJnZXRSZW1haW5pbmdCbG9ja3MAAWkBC3ZvdGVGb3JUeElkAQR0eElkBBNjYWxsZXJBZGRyZXNzU3RyaW5nCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMECWtleVByZWZpeAkBGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEFBHR4SWQEBnJlc3VsdAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5QWxsb3dlZFR4SWQABQR0eElkBQNuaWwEEWFsbG93ZWRUeElkT3B0aW9uCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAAEA2VycgkAzAgCAwkAAAIJAMgBAQkA2QQBBQR0eElkBRFUWElEX0JZVEVTX0xFTkdUSAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAISIGlzIG5vdCB2YWxpZCB0eElkCQDMCAIDAwkAAAIFEWFsbG93ZWRUeElkT3B0aW9uBQR1bml0BgkBAiE9AgkBBXZhbHVlAQURYWxsb3dlZFR4SWRPcHRpb24FBHR4SWQGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEyBpcyBhbHJlYWR5IGFsbG93ZWQFA25pbAMJAAACBQNlcnIFA2VycgkBDHZvdGVJTlRFUk5BTAQFE2NhbGxlckFkZHJlc3NTdHJpbmcFCWtleVByZWZpeAUGUVVPUlVNBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAhieUFkbWlucwkAAAIIBQJ0eAJpZAkA2QQBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAACAAQHYnlPd25lcgMJAGcCCQCQAwEJAQ1nZXRBZG1pbnNMaXN0AAUGUVVPUlVNBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQMFCGJ5QWRtaW5zBgUHYnlPd25lcgFre0I=", "height": 3066416, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: K6qhCjDGRdUw15DWpLt1CAdsCyZ9FuT3uGvnq6L7S8m Next: none Diff:
OldNewDifferences
3131 let keyTotalAssetAmount = makeString(["%s", "totalAssetAmount"], SEP)
3232
3333 let keyTotalLockedLpAmount = makeString(["%s", "totalLockedLpAmount"], SEP)
34+
35+let keyWithdrawLockHeight = makeString(["%s", "withdrawLockHeight"], SEP)
3436
3537 func keyUserLpAmount (userAddress) = makeString(["%s%s", "userLpAmount", userAddress], SEP)
3638
7476
7577 let emissionPerPeriod = (emissionPerBlock * emissionPeriodInBlocks)
7678
79+let withdrawLockHeight = valueOrElse(getInteger(this, keyWithdrawLockHeight), 0)
80+
7781 let ADMIN_LIST_SIZE = 5
7882
7983 let QUORUM = 3
110114
111115
112116 func genVotesKeysHelper (a,adminAddress) = {
113- let $t035953619 = a
114- let result = $t035953619._1
115- let prefix = $t035953619._2
117+ let $t037513775 = a
118+ let result = $t037513775._1
119+ let prefix = $t037513775._2
116120 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
117121 }
118122
119123
120124 func genVotesKeys (keyPrefix) = {
121125 let adminList = keyAdminAddressList()
122- let $t037663850 = {
126+ let $t039224006 = {
123127 let $l = getAdminsList()
124128 let $s = size($l)
125129 let $acc0 = $Tuple2(nil, keyPrefix)
133137
134138 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
135139 }
136- let result = $t037663850._1
137- let prefix = $t037663850._2
140+ let result = $t039224006._1
141+ let prefix = $t039224006._2
138142 result
139143 }
140144
401405 let lpAmountToWithdraw = calcLpFromAsset(withdrawAssetAmount)
402406 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
403407 let minWithdrawAssetAmount = toInt(fraction(getCurrentPrice(), toBigInt(1), scale18BigInt, CEILING))
404- let check = [if ((withdrawAssetAmount > 0))
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))
405413 then true
406414 else throwErr("withdraw amount should be more than 0"), if ((userAvailableAssetToWithdraw >= withdrawAssetAmount))
407415 then true
482490 if ((check == check))
483491 then {
484492 func getAirdropStateChanges (accum,assetAmount) = {
485- let $t01511515166 = accum
486- let result = $t01511515166._1
487- let index = $t01511515166._2
488- let totalLp = $t01511515166._3
489- let processedList = $t01511515166._4
493+ let $t01542815479 = accum
494+ let result = $t01542815479._1
495+ let index = $t01542815479._2
496+ let totalLp = $t01542815479._3
497+ let processedList = $t01542815479._4
490498 let addressString = addressList[index]
491499 let address = match addressFromString(addressString) {
492500 case adr: Address =>
507515 else throw("Strict value is not equal to itself.")
508516 }
509517
510- let $t01593016047 = {
518+ let $t01624316360 = {
511519 let $l = amountList
512520 let $s = size($l)
513521 let $acc0 = $Tuple4(nil, 0, 0, nil)
521529
522530 $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)
523531 }
524- let airdropEntries = $t01593016047._1
525- let _a = $t01593016047._2
526- let addedTotalLockedLpAmount = $t01593016047._3
527- let _b = $t01593016047._4
532+ let airdropEntries = $t01624316360._1
533+ let _a = $t01624316360._2
534+ let addedTotalLockedLpAmount = $t01624316360._3
535+ let _b = $t01624316360._4
528536 let newTotalAsset = calcAssetFromLp((totalLpAmount + addedTotalLockedLpAmount))
529537 ([IntegerEntry(keyTotalLockedLpAmount, (totalLockedLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalLpAmount, (totalLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalAssetAmount, newTotalAsset), IntegerEntry(keyStartBlock, height)] ++ airdropEntries)
530538 }
541549 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
542550 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
543551 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
544- let $t01739717489 = getUserStakingNodesData(userAddress)
545- let userStakingNodesList = $t01739717489._1
546- let userStakingNodeSharesList = $t01739717489._2
552+ let $t01771017802 = getUserStakingNodesData(userAddress)
553+ let userStakingNodesList = $t01771017802._1
554+ let userStakingNodeSharesList = $t01771017802._2
547555 $Tuple2(nil, $Tuple10(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn, userLockedLpAmount, userLockedAssetAmount, userStakingNodesList, userStakingNodeSharesList, getRemainingBlocks()))
548556 }
549557
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)
34+
35+let keyWithdrawLockHeight = makeString(["%s", "withdrawLockHeight"], SEP)
3436
3537 func keyUserLpAmount (userAddress) = makeString(["%s%s", "userLpAmount", userAddress], SEP)
3638
3739
3840 func keyUserLockedLpAmount (userAddress) = makeString(["%s%s", "userLockedLpAmount", userAddress], SEP)
3941
4042
4143 func keyUserStakingNodes (userAddress) = makeString(["%s%s", "userStakingNodes", userAddress], SEP)
4244
4345
4446 func keyUserStakingNodesShares (userAddress) = makeString(["%s%s", "userStakingNodesShares", userAddress], SEP)
4547
4648
4749 func keyUserTotalAssetWithdrawn (userAddress) = makeString(["%s%s", "totalAssetWithdrawn", userAddress], SEP)
4850
4951
5052 func keyUserTotalAssetStaked (userAddress) = makeString(["%s%s", "totalAssetStaked", userAddress], SEP)
5153
5254
5355 func keyHistory (type,userAddress,txId) = makeString(["%s%s%s", type, userAddress, toBase58String(txId)], SEP)
5456
5557
5658 func formatHistory (totalProfit,price,totalAssetAmount,totalLpAmount) = makeString(["%d%d%d%d", toString(totalProfit), toString(price), toString(totalAssetAmount), toString(totalLpAmount)], SEP)
5759
5860
5961 let totalLpAmount = valueOrElse(getInteger(this, keyTotalLpAmount), 0)
6062
6163 let totalAssetAmount = valueOrElse(getInteger(this, keyTotalAssetAmount), 0)
6264
6365 let totalLockedLpAmount = valueOrElse(getInteger(this, keyTotalLockedLpAmount), 0)
6466
6567 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
6668
6769 let assetIdBytes = if ((assetIdString == "WAVES"))
6870 then unit
6971 else fromBase58String(assetIdString)
7072
7173 let emissionPeriodInBlocks = valueOrElse(getInteger(this, keyEmissionPeriodInBlocks), BLOCKS_IN_DAY)
7274
7375 let emissionPerBlock = valueOrElse(getInteger(this, keyEmissionPerBlock), 0)
7476
7577 let emissionPerPeriod = (emissionPerBlock * emissionPeriodInBlocks)
7678
79+let withdrawLockHeight = valueOrElse(getInteger(this, keyWithdrawLockHeight), 0)
80+
7781 let ADMIN_LIST_SIZE = 5
7882
7983 let QUORUM = 3
8084
8185 let TXID_BYTES_LENGTH = 32
8286
8387 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
8488
8589
8690 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
8791
8892
8993 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
9094
9195
9296 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
9397
9498
9599 func getAdminVote (prefix,admin) = {
96100 let voteKey = keyFullAdminVote(prefix, admin)
97101 valueOrElse(getInteger(voteKey), 0)
98102 }
99103
100104
101105 func getAdminsList () = match getString(this, keyAdminAddressList()) {
102106 case s: String =>
103107 split(s, SEP)
104108 case _ =>
105109 nil
106110 }
107111
108112
109113 func isInAdminList (address) = containsElement(getAdminsList(), address)
110114
111115
112116 func genVotesKeysHelper (a,adminAddress) = {
113- let $t035953619 = a
114- let result = $t035953619._1
115- let prefix = $t035953619._2
117+ let $t037513775 = a
118+ let result = $t037513775._1
119+ let prefix = $t037513775._2
116120 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
117121 }
118122
119123
120124 func genVotesKeys (keyPrefix) = {
121125 let adminList = keyAdminAddressList()
122- let $t037663850 = {
126+ let $t039224006 = {
123127 let $l = getAdminsList()
124128 let $s = size($l)
125129 let $acc0 = $Tuple2(nil, keyPrefix)
126130 func $f0_1 ($a,$i) = if (($i >= $s))
127131 then $a
128132 else genVotesKeysHelper($a, $l[$i])
129133
130134 func $f0_2 ($a,$i) = if (($i >= $s))
131135 then $a
132136 else throw("List size exceeds 5")
133137
134138 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
135139 }
136- let result = $t037663850._1
137- let prefix = $t037663850._2
140+ let result = $t039224006._1
141+ let prefix = $t039224006._2
138142 result
139143 }
140144
141145
142146 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
143147
144148
145149 func countVotes (prefix) = {
146150 let votes = genVotesKeys(prefix)
147151 let $l = votes
148152 let $s = size($l)
149153 let $acc0 = 0
150154 func $f0_1 ($a,$i) = if (($i >= $s))
151155 then $a
152156 else countVotesHelper($a, $l[$i])
153157
154158 func $f0_2 ($a,$i) = if (($i >= $s))
155159 then $a
156160 else throw("List size exceeds 5")
157161
158162 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
159163 }
160164
161165
162166 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
163167
164168
165169 func getClearVoteEntries (prefix) = {
166170 let votes = genVotesKeys(prefix)
167171 let $l = votes
168172 let $s = size($l)
169173 let $acc0 = nil
170174 func $f0_1 ($a,$i) = if (($i >= $s))
171175 then $a
172176 else clearVotesHelper($a, $l[$i])
173177
174178 func $f0_2 ($a,$i) = if (($i >= $s))
175179 then $a
176180 else throw("List size exceeds 5")
177181
178182 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
179183 }
180184
181185
182186 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
183187 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
184188 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
185189 let err = if (!(isInAdminList(callerAddressString)))
186190 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
187191 else if ((adminCurrentVote == 1))
188192 then throwErr((voteKey + " you already voted"))
189193 else unit
190194 if ((err == err))
191195 then {
192196 let votes = countVotes(keyPrefix)
193197 if (((votes + 1) >= minVotes))
194198 then {
195199 let clearVoteEntries = getClearVoteEntries(keyPrefix)
196200 (clearVoteEntries ++ voteResult)
197201 }
198202 else [IntegerEntry(voteKey, 1)]
199203 }
200204 else throw("Strict value is not equal to itself.")
201205 }
202206
203207
204208 func stringListToIntListHelper (acc,value) = (acc :+ parseIntValue(value))
205209
206210
207211 func calcTotalProfitForHeight (h) = {
208212 let startBlock = valueOrElse(getInteger(this, keyStartBlock), height)
209213 let startPeriod = fraction(startBlock, 1, emissionPeriodInBlocks)
210214 let elapsedPeriods = ((h / emissionPeriodInBlocks) - startPeriod)
211215 max([0, (emissionPerPeriod * elapsedPeriods)])
212216 }
213217
214218
215219 func calcTotalProfit () = calcTotalProfitForHeight(height)
216220
217221
218222 func getMaxAssetAvailable () = match assetIdBytes {
219223 case u: Unit =>
220224 wavesBalance(this).available
221225 case b: ByteVector =>
222226 assetBalance(this, b)
223227 case _ =>
224228 throw("Match error")
225229 }
226230
227231
228232 func getTotalAssetAmountWithProfitOrMaxAvailable () = {
229233 let totalAssetAmountWithProfit = (totalAssetAmount + calcTotalProfit())
230234 let totalAmount = min([totalAssetAmountWithProfit, getMaxAssetAvailable()])
231235 if ((totalLpAmount == 0))
232236 then 0
233237 else totalAmount
234238 }
235239
236240
237241 func getCurrentPrice () = if ((totalLpAmount != 0))
238242 then fraction(toBigInt(getTotalAssetAmountWithProfitOrMaxAvailable()), scale18BigInt, toBigInt(totalLpAmount))
239243 else scale18BigInt
240244
241245
242246 func getRemainingBlocks () = if ((emissionPerBlock == 0))
243247 then 0
244248 else fraction((getMaxAssetAvailable() - getTotalAssetAmountWithProfitOrMaxAvailable()), 1, emissionPerBlock)
245249
246250
247251 func getUserStakingNodesData (userAddress) = {
248252 let nodesRaw = valueOrElse(getString(this, keyUserStakingNodes(userAddress)), "")
249253 let sharesRaw = valueOrElse(getString(this, keyUserStakingNodesShares(userAddress)), "")
250254 let nodesList = if ((nodesRaw == ""))
251255 then nil
252256 else split(nodesRaw, SEP)
253257 let sharesStringList = if ((sharesRaw == ""))
254258 then nil
255259 else split(sharesRaw, SEP)
256260 let sharesList = {
257261 let $l = sharesStringList
258262 let $s = size($l)
259263 let $acc0 = nil
260264 func $f0_1 ($a,$i) = if (($i >= $s))
261265 then $a
262266 else stringListToIntListHelper($a, $l[$i])
263267
264268 func $f0_2 ($a,$i) = if (($i >= $s))
265269 then $a
266270 else throw("List size exceeds 20")
267271
268272 $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)
269273 }
270274 $Tuple2(nodesList, sharesList)
271275 }
272276
273277
274278 func calcAssetFromLp (lpAmount) = max([0, toInt(fraction(toBigInt(lpAmount), getCurrentPrice(), scale18BigInt))])
275279
276280
277281 func calcLpFromAsset (assetAmount) = max([0, toInt(fraction(toBigInt(assetAmount), scale18BigInt, getCurrentPrice()))])
278282
279283
280284 func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
281285
282286
283287 func getUserLockedLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLockedLpAmount(userAddress)), 0)
284288
285289
286290 func getUserAvailableAssetsToWithdraw (userAddress) = {
287291 let userLpAmount = getUserLpAmount(userAddress)
288292 calcAssetFromLp(userLpAmount)
289293 }
290294
291295
292296 func getClearStakingNodesActions (userAddress) = [DeleteEntry(keyUserStakingNodes(userAddress)), DeleteEntry(keyUserStakingNodesShares(userAddress))]
293297
294298
295299 func getStakeActions (i,userAddress) = {
296300 let checks = [if ((size(i.payments) == 1))
297301 then true
298302 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
299303 then true
300304 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
301305 then true
302306 else "payment amount should be greater than 0", if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
303307 then true
304308 else throwErr("user address is not valid")]
305309 if ((checks == checks))
306310 then {
307311 let paymentAmount = i.payments[0].amount
308312 let paymentLpAmount = calcLpFromAsset(paymentAmount)
309313 let userLpAmount = getUserLpAmount(userAddress)
310314 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
311315 let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
312316 let newTotalAssetAmount = calcAssetFromLp(newTotalLpAmount)
313317 let newUserLpAmount = (userLpAmount + paymentLpAmount)
314318 let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
315319 [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)]
316320 }
317321 else throw("Strict value is not equal to itself.")
318322 }
319323
320324
321325 func getWithdrawActions (i,lpAssetWithdrawAmount) = {
322326 let userAddress = toString(i.caller)
323327 let userLpAmount = getUserLpAmount(userAddress)
324328 let check = [if ((lpAssetWithdrawAmount > 0))
325329 then true
326330 else throwErr("LP amount should be more than 0"), if ((userLpAmount >= lpAssetWithdrawAmount))
327331 then true
328332 else throwErr((("cannot withdraw more than available LP (" + toString(userLpAmount)) + ")"))]
329333 if ((check == check))
330334 then {
331335 let newUserLpAmount = (userLpAmount - lpAssetWithdrawAmount)
332336 let withdrawAssetAmount = calcAssetFromLp(lpAssetWithdrawAmount)
333337 let newTotalLpAmount = (totalLpAmount - lpAssetWithdrawAmount)
334338 let newTotalAssetAmount = calcAssetFromLp(newTotalLpAmount)
335339 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
336340 let newUserTotalAssetWithdrawn = (userTotalAssetWithdrawn + withdrawAssetAmount)
337341 let clearStakingNodesAction = if ((newUserLpAmount == 0))
338342 then getClearStakingNodesActions(userAddress)
339343 else nil
340344 ([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)
341345 }
342346 else throw("Strict value is not equal to itself.")
343347 }
344348
345349
346350 func getSetStakingNodeActions (userAddress,nodeAddress,nodeShare) = {
347351 let check = [if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
348352 then true
349353 else throwErr("user address is not valid"), if ((size(fromBase58String(nodeAddress)) == ADDRESS_BYTES_SIZE))
350354 then true
351355 else throwErr("node address is not valid")]
352356 if ((check == check))
353357 then [StringEntry(keyUserStakingNodes(userAddress), nodeAddress), StringEntry(keyUserStakingNodesShares(userAddress), toString(nodeShare))]
354358 else throw("Strict value is not equal to itself.")
355359 }
356360
357361
358362 @Callable(i)
359363 func setEmissionPerBlock (emissionPerBlock) = {
360364 let check = [if ((i.caller == this))
361365 then true
362366 else throwErr("permission denied")]
363367 if ((check == check))
364368 then [IntegerEntry(keyTotalAssetAmount, getTotalAssetAmountWithProfitOrMaxAvailable()), IntegerEntry(keyStartBlock, height), IntegerEntry(keyEmissionPerBlock, max([0, emissionPerBlock]))]
365369 else throw("Strict value is not equal to itself.")
366370 }
367371
368372
369373
370374 @Callable(i)
371375 func setEmissionPeriodInBlocks (p) = {
372376 let check = [if ((p > 0))
373377 then true
374378 else throwErr("emission period should be greater than 0"), if ((i.caller == this))
375379 then true
376380 else throwErr("permission denied")]
377381 if ((check == check))
378382 then [IntegerEntry(keyTotalAssetAmount, getTotalAssetAmountWithProfitOrMaxAvailable()), IntegerEntry(keyStartBlock, height), IntegerEntry(keyEmissionPeriodInBlocks, p)]
379383 else throw("Strict value is not equal to itself.")
380384 }
381385
382386
383387
384388 @Callable(i)
385389 func stake () = {
386390 let userAddress = toString(i.caller)
387391 getStakeActions(i, userAddress)
388392 }
389393
390394
391395
392396 @Callable(i)
393397 func stakeFor (userAddress) = getStakeActions(i, userAddress)
394398
395399
396400
397401 @Callable(i)
398402 func withdraw (withdrawAssetAmount) = {
399403 let userAddress = toString(i.caller)
400404 let userLpAmount = getUserLpAmount(userAddress)
401405 let lpAmountToWithdraw = calcLpFromAsset(withdrawAssetAmount)
402406 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
403407 let minWithdrawAssetAmount = toInt(fraction(getCurrentPrice(), toBigInt(1), scale18BigInt, CEILING))
404- let check = [if ((withdrawAssetAmount > 0))
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))
405413 then true
406414 else throwErr("withdraw amount should be more than 0"), if ((userAvailableAssetToWithdraw >= withdrawAssetAmount))
407415 then true
408416 else throwErr((("cannot withdraw more than available (" + toString(userAvailableAssetToWithdraw)) + ")")), if ((withdrawAssetAmount >= minWithdrawAssetAmount))
409417 then true
410418 else throwErr((("withdraw amount is too small. Min: (" + toString(minWithdrawAssetAmount)) + ")"))]
411419 if ((check == check))
412420 then getWithdrawActions(i, min([userLpAmount, (lpAmountToWithdraw + 1)]))
413421 else throw("Strict value is not equal to itself.")
414422 }
415423
416424
417425
418426 @Callable(i)
419427 func setStakingNode (nodeAddress) = {
420428 let userAddress = toString(i.caller)
421429 getSetStakingNodeActions(userAddress, nodeAddress, 100)
422430 }
423431
424432
425433
426434 @Callable(i)
427435 func stakeAndSetStakingNode (nodeAddress) = {
428436 let userAddress = toString(i.caller)
429437 (getStakeActions(i, userAddress) ++ getSetStakingNodeActions(userAddress, nodeAddress, 100))
430438 }
431439
432440
433441
434442 @Callable(i)
435443 func stakeForSwapHELPER (userAddress,nodeAddress) = {
436444 let check = [if ((toString(i.originCaller) == userAddress))
437445 then true
438446 else throwErr("i.originCaller should be equal to userAddress")]
439447 if ((check == check))
440448 then {
441449 let setStakingNodeActions = if ((nodeAddress == ""))
442450 then nil
443451 else getSetStakingNodeActions(userAddress, nodeAddress, 100)
444452 (getStakeActions(i, userAddress) ++ setStakingNodeActions)
445453 }
446454 else throw("Strict value is not equal to itself.")
447455 }
448456
449457
450458
451459 @Callable(i)
452460 func airdrop (addressList,amountList) = {
453461 func sum (accum,next) = if ((0 > next))
454462 then throwErr("negative amount value in amountList")
455463 else (accum + next)
456464
457465 let amountListSum = {
458466 let $l = amountList
459467 let $s = size($l)
460468 let $acc0 = 0
461469 func $f0_1 ($a,$i) = if (($i >= $s))
462470 then $a
463471 else sum($a, $l[$i])
464472
465473 func $f0_2 ($a,$i) = if (($i >= $s))
466474 then $a
467475 else throw("List size exceeds 90")
468476
469477 $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)
470478 }
471479 let check = [if ((size(i.payments) == 1))
472480 then true
473481 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
474482 then true
475483 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
476484 then true
477485 else "payment amount should be greater than 0", if ((size(addressList) == size(amountList)))
478486 then true
479487 else throwErr("addressList should be same size as amountList"), if ((i.payments[0].amount >= amountListSum))
480488 then true
481489 else throwErr("payment amount is less than sum of amountList")]
482490 if ((check == check))
483491 then {
484492 func getAirdropStateChanges (accum,assetAmount) = {
485- let $t01511515166 = accum
486- let result = $t01511515166._1
487- let index = $t01511515166._2
488- let totalLp = $t01511515166._3
489- let processedList = $t01511515166._4
493+ let $t01542815479 = accum
494+ let result = $t01542815479._1
495+ let index = $t01542815479._2
496+ let totalLp = $t01542815479._3
497+ let processedList = $t01542815479._4
490498 let addressString = addressList[index]
491499 let address = match addressFromString(addressString) {
492500 case adr: Address =>
493501 adr
494502 case _ =>
495503 throwErr("invalid address in addressList")
496504 }
497505 let ch = [if (!(containsElement(processedList, address)))
498506 then true
499507 else throwErr("duplicate address is addressList")]
500508 if ((ch == ch))
501509 then {
502510 let addedLpAmount = calcLpFromAsset(assetAmount)
503511 let userLockedLpKey = keyUserLockedLpAmount(addressString)
504512 let oldLpAmount = valueOrElse(getInteger(this, userLockedLpKey), 0)
505513 $Tuple4((result :+ IntegerEntry(userLockedLpKey, (oldLpAmount + addedLpAmount))), (index + 1), (totalLp + addedLpAmount), (processedList :+ address))
506514 }
507515 else throw("Strict value is not equal to itself.")
508516 }
509517
510- let $t01593016047 = {
518+ let $t01624316360 = {
511519 let $l = amountList
512520 let $s = size($l)
513521 let $acc0 = $Tuple4(nil, 0, 0, nil)
514522 func $f1_1 ($a,$i) = if (($i >= $s))
515523 then $a
516524 else getAirdropStateChanges($a, $l[$i])
517525
518526 func $f1_2 ($a,$i) = if (($i >= $s))
519527 then $a
520528 else throw("List size exceeds 90")
521529
522530 $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)
523531 }
524- let airdropEntries = $t01593016047._1
525- let _a = $t01593016047._2
526- let addedTotalLockedLpAmount = $t01593016047._3
527- let _b = $t01593016047._4
532+ let airdropEntries = $t01624316360._1
533+ let _a = $t01624316360._2
534+ let addedTotalLockedLpAmount = $t01624316360._3
535+ let _b = $t01624316360._4
528536 let newTotalAsset = calcAssetFromLp((totalLpAmount + addedTotalLockedLpAmount))
529537 ([IntegerEntry(keyTotalLockedLpAmount, (totalLockedLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalLpAmount, (totalLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalAssetAmount, newTotalAsset), IntegerEntry(keyStartBlock, height)] ++ airdropEntries)
530538 }
531539 else throw("Strict value is not equal to itself.")
532540 }
533541
534542
535543
536544 @Callable(i)
537545 func getUserAssetsREADONLY (userAddress) = {
538546 let userLpAmount = getUserLpAmount(userAddress)
539547 let userLockedLpAmount = getUserLockedLpAmount(userAddress)
540548 let userLockedAssetAmount = calcAssetFromLp(userLockedLpAmount)
541549 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
542550 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
543551 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
544- let $t01739717489 = getUserStakingNodesData(userAddress)
545- let userStakingNodesList = $t01739717489._1
546- let userStakingNodeSharesList = $t01739717489._2
552+ let $t01771017802 = getUserStakingNodesData(userAddress)
553+ let userStakingNodesList = $t01771017802._1
554+ let userStakingNodeSharesList = $t01771017802._2
547555 $Tuple2(nil, $Tuple10(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn, userLockedLpAmount, userLockedAssetAmount, userStakingNodesList, userStakingNodeSharesList, getRemainingBlocks()))
548556 }
549557
550558
551559
552560 @Callable(i)
553561 func getTotalAssetsREADONLY () = $Tuple2(nil, $Tuple6(totalLpAmount, getTotalAssetAmountWithProfitOrMaxAvailable(), getCurrentPrice(), totalLockedLpAmount, calcAssetFromLp(totalLockedLpAmount), getRemainingBlocks()))
554562
555563
556564
557565 @Callable(i)
558566 func voteForTxId (txId) = {
559567 let callerAddressString = toBase58String(i.caller.bytes)
560568 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
561569 let result = [StringEntry(keyAllowedTxId(), txId)]
562570 let allowedTxIdOption = getString(this, keyAllowedTxId())
563571 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
564572 then true
565573 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
566574 then true
567575 else (value(allowedTxIdOption) != txId))
568576 then true
569577 else throwErr((txId + " is already allowed"))]
570578 if ((err == err))
571579 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
572580 else throw("Strict value is not equal to itself.")
573581 }
574582
575583
576584 @Verifier(tx)
577585 func verify () = {
578586 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
579587 let byOwner = if ((size(getAdminsList()) >= QUORUM))
580588 then false
581589 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
582590 if (byAdmins)
583591 then true
584592 else byOwner
585593 }
586594

github/deemru/w8io/786bc32 
245.28 ms