tx · 3LBWi3NoargvPCRarwy2edDaabb4VzLkFCrKvpwZqpwA

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.01800000 Waves

2024.09.13 05:01 [3281226] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "3LBWi3NoargvPCRarwy2edDaabb4VzLkFCrKvpwZqpwA", "fee": 1800000, "feeAssetId": null, "timestamp": 1726192950663, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "2E6QUJ3rriwZxpTG1kXRKkx6UxAASsN9tYXBvjtZDFpSkmZA4BWU4VYiTqmewokSuQXixoS1cncy9HfqY7Hmmuh6" ], "script": "base64:BgIsCAISBgoECAgICBIDCgEIEgMKAQESAwoBARIAEgMKAQgSABIDCgEIEgMKAQhzAApEQVlfTUlMTElTAIC4mSkABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgAQYWNyZXMyQWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1A0VUgzVDluWHBNTnBVbVNtUWpQbUV6M0c4NXQzem42ZUEDCQAAAgEBVAUHJG1hdGNoMAIjM05CUHgxRmNpdTNKUU5FR1oyMWpTblRkdXRMTkdHQlVTWGgJAAIBAg1Vbmtub3duIGNoYWluAA5hcmJpdHJhZ2VEZWxheQQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAUKREFZX01JTExJUwMJAAACAQFUBQckbWF0Y2gwAODUAwkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAOTUlOU0hPUFBBWU1FTlQAoI0GAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQANSWR4Q2ZnV2xnRGFwcAAEABRJZHhDZmdQdXp6bGVQb29sRGFwcAAFABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAGAA9JZHhDZmdBY3Jlc0RhcHAACAEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgEPa2V5UmVzdDJBZGRyZXNzAAINJXNfX3Jlc3QyQWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ1JZHhDZmdXbGdEYXBwABJwdXp6bGVQb29sQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdQdXp6bGVQb29sRGFwcAASaW52ZXN0RnVuZENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUUSWR4Q2ZnSW52ZXN0RnVuZERhcHAADWFjcmVzQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ9JZHhDZmdBY3Jlc0RhcHAADXdsZ0Fzc2V0SWRLZXkCC3dsZ19hc3NldElkAAp3bGdBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgULd2xnQ29udHJhY3QFDXdsZ0Fzc2V0SWRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAAGU0NBTEU4AIDC1y8ADHhwTGV2ZWxTY2FsZQCAGQAPeHBMZXZlbFJlY2lwUG93AKAfABJudW1Qb2ludHNPbkxldmVsVXAAAwAPd2xnQmFzZUFtb3VudFhwAIDQ28P0AgEJa2V5VXNlclhQAQRhZGRyCQCsAgICB3VzZXJYUF8FBGFkZHIBDGtleVVzZXJMZXZlbAEEYWRkcgkArAICAgp1c2VyTGV2ZWxfBQRhZGRyAAV4cFdsZwCQTgEJbGV2ZWxCeVhQAQJ4cAkAawMFDHhwTGV2ZWxTY2FsZQkAbAYFAnhwAAQFD3hwTGV2ZWxSZWNpcFBvdwAEAAQFBERPV04FBlNDQUxFOAEHbGV2ZWxVcAIJY3VyckxldmVsBW5ld1hQBAhuZXdMZXZlbAkBCWxldmVsQnlYUAEFBW5ld1hQCQDMCAIFCG5ld0xldmVsCQDMCAIJAGgCBRJudW1Qb2ludHNPbkxldmVsVXAJAGUCBQhuZXdMZXZlbAUJY3VyckxldmVsBQNuaWwACE1JTExJT042AICA6YOx3hYAC1BMQVlFUlNIQVJFAIC1GAAJREFZTUlMTElTAIC4mSkAC3RlYW1BZGRyS2V5Agh0ZWFtQWRkcgAPbGFzdFRlYW1UaW1lS2V5AhRsYXN0Q2xhaW1lZFRpbWVfdGVhbQARdGVhbUFtb3VudExlZnRLZXkCDnRlYW1BbW91bnRMZWZ0ABVsYXN0QWN0aXZpdGllc1RpbWVLZXkCGmxhc3RDbGFpbWVkVGltZV9hY3Rpdml0aWVzABBhY3RBbW91bnRMZWZ0S2V5AhRhY3Rpdml0aWVzQW1vdW50TGVmdAAUc3Rha2Vyc0Ftb3VudExlZnRLZXkCEXN0YWtlcnNBbW91bnRMZWZ0ARhrZXlMYXN0Q2xhaW1lZFRpbWVCeVVzZXIBBGFkZHIJAKwCAgIUbGFzdENsYWltZWRUaW1lVXNlcl8FBGFkZHIBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIAD3dsZ0lzc3VlVGltZUtleQINd2xnX2lzc3VlVGltZQASd2xnSXNzdWVkQW1vdW50S2V5AhB3bGdfaXNzdWVkQW1vdW50ARprZXlBY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcgEEYWRkcgkArAICAhhhY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcl8FBGFkZHIBGGtleVdsZ1N0YWtlZEFtb3VudEJ5VXNlcgEEYWRkcgkArAICAhZ3bGdTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyABF3bGdTdGFrZWRUb3RhbEtleQIUd2xnU3Rha2VkQW1vdW50VG90YWwBFmtleVdsZ1N0YWtlZFRpbWVCeVVzZXIBBGFkZHIJAKwCAgIUd2xnU3Rha2VkVGltZUJ5VXNlcl8FBGFkZHIAA002XwDAhD0AA004XwCAwtcvAAVNSUxMNgCAgOmDsd4WAApURUFNX1NIQVJFAMCaDAAOQUNUSVZJVFlfU0hBUkUAoI0GAAxQTEFZRVJfU0hBUkUAgLUYAAtZRUFSX01JTExJUwCAhuvHdQADY2huCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAA1VU0RUX1RWTF9DT1JSBAckbWF0Y2gwBQNjaG4DCQAAAgEBVwUHJG1hdGNoMADw9ajABAMJAAACAQFUBQckbWF0Y2gwAAAJAAIBAg1Vbmtub3duIGNoYWluAAp0ZWFtQWRyS2V5Agh0ZWFtQWRkcgAObGFzdFRlYW1UaW1LZXkCFGxhc3RDbGFpbWVkVGltZV90ZWFtAA50ZWFtQW10TGVmdEtleQIOdGVhbUFtb3VudExlZnQAFGxhc3RBY3Rpdml0aWVzVGltS2V5AhpsYXN0Q2xhaW1lZFRpbWVfYWN0aXZpdGllcwANYWN0QW10TGVmdEtleQIUYWN0aXZpdGllc0Ftb3VudExlZnQAEXN0YWtlcnNBbXRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAEWa2V5TGFzdENsYWltVGltZUJ5VXNlcgEEYWRkcgkArAICAhRsYXN0Q2xhaW1lZFRpbWVVc2VyXwUEYWRkcgENZGlzdHJCeVBlcmlvZAEGcGVyaW9kCQBrAwUFTUlMTDYJAGgCBQxQTEFZRVJfU0hBUkUJAGQCBQZwZXJpb2QAAQkAaAIABgUDTTZfAA53bGdJc3N1ZVRpbUtleQINd2xnX2lzc3VlVGltZQAPd2xnSXNzdWVkQW10S2V5AhB3bGdfaXNzdWVkQW1vdW50AA56Yklzc3VlZEFtdEtleQISemJpbGxfaXNzdWVkQW1vdW50ARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEEYWRkcgkArAICAhhhY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcl8FBGFkZHIAEmFjcmVzU3Rha2RUb3RhbEtleQIWYWNyZXNTdGFrZWRBbW91bnRUb3RhbAAJZGFwcDJSZXN0AAAADGRhcHAyU3Rha2luZwABAAhkYXBwMldsZwACAAtkYXBwMlB1enpsZQADAA9kYXBwMkludmVzdEZ1bmQABAAGbGV2ZWxzCQDMCAIACgkAzAgCABQJAMwIAgAoCQDMCAIAUAkAzAgCAJYBCQDMCAIA+gEJAMwIAgCQAwkAzAgCALwFCQDMCAIA6AcFA25pbAEPZ2V0TGV2ZWxCeUFjcmVzAQVhY3JlcwQDYWNyCQBpAgUFYWNyZXMFA004XwoBB2NoZWNrZXICA2FjYwRpdGVtAwkAZgIFBGl0ZW0FA2FjcgUDYWNjCQBkAgUDYWNjAAEEA2lkeAoAAiRsBQZsZXZlbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2NoZWNrZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAGQCBQNpZHgAAQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFYWNyZXMJAGgCCQBoAgUFYWNyZXMAFAkAZAIJAQ9nZXRMZXZlbEJ5QWNyZXMBBQVhY3JlcwAEARBnZXRGYXJtaW5nUG93ZXJzAhJ1c2VyQWRkclN0ck9yRW1wdHkPc3Rha2luZ0NvbnRyYWN0BAp0b3RhbEFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAUSYWNyZXNTdGFrZFRvdGFsS2V5AAAEB3RvdGFsRlAJARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQUKdG90YWxBY3JlcwQJdXNlckFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQUSdXNlckFkZHJTdHJPckVtcHR5AAAEBnVzZXJGUAkBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBQl1c2VyQWNyZXMJAMwIAgUHdG90YWxGUAkAzAgCBQZ1c2VyRlAFA25pbAAKaWR4VG90YWxGUAAAAAlpZHhVc2VyRlAAAQALaXhXbGdBbW91bnQAAAAKaXhXbGdQcmljZQABAAppeFdsZ0Z1bmRzAAIADml4V2xnSXNzdWVUaW1lAAYAD2l4V2xnVGVhbUFtTGVmdAAJABNpeFdsZ1RlYW1BbUF2YWlsTm93AAoADml4V2xnQWN0QW1MZWZ0AA0AEml4V2xnQWN0QW1BdmFpbE5vdwAOABBpeFdsZ0FtTGVmdFRvdGFsABEAE2l4V2xnVXNlckFtQXZhaWxOb3cAFQAQaXhXbGdFZmZVc2VyVGltZQAWAQxnZXRXbGdTdGF0czIEC3VzZXJBZGRyT3B0CWNvbnRyYWN0cwZ1c2R0SWQVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAxpc3N1ZWRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFD3dsZ0lzc3VlZEFtdEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0BAdyZXN0VXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQlkYXBwMlJlc3QFBnVzZHRJZAQGd2xnVXNkCQBlAgkA8AcCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFBnVzZHRJZAUVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAlwdXp6bGVVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFC2RhcHAyUHV6emxlBQZ1c2R0SWQEEWludmVzdEZuZENvbnRyYWN0CQCRAwIFCWNvbnRyYWN0cwUPZGFwcDJJbnZlc3RGdW5kBA9pbnZlc3RGdW5kVG90YWwJAGQCCQDwBwIFEWludmVzdEZuZENvbnRyYWN0BQZ1c2R0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgURaW52ZXN0Rm5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEDXRvdGFsRnVuZHNVc2QJAGQCBQZ3bGdVc2QFD2ludmVzdEZ1bmRUb3RhbAQFd2xnSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcCC3dsZ19hc3NldElkAhNOb3QgaW5pdGlhbGl6ZWQgeWV0BANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAlpc3N1ZVRpbWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDndsZ0lzc3VlVGltS2V5Ag9Ob3QgaW5pdGlhbGl6ZWQECXRlYW1Ub3RhbAkAawMFBU1JTEw2BQpURUFNX1NIQVJFBQNNNl8EDnRlYW1BbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUOdGVhbUFtdExlZnRLZXkFCXRlYW1Ub3RhbAQMbGFzdFRlYW1UaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUObGFzdFRlYW1UaW1LZXkFCWlzc3VlVGltZQQIdGVhbUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQp0ZWFtQWRyS2V5BBZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCXRlYW1Ub3RhbAkAZQIFA25vdwUMbGFzdFRlYW1UaW1lCQBoAgADBQtZRUFSX01JTExJUwkAzAgCBQ50ZWFtQW1vdW50TGVmdAUDbmlsBAp0ZWFtV2xnb2xkCQDwBwIFCHRlYW1BZGRyBQV3bGdJZAQIYWN0VG90YWwJAGsDBQVNSUxMNgUOQUNUSVZJVFlfU0hBUkUFA002XwQNYWN0QW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDWFjdEFtdExlZnRLZXkFCGFjdFRvdGFsBBJsYXN0QWN0aXZpdGllc1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBRRsYXN0QWN0aXZpdGllc1RpbUtleQUJaXNzdWVUaW1lBBVhY3RBbW91bnRBdmFpbGFibGVOb3cJAJcDAQkAzAgCCQBrAwUIYWN0VG90YWwJAGUCBQNub3cFEmxhc3RBY3Rpdml0aWVzVGltZQkAaAIAAwULWUVBUl9NSUxMSVMJAMwIAgUNYWN0QW1vdW50TGVmdAUDbmlsBAlhY3RXbGdvbGQJAPAHAgkAkQMCBQljb250cmFjdHMFCWRhcHAyUmVzdAUFd2xnSWQEDGxhc3RVc2VyVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcJARZrZXlMYXN0Q2xhaW1UaW1lQnlVc2VyAQULdXNlckFkZHJPcHQFCWlzc3VlVGltZQQObGFzdFVzZXJQZXJpb2QJAGkCCQBlAgUMbGFzdFVzZXJUaW1lBQlpc3N1ZVRpbWUFC1lFQVJfTUlMTElTBApub3dMaW1pdGVkCQCXAwEJAMwIAgUDbm93CQDMCAIJAGQCBQlpc3N1ZVRpbWUJAGgCAAMFC1lFQVJfTUlMTElTBQNuaWwECWN1clBlcmlvZAkAlwMBCQDMCAIJAGkCCQBlAgUDbm93BQlpc3N1ZVRpbWUFC1lFQVJfTUlMTElTCQDMCAIAAgUDbmlsBANlZmYJARBnZXRGYXJtaW5nUG93ZXJzAgULdXNlckFkZHJPcHQJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcEFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkBDWRpc3RyQnlQZXJpb2QBBQljdXJQZXJpb2QECCR0MDc5MTQyAwkAAAIFDmxhc3RVc2VyUGVyaW9kBQljdXJQZXJpb2QEAmEwCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQBlAgUKbm93TGltaXRlZAUMbGFzdFVzZXJUaW1lBQtZRUFSX01JTExJUwQHZWZmVGltZQkAZQIJAGQCBQxsYXN0VXNlclRpbWUFCm5vd0xpbWl0ZWQFDGxhc3RVc2VyVGltZQkAlAoCBQJhMAUHZWZmVGltZQMJAAACBQ5sYXN0VXNlclBlcmlvZAkAZQIFCWN1clBlcmlvZAABBAJhMQkAawMJAQ1kaXN0ckJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABCQBlAgkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTBQljdXJQZXJpb2QFDGxhc3RVc2VyVGltZQULWUVBUl9NSUxMSVMEAmEwCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQBlAgUKbm93TGltaXRlZAkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTBQljdXJQZXJpb2QFC1lFQVJfTUlMTElTBAVhdmFpbAkAZAIFAmExBQJhMAQHZWZmVGltZQMJAGcCBQJhMQUFYXZhaWwJAGQCBQxsYXN0VXNlclRpbWUJAGsDBQtZRUFSX01JTExJUwUFYXZhaWwJAQ1kaXN0ckJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABCQBkAgkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTBQljdXJQZXJpb2QJAGsDBQtZRUFSX01JTExJUwkAZQIFBWF2YWlsBQJhMQUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQCUCgIFBWF2YWlsBQdlZmZUaW1lBAJhMgkAawMJAQ1kaXN0ckJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAACCQBlAgkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTCQBlAgUJY3VyUGVyaW9kAAEFDGxhc3RVc2VyVGltZQULWUVBUl9NSUxMSVMEAmExCQENZGlzdHJCeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkCQBkAgUJaXNzdWVUaW1lCQBoAgULWUVBUl9NSUxMSVMFCWN1clBlcmlvZAULWUVBUl9NSUxMSVMEBWF2YWlsCQBkAgkAZAIFAmEyBQJhMQUCYTAEB2VmZlRpbWUDCQBnAgUCYTIFBWF2YWlsCQBkAgUMbGFzdFVzZXJUaW1lCQBrAwULWUVBUl9NSUxMSVMFBWF2YWlsCQENZGlzdHJCeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAgMJAGcCCQBkAgUCYTIFAmExBQVhdmFpbAkAZAIJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwkAZQIFCWN1clBlcmlvZAABCQBrAwULWUVBUl9NSUxMSVMJAGUCBQVhdmFpbAUCYTIJAQ1kaXN0ckJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABCQBkAgkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTBQljdXJQZXJpb2QJAGsDBQtZRUFSX01JTExJUwkAZQIJAGUCBQVhdmFpbAUCYTIFAmExBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAJQKAgUFYXZhaWwFB2VmZlRpbWUEDXVzZXJBdmFpbGFibGUIBQgkdDA3OTE0MgJfMQQLZWZmTGFzdFRpbWUIBQgkdDA3OTE0MgJfMgQPYW1vdW50TGVmdFRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwURc3Rha2Vyc0FtdExlZnRLZXkAAAQMdW5yb2JiZWRVc2VyAwkBAiE9AgkAkQMCBQNlZmYFCmlkeFRvdGFsRlAAAAkAawMFDXVzZXJBdmFpbGFibGUJAJEDAgUDZWZmBQlpZHhVc2VyRlAJAJEDAgUDZWZmBQppZHhUb3RhbEZQAAAJAMwIAgUMaXNzdWVkQW1vdW50CQDMCAIJAGsDCQBlAgUNdG90YWxGdW5kc1VzZAUNVVNEVF9UVkxfQ09SUgUDTThfBQxpc3N1ZWRBbW91bnQJAMwIAgUNdG90YWxGdW5kc1VzZAkAzAgCBQdyZXN0VXNkCQDMCAIFBndsZ1VzZAkAzAgCBQlwdXp6bGVVc2QJAMwIAgUJaXNzdWVUaW1lCQDMCAIFDGxhc3RUZWFtVGltZQkAzAgCBQl0ZWFtVG90YWwJAMwIAgUOdGVhbUFtb3VudExlZnQJAMwIAgUWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAzAgCBQp0ZWFtV2xnb2xkCQDMCAIFCGFjdFRvdGFsCQDMCAIFDWFjdEFtb3VudExlZnQJAMwIAgUVYWN0QW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCWFjdFdsZ29sZAkAzAgCBQljdXJQZXJpb2QJAMwIAgUPYW1vdW50TGVmdFRvdGFsCQDMCAIFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAzAgCBQxsYXN0VXNlclRpbWUJAMwIAgUPaW52ZXN0RnVuZFRvdGFsCQDMCAIFDHVucm9iYmVkVXNlcgkAzAgCBQtlZmZMYXN0VGltZQUDbmlsAANuZXQJAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAFmRlZmF1bHRSZXN0MkFkZHJlc3NTdHIEByRtYXRjaDAFA25ldAMJAAACAQFXBQckbWF0Y2gwAiMzUEZ3WXRhOGJpRXozMXpwZUZlNURKSzh3RTV0clNwUVZGOAMJAAACAQFUBQckbWF0Y2gwAiMzTjdVdVlhcjYyNjRQNThGQmhWV0tQUUFoNFl1YTJoZ25ndgkAAgECDVVua25vd24gY2hhaW4ADXByb2ZpdEFkZHJLZXkCCnByb2ZpdEFkZHIAGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkCFnN0YWtlcnNBbW91bnRQYWlkVG90YWwBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEEYWRkcgkArAICAhZzdGFrZXJzQW1vdW50UGFpZFVzZXJfBQRhZGRyAA1yZXN0MkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ9rZXlSZXN0MkFkZHJlc3MABRZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyAA5hY3JlczJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUQYWNyZXMyQWRkcmVzc1N0cgEHcHJvbG9nMgAJAQVhc0ludAEJAP0HBAUOYWNyZXMyQ29udHJhY3QCCnNhdmVMYXN0VHgFA25pbAUDbmlsAQ9nZXRTd2FwTGltaXRXbGcBBGFkZHIECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEFBGFkZHIAAAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAGYCBQ5hcmJpdHJhZ2VEZWxheQkAZQIFA25vdwUIbGFzdFRpbWUJAAIBCQCsAgIJAKwCAgIfQXJiaXRyYWdlcyBhcmUgcG9zc2libGUgb25jZSBhIAkApAMBCQBpAgUOYXJiaXRyYWdlRGVsYXkA4NQDAgNtaW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARprZXlBY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcgEFBGFkZHIAAAEOY2xhaW1JbnRlcm5hbDIBBGFkZHIEBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYWRkcgQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEBQRhZGRyCQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAlpc3N1ZVRpbWUJAJEDAgUIY3VyU3RhdHMFDml4V2xnSXNzdWVUaW1lBA50ZWFtQW1vdW50TGVmdAkAkQMCBQhjdXJTdGF0cwUPaXhXbGdUZWFtQW1MZWZ0BAp0ZWFtQW1vdW50CQCRAwIFCGN1clN0YXRzBRNpeFdsZ1RlYW1BbUF2YWlsTm93BA1hY3RBbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBQ5peFdsZ0FjdEFtTGVmdAQJYWN0QW1vdW50CQCRAwIFCGN1clN0YXRzBRJpeFdsZ0FjdEFtQXZhaWxOb3cECnVzZXJBbW91bnQJAJEDAgUIY3VyU3RhdHMFE2l4V2xnVXNlckFtQXZhaWxOb3cEB3VzZXJLZXkJARhrZXlTdGFrZXJzQW1vdW50UGFpZFVzZXIBBQRhZGRyBAl1c2VyVG90YWwJAJEDAgUIY3VyU3RhdHMFE2l4V2xnVXNlckFtQXZhaWxOb3cEC3VzZXJFZmZUaW1lCQCRAwIFCGN1clN0YXRzBRBpeFdsZ0VmZlVzZXJUaW1lCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQt0ZWFtQWRkcktleQUKdGVhbUFtb3VudAUKd2xnQXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFCWFjdEFtb3VudAUKd2xnQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdXNlcktleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdXNlcktleQAABQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5AAAFCXVzZXJUb3RhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGUCCQCRAwIFCGN1clN0YXRzBRBpeFdsZ0FtTGVmdFRvdGFsBQl1c2VyVG90YWwJAMwIAgkBDEludGVnZXJFbnRyeQIFEXRlYW1BbW91bnRMZWZ0S2V5CQBlAgUOdGVhbUFtb3VudExlZnQFCnRlYW1BbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFD2xhc3RUZWFtVGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBhY3RBbW91bnRMZWZ0S2V5CQBlAgUNYWN0QW1vdW50TGVmdAUJYWN0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVsYXN0QWN0aXZpdGllc1RpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleUxhc3RDbGFpbWVkVGltZUJ5VXNlcgEFBGFkZHIFC3VzZXJFZmZUaW1lBQNuaWwFCnVzZXJBbW91bnQBDnRha2VYcEludGVybmFsAgRhZGRyBWRlbHRhBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAd0aW1lS2V5CQEWa2V5V2xnU3Rha2VkVGltZUJ5VXNlcgEFBGFkZHIECWFtb3VudEtleQkBGGtleVdsZ1N0YWtlZEFtb3VudEJ5VXNlcgEFBGFkZHIECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFB3RpbWVLZXkAAAQHb2xkVXNlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlhbW91bnRLZXkAAAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQURd2xnU3Rha2VkVG90YWxLZXkAAAQCeHAJAGsDCQBrAwUFeHBXbGcFB29sZFVzZXIFD3dsZ0Jhc2VBbW91bnRYcAkAZQIFCGxhc3RUaW1lBQNub3cFCURBWU1JTExJUwkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd0aW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFCWFtb3VudEtleQkAZAIFB29sZFVzZXIFBWRlbHRhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF3bGdTdGFrZWRUb3RhbEtleQkAZAIFCG9sZFRvdGFsBQVkZWx0YQUDbmlsBQJ4cAUHb2xkVXNlcgkBaQENY29uc3RydWN0b3JWMQQIcmVzdEFkZHINbWFya2V0aW5nQWRkcgh0ZWFtQWRkcgpwcm9maXRBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQDCQEJaXNEZWZpbmVkAQkAoQgBBQ13bGdBc3NldElkS2V5CQACAQITQWxyZWFkeSBpbml0aWFsaXplZAQMaXNzdWVkQW1vdW50BQhNSUxMSU9ONgQFaXNzdWUJAMMIBwIGV0xHT0xEAiBXYXZlc0xhbmRzIEdvbGQgaW52ZXN0bWVudCB0b2tlbgUMaXNzdWVkQW1vdW50AAgGBQR1bml0AAAEB2Fzc2V0SWQJALgIAQUFaXNzdWUJAMwIAgUFaXNzdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFD3dsZ0lzc3VlVGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQUMaXNzdWVkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFFHN0YWtlcnNBbW91bnRMZWZ0S2V5CQBrAwUITUlMTElPTjYFC1BMQVlFUlNIQVJFBQVNVUxUNgkAzAgCCQELQmluYXJ5RW50cnkCBQ13bGdBc3NldElkS2V5BQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFC3RlYW1BZGRyS2V5BQh0ZWFtQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ1wcm9maXRBZGRyS2V5BQpwcm9maXRBZGRyBQNuaWwBaQENY29uc3RydWN0b3JWMgEJcmVzdDJBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleVJlc3QyQWRkcmVzcwAFCXJlc3QyQWRkcgUDbmlsAWkBBmJ1eVdsZwEJbWluQW1vdW50BAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAd1c2R0QW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQGY2FsbGVyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUGY2FsbGVyAwkAZgIFDk1JTlNIT1BQQVlNRU5UBQd1c2R0QW10CQACAQkArAICCQCsAgICEllvdSBjYW4gdHJhZGUgbWluIAkBCmZpeGVkUG9pbnQCBQ5NSU5TSE9QUEFZTUVOVAAGAgUgVVNEVAQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkBQd1c2R0QW10BAxjdXJXbGdBbW91bnQJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BAhmdW5kc1VzZAkAkQMCBQhjdXJTdGF0cwUKaXhXbGdGdW5kcwQId2xnUHJpY2UJAGsDBQhmdW5kc1VzZAUFTVVMVDgFDGN1cldsZ0Ftb3VudAQIYnV5UHJpY2UJAGsDBQh3bGdQcmljZQAGAAUECXdsZ0Ftb3VudAkAawMFB3VzZHRBbXQFBU1VTFQ4BQhidXlQcmljZQQGbWF4V2xnCQEPZ2V0U3dhcExpbWl0V2xnAQUEYWRkcgMJAGYCBQl3bGdBbW91bnQFBm1heFdsZwkAAgEJAKwCAgkArAICAhBZb3UgY2FuIGdldCBtYXggCQEKZml4ZWRQb2ludAIFBm1heFdsZwAIAgcgV0xHT0xEAwkAZgIFCW1pbkFtb3VudAUJd2xnQW1vdW50CQACAQIwUHJpY2UgY2hhbmdlZCBkdXJpbmcgb3BlcmF0aW9uLCBwbGVhc2UgdHJ5IGFnYWluBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAYECmRlbHRhRnVuZHMJAGUCBQd1c2R0QW10BQxwcm9maXRBbW91bnQECHJlaXNzdWVkCQBrAwUMY3VyV2xnQW1vdW50BQpkZWx0YUZ1bmRzBQhmdW5kc1VzZAkAlAoCCQDMCAIJAQdSZWlzc3VlAwUKd2xnQXNzZXRJZAUIcmVpc3N1ZWQGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkJAGQCBQxjdXJXbGdBbW91bnQFCHJlaXNzdWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFDXByb2ZpdEFkZHJLZXkFDHByb2ZpdEFtb3VudAULdXNkdEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQl3bGdBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUMcHJvbG9nUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3NlbGxXbGcBCW1pbkFtb3VudAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQGd2xnQW10CAUDcG10BmFtb3VudAQGY2FsbGVyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUGY2FsbGVyBAZtYXhXbGcJAQ9nZXRTd2FwTGltaXRXbGcBBQRhZGRyAwkAZgIFBndsZ0FtdAUGbWF4V2xnCQACAQkArAICCQCsAgICEllvdSBjYW4gc3BlbmQgbWF4IAkBCmZpeGVkUG9pbnQCBQZtYXhXbGcACAIHIFdMR09MRAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFCndsZ0Fzc2V0SWQJAAIBAhVXTEdPTEQgcGF5bWVudHMgb25seSEECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABAxjdXJXbGdBbW91bnQJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BAlzZWxsUHJpY2UJAGsDCQCRAwIFCGN1clN0YXRzBQppeFdsZ1ByaWNlAAQABQQHdXNkdEFtdAkAawMFBndsZ0FtdAUJc2VsbFByaWNlBQVNVUxUOAMJAGYCBQ5NSU5TSE9QUEFZTUVOVAUHdXNkdEFtdAkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHRyYWRlIG1pbiAJAQpmaXhlZFBvaW50AgUOTUlOU0hPUFBBWU1FTlQABgIFIFVTRFQDCQBmAgUJbWluQW1vdW50BQd1c2R0QW10CQACAQIwUHJpY2UgY2hhbmdlZCBkdXJpbmcgb3BlcmF0aW9uLCBwbGVhc2UgdHJ5IGFnYWluBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAQJAJQKAgkAzAgCCQEEQnVybgIFCndsZ0Fzc2V0SWQFBndsZ0FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5CQBlAgUMY3VyV2xnQW1vdW50BQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUNcHJvZml0QWRkcktleQUMcHJvZml0QW1vdW50BQt1c2R0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFB3VzZHRBbXQFC3VzZHRBc3NldElkBQNuaWwFDHByb2xvZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQAEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEAXIJAQ5jbGFpbUludGVybmFsMgEJAKUIAQgFAWkGY2FsbGVyBAdhY3Rpb25zCAUBcgJfMQkAlAoCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcggFAXICXzIFCndsZ0Fzc2V0SWQFDHByb2xvZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJvblN0YWtlVW5zdGFrZUxhbmQBBGFkZHIDAwMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQECIT0CCAUBaQZjYWxsZXIFDWFjcmVzQ29udHJhY3QHCQECIT0CCAUBaQZjYWxsZXIFDmFjcmVzMkNvbnRyYWN0BwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA0kdDAxMDgzODEwODkyCQEOY2xhaW1JbnRlcm5hbDIBBQRhZGRyBAdhY3Rpb25zCAUNJHQwMTA4MzgxMDg5MgJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDEwODM4MTA4OTICXzIJAJQKAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRhZGRyBRB3bGdDbGFpbWVkQW1vdW50BQp3bGdBc3NldElkBRB3bGdDbGFpbWVkQW1vdW50AWkBCmJ1cm5XbGdvbGQAAwkBAiE9AggFAWkGY2FsbGVyBQ5hY3JlczJDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAZ3bGdBbXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQNd2xnQW1vdW50TGVmdAkAZQIJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BQZ3bGdBbXQJAJQKAgkAzAgCCQEEQnVybgIFCndsZ0Fzc2V0SWQFBndsZ0FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5BQ13bGdBbW91bnRMZWZ0BQNuaWwFDXdsZ0Ftb3VudExlZnQBaQEJdGFrZVdsZ1hwAQRhZGRyAwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQNJHQwMTMxNjMxMzIwNgkBDnRha2VYcEludGVybmFsAgUEYWRkcgAABAdhY3Rpb25zCAUNJHQwMTMxNjMxMzIwNgJfMQQCeHAIBQ0kdDAxMzE2MzEzMjA2Al8yCQCUCgIFB2FjdGlvbnMFAnhwAWkBEmNoZWNrV2xnWHBSRUFET05MWQEEYWRkcgQNJHQwMTMyODMxMzMzMQkBDnRha2VYcEludGVybmFsAgUEYWRkcgAABAdpZ25vcmVkCAUNJHQwMTMyODMxMzMzMQJfMQQHZGVsdGFYUAgFDSR0MDEzMjgzMTMzMzECXzIEBW5ld1hQCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQlrZXlVc2VyWFABBQRhZGRyAAAFB2RlbHRhWFAECWx2bFBvaW50cwkBB2xldmVsVXACCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBDGtleVVzZXJMZXZlbAEFBGFkZHIAAAUFbmV3WFAJAJQKAgUDbmlsCQDNCAIFCWx2bFBvaW50cwUFbmV3WFAAsV675A==", "height": 3281226, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FrggMfs6QLRkDrUVXQuvh2ve2y8ajdJQMxy6BvGLWcja Next: CGFVXtKMtfaVtUDrytrDBEfPjcvyTazp1nAyZ4YodnRG Diff:
OldNewDifferences
364364 let userAvailable = $t079142._1
365365 let effLastTime = $t079142._2
366366 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
367- let unrobbedUser = fraction(userAvailable, eff[idxUserFP], eff[idxTotalFP])
367+ let unrobbedUser = if ((eff[idxTotalFP] != 0))
368+ then fraction(userAvailable, eff[idxUserFP], eff[idxTotalFP])
369+ else 0
368370 [issuedAmount, fraction((totalFundsUsd - USDT_TVL_CORR), M8_, issuedAmount), totalFundsUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastTeamTime, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, investFundTotal, unrobbedUser, effLastTime]
369371 }
370372
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let DAY_MILLIS = 86400000
55
66 let chain = take(drop(this.bytes, 1), 1)
77
88 let usdtAssetId = match chain {
99 case _ =>
1010 if ((base58'2W' == $match0))
1111 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
1212 else if ((base58'2T' == $match0))
1313 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
1414 else throw("Unknown chain")
1515 }
1616
1717 let defaultRestAddressStr = match chain {
1818 case _ =>
1919 if ((base58'2W' == $match0))
2020 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
2121 else if ((base58'2T' == $match0))
2222 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
2323 else throw("Unknown chain")
2424 }
2525
2626 let acres2AddressStr = match chain {
2727 case _ =>
2828 if ((base58'2W' == $match0))
2929 then "3P4UH3T9nXpMNpUmSmQjPmEz3G85t3zn6eA"
3030 else if ((base58'2T' == $match0))
3131 then "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh"
3232 else throw("Unknown chain")
3333 }
3434
3535 let arbitrageDelay = match chain {
3636 case _ =>
3737 if ((base58'2W' == $match0))
3838 then DAY_MILLIS
3939 else if ((base58'2T' == $match0))
4040 then 60000
4141 else throw("Unknown chain")
4242 }
4343
4444 let SEP = "__"
4545
4646 let MULT6 = 1000000
4747
4848 let MULT8 = 100000000
4949
5050 let MINSHOPPAYMENT = 100000
5151
5252 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
5353
5454
5555 let IdxCfgStakingDapp = 1
5656
5757 let IdxCfgWlgDapp = 4
5858
5959 let IdxCfgPuzzlePoolDapp = 5
6060
6161 let IdxCfgInvestFundDapp = 6
6262
6363 let IdxCfgAcresDapp = 8
6464
6565 func keyRestCfg () = "%s__restConfig"
6666
6767
6868 func keyRestAddress () = "%s__restAddr"
6969
7070
7171 func keyRest2Address () = "%s__rest2Addr"
7272
7373
7474 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
7575
7676
7777 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
7878
7979
8080 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
8181
8282 let restCfg = readRestCfgOrFail(restContract)
8383
8484 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
8585
8686 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
8787
8888 let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
8989
9090 let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
9191
9292 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
9393
9494 let wlgAssetIdKey = "wlg_assetId"
9595
9696 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
9797
9898 func asInt (v) = match v {
9999 case n: Int =>
100100 n
101101 case _ =>
102102 throw("fail to cast into Int")
103103 }
104104
105105
106106 func fixedPoint (val,decimals) = {
107107 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
108108 let lowPart = toString((val % tenPow))
109109 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
110110 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
111111 }
112112
113113
114114 let SCALE8 = 100000000
115115
116116 let xpLevelScale = 3200
117117
118118 let xpLevelRecipPow = 4000
119119
120120 let numPointsOnLevelUp = 3
121121
122122 let wlgBaseAmountXp = 100000000000
123123
124124 func keyUserXP (addr) = ("userXP_" + addr)
125125
126126
127127 func keyUserLevel (addr) = ("userLevel_" + addr)
128128
129129
130130 let xpWlg = 10000
131131
132132 func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
133133
134134
135135 func levelUp (currLevel,newXP) = {
136136 let newLevel = levelByXP(newXP)
137137 [newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
138138 }
139139
140140
141141 let MILLION6 = 100000000000000
142142
143143 let PLAYERSHARE = 400000
144144
145145 let DAYMILLIS = 86400000
146146
147147 let teamAddrKey = "teamAddr"
148148
149149 let lastTeamTimeKey = "lastClaimedTime_team"
150150
151151 let teamAmountLeftKey = "teamAmountLeft"
152152
153153 let lastActivitiesTimeKey = "lastClaimedTime_activities"
154154
155155 let actAmountLeftKey = "activitiesAmountLeft"
156156
157157 let stakersAmountLeftKey = "stakersAmountLeft"
158158
159159 func keyLastClaimedTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
160160
161161
162162 func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
163163
164164
165165 let wlgIssueTimeKey = "wlg_issueTime"
166166
167167 let wlgIssuedAmountKey = "wlg_issuedAmount"
168168
169169 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
170170
171171
172172 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
173173
174174
175175 let wlgStakedTotalKey = "wlgStakedAmountTotal"
176176
177177 func keyWlgStakedTimeByUser (addr) = ("wlgStakedTimeByUser_" + addr)
178178
179179
180180 let M6_ = 1000000
181181
182182 let M8_ = 100000000
183183
184184 let MILL6 = 100000000000000
185185
186186 let TEAM_SHARE = 200000
187187
188188 let ACTIVITY_SHARE = 100000
189189
190190 let PLAYER_SHARE = 400000
191191
192192 let YEAR_MILLIS = 31557600000
193193
194194 let chn = take(drop(this.bytes, 1), 1)
195195
196196 let USDT_TVL_CORR = match chn {
197197 case _ =>
198198 if ((base58'2W' == $match0))
199199 then 1208630000
200200 else if ((base58'2T' == $match0))
201201 then 0
202202 else throw("Unknown chain")
203203 }
204204
205205 let teamAdrKey = "teamAddr"
206206
207207 let lastTeamTimKey = "lastClaimedTime_team"
208208
209209 let teamAmtLeftKey = "teamAmountLeft"
210210
211211 let lastActivitiesTimKey = "lastClaimedTime_activities"
212212
213213 let actAmtLeftKey = "activitiesAmountLeft"
214214
215215 let stakersAmtLeftKey = "stakersAmountLeft"
216216
217217 func keyLastClaimTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
218218
219219
220220 func distrByPeriod (period) = fraction(MILL6, (PLAYER_SHARE * (period + 1)), (6 * M6_))
221221
222222
223223 let wlgIssueTimKey = "wlg_issueTime"
224224
225225 let wlgIssuedAmtKey = "wlg_issuedAmount"
226226
227227 let zbIssuedAmtKey = "zbill_issuedAmount"
228228
229229 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
230230
231231
232232 let acresStakdTotalKey = "acresStakedAmountTotal"
233233
234234 let dapp2Rest = 0
235235
236236 let dapp2Staking = 1
237237
238238 let dapp2Wlg = 2
239239
240240 let dapp2Puzzle = 3
241241
242242 let dapp2InvestFund = 4
243243
244244 let levels = [10, 20, 40, 80, 150, 250, 400, 700, 1000]
245245
246246 func getLevelByAcres (acres) = {
247247 let acr = (acres / M8_)
248248 func checker (acc,item) = if ((item > acr))
249249 then acc
250250 else (acc + 1)
251251
252252 let idx = {
253253 let $l = levels
254254 let $s = size($l)
255255 let $acc0 = 0
256256 func $f0_1 ($a,$i) = if (($i >= $s))
257257 then $a
258258 else checker($a, $l[$i])
259259
260260 func $f0_2 ($a,$i) = if (($i >= $s))
261261 then $a
262262 else throw("List size exceeds 10")
263263
264264 $f0_2($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)
265265 }
266266 (idx + 1)
267267 }
268268
269269
270270 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
271271
272272
273273 func getFarmingPowers (userAddrStrOrEmpty,stakingContract) = {
274274 let totalAcres = valueOrElse(getInteger(stakingContract, acresStakdTotalKey), 0)
275275 let totalFP = getFarmingPowerByAcres(totalAcres)
276276 let userAcres = valueOrElse(getInteger(stakingContract, keyAcresStakedAmtByUser(userAddrStrOrEmpty)), 0)
277277 let userFP = getFarmingPowerByAcres(userAcres)
278278 [totalFP, userFP]
279279 }
280280
281281
282282 let idxTotalFP = 0
283283
284284 let idxUserFP = 1
285285
286286 let ixWlgAmount = 0
287287
288288 let ixWlgPrice = 1
289289
290290 let ixWlgFunds = 2
291291
292292 let ixWlgIssueTime = 6
293293
294294 let ixWlgTeamAmLeft = 9
295295
296296 let ixWlgTeamAmAvailNow = 10
297297
298298 let ixWlgActAmLeft = 13
299299
300300 let ixWlgActAmAvailNow = 14
301301
302302 let ixWlgAmLeftTotal = 17
303303
304304 let ixWlgUserAmAvailNow = 21
305305
306306 let ixWlgEffUserTime = 22
307307
308308 func getWlgStats2 (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
309309 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssuedAmtKey), "WLGOLD is not issued yet")
310310 let restUsd = assetBalance(contracts[dapp2Rest], usdtId)
311311 let wlgUsd = (assetBalance(contracts[dapp2Wlg], usdtId) - usdtBalanceCorrection)
312312 let puzzleUsd = assetBalance(contracts[dapp2Puzzle], usdtId)
313313 let investFndContract = contracts[dapp2InvestFund]
314314 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmtKey), 0))
315315 let totalFundsUsd = (wlgUsd + investFundTotal)
316316 let wlgId = valueOrErrorMessage(getBinary(contracts[dapp2Wlg], "wlg_assetId"), "Not initialized yet")
317317 let now = lastBlock.timestamp
318318 let issueTime = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssueTimKey), "Not initialized")
319319 let teamTotal = fraction(MILL6, TEAM_SHARE, M6_)
320320 let teamAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], teamAmtLeftKey), teamTotal)
321321 let lastTeamTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastTeamTimKey), issueTime)
322322 let teamAddr = addressFromStringValue(value(getString(contracts[dapp2Wlg], teamAdrKey)))
323323 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEAR_MILLIS)), teamAmountLeft])
324324 let teamWlgold = assetBalance(teamAddr, wlgId)
325325 let actTotal = fraction(MILL6, ACTIVITY_SHARE, M6_)
326326 let actAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], actAmtLeftKey), actTotal)
327327 let lastActivitiesTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastActivitiesTimKey), issueTime)
328328 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEAR_MILLIS)), actAmountLeft])
329329 let actWlgold = assetBalance(contracts[dapp2Rest], wlgId)
330330 let lastUserTime = valueOrElse(getInteger(contracts[dapp2Wlg], keyLastClaimTimeByUser(userAddrOpt)), issueTime)
331331 let lastUserPeriod = ((lastUserTime - issueTime) / YEAR_MILLIS)
332332 let nowLimited = min([now, (issueTime + (3 * YEAR_MILLIS))])
333333 let curPeriod = min([((now - issueTime) / YEAR_MILLIS), 2])
334334 let eff = getFarmingPowers(userAddrOpt, contracts[dapp2Staking])
335335 let curPeriodDistribution = distrByPeriod(curPeriod)
336336 let $t079142 = if ((lastUserPeriod == curPeriod))
337337 then {
338338 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEAR_MILLIS)
339339 let effTime = ((lastUserTime + nowLimited) - lastUserTime)
340340 $Tuple2(a0, effTime)
341341 }
342342 else if ((lastUserPeriod == (curPeriod - 1)))
343343 then {
344344 let a1 = fraction(distrByPeriod((curPeriod - 1)), ((issueTime + (YEAR_MILLIS * curPeriod)) - lastUserTime), YEAR_MILLIS)
345345 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEAR_MILLIS * curPeriod))), YEAR_MILLIS)
346346 let avail = (a1 + a0)
347347 let effTime = if ((a1 >= avail))
348348 then (lastUserTime + fraction(YEAR_MILLIS, avail, distrByPeriod((curPeriod - 1))))
349349 else ((issueTime + (YEAR_MILLIS * curPeriod)) + fraction(YEAR_MILLIS, (avail - a1), curPeriodDistribution))
350350 $Tuple2(avail, effTime)
351351 }
352352 else {
353353 let a2 = fraction(distrByPeriod((curPeriod - 2)), ((issueTime + (YEAR_MILLIS * (curPeriod - 1))) - lastUserTime), YEAR_MILLIS)
354354 let a1 = distrByPeriod((curPeriod - 1))
355355 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEAR_MILLIS * curPeriod))), YEAR_MILLIS)
356356 let avail = ((a2 + a1) + a0)
357357 let effTime = if ((a2 >= avail))
358358 then (lastUserTime + fraction(YEAR_MILLIS, avail, distrByPeriod((curPeriod - 2))))
359359 else if (((a2 + a1) >= avail))
360360 then ((issueTime + (YEAR_MILLIS * (curPeriod - 1))) + fraction(YEAR_MILLIS, (avail - a2), distrByPeriod((curPeriod - 1))))
361361 else ((issueTime + (YEAR_MILLIS * curPeriod)) + fraction(YEAR_MILLIS, ((avail - a2) - a1), curPeriodDistribution))
362362 $Tuple2(avail, effTime)
363363 }
364364 let userAvailable = $t079142._1
365365 let effLastTime = $t079142._2
366366 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
367- let unrobbedUser = fraction(userAvailable, eff[idxUserFP], eff[idxTotalFP])
367+ let unrobbedUser = if ((eff[idxTotalFP] != 0))
368+ then fraction(userAvailable, eff[idxUserFP], eff[idxTotalFP])
369+ else 0
368370 [issuedAmount, fraction((totalFundsUsd - USDT_TVL_CORR), M8_, issuedAmount), totalFundsUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastTeamTime, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, investFundTotal, unrobbedUser, effLastTime]
369371 }
370372
371373
372374 let net = take(drop(this.bytes, 1), 1)
373375
374376 let defaultRest2AddressStr = match net {
375377 case _ =>
376378 if ((base58'2W' == $match0))
377379 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
378380 else if ((base58'2T' == $match0))
379381 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
380382 else throw("Unknown chain")
381383 }
382384
383385 let profitAddrKey = "profitAddr"
384386
385387 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
386388
387389 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
388390
389391
390392 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
391393
392394 let acres2Contract = addressFromStringValue(acres2AddressStr)
393395
394396 func prolog2 () = asInt(reentrantInvoke(acres2Contract, "saveLastTx", nil, nil))
395397
396398
397399 func getSwapLimitWlg (addr) = {
398400 let lastTime = valueOrElse(getInteger(keyLastArbTimeByUser(addr)), 0)
399401 let now = lastBlock.timestamp
400402 if ((arbitrageDelay > (now - lastTime)))
401403 then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "min"))
402404 else valueOrElse(getInteger(acres2Contract, keyAcresStakedAmountByUser(addr)), 0)
403405 }
404406
405407
406408 func claimInternal2 (addr) = {
407409 let caller = addressFromStringValue(addr)
408410 let curStats = getWlgStats2(addr, [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
409411 let now = lastBlock.timestamp
410412 let issueTime = curStats[ixWlgIssueTime]
411413 let teamAmountLeft = curStats[ixWlgTeamAmLeft]
412414 let teamAmount = curStats[ixWlgTeamAmAvailNow]
413415 let actAmountLeft = curStats[ixWlgActAmLeft]
414416 let actAmount = curStats[ixWlgActAmAvailNow]
415417 let userAmount = curStats[ixWlgUserAmAvailNow]
416418 let userKey = keyStakersAmountPaidUser(addr)
417419 let userTotal = curStats[ixWlgUserAmAvailNow]
418420 let userEffTime = curStats[ixWlgEffUserTime]
419421 $Tuple2([ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId), ScriptTransfer(restContract, actAmount, wlgAssetId), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userTotal)), IntegerEntry(stakersAmountLeftKey, (curStats[ixWlgAmLeftTotal] - userTotal)), IntegerEntry(teamAmountLeftKey, (teamAmountLeft - teamAmount)), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(keyLastClaimedTimeByUser(addr), userEffTime)], userAmount)
420422 }
421423
422424
423425 func takeXpInternal (addr,delta) = {
424426 let now = lastBlock.timestamp
425427 let timeKey = keyWlgStakedTimeByUser(addr)
426428 let amountKey = keyWlgStakedAmountByUser(addr)
427429 let lastTime = valueOrElse(getInteger(timeKey), 0)
428430 let oldUser = valueOrElse(getInteger(amountKey), 0)
429431 let oldTotal = valueOrElse(getInteger(wlgStakedTotalKey), 0)
430432 let xp = fraction(fraction(xpWlg, oldUser, wlgBaseAmountXp), (lastTime - now), DAYMILLIS)
431433 $Tuple3([IntegerEntry(timeKey, now), IntegerEntry(amountKey, (oldUser + delta)), IntegerEntry(wlgStakedTotalKey, (oldTotal + delta))], xp, oldUser)
432434 }
433435
434436
435437 @Callable(i)
436438 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
437439 then throw("Permission denied")
438440 else if (isDefined(getBinary(wlgAssetIdKey)))
439441 then throw("Already initialized")
440442 else {
441443 let issuedAmount = MILLION6
442444 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
443445 let assetId = calculateAssetId(issue)
444446 [issue, IntegerEntry(wlgIssueTimeKey, lastBlock.timestamp), IntegerEntry(wlgIssuedAmountKey, issuedAmount), IntegerEntry(stakersAmountPaidTotalKey, 0), IntegerEntry(stakersAmountLeftKey, fraction(MILLION6, PLAYERSHARE, MULT6)), BinaryEntry(wlgAssetIdKey, assetId), StringEntry(keyRestAddress(), restAddr), StringEntry(teamAddrKey, teamAddr), StringEntry(profitAddrKey, profitAddr)]
445447 }
446448
447449
448450
449451 @Callable(i)
450452 func constructorV2 (rest2Addr) = if ((i.caller != this))
451453 then throw("Permission denied")
452454 else [StringEntry(keyRest2Address(), rest2Addr)]
453455
454456
455457
456458 @Callable(i)
457459 func buyWlg (minAmount) = {
458460 let prologResult = prolog2()
459461 if ((prologResult == prologResult))
460462 then if ((size(i.payments) != 1))
461463 then throw("exactly 1 payment must be attached")
462464 else {
463465 let pmt = i.payments[0]
464466 let usdtAmt = pmt.amount
465467 if (if (!(isDefined(pmt.assetId)))
466468 then true
467469 else (value(pmt.assetId) != usdtAssetId))
468470 then throw("USDT payments only!")
469471 else {
470472 let caller = i.caller
471473 let addr = toString(caller)
472474 if ((MINSHOPPAYMENT > usdtAmt))
473475 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
474476 else {
475477 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
476478 let curWlgAmount = curStats[ixWlgAmount]
477479 let fundsUsd = curStats[ixWlgFunds]
478480 let wlgPrice = fraction(fundsUsd, MULT8, curWlgAmount)
479481 let buyPrice = fraction(wlgPrice, 6, 5)
480482 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
481483 let maxWlg = getSwapLimitWlg(addr)
482484 if ((wlgAmount > maxWlg))
483485 then throw((("You can get max " + fixedPoint(maxWlg, 8)) + " WLGOLD"))
484486 else if ((minAmount > wlgAmount))
485487 then throw("Price changed during operation, please try again")
486488 else {
487489 let profitAmount = (usdtAmt / 6)
488490 let deltaFunds = (usdtAmt - profitAmount)
489491 let reissued = fraction(curWlgAmount, deltaFunds, fundsUsd)
490492 $Tuple2([Reissue(wlgAssetId, reissued, true), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount + reissued)), IntegerEntry(keyLastArbTimeByUser(addr), lastBlock.timestamp), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, wlgAmount, wlgAssetId)], prologResult)
491493 }
492494 }
493495 }
494496 }
495497 else throw("Strict value is not equal to itself.")
496498 }
497499
498500
499501
500502 @Callable(i)
501503 func sellWlg (minAmount) = {
502504 let prologResult = prolog2()
503505 if ((prologResult == prologResult))
504506 then if ((size(i.payments) != 1))
505507 then throw("exactly 1 payment must be attached")
506508 else {
507509 let pmt = i.payments[0]
508510 let wlgAmt = pmt.amount
509511 let caller = i.caller
510512 let addr = toString(caller)
511513 let maxWlg = getSwapLimitWlg(addr)
512514 if ((wlgAmt > maxWlg))
513515 then throw((("You can spend max " + fixedPoint(maxWlg, 8)) + " WLGOLD"))
514516 else if (if (!(isDefined(pmt.assetId)))
515517 then true
516518 else (value(pmt.assetId) != wlgAssetId))
517519 then throw("WLGOLD payments only!")
518520 else {
519521 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
520522 let curWlgAmount = curStats[ixWlgAmount]
521523 let sellPrice = fraction(curStats[ixWlgPrice], 4, 5)
522524 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
523525 if ((MINSHOPPAYMENT > usdtAmt))
524526 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
525527 else if ((minAmount > usdtAmt))
526528 then throw("Price changed during operation, please try again")
527529 else {
528530 let profitAmount = (usdtAmt / 4)
529531 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount - wlgAmt)), IntegerEntry(keyLastArbTimeByUser(addr), lastBlock.timestamp), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, usdtAmt, usdtAssetId)], prologResult)
530532 }
531533 }
532534 }
533535 else throw("Strict value is not equal to itself.")
534536 }
535537
536538
537539
538540 @Callable(i)
539541 func claim () = {
540542 let prologResult = prolog2()
541543 if ((prologResult == prologResult))
542544 then if ((size(i.payments) != 0))
543545 then throw("No payments required")
544546 else {
545547 let r = claimInternal2(toString(i.caller))
546548 let actions = r._1
547549 $Tuple2((actions :+ ScriptTransfer(i.caller, r._2, wlgAssetId)), prologResult)
548550 }
549551 else throw("Strict value is not equal to itself.")
550552 }
551553
552554
553555
554556 @Callable(i)
555557 func onStakeUnstakeLand (addr) = if (if (if ((i.caller != stakingContract))
556558 then (i.caller != acresContract)
557559 else false)
558560 then (i.caller != acres2Contract)
559561 else false)
560562 then throw("Permission denied")
561563 else {
562564 let $t01083810892 = claimInternal2(addr)
563565 let actions = $t01083810892._1
564566 let wlgClaimedAmount = $t01083810892._2
565567 $Tuple2((actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId)), wlgClaimedAmount)
566568 }
567569
568570
569571
570572 @Callable(i)
571573 func burnWlgold () = if ((i.caller != acres2Contract))
572574 then throw("Permission denied")
573575 else {
574576 let wlgAmt = i.payments[0].amount
575577 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
576578 let wlgAmountLeft = (curStats[ixWlgAmount] - wlgAmt)
577579 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, wlgAmountLeft)], wlgAmountLeft)
578580 }
579581
580582
581583
582584 @Callable(i)
583585 func takeWlgXp (addr) = if ((i.caller != stakingContract))
584586 then throw("Permission denied")
585587 else {
586588 let $t01316313206 = takeXpInternal(addr, 0)
587589 let actions = $t01316313206._1
588590 let xp = $t01316313206._2
589591 $Tuple2(actions, xp)
590592 }
591593
592594
593595
594596 @Callable(i)
595597 func checkWlgXpREADONLY (addr) = {
596598 let $t01328313331 = takeXpInternal(addr, 0)
597599 let ignored = $t01328313331._1
598600 let deltaXP = $t01328313331._2
599601 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
600602 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
601603 $Tuple2(nil, (lvlPoints :+ newXP))
602604 }
603605
604606

github/deemru/w8io/026f985 
67.24 ms