tx · 9sW4poLPS2SUg3hUuqhsvvUkWTCuEyL86tfGieGt26xR

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.01800000 Waves

2024.09.13 17:17 [3281975] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "9sW4poLPS2SUg3hUuqhsvvUkWTCuEyL86tfGieGt26xR", "fee": 1800000, "feeAssetId": null, "timestamp": 1726237122663, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "3CCdqnDntK3JnVeY5XBC7XmbFQstXcut2N9p2E2SLPovQWT1Qu6HcEA3q9BuoBvKTqbwGGyo2aApgirpwe3ddeRA" ], "script": "base64:BgIsCAISBgoECAgICBIDCgEIEgMKAQESAwoBARIAEgMKAQgSABIDCgEIEgMKAQhyAApEQVlfTUlMTElTAIC4mSkABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgAQYWNyZXMyQWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1A0VUgzVDluWHBNTnBVbVNtUWpQbUV6M0c4NXQzem42ZUEDCQAAAgEBVAUHJG1hdGNoMAIjM05CUHgxRmNpdTNKUU5FR1oyMWpTblRkdXRMTkdHQlVTWGgJAAIBAg1Vbmtub3duIGNoYWluAA5hcmJpdHJhZ2VEZWxheQQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAUKREFZX01JTExJUwMJAAACAQFUBQckbWF0Y2gwAODUAwkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAOTUlOU0hPUFBBWU1FTlQAoI0GAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQANSWR4Q2ZnV2xnRGFwcAAEABRJZHhDZmdQdXp6bGVQb29sRGFwcAAFABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAGAA9JZHhDZmdBY3Jlc0RhcHAACAEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgEPa2V5UmVzdDJBZGRyZXNzAAINJXNfX3Jlc3QyQWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ1JZHhDZmdXbGdEYXBwABJwdXp6bGVQb29sQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdQdXp6bGVQb29sRGFwcAASaW52ZXN0RnVuZENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUUSWR4Q2ZnSW52ZXN0RnVuZERhcHAADWFjcmVzQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ9JZHhDZmdBY3Jlc0RhcHAADXdsZ0Fzc2V0SWRLZXkCC3dsZ19hc3NldElkAAp3bGdBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgULd2xnQ29udHJhY3QFDXdsZ0Fzc2V0SWRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAAGU0NBTEU4AIDC1y8ADHhwTGV2ZWxTY2FsZQCAGQAPeHBMZXZlbFJlY2lwUG93AKAfABJudW1Qb2ludHNPbkxldmVsVXAAAwAPd2xnQmFzZUFtb3VudFhwAIDQ28P0AgEJa2V5VXNlclhQAQRhZGRyCQCsAgICB3VzZXJYUF8FBGFkZHIBDGtleVVzZXJMZXZlbAEEYWRkcgkArAICAgp1c2VyTGV2ZWxfBQRhZGRyAAV4cFdsZwCQTgEJbGV2ZWxCeVhQAQJ4cAkAawMFDHhwTGV2ZWxTY2FsZQkAbAYFAnhwAAQFD3hwTGV2ZWxSZWNpcFBvdwAEAAQFBERPV04FBlNDQUxFOAEHbGV2ZWxVcAIJY3VyckxldmVsBW5ld1hQBAhuZXdMZXZlbAkBCWxldmVsQnlYUAEFBW5ld1hQCQDMCAIFCG5ld0xldmVsCQDMCAIJAGgCBRJudW1Qb2ludHNPbkxldmVsVXAJAGUCBQhuZXdMZXZlbAUJY3VyckxldmVsBQNuaWwACE1JTExJT042AICA6YOx3hYAC1BMQVlFUlNIQVJFAIC1GAAJREFZTUlMTElTAIC4mSkAC3RlYW1BZGRyS2V5Agh0ZWFtQWRkcgAPbGFzdFRlYW1UaW1lS2V5AhRsYXN0Q2xhaW1lZFRpbWVfdGVhbQARdGVhbUFtb3VudExlZnRLZXkCDnRlYW1BbW91bnRMZWZ0ABVsYXN0QWN0aXZpdGllc1RpbWVLZXkCGmxhc3RDbGFpbWVkVGltZV9hY3Rpdml0aWVzABBhY3RBbW91bnRMZWZ0S2V5AhRhY3Rpdml0aWVzQW1vdW50TGVmdAAUc3Rha2Vyc0Ftb3VudExlZnRLZXkCEXN0YWtlcnNBbW91bnRMZWZ0ARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEEYWRkcgkArAICAhBsYXN0QXJiVGltZVVzZXJfBQRhZGRyAA93bGdJc3N1ZVRpbWVLZXkCDXdsZ19pc3N1ZVRpbWUAEndsZ0lzc3VlZEFtb3VudEtleQIQd2xnX2lzc3VlZEFtb3VudAEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyARhrZXlXbGdTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIWd2xnU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgARd2xnU3Rha2VkVG90YWxLZXkCFHdsZ1N0YWtlZEFtb3VudFRvdGFsARZrZXlXbGdTdGFrZWRUaW1lQnlVc2VyAQRhZGRyCQCsAgICFHdsZ1N0YWtlZFRpbWVCeVVzZXJfBQRhZGRyAANNNl8AwIQ9AANNOF8AgMLXLwAFTUlMTDYAgIDpg7HeFgAKVEVBTV9TSEFSRQDAmgwADkFDVElWSVRZX1NIQVJFAKCNBgAMUExBWUVSX1NIQVJFAIC1GAALWUVBUl9NSUxMSVMAgIbrx3UAA2NobgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQANVVNEVF9UVkxfQ09SUgQHJG1hdGNoMAUDY2huAwkAAAIBAVcFByRtYXRjaDAA8PWowAQDCQAAAgEBVAUHJG1hdGNoMAAACQACAQINVW5rbm93biBjaGFpbgAKdGVhbUFkcktleQIIdGVhbUFkZHIADmxhc3RUZWFtVGltS2V5AhRsYXN0Q2xhaW1lZFRpbWVfdGVhbQAOdGVhbUFtdExlZnRLZXkCDnRlYW1BbW91bnRMZWZ0ABRsYXN0QWN0aXZpdGllc1RpbUtleQIabGFzdENsYWltZWRUaW1lX2FjdGl2aXRpZXMADWFjdEFtdExlZnRLZXkCFGFjdGl2aXRpZXNBbW91bnRMZWZ0ABFzdGFrZXJzQW10TGVmdEtleQIRc3Rha2Vyc0Ftb3VudExlZnQBFmtleUxhc3RDbGFpbVRpbWVCeVVzZXIBBGFkZHIJAKwCAgIUbGFzdENsYWltZWRUaW1lVXNlcl8FBGFkZHIBDWRpc3RyQnlQZXJpb2QBBnBlcmlvZAkAawMFBU1JTEw2CQBoAgUMUExBWUVSX1NIQVJFCQBkAgUGcGVyaW9kAAEJAGgCAAYFA002XwAOd2xnSXNzdWVUaW1LZXkCDXdsZ19pc3N1ZVRpbWUAD3dsZ0lzc3VlZEFtdEtleQIQd2xnX2lzc3VlZEFtb3VudAAOemJJc3N1ZWRBbXRLZXkCEnpiaWxsX2lzc3VlZEFtb3VudAEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyABJhY3Jlc1N0YWtkVG90YWxLZXkCFmFjcmVzU3Rha2VkQW1vdW50VG90YWwACWRhcHAyUmVzdAAAAAxkYXBwMlN0YWtpbmcAAQAIZGFwcDJXbGcAAgALZGFwcDJQdXp6bGUAAwAPZGFwcDJJbnZlc3RGdW5kAAQABmxldmVscwkAzAgCAAoJAMwIAgAUCQDMCAIAKAkAzAgCAFAJAMwIAgCWAQkAzAgCAPoBCQDMCAIAkAMJAMwIAgC8BQkAzAgCAOgHBQNuaWwBD2dldExldmVsQnlBY3JlcwEFYWNyZXMEA2FjcgkAaQIFBWFjcmVzBQNNOF8KAQdjaGVja2VyAgNhY2MEaXRlbQMJAGYCBQRpdGVtBQNhY3IFA2FjYwkAZAIFA2FjYwABBANpZHgKAAIkbAUGbGV2ZWxzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdjaGVja2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQBkAgUDaWR4AAEBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBWFjcmVzCQBoAgkAaAIFBWFjcmVzABQJAGQCCQEPZ2V0TGV2ZWxCeUFjcmVzAQUFYWNyZXMABAEQZ2V0RmFybWluZ1Bvd2VycwISdXNlckFkZHJTdHJPckVtcHR5D3N0YWtpbmdDb250cmFjdAQKdG90YWxBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QFEmFjcmVzU3Rha2RUb3RhbEtleQAABAd0b3RhbEZQCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFCnRvdGFsQWNyZXMECXVzZXJBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFEnVzZXJBZGRyU3RyT3JFbXB0eQAABAZ1c2VyRlAJARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQUJdXNlckFjcmVzCQDMCAIFB3RvdGFsRlAJAMwIAgUGdXNlckZQBQNuaWwACmlkeFRvdGFsRlAAAAAJaWR4VXNlckZQAAEAC2l4V2xnQW1vdW50AAAACml4V2xnUHJpY2UAAQAKaXhXbGdGdW5kcwACAA5peFdsZ0lzc3VlVGltZQAGAA9peFdsZ1RlYW1BbUxlZnQACQATaXhXbGdUZWFtQW1BdmFpbE5vdwAKAA5peFdsZ0FjdEFtTGVmdAANABJpeFdsZ0FjdEFtQXZhaWxOb3cADgAQaXhXbGdBbUxlZnRUb3RhbAARABNpeFdsZ1VzZXJBbUF2YWlsTm93ABUAEGl4V2xnRWZmVXNlclRpbWUAFgEMZ2V0V2xnU3RhdHMyBAt1c2VyQWRkck9wdAljb250cmFjdHMGdXNkdElkFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQMaXNzdWVkQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ93bGdJc3N1ZWRBbXRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQHcmVzdFVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUJZGFwcDJSZXN0BQZ1c2R0SWQEBndsZ1VzZAkAZQIJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQZ1c2R0SWQFFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQJcHV6emxlVXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQtkYXBwMlB1enpsZQUGdXNkdElkBBFpbnZlc3RGbmRDb250cmFjdAkAkQMCBQljb250cmFjdHMFD2RhcHAySW52ZXN0RnVuZAQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRFpbnZlc3RGbmRDb250cmFjdAUGdXNkdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEWludmVzdEZuZENvbnRyYWN0BQ56Yklzc3VlZEFtdEtleQAABA10b3RhbEZ1bmRzVXNkCQBkAgUGd2xnVXNkBQ9pbnZlc3RGdW5kVG90YWwEBXdsZ0lkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnAgt3bGdfYXNzZXRJZAITTm90IGluaXRpYWxpemVkIHlldAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ53bGdJc3N1ZVRpbUtleQIPTm90IGluaXRpYWxpemVkBAl0ZWFtVG90YWwJAGsDBQVNSUxMNgUKVEVBTV9TSEFSRQUDTTZfBA50ZWFtQW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDnRlYW1BbXRMZWZ0S2V5BQl0ZWFtVG90YWwEDGxhc3RUZWFtVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDmxhc3RUZWFtVGltS2V5BQlpc3N1ZVRpbWUECHRlYW1BZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCdCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUKdGVhbUFkcktleQQWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQl0ZWFtVG90YWwJAGUCBQNub3cFDGxhc3RUZWFtVGltZQkAaAIAAwULWUVBUl9NSUxMSVMJAMwIAgUOdGVhbUFtb3VudExlZnQFA25pbAQKdGVhbVdsZ29sZAkA8AcCBQh0ZWFtQWRkcgUFd2xnSWQECGFjdFRvdGFsCQBrAwUFTUlMTDYFDkFDVElWSVRZX1NIQVJFBQNNNl8EDWFjdEFtb3VudExlZnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ1hY3RBbXRMZWZ0S2V5BQhhY3RUb3RhbAQSbGFzdEFjdGl2aXRpZXNUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUUbGFzdEFjdGl2aXRpZXNUaW1LZXkFCWlzc3VlVGltZQQVYWN0QW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCGFjdFRvdGFsCQBlAgUDbm93BRJsYXN0QWN0aXZpdGllc1RpbWUJAGgCAAMFC1lFQVJfTUlMTElTCQDMCAIFDWFjdEFtb3VudExlZnQFA25pbAQJYWN0V2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQlkYXBwMlJlc3QFBXdsZ0lkBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnCQEWa2V5TGFzdENsYWltVGltZUJ5VXNlcgEFC3VzZXJBZGRyT3B0BQlpc3N1ZVRpbWUEDmxhc3RVc2VyUGVyaW9kCQBpAgkAZQIFDGxhc3RVc2VyVGltZQUJaXNzdWVUaW1lBQtZRUFSX01JTExJUwQKbm93TGltaXRlZAkAlwMBCQDMCAIFA25vdwkAzAgCCQBkAgUJaXNzdWVUaW1lCQBoAgADBQtZRUFSX01JTExJUwUDbmlsBAljdXJQZXJpb2QJAJcDAQkAzAgCCQBpAgkAZQIFA25vdwUJaXNzdWVUaW1lBQtZRUFSX01JTExJUwkAzAgCAAIFA25pbAQDZWZmCQEQZ2V0RmFybWluZ1Bvd2VycwIFC3VzZXJBZGRyT3B0CQCRAwIFCWNvbnRyYWN0cwUMZGFwcDJTdGFraW5nBBVjdXJQZXJpb2REaXN0cmlidXRpb24JAQ1kaXN0ckJ5UGVyaW9kAQUJY3VyUGVyaW9kBAgkdDA3OTE0MgMJAAACBQ5sYXN0VXNlclBlcmlvZAUJY3VyUGVyaW9kBAJhMAkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQFDGxhc3RVc2VyVGltZQULWUVBUl9NSUxMSVMEB2VmZlRpbWUFCm5vd0xpbWl0ZWQJAJQKAgUCYTAFB2VmZlRpbWUDCQAAAgUObGFzdFVzZXJQZXJpb2QJAGUCBQljdXJQZXJpb2QAAQQCYTEJAGsDCQENZGlzdHJCeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZQIJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwUJY3VyUGVyaW9kBQxsYXN0VXNlclRpbWUFC1lFQVJfTUlMTElTBAJhMAkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwUJY3VyUGVyaW9kBQtZRUFSX01JTExJUwQFYXZhaWwJAGQCBQJhMQUCYTAEB2VmZlRpbWUDCQBnAgUCYTEFBWF2YWlsCQBkAgUMbGFzdFVzZXJUaW1lCQBrAwULWUVBUl9NSUxMSVMFBWF2YWlsCQENZGlzdHJCeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZAIJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwUJY3VyUGVyaW9kCQBrAwULWUVBUl9NSUxMSVMJAGUCBQVhdmFpbAUCYTEFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAlAoCBQVhdmFpbAUHZWZmVGltZQQCYTIJAGsDCQENZGlzdHJCeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAgkAZQIJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwkAZQIFCWN1clBlcmlvZAABBQxsYXN0VXNlclRpbWUFC1lFQVJfTUlMTElTBAJhMQkBDWRpc3RyQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAEEAmEwCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQBlAgUKbm93TGltaXRlZAkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTBQljdXJQZXJpb2QFC1lFQVJfTUlMTElTBAVhdmFpbAkAZAIJAGQCBQJhMgUCYTEFAmEwBAdlZmZUaW1lAwkAZwIFAmEyBQVhdmFpbAkAZAIFDGxhc3RVc2VyVGltZQkAawMFC1lFQVJfTUlMTElTBQVhdmFpbAkBDWRpc3RyQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAIDCQBnAgkAZAIFAmEyBQJhMQUFYXZhaWwJAGQCCQBkAgUJaXNzdWVUaW1lCQBoAgULWUVBUl9NSUxMSVMJAGUCBQljdXJQZXJpb2QAAQkAawMFC1lFQVJfTUlMTElTCQBlAgUFYXZhaWwFAmEyCQENZGlzdHJCeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZAIJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwUJY3VyUGVyaW9kCQBrAwULWUVBUl9NSUxMSVMJAGUCCQBlAgUFYXZhaWwFAmEyBQJhMQUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQCUCgIFBWF2YWlsBQdlZmZUaW1lBA11c2VyQXZhaWxhYmxlCAUIJHQwNzkxNDICXzEEC2VmZkxhc3RUaW1lCAUIJHQwNzkxNDICXzIED2Ftb3VudExlZnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFEXN0YWtlcnNBbXRMZWZ0S2V5AAAEDHVucm9iYmVkVXNlcgMJAQIhPQIJAJEDAgUDZWZmBQppZHhUb3RhbEZQAAAJAGsDBQ11c2VyQXZhaWxhYmxlCQCRAwIFA2VmZgUJaWR4VXNlckZQCQCRAwIFA2VmZgUKaWR4VG90YWxGUAAACQDMCAIFDGlzc3VlZEFtb3VudAkAzAgCCQBrAwkAZQIFDXRvdGFsRnVuZHNVc2QFDVVTRFRfVFZMX0NPUlIFA004XwUMaXNzdWVkQW1vdW50CQDMCAIFDXRvdGFsRnVuZHNVc2QJAMwIAgUHcmVzdFVzZAkAzAgCBQZ3bGdVc2QJAMwIAgUJcHV6emxlVXNkCQDMCAIFCWlzc3VlVGltZQkAzAgCBQxsYXN0VGVhbVRpbWUJAMwIAgUJdGVhbVRvdGFsCQDMCAIFDnRlYW1BbW91bnRMZWZ0CQDMCAIFFnRlYW1BbW91bnRBdmFpbGFibGVOb3cJAMwIAgUKdGVhbVdsZ29sZAkAzAgCBQhhY3RUb3RhbAkAzAgCBQ1hY3RBbW91bnRMZWZ0CQDMCAIFFWFjdEFtb3VudEF2YWlsYWJsZU5vdwkAzAgCBQlhY3RXbGdvbGQJAMwIAgUJY3VyUGVyaW9kCQDMCAIFD2Ftb3VudExlZnRUb3RhbAkAzAgCBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAMwIAgUMbGFzdFVzZXJUaW1lCQDMCAIFD2ludmVzdEZ1bmRUb3RhbAkAzAgCBQx1bnJvYmJlZFVzZXIJAMwIAgULZWZmTGFzdFRpbWUFA25pbAADbmV0CQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABABZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyBAckbWF0Y2gwBQNuZXQDCQAAAgEBVwUHJG1hdGNoMAIjM1BGd1l0YThiaUV6MzF6cGVGZTVESks4d0U1dHJTcFFWRjgDCQAAAgEBVAUHJG1hdGNoMAIjM043VXVZYXI2MjY0UDU4RkJoVldLUFFBaDRZdWEyaGduZ3YJAAIBAg1Vbmtub3duIGNoYWluAA1wcm9maXRBZGRyS2V5Agpwcm9maXRBZGRyABlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5AhZzdGFrZXJzQW1vdW50UGFpZFRvdGFsARhrZXlTdGFrZXJzQW1vdW50UGFpZFVzZXIBBGFkZHIJAKwCAgIWc3Rha2Vyc0Ftb3VudFBhaWRVc2VyXwUEYWRkcgANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAOYWNyZXMyQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEGFjcmVzMkFkZHJlc3NTdHIBB3Byb2xvZzIACQEFYXNJbnQBCQD9BwQFDmFjcmVzMkNvbnRyYWN0AgpzYXZlTGFzdFR4BQNuaWwFA25pbAEPZ2V0U3dhcExpbWl0V2xnAQRhZGRyBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBQRhZGRyAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXADCQBmAgUOYXJiaXRyYWdlRGVsYXkJAGUCBQNub3cFCGxhc3RUaW1lCQACAQkArAICCQCsAgICH0FyYml0cmFnZXMgYXJlIHBvc3NpYmxlIG9uY2UgYSAJAKQDAQkAaQIFDmFyYml0cmFnZURlbGF5AODUAwIDbWluCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBQRhZGRyAAABDmNsYWltSW50ZXJuYWwyAQRhZGRyBAZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAUEYWRkcgkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQLdXNlclRpbWVLZXkJARZrZXlMYXN0Q2xhaW1UaW1lQnlVc2VyAQUEYWRkcgQMbGFzdFVzZXJUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFC3VzZXJUaW1lS2V5AAAEC3VzZXJFZmZUaW1lCQCRAwIFCGN1clN0YXRzBRBpeFdsZ0VmZlVzZXJUaW1lAwkAAAIFDGxhc3RVc2VyVGltZQULdXNlckVmZlRpbWUJAJQKAgUDbmlsAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWlzc3VlVGltZQkAkQMCBQhjdXJTdGF0cwUOaXhXbGdJc3N1ZVRpbWUEDnRlYW1BbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBQ9peFdsZ1RlYW1BbUxlZnQECnRlYW1BbW91bnQJAJEDAgUIY3VyU3RhdHMFE2l4V2xnVGVhbUFtQXZhaWxOb3cEDHRlYW1UcmFuc2ZlcgMJAGYCBQp0ZWFtQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQt0ZWFtQWRkcktleQUKdGVhbUFtb3VudAUKd2xnQXNzZXRJZAUDbmlsBQNuaWwEDWFjdEFtb3VudExlZnQJAJEDAgUIY3VyU3RhdHMFDml4V2xnQWN0QW1MZWZ0BAlhY3RBbW91bnQJAJEDAgUIY3VyU3RhdHMFEml4V2xnQWN0QW1BdmFpbE5vdwQLYWN0VHJhbnNmZXIDCQBmAgUJYWN0QW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQlhY3RBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBAp1c2VyQW1vdW50CQCRAwIFCGN1clN0YXRzBRNpeFdsZ1VzZXJBbUF2YWlsTm93BAd1c2VyS2V5CQEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQUEYWRkcgQJdXNlclRvdGFsCQCRAwIFCGN1clN0YXRzBRNpeFdsZ1VzZXJBbUF2YWlsTm93CQCUCgIJAM4IAgkAzggCBQx0ZWFtVHJhbnNmZXIFC2FjdFRyYW5zZmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd1c2VyS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd1c2VyS2V5AAAFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAUJdXNlclRvdGFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQkAZQIJAJEDAgUIY3VyU3RhdHMFEGl4V2xnQW1MZWZ0VG90YWwFCXVzZXJUb3RhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgURdGVhbUFtb3VudExlZnRLZXkJAGUCBQ50ZWFtQW1vdW50TGVmdAUKdGVhbUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPbGFzdFRlYW1UaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFEGFjdEFtb3VudExlZnRLZXkJAGUCBQ1hY3RBbW91bnRMZWZ0BQlhY3RBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFWxhc3RBY3Rpdml0aWVzVGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQt1c2VyVGltZUtleQULdXNlckVmZlRpbWUFA25pbAUKdXNlckFtb3VudAEOdGFrZVhwSW50ZXJuYWwCBGFkZHIFZGVsdGEEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEB3RpbWVLZXkJARZrZXlXbGdTdGFrZWRUaW1lQnlVc2VyAQUEYWRkcgQJYW1vdW50S2V5CQEYa2V5V2xnU3Rha2VkQW1vdW50QnlVc2VyAQUEYWRkcgQIbGFzdFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdGltZUtleQAABAdvbGRVc2VyCQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAABAhvbGRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRF3bGdTdGFrZWRUb3RhbEtleQAABAJ4cAkAawMJAGsDBQV4cFdsZwUHb2xkVXNlcgUPd2xnQmFzZUFtb3VudFhwCQBlAgUIbGFzdFRpbWUFA25vdwUJREFZTUlMTElTCQCVCgMJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUJYW1vdW50S2V5CQBkAgUHb2xkVXNlcgUFZGVsdGEJAMwIAgkBDEludGVnZXJFbnRyeQIFEXdsZ1N0YWtlZFRvdGFsS2V5CQBkAgUIb2xkVG90YWwFBWRlbHRhBQNuaWwFAnhwBQdvbGRVc2VyCQFpAQ1jb25zdHJ1Y3RvclYxBAhyZXN0QWRkcg1tYXJrZXRpbmdBZGRyCHRlYW1BZGRyCnByb2ZpdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAMJAQlpc0RlZmluZWQBCQChCAEFDXdsZ0Fzc2V0SWRLZXkJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkBAxpc3N1ZWRBbW91bnQFCE1JTExJT042BAVpc3N1ZQkAwwgHAgZXTEdPTEQCIFdhdmVzTGFuZHMgR29sZCBpbnZlc3RtZW50IHRva2VuBQxpc3N1ZWRBbW91bnQACAYFBHVuaXQAAAQHYXNzZXRJZAkAuAgBBQVpc3N1ZQkAzAgCBQVpc3N1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPd2xnSXNzdWVUaW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5BQxpc3N1ZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGsDBQhNSUxMSU9ONgULUExBWUVSU0hBUkUFBU1VTFQ2CQDMCAIJAQtCaW5hcnlFbnRyeQIFDXdsZ0Fzc2V0SWRLZXkFB2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleVJlc3RBZGRyZXNzAAUIcmVzdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULdGVhbUFkZHJLZXkFCHRlYW1BZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDXByb2ZpdEFkZHJLZXkFCnByb2ZpdEFkZHIFA25pbAFpAQ1jb25zdHJ1Y3RvclYyAQlyZXN0MkFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5UmVzdDJBZGRyZXNzAAUJcmVzdDJBZGRyBQNuaWwBaQEGYnV5V2xnAQltaW5BbW91bnQEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEB3VzZHRBbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAZjYWxsZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQZjYWxsZXIDCQBmAgUOTUlOU0hPUFBBWU1FTlQFB3VzZHRBbXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiB0cmFkZSBtaW4gCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYCBSBVU0RUBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQFB3VzZHRBbXQEDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwULaXhXbGdBbW91bnQECGZ1bmRzVXNkCQCRAwIFCGN1clN0YXRzBQppeFdsZ0Z1bmRzBAh3bGdQcmljZQkAawMFCGZ1bmRzVXNkBQVNVUxUOAUMY3VyV2xnQW1vdW50BAhidXlQcmljZQkAawMFCHdsZ1ByaWNlAAYABQQJd2xnQW1vdW50CQBrAwUHdXNkdEFtdAUFTVVMVDgFCGJ1eVByaWNlBAZtYXhXbGcJAQ9nZXRTd2FwTGltaXRXbGcBBQRhZGRyAwkAZgIFCXdsZ0Ftb3VudAUGbWF4V2xnCQACAQkArAICCQCsAgICEFlvdSBjYW4gZ2V0IG1heCAJAQpmaXhlZFBvaW50AgUGbWF4V2xnAAgCByBXTEdPTEQDCQBmAgUJbWluQW1vdW50BQl3bGdBbW91bnQJAAIBAjBQcmljZSBjaGFuZ2VkIGR1cmluZyBvcGVyYXRpb24sIHBsZWFzZSB0cnkgYWdhaW4EDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABgQKZGVsdGFGdW5kcwkAZQIFB3VzZHRBbXQFDHByb2ZpdEFtb3VudAQIcmVpc3N1ZWQJAGsDBQxjdXJXbGdBbW91bnQFCmRlbHRhRnVuZHMFCGZ1bmRzVXNkCQCUCgIJAMwIAgkBB1JlaXNzdWUDBQp3bGdBc3NldElkBQhyZWlzc3VlZAYJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZAIFDGN1cldsZ0Ftb3VudAUIcmVpc3N1ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUNcHJvZml0QWRkcktleQUMcHJvZml0QW1vdW50BQt1c2R0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXdsZ0Ftb3VudAUKd2xnQXNzZXRJZAUDbmlsBQxwcm9sb2dSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHc2VsbFdsZwEJbWluQW1vdW50BAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZ3bGdBbXQIBQNwbXQGYW1vdW50BAZjYWxsZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQZjYWxsZXIEBm1heFdsZwkBD2dldFN3YXBMaW1pdFdsZwEFBGFkZHIDCQBmAgUGd2xnQW10BQZtYXhXbGcJAAIBCQCsAgIJAKwCAgISWW91IGNhbiBzcGVuZCBtYXggCQEKZml4ZWRQb2ludAIFBm1heFdsZwAIAgcgV0xHT0xEAwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUKd2xnQXNzZXRJZAkAAgECFVdMR09MRCBwYXltZW50cyBvbmx5IQQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAAEDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwULaXhXbGdBbW91bnQECXNlbGxQcmljZQkAawMJAJEDAgUIY3VyU3RhdHMFCml4V2xnUHJpY2UABAAFBAd1c2R0QW10CQBrAwUGd2xnQW10BQlzZWxsUHJpY2UFBU1VTFQ4AwkAZgIFDk1JTlNIT1BQQVlNRU5UBQd1c2R0QW10CQACAQkArAICCQCsAgICEllvdSBjYW4gdHJhZGUgbWluIAkBCmZpeGVkUG9pbnQCBQ5NSU5TSE9QUEFZTUVOVAAGAgUgVVNEVAMJAGYCBQltaW5BbW91bnQFB3VzZHRBbXQJAAIBAjBQcmljZSBjaGFuZ2VkIGR1cmluZyBvcGVyYXRpb24sIHBsZWFzZSB0cnkgYWdhaW4EDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABAkAlAoCCQDMCAIJAQRCdXJuAgUKd2xnQXNzZXRJZAUGd2xnQW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkJAGUCBQxjdXJXbGdBbW91bnQFBndsZ0FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQUEYWRkcggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQ1wcm9maXRBZGRyS2V5BQxwcm9maXRBbW91bnQFC3VzZHRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUHdXNkdEFtdAULdXNkdEFzc2V0SWQFA25pbAUMcHJvbG9nUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQBcgkBDmNsYWltSW50ZXJuYWwyAQkApQgBCAUBaQZjYWxsZXIEB2FjdGlvbnMIBQFyAl8xCQCUCgIJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCAUBcgJfMgUKd2xnQXNzZXRJZAUMcHJvbG9nUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEm9uU3Rha2VVbnN0YWtlTGFuZAEEYWRkcgMDAwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAQIhPQIIBQFpBmNhbGxlcgUNYWNyZXNDb250cmFjdAcJAQIhPQIIBQFpBmNhbGxlcgUOYWNyZXMyQ29udHJhY3QHCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDExMTEyMTExNjYJAQ5jbGFpbUludGVybmFsMgEFBGFkZHIEB2FjdGlvbnMIBQ0kdDAxMTExMjExMTY2Al8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTExMTIxMTE2NgJfMgkAlAoCAwkAZgIFEHdsZ0NsYWltZWRBbW91bnQAAAkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRhZGRyBRB3bGdDbGFpbWVkQW1vdW50BQp3bGdBc3NldElkBQdhY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCmJ1cm5XbGdvbGQAAwkBAiE9AggFAWkGY2FsbGVyBQ5hY3JlczJDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAZ3bGdBbXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQNd2xnQW1vdW50TGVmdAkAZQIJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BQZ3bGdBbXQJAJQKAgkAzAgCCQEEQnVybgIFCndsZ0Fzc2V0SWQFBndsZ0FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5BQ13bGdBbW91bnRMZWZ0BQNuaWwFDXdsZ0Ftb3VudExlZnQBaQEJdGFrZVdsZ1hwAQRhZGRyAwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQNJHQwMTM0OTMxMzUzNgkBDnRha2VYcEludGVybmFsAgUEYWRkcgAABAdhY3Rpb25zCAUNJHQwMTM0OTMxMzUzNgJfMQQCeHAIBQ0kdDAxMzQ5MzEzNTM2Al8yCQCUCgIFB2FjdGlvbnMFAnhwAWkBEmNoZWNrV2xnWHBSRUFET05MWQEEYWRkcgQNJHQwMTM2MTMxMzY2MQkBDnRha2VYcEludGVybmFsAgUEYWRkcgAABAdpZ25vcmVkCAUNJHQwMTM2MTMxMzY2MQJfMQQHZGVsdGFYUAgFDSR0MDEzNjEzMTM2NjECXzIEBW5ld1hQCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQlrZXlVc2VyWFABBQRhZGRyAAAFB2RlbHRhWFAECWx2bFBvaW50cwkBB2xldmVsVXACCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBDGtleVVzZXJMZXZlbAEFBGFkZHIAAAUFbmV3WFAJAJQKAgUDbmlsCQDNCAIFCWx2bFBvaW50cwUFbmV3WFAAoWpJFw==", "height": 3281975, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CGFVXtKMtfaVtUDrytrDBEfPjcvyTazp1nAyZ4YodnRG Next: 2iY66FT7uJhpCGPFWL6UCNkYqzXNLYqVNg3x32zBUakJ Diff:
OldNewDifferences
415415 let issueTime = curStats[ixWlgIssueTime]
416416 let teamAmountLeft = curStats[ixWlgTeamAmLeft]
417417 let teamAmount = curStats[ixWlgTeamAmAvailNow]
418+ let teamTransfer = if ((teamAmount > 0))
419+ then [ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
420+ else nil
418421 let actAmountLeft = curStats[ixWlgActAmLeft]
419422 let actAmount = curStats[ixWlgActAmAvailNow]
423+ let actTransfer = if ((actAmount > 0))
424+ then [ScriptTransfer(restContract, actAmount, wlgAssetId)]
425+ else nil
420426 let userAmount = curStats[ixWlgUserAmAvailNow]
421427 let userKey = keyStakersAmountPaidUser(addr)
422428 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)
429+ $Tuple2(((teamTransfer ++ actTransfer) ++ [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)
424430 }
425431 }
426432
564570 else false)
565571 then throw("Permission denied")
566572 else {
567- let $t01098111035 = claimInternal2(addr)
568- let actions = $t01098111035._1
569- let wlgClaimedAmount = $t01098111035._2
570- $Tuple2((actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId)), wlgClaimedAmount)
573+ let $t01111211166 = claimInternal2(addr)
574+ let actions = $t01111211166._1
575+ let wlgClaimedAmount = $t01111211166._2
576+ $Tuple2(if ((wlgClaimedAmount > 0))
577+ then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
578+ else actions, wlgClaimedAmount)
571579 }
572580
573581
588596 func takeWlgXp (addr) = if ((i.caller != stakingContract))
589597 then throw("Permission denied")
590598 else {
591- let $t01330613349 = takeXpInternal(addr, 0)
592- let actions = $t01330613349._1
593- let xp = $t01330613349._2
599+ let $t01349313536 = takeXpInternal(addr, 0)
600+ let actions = $t01349313536._1
601+ let xp = $t01349313536._2
594602 $Tuple2(actions, xp)
595603 }
596604
598606
599607 @Callable(i)
600608 func checkWlgXpREADONLY (addr) = {
601- let $t01342613474 = takeXpInternal(addr, 0)
602- let ignored = $t01342613474._1
603- let deltaXP = $t01342613474._2
609+ let $t01361313661 = takeXpInternal(addr, 0)
610+ let ignored = $t01361313661._1
611+ let deltaXP = $t01361313661._2
604612 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
605613 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
606614 $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"
158158
159159 func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
160160
161161
162162 let wlgIssueTimeKey = "wlg_issueTime"
163163
164164 let wlgIssuedAmountKey = "wlg_issuedAmount"
165165
166166 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
167167
168168
169169 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
170170
171171
172172 let wlgStakedTotalKey = "wlgStakedAmountTotal"
173173
174174 func keyWlgStakedTimeByUser (addr) = ("wlgStakedTimeByUser_" + addr)
175175
176176
177177 let M6_ = 1000000
178178
179179 let M8_ = 100000000
180180
181181 let MILL6 = 100000000000000
182182
183183 let TEAM_SHARE = 200000
184184
185185 let ACTIVITY_SHARE = 100000
186186
187187 let PLAYER_SHARE = 400000
188188
189189 let YEAR_MILLIS = 31557600000
190190
191191 let chn = take(drop(this.bytes, 1), 1)
192192
193193 let USDT_TVL_CORR = match chn {
194194 case _ =>
195195 if ((base58'2W' == $match0))
196196 then 1208630000
197197 else if ((base58'2T' == $match0))
198198 then 0
199199 else throw("Unknown chain")
200200 }
201201
202202 let teamAdrKey = "teamAddr"
203203
204204 let lastTeamTimKey = "lastClaimedTime_team"
205205
206206 let teamAmtLeftKey = "teamAmountLeft"
207207
208208 let lastActivitiesTimKey = "lastClaimedTime_activities"
209209
210210 let actAmtLeftKey = "activitiesAmountLeft"
211211
212212 let stakersAmtLeftKey = "stakersAmountLeft"
213213
214214 func keyLastClaimTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
215215
216216
217217 func distrByPeriod (period) = fraction(MILL6, (PLAYER_SHARE * (period + 1)), (6 * M6_))
218218
219219
220220 let wlgIssueTimKey = "wlg_issueTime"
221221
222222 let wlgIssuedAmtKey = "wlg_issuedAmount"
223223
224224 let zbIssuedAmtKey = "zbill_issuedAmount"
225225
226226 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
227227
228228
229229 let acresStakdTotalKey = "acresStakedAmountTotal"
230230
231231 let dapp2Rest = 0
232232
233233 let dapp2Staking = 1
234234
235235 let dapp2Wlg = 2
236236
237237 let dapp2Puzzle = 3
238238
239239 let dapp2InvestFund = 4
240240
241241 let levels = [10, 20, 40, 80, 150, 250, 400, 700, 1000]
242242
243243 func getLevelByAcres (acres) = {
244244 let acr = (acres / M8_)
245245 func checker (acc,item) = if ((item > acr))
246246 then acc
247247 else (acc + 1)
248248
249249 let idx = {
250250 let $l = levels
251251 let $s = size($l)
252252 let $acc0 = 0
253253 func $f0_1 ($a,$i) = if (($i >= $s))
254254 then $a
255255 else checker($a, $l[$i])
256256
257257 func $f0_2 ($a,$i) = if (($i >= $s))
258258 then $a
259259 else throw("List size exceeds 10")
260260
261261 $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)
262262 }
263263 (idx + 1)
264264 }
265265
266266
267267 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
268268
269269
270270 func getFarmingPowers (userAddrStrOrEmpty,stakingContract) = {
271271 let totalAcres = valueOrElse(getInteger(stakingContract, acresStakdTotalKey), 0)
272272 let totalFP = getFarmingPowerByAcres(totalAcres)
273273 let userAcres = valueOrElse(getInteger(stakingContract, keyAcresStakedAmtByUser(userAddrStrOrEmpty)), 0)
274274 let userFP = getFarmingPowerByAcres(userAcres)
275275 [totalFP, userFP]
276276 }
277277
278278
279279 let idxTotalFP = 0
280280
281281 let idxUserFP = 1
282282
283283 let ixWlgAmount = 0
284284
285285 let ixWlgPrice = 1
286286
287287 let ixWlgFunds = 2
288288
289289 let ixWlgIssueTime = 6
290290
291291 let ixWlgTeamAmLeft = 9
292292
293293 let ixWlgTeamAmAvailNow = 10
294294
295295 let ixWlgActAmLeft = 13
296296
297297 let ixWlgActAmAvailNow = 14
298298
299299 let ixWlgAmLeftTotal = 17
300300
301301 let ixWlgUserAmAvailNow = 21
302302
303303 let ixWlgEffUserTime = 22
304304
305305 func getWlgStats2 (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
306306 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssuedAmtKey), "WLGOLD is not issued yet")
307307 let restUsd = assetBalance(contracts[dapp2Rest], usdtId)
308308 let wlgUsd = (assetBalance(contracts[dapp2Wlg], usdtId) - usdtBalanceCorrection)
309309 let puzzleUsd = assetBalance(contracts[dapp2Puzzle], usdtId)
310310 let investFndContract = contracts[dapp2InvestFund]
311311 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmtKey), 0))
312312 let totalFundsUsd = (wlgUsd + investFundTotal)
313313 let wlgId = valueOrErrorMessage(getBinary(contracts[dapp2Wlg], "wlg_assetId"), "Not initialized yet")
314314 let now = lastBlock.timestamp
315315 let issueTime = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssueTimKey), "Not initialized")
316316 let teamTotal = fraction(MILL6, TEAM_SHARE, M6_)
317317 let teamAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], teamAmtLeftKey), teamTotal)
318318 let lastTeamTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastTeamTimKey), issueTime)
319319 let teamAddr = addressFromStringValue(value(getString(contracts[dapp2Wlg], teamAdrKey)))
320320 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEAR_MILLIS)), teamAmountLeft])
321321 let teamWlgold = assetBalance(teamAddr, wlgId)
322322 let actTotal = fraction(MILL6, ACTIVITY_SHARE, M6_)
323323 let actAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], actAmtLeftKey), actTotal)
324324 let lastActivitiesTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastActivitiesTimKey), issueTime)
325325 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEAR_MILLIS)), actAmountLeft])
326326 let actWlgold = assetBalance(contracts[dapp2Rest], wlgId)
327327 let lastUserTime = valueOrElse(getInteger(contracts[dapp2Wlg], keyLastClaimTimeByUser(userAddrOpt)), issueTime)
328328 let lastUserPeriod = ((lastUserTime - issueTime) / YEAR_MILLIS)
329329 let nowLimited = min([now, (issueTime + (3 * YEAR_MILLIS))])
330330 let curPeriod = min([((now - issueTime) / YEAR_MILLIS), 2])
331331 let eff = getFarmingPowers(userAddrOpt, contracts[dapp2Staking])
332332 let curPeriodDistribution = distrByPeriod(curPeriod)
333333 let $t079142 = if ((lastUserPeriod == curPeriod))
334334 then {
335335 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEAR_MILLIS)
336336 let effTime = nowLimited
337337 $Tuple2(a0, effTime)
338338 }
339339 else if ((lastUserPeriod == (curPeriod - 1)))
340340 then {
341341 let a1 = fraction(distrByPeriod((curPeriod - 1)), ((issueTime + (YEAR_MILLIS * curPeriod)) - lastUserTime), YEAR_MILLIS)
342342 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEAR_MILLIS * curPeriod))), YEAR_MILLIS)
343343 let avail = (a1 + a0)
344344 let effTime = if ((a1 >= avail))
345345 then (lastUserTime + fraction(YEAR_MILLIS, avail, distrByPeriod((curPeriod - 1))))
346346 else ((issueTime + (YEAR_MILLIS * curPeriod)) + fraction(YEAR_MILLIS, (avail - a1), curPeriodDistribution))
347347 $Tuple2(avail, effTime)
348348 }
349349 else {
350350 let a2 = fraction(distrByPeriod((curPeriod - 2)), ((issueTime + (YEAR_MILLIS * (curPeriod - 1))) - lastUserTime), YEAR_MILLIS)
351351 let a1 = distrByPeriod((curPeriod - 1))
352352 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEAR_MILLIS * curPeriod))), YEAR_MILLIS)
353353 let avail = ((a2 + a1) + a0)
354354 let effTime = if ((a2 >= avail))
355355 then (lastUserTime + fraction(YEAR_MILLIS, avail, distrByPeriod((curPeriod - 2))))
356356 else if (((a2 + a1) >= avail))
357357 then ((issueTime + (YEAR_MILLIS * (curPeriod - 1))) + fraction(YEAR_MILLIS, (avail - a2), distrByPeriod((curPeriod - 1))))
358358 else ((issueTime + (YEAR_MILLIS * curPeriod)) + fraction(YEAR_MILLIS, ((avail - a2) - a1), curPeriodDistribution))
359359 $Tuple2(avail, effTime)
360360 }
361361 let userAvailable = $t079142._1
362362 let effLastTime = $t079142._2
363363 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
364364 let unrobbedUser = if ((eff[idxTotalFP] != 0))
365365 then fraction(userAvailable, eff[idxUserFP], eff[idxTotalFP])
366366 else 0
367367 [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]
368368 }
369369
370370
371371 let net = take(drop(this.bytes, 1), 1)
372372
373373 let defaultRest2AddressStr = match net {
374374 case _ =>
375375 if ((base58'2W' == $match0))
376376 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
377377 else if ((base58'2T' == $match0))
378378 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
379379 else throw("Unknown chain")
380380 }
381381
382382 let profitAddrKey = "profitAddr"
383383
384384 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
385385
386386 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
387387
388388
389389 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
390390
391391 let acres2Contract = addressFromStringValue(acres2AddressStr)
392392
393393 func prolog2 () = asInt(reentrantInvoke(acres2Contract, "saveLastTx", nil, nil))
394394
395395
396396 func getSwapLimitWlg (addr) = {
397397 let lastTime = valueOrElse(getInteger(keyLastArbTimeByUser(addr)), 0)
398398 let now = lastBlock.timestamp
399399 if ((arbitrageDelay > (now - lastTime)))
400400 then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "min"))
401401 else valueOrElse(getInteger(acres2Contract, keyAcresStakedAmountByUser(addr)), 0)
402402 }
403403
404404
405405 func claimInternal2 (addr) = {
406406 let caller = addressFromStringValue(addr)
407407 let curStats = getWlgStats2(addr, [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
408408 let userTimeKey = keyLastClaimTimeByUser(addr)
409409 let lastUserTime = valueOrElse(getInteger(userTimeKey), 0)
410410 let userEffTime = curStats[ixWlgEffUserTime]
411411 if ((lastUserTime == userEffTime))
412412 then $Tuple2(nil, 0)
413413 else {
414414 let now = lastBlock.timestamp
415415 let issueTime = curStats[ixWlgIssueTime]
416416 let teamAmountLeft = curStats[ixWlgTeamAmLeft]
417417 let teamAmount = curStats[ixWlgTeamAmAvailNow]
418+ let teamTransfer = if ((teamAmount > 0))
419+ then [ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
420+ else nil
418421 let actAmountLeft = curStats[ixWlgActAmLeft]
419422 let actAmount = curStats[ixWlgActAmAvailNow]
423+ let actTransfer = if ((actAmount > 0))
424+ then [ScriptTransfer(restContract, actAmount, wlgAssetId)]
425+ else nil
420426 let userAmount = curStats[ixWlgUserAmAvailNow]
421427 let userKey = keyStakersAmountPaidUser(addr)
422428 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)
429+ $Tuple2(((teamTransfer ++ actTransfer) ++ [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)
424430 }
425431 }
426432
427433
428434 func takeXpInternal (addr,delta) = {
429435 let now = lastBlock.timestamp
430436 let timeKey = keyWlgStakedTimeByUser(addr)
431437 let amountKey = keyWlgStakedAmountByUser(addr)
432438 let lastTime = valueOrElse(getInteger(timeKey), 0)
433439 let oldUser = valueOrElse(getInteger(amountKey), 0)
434440 let oldTotal = valueOrElse(getInteger(wlgStakedTotalKey), 0)
435441 let xp = fraction(fraction(xpWlg, oldUser, wlgBaseAmountXp), (lastTime - now), DAYMILLIS)
436442 $Tuple3([IntegerEntry(timeKey, now), IntegerEntry(amountKey, (oldUser + delta)), IntegerEntry(wlgStakedTotalKey, (oldTotal + delta))], xp, oldUser)
437443 }
438444
439445
440446 @Callable(i)
441447 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
442448 then throw("Permission denied")
443449 else if (isDefined(getBinary(wlgAssetIdKey)))
444450 then throw("Already initialized")
445451 else {
446452 let issuedAmount = MILLION6
447453 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
448454 let assetId = calculateAssetId(issue)
449455 [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)]
450456 }
451457
452458
453459
454460 @Callable(i)
455461 func constructorV2 (rest2Addr) = if ((i.caller != this))
456462 then throw("Permission denied")
457463 else [StringEntry(keyRest2Address(), rest2Addr)]
458464
459465
460466
461467 @Callable(i)
462468 func buyWlg (minAmount) = {
463469 let prologResult = prolog2()
464470 if ((prologResult == prologResult))
465471 then if ((size(i.payments) != 1))
466472 then throw("exactly 1 payment must be attached")
467473 else {
468474 let pmt = i.payments[0]
469475 let usdtAmt = pmt.amount
470476 if (if (!(isDefined(pmt.assetId)))
471477 then true
472478 else (value(pmt.assetId) != usdtAssetId))
473479 then throw("USDT payments only!")
474480 else {
475481 let caller = i.caller
476482 let addr = toString(caller)
477483 if ((MINSHOPPAYMENT > usdtAmt))
478484 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
479485 else {
480486 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
481487 let curWlgAmount = curStats[ixWlgAmount]
482488 let fundsUsd = curStats[ixWlgFunds]
483489 let wlgPrice = fraction(fundsUsd, MULT8, curWlgAmount)
484490 let buyPrice = fraction(wlgPrice, 6, 5)
485491 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
486492 let maxWlg = getSwapLimitWlg(addr)
487493 if ((wlgAmount > maxWlg))
488494 then throw((("You can get max " + fixedPoint(maxWlg, 8)) + " WLGOLD"))
489495 else if ((minAmount > wlgAmount))
490496 then throw("Price changed during operation, please try again")
491497 else {
492498 let profitAmount = (usdtAmt / 6)
493499 let deltaFunds = (usdtAmt - profitAmount)
494500 let reissued = fraction(curWlgAmount, deltaFunds, fundsUsd)
495501 $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)
496502 }
497503 }
498504 }
499505 }
500506 else throw("Strict value is not equal to itself.")
501507 }
502508
503509
504510
505511 @Callable(i)
506512 func sellWlg (minAmount) = {
507513 let prologResult = prolog2()
508514 if ((prologResult == prologResult))
509515 then if ((size(i.payments) != 1))
510516 then throw("exactly 1 payment must be attached")
511517 else {
512518 let pmt = i.payments[0]
513519 let wlgAmt = pmt.amount
514520 let caller = i.caller
515521 let addr = toString(caller)
516522 let maxWlg = getSwapLimitWlg(addr)
517523 if ((wlgAmt > maxWlg))
518524 then throw((("You can spend max " + fixedPoint(maxWlg, 8)) + " WLGOLD"))
519525 else if (if (!(isDefined(pmt.assetId)))
520526 then true
521527 else (value(pmt.assetId) != wlgAssetId))
522528 then throw("WLGOLD payments only!")
523529 else {
524530 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
525531 let curWlgAmount = curStats[ixWlgAmount]
526532 let sellPrice = fraction(curStats[ixWlgPrice], 4, 5)
527533 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
528534 if ((MINSHOPPAYMENT > usdtAmt))
529535 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
530536 else if ((minAmount > usdtAmt))
531537 then throw("Price changed during operation, please try again")
532538 else {
533539 let profitAmount = (usdtAmt / 4)
534540 $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)
535541 }
536542 }
537543 }
538544 else throw("Strict value is not equal to itself.")
539545 }
540546
541547
542548
543549 @Callable(i)
544550 func claim () = {
545551 let prologResult = prolog2()
546552 if ((prologResult == prologResult))
547553 then if ((size(i.payments) != 0))
548554 then throw("No payments required")
549555 else {
550556 let r = claimInternal2(toString(i.caller))
551557 let actions = r._1
552558 $Tuple2((actions :+ ScriptTransfer(i.caller, r._2, wlgAssetId)), prologResult)
553559 }
554560 else throw("Strict value is not equal to itself.")
555561 }
556562
557563
558564
559565 @Callable(i)
560566 func onStakeUnstakeLand (addr) = if (if (if ((i.caller != stakingContract))
561567 then (i.caller != acresContract)
562568 else false)
563569 then (i.caller != acres2Contract)
564570 else false)
565571 then throw("Permission denied")
566572 else {
567- let $t01098111035 = claimInternal2(addr)
568- let actions = $t01098111035._1
569- let wlgClaimedAmount = $t01098111035._2
570- $Tuple2((actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId)), wlgClaimedAmount)
573+ let $t01111211166 = claimInternal2(addr)
574+ let actions = $t01111211166._1
575+ let wlgClaimedAmount = $t01111211166._2
576+ $Tuple2(if ((wlgClaimedAmount > 0))
577+ then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
578+ else actions, wlgClaimedAmount)
571579 }
572580
573581
574582
575583 @Callable(i)
576584 func burnWlgold () = if ((i.caller != acres2Contract))
577585 then throw("Permission denied")
578586 else {
579587 let wlgAmt = i.payments[0].amount
580588 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
581589 let wlgAmountLeft = (curStats[ixWlgAmount] - wlgAmt)
582590 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, wlgAmountLeft)], wlgAmountLeft)
583591 }
584592
585593
586594
587595 @Callable(i)
588596 func takeWlgXp (addr) = if ((i.caller != stakingContract))
589597 then throw("Permission denied")
590598 else {
591- let $t01330613349 = takeXpInternal(addr, 0)
592- let actions = $t01330613349._1
593- let xp = $t01330613349._2
599+ let $t01349313536 = takeXpInternal(addr, 0)
600+ let actions = $t01349313536._1
601+ let xp = $t01349313536._2
594602 $Tuple2(actions, xp)
595603 }
596604
597605
598606
599607 @Callable(i)
600608 func checkWlgXpREADONLY (addr) = {
601- let $t01342613474 = takeXpInternal(addr, 0)
602- let ignored = $t01342613474._1
603- let deltaXP = $t01342613474._2
609+ let $t01361313661 = takeXpInternal(addr, 0)
610+ let ignored = $t01361313661._1
611+ let deltaXP = $t01361313661._2
604612 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
605613 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
606614 $Tuple2(nil, (lvlPoints :+ newXP))
607615 }
608616
609617

github/deemru/w8io/169f3d6 
252.07 ms