tx · CGFVXtKMtfaVtUDrytrDBEfPjcvyTazp1nAyZ4YodnRG

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.01800000 Waves

2024.09.13 05:39 [3281265] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "CGFVXtKMtfaVtUDrytrDBEfPjcvyTazp1nAyZ4YodnRG", "fee": 1800000, "feeAssetId": null, "timestamp": 1726195184569, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "aP4cTfNWJcsSFCpCza4BQRdth2Xy3BYYtJx8mmT9fosycAXEQj2BU7XKm9mVMu9wEWhWoFTSwTruWkyawHhBNgi" ], "script": "base64:BgIsCAISBgoECAgICBIDCgEIEgMKAQESAwoBARIAEgMKAQgSABIDCgEIEgMKAQhyAApEQVlfTUlMTElTAIC4mSkABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgAQYWNyZXMyQWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1A0VUgzVDluWHBNTnBVbVNtUWpQbUV6M0c4NXQzem42ZUEDCQAAAgEBVAUHJG1hdGNoMAIjM05CUHgxRmNpdTNKUU5FR1oyMWpTblRkdXRMTkdHQlVTWGgJAAIBAg1Vbmtub3duIGNoYWluAA5hcmJpdHJhZ2VEZWxheQQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAUKREFZX01JTExJUwMJAAACAQFUBQckbWF0Y2gwAODUAwkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAOTUlOU0hPUFBBWU1FTlQAoI0GAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQANSWR4Q2ZnV2xnRGFwcAAEABRJZHhDZmdQdXp6bGVQb29sRGFwcAAFABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAGAA9JZHhDZmdBY3Jlc0RhcHAACAEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgEPa2V5UmVzdDJBZGRyZXNzAAINJXNfX3Jlc3QyQWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ1JZHhDZmdXbGdEYXBwABJwdXp6bGVQb29sQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdQdXp6bGVQb29sRGFwcAASaW52ZXN0RnVuZENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUUSWR4Q2ZnSW52ZXN0RnVuZERhcHAADWFjcmVzQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ9JZHhDZmdBY3Jlc0RhcHAADXdsZ0Fzc2V0SWRLZXkCC3dsZ19hc3NldElkAAp3bGdBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgULd2xnQ29udHJhY3QFDXdsZ0Fzc2V0SWRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAAGU0NBTEU4AIDC1y8ADHhwTGV2ZWxTY2FsZQCAGQAPeHBMZXZlbFJlY2lwUG93AKAfABJudW1Qb2ludHNPbkxldmVsVXAAAwAPd2xnQmFzZUFtb3VudFhwAIDQ28P0AgEJa2V5VXNlclhQAQRhZGRyCQCsAgICB3VzZXJYUF8FBGFkZHIBDGtleVVzZXJMZXZlbAEEYWRkcgkArAICAgp1c2VyTGV2ZWxfBQRhZGRyAAV4cFdsZwCQTgEJbGV2ZWxCeVhQAQJ4cAkAawMFDHhwTGV2ZWxTY2FsZQkAbAYFAnhwAAQFD3hwTGV2ZWxSZWNpcFBvdwAEAAQFBERPV04FBlNDQUxFOAEHbGV2ZWxVcAIJY3VyckxldmVsBW5ld1hQBAhuZXdMZXZlbAkBCWxldmVsQnlYUAEFBW5ld1hQCQDMCAIFCG5ld0xldmVsCQDMCAIJAGgCBRJudW1Qb2ludHNPbkxldmVsVXAJAGUCBQhuZXdMZXZlbAUJY3VyckxldmVsBQNuaWwACE1JTExJT042AICA6YOx3hYAC1BMQVlFUlNIQVJFAIC1GAAJREFZTUlMTElTAIC4mSkAC3RlYW1BZGRyS2V5Agh0ZWFtQWRkcgAPbGFzdFRlYW1UaW1lS2V5AhRsYXN0Q2xhaW1lZFRpbWVfdGVhbQARdGVhbUFtb3VudExlZnRLZXkCDnRlYW1BbW91bnRMZWZ0ABVsYXN0QWN0aXZpdGllc1RpbWVLZXkCGmxhc3RDbGFpbWVkVGltZV9hY3Rpdml0aWVzABBhY3RBbW91bnRMZWZ0S2V5AhRhY3Rpdml0aWVzQW1vdW50TGVmdAAUc3Rha2Vyc0Ftb3VudExlZnRLZXkCEXN0YWtlcnNBbW91bnRMZWZ0ARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEEYWRkcgkArAICAhBsYXN0QXJiVGltZVVzZXJfBQRhZGRyAA93bGdJc3N1ZVRpbWVLZXkCDXdsZ19pc3N1ZVRpbWUAEndsZ0lzc3VlZEFtb3VudEtleQIQd2xnX2lzc3VlZEFtb3VudAEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyARhrZXlXbGdTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIWd2xnU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgARd2xnU3Rha2VkVG90YWxLZXkCFHdsZ1N0YWtlZEFtb3VudFRvdGFsARZrZXlXbGdTdGFrZWRUaW1lQnlVc2VyAQRhZGRyCQCsAgICFHdsZ1N0YWtlZFRpbWVCeVVzZXJfBQRhZGRyAANNNl8AwIQ9AANNOF8AgMLXLwAFTUlMTDYAgIDpg7HeFgAKVEVBTV9TSEFSRQDAmgwADkFDVElWSVRZX1NIQVJFAKCNBgAMUExBWUVSX1NIQVJFAIC1GAALWUVBUl9NSUxMSVMAgIbrx3UAA2NobgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQANVVNEVF9UVkxfQ09SUgQHJG1hdGNoMAUDY2huAwkAAAIBAVcFByRtYXRjaDAA8PWowAQDCQAAAgEBVAUHJG1hdGNoMAAACQACAQINVW5rbm93biBjaGFpbgAKdGVhbUFkcktleQIIdGVhbUFkZHIADmxhc3RUZWFtVGltS2V5AhRsYXN0Q2xhaW1lZFRpbWVfdGVhbQAOdGVhbUFtdExlZnRLZXkCDnRlYW1BbW91bnRMZWZ0ABRsYXN0QWN0aXZpdGllc1RpbUtleQIabGFzdENsYWltZWRUaW1lX2FjdGl2aXRpZXMADWFjdEFtdExlZnRLZXkCFGFjdGl2aXRpZXNBbW91bnRMZWZ0ABFzdGFrZXJzQW10TGVmdEtleQIRc3Rha2Vyc0Ftb3VudExlZnQBFmtleUxhc3RDbGFpbVRpbWVCeVVzZXIBBGFkZHIJAKwCAgIUbGFzdENsYWltZWRUaW1lVXNlcl8FBGFkZHIBDWRpc3RyQnlQZXJpb2QBBnBlcmlvZAkAawMFBU1JTEw2CQBoAgUMUExBWUVSX1NIQVJFCQBkAgUGcGVyaW9kAAEJAGgCAAYFA002XwAOd2xnSXNzdWVUaW1LZXkCDXdsZ19pc3N1ZVRpbWUAD3dsZ0lzc3VlZEFtdEtleQIQd2xnX2lzc3VlZEFtb3VudAAOemJJc3N1ZWRBbXRLZXkCEnpiaWxsX2lzc3VlZEFtb3VudAEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyABJhY3Jlc1N0YWtkVG90YWxLZXkCFmFjcmVzU3Rha2VkQW1vdW50VG90YWwACWRhcHAyUmVzdAAAAAxkYXBwMlN0YWtpbmcAAQAIZGFwcDJXbGcAAgALZGFwcDJQdXp6bGUAAwAPZGFwcDJJbnZlc3RGdW5kAAQABmxldmVscwkAzAgCAAoJAMwIAgAUCQDMCAIAKAkAzAgCAFAJAMwIAgCWAQkAzAgCAPoBCQDMCAIAkAMJAMwIAgC8BQkAzAgCAOgHBQNuaWwBD2dldExldmVsQnlBY3JlcwEFYWNyZXMEA2FjcgkAaQIFBWFjcmVzBQNNOF8KAQdjaGVja2VyAgNhY2MEaXRlbQMJAGYCBQRpdGVtBQNhY3IFA2FjYwkAZAIFA2FjYwABBANpZHgKAAIkbAUGbGV2ZWxzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdjaGVja2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQBkAgUDaWR4AAEBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBWFjcmVzCQBoAgkAaAIFBWFjcmVzABQJAGQCCQEPZ2V0TGV2ZWxCeUFjcmVzAQUFYWNyZXMABAEQZ2V0RmFybWluZ1Bvd2VycwISdXNlckFkZHJTdHJPckVtcHR5D3N0YWtpbmdDb250cmFjdAQKdG90YWxBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QFEmFjcmVzU3Rha2RUb3RhbEtleQAABAd0b3RhbEZQCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFCnRvdGFsQWNyZXMECXVzZXJBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFEnVzZXJBZGRyU3RyT3JFbXB0eQAABAZ1c2VyRlAJARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQUJdXNlckFjcmVzCQDMCAIFB3RvdGFsRlAJAMwIAgUGdXNlckZQBQNuaWwACmlkeFRvdGFsRlAAAAAJaWR4VXNlckZQAAEAC2l4V2xnQW1vdW50AAAACml4V2xnUHJpY2UAAQAKaXhXbGdGdW5kcwACAA5peFdsZ0lzc3VlVGltZQAGAA9peFdsZ1RlYW1BbUxlZnQACQATaXhXbGdUZWFtQW1BdmFpbE5vdwAKAA5peFdsZ0FjdEFtTGVmdAANABJpeFdsZ0FjdEFtQXZhaWxOb3cADgAQaXhXbGdBbUxlZnRUb3RhbAARABNpeFdsZ1VzZXJBbUF2YWlsTm93ABUAEGl4V2xnRWZmVXNlclRpbWUAFgEMZ2V0V2xnU3RhdHMyBAt1c2VyQWRkck9wdAljb250cmFjdHMGdXNkdElkFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQMaXNzdWVkQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ93bGdJc3N1ZWRBbXRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQHcmVzdFVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUJZGFwcDJSZXN0BQZ1c2R0SWQEBndsZ1VzZAkAZQIJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQZ1c2R0SWQFFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQJcHV6emxlVXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQtkYXBwMlB1enpsZQUGdXNkdElkBBFpbnZlc3RGbmRDb250cmFjdAkAkQMCBQljb250cmFjdHMFD2RhcHAySW52ZXN0RnVuZAQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRFpbnZlc3RGbmRDb250cmFjdAUGdXNkdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEWludmVzdEZuZENvbnRyYWN0BQ56Yklzc3VlZEFtdEtleQAABA10b3RhbEZ1bmRzVXNkCQBkAgUGd2xnVXNkBQ9pbnZlc3RGdW5kVG90YWwEBXdsZ0lkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnAgt3bGdfYXNzZXRJZAITTm90IGluaXRpYWxpemVkIHlldAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ53bGdJc3N1ZVRpbUtleQIPTm90IGluaXRpYWxpemVkBAl0ZWFtVG90YWwJAGsDBQVNSUxMNgUKVEVBTV9TSEFSRQUDTTZfBA50ZWFtQW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDnRlYW1BbXRMZWZ0S2V5BQl0ZWFtVG90YWwEDGxhc3RUZWFtVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDmxhc3RUZWFtVGltS2V5BQlpc3N1ZVRpbWUECHRlYW1BZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCdCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUKdGVhbUFkcktleQQWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQl0ZWFtVG90YWwJAGUCBQNub3cFDGxhc3RUZWFtVGltZQkAaAIAAwULWUVBUl9NSUxMSVMJAMwIAgUOdGVhbUFtb3VudExlZnQFA25pbAQKdGVhbVdsZ29sZAkA8AcCBQh0ZWFtQWRkcgUFd2xnSWQECGFjdFRvdGFsCQBrAwUFTUlMTDYFDkFDVElWSVRZX1NIQVJFBQNNNl8EDWFjdEFtb3VudExlZnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ1hY3RBbXRMZWZ0S2V5BQhhY3RUb3RhbAQSbGFzdEFjdGl2aXRpZXNUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUUbGFzdEFjdGl2aXRpZXNUaW1LZXkFCWlzc3VlVGltZQQVYWN0QW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCGFjdFRvdGFsCQBlAgUDbm93BRJsYXN0QWN0aXZpdGllc1RpbWUJAGgCAAMFC1lFQVJfTUlMTElTCQDMCAIFDWFjdEFtb3VudExlZnQFA25pbAQJYWN0V2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQlkYXBwMlJlc3QFBXdsZ0lkBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnCQEWa2V5TGFzdENsYWltVGltZUJ5VXNlcgEFC3VzZXJBZGRyT3B0BQlpc3N1ZVRpbWUEDmxhc3RVc2VyUGVyaW9kCQBpAgkAZQIFDGxhc3RVc2VyVGltZQUJaXNzdWVUaW1lBQtZRUFSX01JTExJUwQKbm93TGltaXRlZAkAlwMBCQDMCAIFA25vdwkAzAgCCQBkAgUJaXNzdWVUaW1lCQBoAgADBQtZRUFSX01JTExJUwUDbmlsBAljdXJQZXJpb2QJAJcDAQkAzAgCCQBpAgkAZQIFA25vdwUJaXNzdWVUaW1lBQtZRUFSX01JTExJUwkAzAgCAAIFA25pbAQDZWZmCQEQZ2V0RmFybWluZ1Bvd2VycwIFC3VzZXJBZGRyT3B0CQCRAwIFCWNvbnRyYWN0cwUMZGFwcDJTdGFraW5nBBVjdXJQZXJpb2REaXN0cmlidXRpb24JAQ1kaXN0ckJ5UGVyaW9kAQUJY3VyUGVyaW9kBAgkdDA3OTE0MgMJAAACBQ5sYXN0VXNlclBlcmlvZAUJY3VyUGVyaW9kBAJhMAkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQFDGxhc3RVc2VyVGltZQULWUVBUl9NSUxMSVMEB2VmZlRpbWUFCm5vd0xpbWl0ZWQJAJQKAgUCYTAFB2VmZlRpbWUDCQAAAgUObGFzdFVzZXJQZXJpb2QJAGUCBQljdXJQZXJpb2QAAQQCYTEJAGsDCQENZGlzdHJCeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZQIJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwUJY3VyUGVyaW9kBQxsYXN0VXNlclRpbWUFC1lFQVJfTUlMTElTBAJhMAkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwUJY3VyUGVyaW9kBQtZRUFSX01JTExJUwQFYXZhaWwJAGQCBQJhMQUCYTAEB2VmZlRpbWUDCQBnAgUCYTEFBWF2YWlsCQBkAgUMbGFzdFVzZXJUaW1lCQBrAwULWUVBUl9NSUxMSVMFBWF2YWlsCQENZGlzdHJCeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZAIJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwUJY3VyUGVyaW9kCQBrAwULWUVBUl9NSUxMSVMJAGUCBQVhdmFpbAUCYTEFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAlAoCBQVhdmFpbAUHZWZmVGltZQQCYTIJAGsDCQENZGlzdHJCeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAgkAZQIJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwkAZQIFCWN1clBlcmlvZAABBQxsYXN0VXNlclRpbWUFC1lFQVJfTUlMTElTBAJhMQkBDWRpc3RyQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAEEAmEwCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQBlAgUKbm93TGltaXRlZAkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTBQljdXJQZXJpb2QFC1lFQVJfTUlMTElTBAVhdmFpbAkAZAIJAGQCBQJhMgUCYTEFAmEwBAdlZmZUaW1lAwkAZwIFAmEyBQVhdmFpbAkAZAIFDGxhc3RVc2VyVGltZQkAawMFC1lFQVJfTUlMTElTBQVhdmFpbAkBDWRpc3RyQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAIDCQBnAgkAZAIFAmEyBQJhMQUFYXZhaWwJAGQCCQBkAgUJaXNzdWVUaW1lCQBoAgULWUVBUl9NSUxMSVMJAGUCBQljdXJQZXJpb2QAAQkAawMFC1lFQVJfTUlMTElTCQBlAgUFYXZhaWwFAmEyCQENZGlzdHJCeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZAIJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwUJY3VyUGVyaW9kCQBrAwULWUVBUl9NSUxMSVMJAGUCCQBlAgUFYXZhaWwFAmEyBQJhMQUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQCUCgIFBWF2YWlsBQdlZmZUaW1lBA11c2VyQXZhaWxhYmxlCAUIJHQwNzkxNDICXzEEC2VmZkxhc3RUaW1lCAUIJHQwNzkxNDICXzIED2Ftb3VudExlZnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFEXN0YWtlcnNBbXRMZWZ0S2V5AAAEDHVucm9iYmVkVXNlcgMJAQIhPQIJAJEDAgUDZWZmBQppZHhUb3RhbEZQAAAJAGsDBQ11c2VyQXZhaWxhYmxlCQCRAwIFA2VmZgUJaWR4VXNlckZQCQCRAwIFA2VmZgUKaWR4VG90YWxGUAAACQDMCAIFDGlzc3VlZEFtb3VudAkAzAgCCQBrAwkAZQIFDXRvdGFsRnVuZHNVc2QFDVVTRFRfVFZMX0NPUlIFA004XwUMaXNzdWVkQW1vdW50CQDMCAIFDXRvdGFsRnVuZHNVc2QJAMwIAgUHcmVzdFVzZAkAzAgCBQZ3bGdVc2QJAMwIAgUJcHV6emxlVXNkCQDMCAIFCWlzc3VlVGltZQkAzAgCBQxsYXN0VGVhbVRpbWUJAMwIAgUJdGVhbVRvdGFsCQDMCAIFDnRlYW1BbW91bnRMZWZ0CQDMCAIFFnRlYW1BbW91bnRBdmFpbGFibGVOb3cJAMwIAgUKdGVhbVdsZ29sZAkAzAgCBQhhY3RUb3RhbAkAzAgCBQ1hY3RBbW91bnRMZWZ0CQDMCAIFFWFjdEFtb3VudEF2YWlsYWJsZU5vdwkAzAgCBQlhY3RXbGdvbGQJAMwIAgUJY3VyUGVyaW9kCQDMCAIFD2Ftb3VudExlZnRUb3RhbAkAzAgCBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAMwIAgUMbGFzdFVzZXJUaW1lCQDMCAIFD2ludmVzdEZ1bmRUb3RhbAkAzAgCBQx1bnJvYmJlZFVzZXIJAMwIAgULZWZmTGFzdFRpbWUFA25pbAADbmV0CQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABABZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyBAckbWF0Y2gwBQNuZXQDCQAAAgEBVwUHJG1hdGNoMAIjM1BGd1l0YThiaUV6MzF6cGVGZTVESks4d0U1dHJTcFFWRjgDCQAAAgEBVAUHJG1hdGNoMAIjM043VXVZYXI2MjY0UDU4RkJoVldLUFFBaDRZdWEyaGduZ3YJAAIBAg1Vbmtub3duIGNoYWluAA1wcm9maXRBZGRyS2V5Agpwcm9maXRBZGRyABlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5AhZzdGFrZXJzQW1vdW50UGFpZFRvdGFsARhrZXlTdGFrZXJzQW1vdW50UGFpZFVzZXIBBGFkZHIJAKwCAgIWc3Rha2Vyc0Ftb3VudFBhaWRVc2VyXwUEYWRkcgANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAOYWNyZXMyQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEGFjcmVzMkFkZHJlc3NTdHIBB3Byb2xvZzIACQEFYXNJbnQBCQD9BwQFDmFjcmVzMkNvbnRyYWN0AgpzYXZlTGFzdFR4BQNuaWwFA25pbAEPZ2V0U3dhcExpbWl0V2xnAQRhZGRyBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBQRhZGRyAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXADCQBmAgUOYXJiaXRyYWdlRGVsYXkJAGUCBQNub3cFCGxhc3RUaW1lCQACAQkArAICCQCsAgICH0FyYml0cmFnZXMgYXJlIHBvc3NpYmxlIG9uY2UgYSAJAKQDAQkAaQIFDmFyYml0cmFnZURlbGF5AODUAwIDbWluCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBQRhZGRyAAABDmNsYWltSW50ZXJuYWwyAQRhZGRyBAZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAUEYWRkcgkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQLdXNlclRpbWVLZXkJARZrZXlMYXN0Q2xhaW1UaW1lQnlVc2VyAQUEYWRkcgQMbGFzdFVzZXJUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFC3VzZXJUaW1lS2V5AAAEC3VzZXJFZmZUaW1lCQCRAwIFCGN1clN0YXRzBRBpeFdsZ0VmZlVzZXJUaW1lAwkAAAIFDGxhc3RVc2VyVGltZQULdXNlckVmZlRpbWUJAJQKAgUDbmlsAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWlzc3VlVGltZQkAkQMCBQhjdXJTdGF0cwUOaXhXbGdJc3N1ZVRpbWUEDnRlYW1BbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBQ9peFdsZ1RlYW1BbUxlZnQECnRlYW1BbW91bnQJAJEDAgUIY3VyU3RhdHMFE2l4V2xnVGVhbUFtQXZhaWxOb3cEDWFjdEFtb3VudExlZnQJAJEDAgUIY3VyU3RhdHMFDml4V2xnQWN0QW1MZWZ0BAlhY3RBbW91bnQJAJEDAgUIY3VyU3RhdHMFEml4V2xnQWN0QW1BdmFpbE5vdwQKdXNlckFtb3VudAkAkQMCBQhjdXJTdGF0cwUTaXhXbGdVc2VyQW1BdmFpbE5vdwQHdXNlcktleQkBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEFBGFkZHIECXVzZXJUb3RhbAkAkQMCBQhjdXJTdGF0cwUTaXhXbGdVc2VyQW1BdmFpbE5vdwkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQULdGVhbUFkZHJLZXkFCnRlYW1BbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQlhY3RBbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFB3VzZXJLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFB3VzZXJLZXkAAAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQAABQl1c2VyVG90YWwJAMwIAgkBDEludGVnZXJFbnRyeQIFFHN0YWtlcnNBbW91bnRMZWZ0S2V5CQBlAgkAkQMCBQhjdXJTdGF0cwUQaXhXbGdBbUxlZnRUb3RhbAUJdXNlclRvdGFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF0ZWFtQW1vdW50TGVmdEtleQkAZQIFDnRlYW1BbW91bnRMZWZ0BQp0ZWFtQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9sYXN0VGVhbVRpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQYWN0QW1vdW50TGVmdEtleQkAZQIFDWFjdEFtb3VudExlZnQFCWFjdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFC3VzZXJUaW1lS2V5BQt1c2VyRWZmVGltZQUDbmlsBQp1c2VyQW1vdW50AQ50YWtlWHBJbnRlcm5hbAIEYWRkcgVkZWx0YQQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQHdGltZUtleQkBFmtleVdsZ1N0YWtlZFRpbWVCeVVzZXIBBQRhZGRyBAlhbW91bnRLZXkJARhrZXlXbGdTdGFrZWRBbW91bnRCeVVzZXIBBQRhZGRyBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd0aW1lS2V5AAAEB29sZFVzZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJYW1vdW50S2V5AAAECG9sZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFEXdsZ1N0YWtlZFRvdGFsS2V5AAAEAnhwCQBrAwkAawMFBXhwV2xnBQdvbGRVc2VyBQ93bGdCYXNlQW1vdW50WHAJAGUCBQhsYXN0VGltZQUDbm93BQlEQVlNSUxMSVMJAJUKAwkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlhbW91bnRLZXkJAGQCBQdvbGRVc2VyBQVkZWx0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgURd2xnU3Rha2VkVG90YWxLZXkJAGQCBQhvbGRUb3RhbAUFZGVsdGEFA25pbAUCeHAFB29sZFVzZXIJAWkBDWNvbnN0cnVjdG9yVjEECHJlc3RBZGRyDW1hcmtldGluZ0FkZHIIdGVhbUFkZHIKcHJvZml0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkAwkBCWlzRGVmaW5lZAEJAKEIAQUNd2xnQXNzZXRJZEtleQkAAgECE0FscmVhZHkgaW5pdGlhbGl6ZWQEDGlzc3VlZEFtb3VudAUITUlMTElPTjYEBWlzc3VlCQDDCAcCBldMR09MRAIgV2F2ZXNMYW5kcyBHb2xkIGludmVzdG1lbnQgdG9rZW4FDGlzc3VlZEFtb3VudAAIBgUEdW5pdAAABAdhc3NldElkCQC4CAEFBWlzc3VlCQDMCAIFBWlzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ93bGdJc3N1ZVRpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkFDGlzc3VlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQkAawMFCE1JTExJT042BQtQTEFZRVJTSEFSRQUFTVVMVDYJAMwIAgkBC0JpbmFyeUVudHJ5AgUNd2xnQXNzZXRJZEtleQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MABQhyZXN0QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQt0ZWFtQWRkcktleQUIdGVhbUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUNcHJvZml0QWRkcktleQUKcHJvZml0QWRkcgUDbmlsAWkBDWNvbnN0cnVjdG9yVjIBCXJlc3QyQWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlSZXN0MkFkZHJlc3MABQlyZXN0MkFkZHIFA25pbAFpAQZidXlXbGcBCW1pbkFtb3VudAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQHdXNkdEFtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEBmNhbGxlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBmNhbGxlcgMJAGYCBQ5NSU5TSE9QUEFZTUVOVAUHdXNkdEFtdAkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHRyYWRlIG1pbiAJAQpmaXhlZFBvaW50AgUOTUlOU0hPUFBBWU1FTlQABgIFIFVTRFQECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAUHdXNkdEFtdAQMY3VyV2xnQW1vdW50CQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAQIZnVuZHNVc2QJAJEDAgUIY3VyU3RhdHMFCml4V2xnRnVuZHMECHdsZ1ByaWNlCQBrAwUIZnVuZHNVc2QFBU1VTFQ4BQxjdXJXbGdBbW91bnQECGJ1eVByaWNlCQBrAwUId2xnUHJpY2UABgAFBAl3bGdBbW91bnQJAGsDBQd1c2R0QW10BQVNVUxUOAUIYnV5UHJpY2UEBm1heFdsZwkBD2dldFN3YXBMaW1pdFdsZwEFBGFkZHIDCQBmAgUJd2xnQW1vdW50BQZtYXhXbGcJAAIBCQCsAgIJAKwCAgIQWW91IGNhbiBnZXQgbWF4IAkBCmZpeGVkUG9pbnQCBQZtYXhXbGcACAIHIFdMR09MRAMJAGYCBQltaW5BbW91bnQFCXdsZ0Ftb3VudAkAAgECMFByaWNlIGNoYW5nZWQgZHVyaW5nIG9wZXJhdGlvbiwgcGxlYXNlIHRyeSBhZ2FpbgQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAGBApkZWx0YUZ1bmRzCQBlAgUHdXNkdEFtdAUMcHJvZml0QW1vdW50BAhyZWlzc3VlZAkAawMFDGN1cldsZ0Ftb3VudAUKZGVsdGFGdW5kcwUIZnVuZHNVc2QJAJQKAgkAzAgCCQEHUmVpc3N1ZQMFCndsZ0Fzc2V0SWQFCHJlaXNzdWVkBgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5CQBkAgUMY3VyV2xnQW1vdW50BQhyZWlzc3VlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQUEYWRkcggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQ1wcm9maXRBZGRyS2V5BQxwcm9maXRBbW91bnQFC3VzZHRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUJd2xnQW1vdW50BQp3bGdBc3NldElkBQNuaWwFDHByb2xvZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdzZWxsV2xnAQltaW5BbW91bnQEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEBndsZ0FtdAgFA3BtdAZhbW91bnQEBmNhbGxlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBmNhbGxlcgQGbWF4V2xnCQEPZ2V0U3dhcExpbWl0V2xnAQUEYWRkcgMJAGYCBQZ3bGdBbXQFBm1heFdsZwkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHNwZW5kIG1heCAJAQpmaXhlZFBvaW50AgUGbWF4V2xnAAgCByBXTEdPTEQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQp3bGdBc3NldElkCQACAQIVV0xHT0xEIHBheW1lbnRzIG9ubHkhBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQMY3VyV2xnQW1vdW50CQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAQJc2VsbFByaWNlCQBrAwkAkQMCBQhjdXJTdGF0cwUKaXhXbGdQcmljZQAEAAUEB3VzZHRBbXQJAGsDBQZ3bGdBbXQFCXNlbGxQcmljZQUFTVVMVDgDCQBmAgUOTUlOU0hPUFBBWU1FTlQFB3VzZHRBbXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiB0cmFkZSBtaW4gCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYCBSBVU0RUAwkAZgIFCW1pbkFtb3VudAUHdXNkdEFtdAkAAgECMFByaWNlIGNoYW5nZWQgZHVyaW5nIG9wZXJhdGlvbiwgcGxlYXNlIHRyeSBhZ2FpbgQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAECQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZQIFDGN1cldsZ0Ftb3VudAUGd2xnQW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFDXByb2ZpdEFkZHJLZXkFDHByb2ZpdEFtb3VudAULdXNkdEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQd1c2R0QW10BQt1c2R0QXNzZXRJZAUDbmlsBQxwcm9sb2dSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFY2xhaW0ABAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAFyCQEOY2xhaW1JbnRlcm5hbDIBCQClCAEIBQFpBmNhbGxlcgQHYWN0aW9ucwgFAXICXzEJAJQKAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIIBQFyAl8yBQp3bGdBc3NldElkBQxwcm9sb2dSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESb25TdGFrZVVuc3Rha2VMYW5kAQRhZGRyAwMDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkBAiE9AggFAWkGY2FsbGVyBQ1hY3Jlc0NvbnRyYWN0BwkBAiE9AggFAWkGY2FsbGVyBQ5hY3JlczJDb250cmFjdAcJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQNJHQwMTA5ODExMTAzNQkBDmNsYWltSW50ZXJuYWwyAQUEYWRkcgQHYWN0aW9ucwgFDSR0MDEwOTgxMTEwMzUCXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAxMDk4MTExMDM1Al8yCQCUCgIJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYWRkcgUQd2xnQ2xhaW1lZEFtb3VudAUKd2xnQXNzZXRJZAUQd2xnQ2xhaW1lZEFtb3VudAFpAQpidXJuV2xnb2xkAAMJAQIhPQIIBQFpBmNhbGxlcgUOYWNyZXMyQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQGd2xnQW10CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAAEDXdsZ0Ftb3VudExlZnQJAGUCCQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAUGd2xnQW10CQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQUNd2xnQW1vdW50TGVmdAUDbmlsBQ13bGdBbW91bnRMZWZ0AWkBCXRha2VXbGdYcAEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDEzMzA2MTMzNDkJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHYWN0aW9ucwgFDSR0MDEzMzA2MTMzNDkCXzEEAnhwCAUNJHQwMTMzMDYxMzM0OQJfMgkAlAoCBQdhY3Rpb25zBQJ4cAFpARJjaGVja1dsZ1hwUkVBRE9OTFkBBGFkZHIEDSR0MDEzNDI2MTM0NzQJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHaWdub3JlZAgFDSR0MDEzNDI2MTM0NzQCXzEEB2RlbHRhWFAIBQ0kdDAxMzQyNjEzNDc0Al8yBAVuZXdYUAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEJa2V5VXNlclhQAQUEYWRkcgAABQdkZWx0YVhQBAlsdmxQb2ludHMJAQdsZXZlbFVwAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlVc2VyTGV2ZWwBBQRhZGRyAAAFBW5ld1hQCQCUCgIFA25pbAkAzQgCBQlsdmxQb2ludHMFBW5ld1hQALWhdkE=", "height": 3281265, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3LBWi3NoargvPCRarwy2edDaabb4VzLkFCrKvpwZqpwA Next: 9sW4poLPS2SUg3hUuqhsvvUkWTCuEyL86tfGieGt26xR Diff:
OldNewDifferences
155155 let actAmountLeftKey = "activitiesAmountLeft"
156156
157157 let stakersAmountLeftKey = "stakersAmountLeft"
158-
159-func keyLastClaimedTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
160-
161158
162159 func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
163160
336333 let $t079142 = if ((lastUserPeriod == curPeriod))
337334 then {
338335 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEAR_MILLIS)
339- let effTime = ((lastUserTime + nowLimited) - lastUserTime)
336+ let effTime = nowLimited
340337 $Tuple2(a0, effTime)
341338 }
342339 else if ((lastUserPeriod == (curPeriod - 1)))
408405 func claimInternal2 (addr) = {
409406 let caller = addressFromStringValue(addr)
410407 let curStats = getWlgStats2(addr, [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
411- let now = lastBlock.timestamp
412- let issueTime = curStats[ixWlgIssueTime]
413- let teamAmountLeft = curStats[ixWlgTeamAmLeft]
414- let teamAmount = curStats[ixWlgTeamAmAvailNow]
415- let actAmountLeft = curStats[ixWlgActAmLeft]
416- let actAmount = curStats[ixWlgActAmAvailNow]
417- let userAmount = curStats[ixWlgUserAmAvailNow]
418- let userKey = keyStakersAmountPaidUser(addr)
419- let userTotal = curStats[ixWlgUserAmAvailNow]
408+ let userTimeKey = keyLastClaimTimeByUser(addr)
409+ let lastUserTime = valueOrElse(getInteger(userTimeKey), 0)
420410 let userEffTime = curStats[ixWlgEffUserTime]
421- $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)
411+ if ((lastUserTime == userEffTime))
412+ then $Tuple2(nil, 0)
413+ else {
414+ let now = lastBlock.timestamp
415+ let issueTime = curStats[ixWlgIssueTime]
416+ let teamAmountLeft = curStats[ixWlgTeamAmLeft]
417+ let teamAmount = curStats[ixWlgTeamAmAvailNow]
418+ let actAmountLeft = curStats[ixWlgActAmLeft]
419+ let actAmount = curStats[ixWlgActAmAvailNow]
420+ let userAmount = curStats[ixWlgUserAmAvailNow]
421+ let userKey = keyStakersAmountPaidUser(addr)
422+ let userTotal = curStats[ixWlgUserAmAvailNow]
423+ $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(userTimeKey, userEffTime)], userAmount)
424+ }
422425 }
423426
424427
561564 else false)
562565 then throw("Permission denied")
563566 else {
564- let $t01083810892 = claimInternal2(addr)
565- let actions = $t01083810892._1
566- let wlgClaimedAmount = $t01083810892._2
567+ let $t01098111035 = claimInternal2(addr)
568+ let actions = $t01098111035._1
569+ let wlgClaimedAmount = $t01098111035._2
567570 $Tuple2((actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId)), wlgClaimedAmount)
568571 }
569572
585588 func takeWlgXp (addr) = if ((i.caller != stakingContract))
586589 then throw("Permission denied")
587590 else {
588- let $t01316313206 = takeXpInternal(addr, 0)
589- let actions = $t01316313206._1
590- let xp = $t01316313206._2
591+ let $t01330613349 = takeXpInternal(addr, 0)
592+ let actions = $t01330613349._1
593+ let xp = $t01330613349._2
591594 $Tuple2(actions, xp)
592595 }
593596
595598
596599 @Callable(i)
597600 func checkWlgXpREADONLY (addr) = {
598- let $t01328313331 = takeXpInternal(addr, 0)
599- let ignored = $t01328313331._1
600- let deltaXP = $t01328313331._2
601+ let $t01342613474 = takeXpInternal(addr, 0)
602+ let ignored = $t01342613474._1
603+ let deltaXP = $t01342613474._2
601604 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
602605 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
603606 $Tuple2(nil, (lvlPoints :+ newXP))
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"
158-
159-func keyLastClaimedTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
160-
161158
162159 func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
163160
164161
165162 let wlgIssueTimeKey = "wlg_issueTime"
166163
167164 let wlgIssuedAmountKey = "wlg_issuedAmount"
168165
169166 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
170167
171168
172169 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
173170
174171
175172 let wlgStakedTotalKey = "wlgStakedAmountTotal"
176173
177174 func keyWlgStakedTimeByUser (addr) = ("wlgStakedTimeByUser_" + addr)
178175
179176
180177 let M6_ = 1000000
181178
182179 let M8_ = 100000000
183180
184181 let MILL6 = 100000000000000
185182
186183 let TEAM_SHARE = 200000
187184
188185 let ACTIVITY_SHARE = 100000
189186
190187 let PLAYER_SHARE = 400000
191188
192189 let YEAR_MILLIS = 31557600000
193190
194191 let chn = take(drop(this.bytes, 1), 1)
195192
196193 let USDT_TVL_CORR = match chn {
197194 case _ =>
198195 if ((base58'2W' == $match0))
199196 then 1208630000
200197 else if ((base58'2T' == $match0))
201198 then 0
202199 else throw("Unknown chain")
203200 }
204201
205202 let teamAdrKey = "teamAddr"
206203
207204 let lastTeamTimKey = "lastClaimedTime_team"
208205
209206 let teamAmtLeftKey = "teamAmountLeft"
210207
211208 let lastActivitiesTimKey = "lastClaimedTime_activities"
212209
213210 let actAmtLeftKey = "activitiesAmountLeft"
214211
215212 let stakersAmtLeftKey = "stakersAmountLeft"
216213
217214 func keyLastClaimTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
218215
219216
220217 func distrByPeriod (period) = fraction(MILL6, (PLAYER_SHARE * (period + 1)), (6 * M6_))
221218
222219
223220 let wlgIssueTimKey = "wlg_issueTime"
224221
225222 let wlgIssuedAmtKey = "wlg_issuedAmount"
226223
227224 let zbIssuedAmtKey = "zbill_issuedAmount"
228225
229226 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
230227
231228
232229 let acresStakdTotalKey = "acresStakedAmountTotal"
233230
234231 let dapp2Rest = 0
235232
236233 let dapp2Staking = 1
237234
238235 let dapp2Wlg = 2
239236
240237 let dapp2Puzzle = 3
241238
242239 let dapp2InvestFund = 4
243240
244241 let levels = [10, 20, 40, 80, 150, 250, 400, 700, 1000]
245242
246243 func getLevelByAcres (acres) = {
247244 let acr = (acres / M8_)
248245 func checker (acc,item) = if ((item > acr))
249246 then acc
250247 else (acc + 1)
251248
252249 let idx = {
253250 let $l = levels
254251 let $s = size($l)
255252 let $acc0 = 0
256253 func $f0_1 ($a,$i) = if (($i >= $s))
257254 then $a
258255 else checker($a, $l[$i])
259256
260257 func $f0_2 ($a,$i) = if (($i >= $s))
261258 then $a
262259 else throw("List size exceeds 10")
263260
264261 $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)
265262 }
266263 (idx + 1)
267264 }
268265
269266
270267 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
271268
272269
273270 func getFarmingPowers (userAddrStrOrEmpty,stakingContract) = {
274271 let totalAcres = valueOrElse(getInteger(stakingContract, acresStakdTotalKey), 0)
275272 let totalFP = getFarmingPowerByAcres(totalAcres)
276273 let userAcres = valueOrElse(getInteger(stakingContract, keyAcresStakedAmtByUser(userAddrStrOrEmpty)), 0)
277274 let userFP = getFarmingPowerByAcres(userAcres)
278275 [totalFP, userFP]
279276 }
280277
281278
282279 let idxTotalFP = 0
283280
284281 let idxUserFP = 1
285282
286283 let ixWlgAmount = 0
287284
288285 let ixWlgPrice = 1
289286
290287 let ixWlgFunds = 2
291288
292289 let ixWlgIssueTime = 6
293290
294291 let ixWlgTeamAmLeft = 9
295292
296293 let ixWlgTeamAmAvailNow = 10
297294
298295 let ixWlgActAmLeft = 13
299296
300297 let ixWlgActAmAvailNow = 14
301298
302299 let ixWlgAmLeftTotal = 17
303300
304301 let ixWlgUserAmAvailNow = 21
305302
306303 let ixWlgEffUserTime = 22
307304
308305 func getWlgStats2 (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
309306 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssuedAmtKey), "WLGOLD is not issued yet")
310307 let restUsd = assetBalance(contracts[dapp2Rest], usdtId)
311308 let wlgUsd = (assetBalance(contracts[dapp2Wlg], usdtId) - usdtBalanceCorrection)
312309 let puzzleUsd = assetBalance(contracts[dapp2Puzzle], usdtId)
313310 let investFndContract = contracts[dapp2InvestFund]
314311 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmtKey), 0))
315312 let totalFundsUsd = (wlgUsd + investFundTotal)
316313 let wlgId = valueOrErrorMessage(getBinary(contracts[dapp2Wlg], "wlg_assetId"), "Not initialized yet")
317314 let now = lastBlock.timestamp
318315 let issueTime = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssueTimKey), "Not initialized")
319316 let teamTotal = fraction(MILL6, TEAM_SHARE, M6_)
320317 let teamAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], teamAmtLeftKey), teamTotal)
321318 let lastTeamTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastTeamTimKey), issueTime)
322319 let teamAddr = addressFromStringValue(value(getString(contracts[dapp2Wlg], teamAdrKey)))
323320 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEAR_MILLIS)), teamAmountLeft])
324321 let teamWlgold = assetBalance(teamAddr, wlgId)
325322 let actTotal = fraction(MILL6, ACTIVITY_SHARE, M6_)
326323 let actAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], actAmtLeftKey), actTotal)
327324 let lastActivitiesTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastActivitiesTimKey), issueTime)
328325 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEAR_MILLIS)), actAmountLeft])
329326 let actWlgold = assetBalance(contracts[dapp2Rest], wlgId)
330327 let lastUserTime = valueOrElse(getInteger(contracts[dapp2Wlg], keyLastClaimTimeByUser(userAddrOpt)), issueTime)
331328 let lastUserPeriod = ((lastUserTime - issueTime) / YEAR_MILLIS)
332329 let nowLimited = min([now, (issueTime + (3 * YEAR_MILLIS))])
333330 let curPeriod = min([((now - issueTime) / YEAR_MILLIS), 2])
334331 let eff = getFarmingPowers(userAddrOpt, contracts[dapp2Staking])
335332 let curPeriodDistribution = distrByPeriod(curPeriod)
336333 let $t079142 = if ((lastUserPeriod == curPeriod))
337334 then {
338335 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEAR_MILLIS)
339- let effTime = ((lastUserTime + nowLimited) - lastUserTime)
336+ let effTime = nowLimited
340337 $Tuple2(a0, effTime)
341338 }
342339 else if ((lastUserPeriod == (curPeriod - 1)))
343340 then {
344341 let a1 = fraction(distrByPeriod((curPeriod - 1)), ((issueTime + (YEAR_MILLIS * curPeriod)) - lastUserTime), YEAR_MILLIS)
345342 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEAR_MILLIS * curPeriod))), YEAR_MILLIS)
346343 let avail = (a1 + a0)
347344 let effTime = if ((a1 >= avail))
348345 then (lastUserTime + fraction(YEAR_MILLIS, avail, distrByPeriod((curPeriod - 1))))
349346 else ((issueTime + (YEAR_MILLIS * curPeriod)) + fraction(YEAR_MILLIS, (avail - a1), curPeriodDistribution))
350347 $Tuple2(avail, effTime)
351348 }
352349 else {
353350 let a2 = fraction(distrByPeriod((curPeriod - 2)), ((issueTime + (YEAR_MILLIS * (curPeriod - 1))) - lastUserTime), YEAR_MILLIS)
354351 let a1 = distrByPeriod((curPeriod - 1))
355352 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEAR_MILLIS * curPeriod))), YEAR_MILLIS)
356353 let avail = ((a2 + a1) + a0)
357354 let effTime = if ((a2 >= avail))
358355 then (lastUserTime + fraction(YEAR_MILLIS, avail, distrByPeriod((curPeriod - 2))))
359356 else if (((a2 + a1) >= avail))
360357 then ((issueTime + (YEAR_MILLIS * (curPeriod - 1))) + fraction(YEAR_MILLIS, (avail - a2), distrByPeriod((curPeriod - 1))))
361358 else ((issueTime + (YEAR_MILLIS * curPeriod)) + fraction(YEAR_MILLIS, ((avail - a2) - a1), curPeriodDistribution))
362359 $Tuple2(avail, effTime)
363360 }
364361 let userAvailable = $t079142._1
365362 let effLastTime = $t079142._2
366363 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
367364 let unrobbedUser = if ((eff[idxTotalFP] != 0))
368365 then fraction(userAvailable, eff[idxUserFP], eff[idxTotalFP])
369366 else 0
370367 [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]
371368 }
372369
373370
374371 let net = take(drop(this.bytes, 1), 1)
375372
376373 let defaultRest2AddressStr = match net {
377374 case _ =>
378375 if ((base58'2W' == $match0))
379376 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
380377 else if ((base58'2T' == $match0))
381378 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
382379 else throw("Unknown chain")
383380 }
384381
385382 let profitAddrKey = "profitAddr"
386383
387384 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
388385
389386 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
390387
391388
392389 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
393390
394391 let acres2Contract = addressFromStringValue(acres2AddressStr)
395392
396393 func prolog2 () = asInt(reentrantInvoke(acres2Contract, "saveLastTx", nil, nil))
397394
398395
399396 func getSwapLimitWlg (addr) = {
400397 let lastTime = valueOrElse(getInteger(keyLastArbTimeByUser(addr)), 0)
401398 let now = lastBlock.timestamp
402399 if ((arbitrageDelay > (now - lastTime)))
403400 then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "min"))
404401 else valueOrElse(getInteger(acres2Contract, keyAcresStakedAmountByUser(addr)), 0)
405402 }
406403
407404
408405 func claimInternal2 (addr) = {
409406 let caller = addressFromStringValue(addr)
410407 let curStats = getWlgStats2(addr, [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
411- let now = lastBlock.timestamp
412- let issueTime = curStats[ixWlgIssueTime]
413- let teamAmountLeft = curStats[ixWlgTeamAmLeft]
414- let teamAmount = curStats[ixWlgTeamAmAvailNow]
415- let actAmountLeft = curStats[ixWlgActAmLeft]
416- let actAmount = curStats[ixWlgActAmAvailNow]
417- let userAmount = curStats[ixWlgUserAmAvailNow]
418- let userKey = keyStakersAmountPaidUser(addr)
419- let userTotal = curStats[ixWlgUserAmAvailNow]
408+ let userTimeKey = keyLastClaimTimeByUser(addr)
409+ let lastUserTime = valueOrElse(getInteger(userTimeKey), 0)
420410 let userEffTime = curStats[ixWlgEffUserTime]
421- $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)
411+ if ((lastUserTime == userEffTime))
412+ then $Tuple2(nil, 0)
413+ else {
414+ let now = lastBlock.timestamp
415+ let issueTime = curStats[ixWlgIssueTime]
416+ let teamAmountLeft = curStats[ixWlgTeamAmLeft]
417+ let teamAmount = curStats[ixWlgTeamAmAvailNow]
418+ let actAmountLeft = curStats[ixWlgActAmLeft]
419+ let actAmount = curStats[ixWlgActAmAvailNow]
420+ let userAmount = curStats[ixWlgUserAmAvailNow]
421+ let userKey = keyStakersAmountPaidUser(addr)
422+ let userTotal = curStats[ixWlgUserAmAvailNow]
423+ $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(userTimeKey, userEffTime)], userAmount)
424+ }
422425 }
423426
424427
425428 func takeXpInternal (addr,delta) = {
426429 let now = lastBlock.timestamp
427430 let timeKey = keyWlgStakedTimeByUser(addr)
428431 let amountKey = keyWlgStakedAmountByUser(addr)
429432 let lastTime = valueOrElse(getInteger(timeKey), 0)
430433 let oldUser = valueOrElse(getInteger(amountKey), 0)
431434 let oldTotal = valueOrElse(getInteger(wlgStakedTotalKey), 0)
432435 let xp = fraction(fraction(xpWlg, oldUser, wlgBaseAmountXp), (lastTime - now), DAYMILLIS)
433436 $Tuple3([IntegerEntry(timeKey, now), IntegerEntry(amountKey, (oldUser + delta)), IntegerEntry(wlgStakedTotalKey, (oldTotal + delta))], xp, oldUser)
434437 }
435438
436439
437440 @Callable(i)
438441 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
439442 then throw("Permission denied")
440443 else if (isDefined(getBinary(wlgAssetIdKey)))
441444 then throw("Already initialized")
442445 else {
443446 let issuedAmount = MILLION6
444447 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
445448 let assetId = calculateAssetId(issue)
446449 [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)]
447450 }
448451
449452
450453
451454 @Callable(i)
452455 func constructorV2 (rest2Addr) = if ((i.caller != this))
453456 then throw("Permission denied")
454457 else [StringEntry(keyRest2Address(), rest2Addr)]
455458
456459
457460
458461 @Callable(i)
459462 func buyWlg (minAmount) = {
460463 let prologResult = prolog2()
461464 if ((prologResult == prologResult))
462465 then if ((size(i.payments) != 1))
463466 then throw("exactly 1 payment must be attached")
464467 else {
465468 let pmt = i.payments[0]
466469 let usdtAmt = pmt.amount
467470 if (if (!(isDefined(pmt.assetId)))
468471 then true
469472 else (value(pmt.assetId) != usdtAssetId))
470473 then throw("USDT payments only!")
471474 else {
472475 let caller = i.caller
473476 let addr = toString(caller)
474477 if ((MINSHOPPAYMENT > usdtAmt))
475478 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
476479 else {
477480 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
478481 let curWlgAmount = curStats[ixWlgAmount]
479482 let fundsUsd = curStats[ixWlgFunds]
480483 let wlgPrice = fraction(fundsUsd, MULT8, curWlgAmount)
481484 let buyPrice = fraction(wlgPrice, 6, 5)
482485 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
483486 let maxWlg = getSwapLimitWlg(addr)
484487 if ((wlgAmount > maxWlg))
485488 then throw((("You can get max " + fixedPoint(maxWlg, 8)) + " WLGOLD"))
486489 else if ((minAmount > wlgAmount))
487490 then throw("Price changed during operation, please try again")
488491 else {
489492 let profitAmount = (usdtAmt / 6)
490493 let deltaFunds = (usdtAmt - profitAmount)
491494 let reissued = fraction(curWlgAmount, deltaFunds, fundsUsd)
492495 $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)
493496 }
494497 }
495498 }
496499 }
497500 else throw("Strict value is not equal to itself.")
498501 }
499502
500503
501504
502505 @Callable(i)
503506 func sellWlg (minAmount) = {
504507 let prologResult = prolog2()
505508 if ((prologResult == prologResult))
506509 then if ((size(i.payments) != 1))
507510 then throw("exactly 1 payment must be attached")
508511 else {
509512 let pmt = i.payments[0]
510513 let wlgAmt = pmt.amount
511514 let caller = i.caller
512515 let addr = toString(caller)
513516 let maxWlg = getSwapLimitWlg(addr)
514517 if ((wlgAmt > maxWlg))
515518 then throw((("You can spend max " + fixedPoint(maxWlg, 8)) + " WLGOLD"))
516519 else if (if (!(isDefined(pmt.assetId)))
517520 then true
518521 else (value(pmt.assetId) != wlgAssetId))
519522 then throw("WLGOLD payments only!")
520523 else {
521524 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
522525 let curWlgAmount = curStats[ixWlgAmount]
523526 let sellPrice = fraction(curStats[ixWlgPrice], 4, 5)
524527 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
525528 if ((MINSHOPPAYMENT > usdtAmt))
526529 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
527530 else if ((minAmount > usdtAmt))
528531 then throw("Price changed during operation, please try again")
529532 else {
530533 let profitAmount = (usdtAmt / 4)
531534 $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)
532535 }
533536 }
534537 }
535538 else throw("Strict value is not equal to itself.")
536539 }
537540
538541
539542
540543 @Callable(i)
541544 func claim () = {
542545 let prologResult = prolog2()
543546 if ((prologResult == prologResult))
544547 then if ((size(i.payments) != 0))
545548 then throw("No payments required")
546549 else {
547550 let r = claimInternal2(toString(i.caller))
548551 let actions = r._1
549552 $Tuple2((actions :+ ScriptTransfer(i.caller, r._2, wlgAssetId)), prologResult)
550553 }
551554 else throw("Strict value is not equal to itself.")
552555 }
553556
554557
555558
556559 @Callable(i)
557560 func onStakeUnstakeLand (addr) = if (if (if ((i.caller != stakingContract))
558561 then (i.caller != acresContract)
559562 else false)
560563 then (i.caller != acres2Contract)
561564 else false)
562565 then throw("Permission denied")
563566 else {
564- let $t01083810892 = claimInternal2(addr)
565- let actions = $t01083810892._1
566- let wlgClaimedAmount = $t01083810892._2
567+ let $t01098111035 = claimInternal2(addr)
568+ let actions = $t01098111035._1
569+ let wlgClaimedAmount = $t01098111035._2
567570 $Tuple2((actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId)), wlgClaimedAmount)
568571 }
569572
570573
571574
572575 @Callable(i)
573576 func burnWlgold () = if ((i.caller != acres2Contract))
574577 then throw("Permission denied")
575578 else {
576579 let wlgAmt = i.payments[0].amount
577580 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
578581 let wlgAmountLeft = (curStats[ixWlgAmount] - wlgAmt)
579582 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, wlgAmountLeft)], wlgAmountLeft)
580583 }
581584
582585
583586
584587 @Callable(i)
585588 func takeWlgXp (addr) = if ((i.caller != stakingContract))
586589 then throw("Permission denied")
587590 else {
588- let $t01316313206 = takeXpInternal(addr, 0)
589- let actions = $t01316313206._1
590- let xp = $t01316313206._2
591+ let $t01330613349 = takeXpInternal(addr, 0)
592+ let actions = $t01330613349._1
593+ let xp = $t01330613349._2
591594 $Tuple2(actions, xp)
592595 }
593596
594597
595598
596599 @Callable(i)
597600 func checkWlgXpREADONLY (addr) = {
598- let $t01328313331 = takeXpInternal(addr, 0)
599- let ignored = $t01328313331._1
600- let deltaXP = $t01328313331._2
601+ let $t01342613474 = takeXpInternal(addr, 0)
602+ let ignored = $t01342613474._1
603+ let deltaXP = $t01342613474._2
601604 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
602605 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
603606 $Tuple2(nil, (lvlPoints :+ newXP))
604607 }
605608
606609

github/deemru/w8io/169f3d6 
68.42 ms