tx · 3paaK7hWixdLRkKk2eiTRBE8vf6JMZ8AudVeszJV51mx

3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh:  -0.01800000 Waves

2024.11.22 16:58 [3382763] smart account 3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh > SELF 0.00000000 Waves

{ "type": 13, "id": "3paaK7hWixdLRkKk2eiTRBE8vf6JMZ8AudVeszJV51mx", "fee": 1800000, "feeAssetId": null, "timestamp": 1732283941093, "version": 2, "chainId": 84, "sender": "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh", "senderPublicKey": "3QtfC1XbLZXdeawMDeSERy9vvjUmj1XYd2GFmrvx7pWQ", "proofs": [ "3gnHWjb2zehZxgKLiWLGuwdvqYRVHZw5mRSaxT4Uq9ZLFzgS1GHmoK3EXaH5iu2mWgDbLKCcpGTqSatauvGStNTF" ], "script": "base64:BgI9CAISABIECgIICBIDCgEEEgMKAQESABIAEgMKAQESABIECgIIARIAEgMKAQgSAwoBCBIECgIIARIECgIIAUIAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDcAgK3iBAAFTVVMVDgAgMLXLwAKREFZX01JTExJUwCAuJkpABVVU0RUMkFDUkVTX01VTFRJUExJRVIACgATT05FX1BFUkNFTlRfRElWSVNPUgBkAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BGd1l0YThiaUV6MzF6cGVGZTVESks4d0U1dHJTcFFWRjgDCQAAAgEBVAUHJG1hdGNoMAIjM043VXVZYXI2MjY0UDU4RkJoVldLUFFBaDRZdWEyaGduZ3YJAAIBAg1Vbmtub3duIGNoYWluAA5hcmJpdHJhZ2VEZWxheQQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAUKREFZX01JTExJUwMJAAACAQFUBQckbWF0Y2gwAODUAwkAAgECDVVua25vd24gY2hhaW4AFW9sZFN0YWtpbmdDb250cmFjdFN0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BMbmNYdFMxVTgzRDZjUWJGRDNIOHJCSFBMZ3p4U0ZLWjEDCQAAAgEBVAUHJG1hdGNoMAIjM05EQ3lCRzVxODVKdWFSaWlnVWVFdGFpbnlqQ1FUM1hwWm0JAAIBAg1Vbmtub3duIGNoYWluAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAAQSWR4Q2ZnQWNyZXMyRGFwcAABAA1JZHhDZmdXbGdEYXBwAAIAFElkeENmZ0ludmVzdEZ1bmREYXBwAAUBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEPa2V5UmVzdDJBZGRyZXNzAAINJXNfX3Jlc3QyQWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCCHJlc3QyQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUIcmVzdDJDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AA1yZXN0MkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ9rZXlSZXN0MkFkZHJlc3MABRZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyAAhyZXN0MkNmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUNcmVzdDJDb250cmFjdAAOYWNyZXMyQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUQSWR4Q2ZnQWNyZXMyRGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUNSWR4Q2ZnV2xnRGFwcAASaW52ZXN0RnVuZENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFFElkeENmZ0ludmVzdEZ1bmREYXBwABNvbGRBY3Jlc0NvbnRyYWN0S2V5AhBvbGRBY3Jlc0NvbnRyYWN0AQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAEVa2V5TGFzdFdlZWtUeElkQnlVc2VyAQRhZGRyCQCsAgICE2xhc3RXZWVrVHhJZEJ5VXNlcl8FBGFkZHIBFGtleUN1cldlZWtUeElkQnlVc2VyAQRhZGRyCQCsAgICEmN1cldlZWtUeElkQnlVc2VyXwUEYWRkcgAUYWNyZXNJc3N1ZWRBbW91bnRLZXkCEWFjcmVzSXNzdWVkQW1vdW50AA9hY3Jlc0Fzc2V0SWRLZXkCDGFjcmVzQXNzZXRJZAAMYWNyZXNBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgUOYWNyZXMyQ29udHJhY3QFD2FjcmVzQXNzZXRJZEtleQIXQUNSRVMgaXMgbm90IGlzc3VlZCB5ZXQBGGtleUFjcmVzU3Rha2VkVGltZUJ5VXNlcgEEYWRkcgkArAICAhZhY3Jlc1N0YWtlZFRpbWVCeVVzZXJfBQRhZGRyARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBCW93bmVyQWRkcgkArAICAhNzdGFrZWRMYW5kc0J5T3duZXJfBQlvd25lckFkZHIBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEMYXNUdXBsZTVJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAhkoSW50LCBJbnQsIEludCwgSW50LCBJbnQpBAF0BQckbWF0Y2gwBQF0CQACAQIrZmFpbCB0byBjYXN0IGludG8gKEludCwgSW50LCBJbnQsIEludCwgSW50KQEMYXNUdXBsZTRJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAhQoSW50LCBJbnQsIEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECJmZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCwgSW50LCBJbnQpAQxhc1R1cGxlM0ludHMBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACDyhJbnQsIEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECIWZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCwgSW50KQEMYXNUdXBsZTJJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBAF0BQckbWF0Y2gwBQF0CQACAQIcZmFpbCB0byBjYXN0IGludG8gKEludCwgSW50KQEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAdsb3dQYXJ0CQCkAwEJAGoCBQN2YWwFBnRlblBvdwQGemVyb2VzCQCwAgIJAKQDAQUGdGVuUG93CQBkAgABCQCxAgEFB2xvd1BhcnQJAKwCAgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuBQZ6ZXJvZXMFB2xvd1BhcnQAA004XwCAwtcvAAtXRUVLX0JMT0NLUwDgTgAPd2xnSXNzdWVkQW10S2V5AhB3bGdfaXNzdWVkQW1vdW50AA56Yklzc3VlZEFtdEtleQISemJpbGxfaXNzdWVkQW1vdW50ARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEEYWRkcgkArAICAhhhY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcl8FBGFkZHIBFWtleUZhcm1pbmdQb3dlckJ5VXNlcgEEYWRkcgkArAICAhNmYXJtaW5nUG93ZXJCeVVzZXJfBQRhZGRyABJhY3Jlc1N0YWtkVG90YWxLZXkCFmFjcmVzU3Rha2VkQW1vdW50VG90YWwAFHRvdGFsRmFybWluZ1Bvd2VyS2V5AhF0b3RhbEZhcm1pbmdQb3dlcgAVSWR4RHR4M1BlcmNDb252ZXJzaW9uAAAACmxldmVsQWNyZXMJAMwIAgAACQDMCAIACgkAzAgCABQJAMwIAgAoCQDMCAIAUAkAzAgCAJYBCQDMCAIA+gEJAMwIAgCQAwkAzAgCALwFCQDMCAIA6AcFA25pbAEPZ2V0TGV2ZWxCeUFjcmVzAQVhY3JlcwQDYWNyCQBpAgkAZAIFBWFjcmVzAP/B1y8FA004XwoBB2NoZWNrZXICA2FjYwRpdGVtAwkAZwIFBGl0ZW0FA2FjcgUDYWNjCQBkAgUDYWNjAAEKAAIkbAUKbGV2ZWxBY3JlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHY2hlY2tlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFYWNyZXMJAGgCCQBoAgUFYWNyZXMAFAkAZAIJAQ9nZXRMZXZlbEJ5QWNyZXMBBQVhY3JlcwAEABFrZXlOZnRUb3RhbElzc3VlZAIObmZ0VG90YWxJc3N1ZWQBFWtleU5mdE51bWJlckJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAhNuZnROdW1iZXJCeUFzc2V0SWRfBQdhc3NldElkARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIAFGtleUxhc3RBY3Jlc1NlbGxUaW1lAhFsYXN0QWNyZXNTZWxsVGltZQAQa2V5TGFzdExpbWl0TGVmdAINbGFzdExpbWl0TGVmdAAIZHR4QXJyYXkEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAFA25pbAMJAAACAQFUBQckbWF0Y2gwCQDMCAICLEN5MWIxY3U2RTVWeDY3TW8yd3ZXaTJwdkp6VDI4ZXhzYjgxbWFveVlQbXZ1CQDMCAICLDZHRXlQVTVIMmdpWmFoaktuVWZaNGRqU01hY0VoU1dzd1ZwMjNYcjhCN3d5BQNuaWwJAAIBAg1Vbmtub3duIGNoYWluAA9uZnREZXNjcmlwdGlvbnMJAMwIAgJ3eyJuYW1lIjogIkdvbGQgc2hvdmVsIiwgImRlc2NyaXB0aW9uIjogIlJld2FyZCBmb3IgZWFybHkgYmlyZHMiLCAicmFyZSI6ICJQcm9tbyIsICJib251cyI6IDMsICJib251c1R5cGUiOiAiRmFybVBvd2VyIn0JAMwIAgJxeyJuYW1lIjogIlBpY2theGUiLCAiZGVzY3JpcHRpb24iOiAiSW5jcmVhc2VzIEZhcm1Qb3dlciIsICJyYXJlIjogIkNvbW1vbiIsICJib251cyI6IDEsICJib251c1R5cGUiOiAiRmFybVBvd2VyIn0FA25pbAAIbmZ0TmFtZXMJAMwIAgIJU0hPVkVMLVAzCQDMCAICClBJQ0tBWEUtQzEFA25pbAEGcHJvbG9nAQFpAwMJAQIhPQIIBQFpDG9yaWdpbkNhbGxlcgUNcmVzdDJDb250cmFjdAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEKa2V5QmxvY2tlZAAHBwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UEBGFkZHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAR3ZWVrCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwQSbGFzdFdlZWtUeElkQnlVc2VyCQCiCAEJARVrZXlMYXN0V2Vla1R4SWRCeVVzZXIBBQRhZGRyBAR0eElkCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQEA3d0eAkArAICCQCsAgIJAKQDAQUEd2VlawIBXwUEdHhJZAMJAQlpc0RlZmluZWQBBRJsYXN0V2Vla1R4SWRCeVVzZXIECmxhc3RXZWVrVHgJALUJAgkBBXZhbHVlAQUSbGFzdFdlZWtUeElkQnlVc2VyAgFfAwkAAAIJAJEDAgUKbGFzdFdlZWtUeAAACQCkAwEFBHdlZWsJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEFBGFkZHIFA3d0eAkAzAgCCQELU3RyaW5nRW50cnkCCQEUa2V5Q3VyV2Vla1R4SWRCeVVzZXIBBQRhZGRyBQN3dHgFA25pbAMJAAACCQCRAwIFCmxhc3RXZWVrVHgAAAkApAMBCQBlAgUEd2VlawABCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlDdXJXZWVrVHhJZEJ5VXNlcgEFBGFkZHIFA3d0eAUDbmlsBBFjdXJXZWVrVHhJZEJ5VXNlcgkBEUBleHRyTmF0aXZlKDEwNTgpAQkBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEFBGFkZHIECWN1cldlZWtUeAkAtQkCBRFjdXJXZWVrVHhJZEJ5VXNlcgIBXwMJAAACCQCRAwIFCWN1cldlZWtUeAAACQCkAwEFBHdlZWsJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGtleUN1cldlZWtUeElkQnlVc2VyAQUEYWRkcgUDd3R4BQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEFBGFkZHIFEWN1cldlZWtUeElkQnlVc2VyCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlDdXJXZWVrVHhJZEJ5VXNlcgEFBGFkZHIFA3d0eAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJARVrZXlMYXN0V2Vla1R4SWRCeVVzZXIBBQRhZGRyBQN3dHgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGtleUN1cldlZWtUeElkQnlVc2VyAQUEYWRkcgUDd3R4BQNuaWwBEGlzc3VlTkZUaW50ZXJuYWwCCG5mdEluZGV4BGFkZHIDCQBnAgUIbmZ0SW5kZXgJAJADAQUIZHR4QXJyYXkJAAIBAhZuZnRJbmRleCBvdXQgb2YgYm91bmRzBAluZnRTZXJpYWwJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFEWtleU5mdFRvdGFsSXNzdWVkAP///////////wEAAQQFaXNzdWUJAMIIBQkAkQMCBQhuZnROYW1lcwUIbmZ0SW5kZXgJALoJAgkAzAgCCQCRAwIFCGR0eEFycmF5BQhuZnRJbmRleAkAzAgCCQCkAwEFCW5mdFNlcmlhbAkAzAgCCQCRAwIFD25mdERlc2NyaXB0aW9ucwUIbmZ0SW5kZXgFA25pbAUDU0VQAAEAAAcECm5mdEFzc2V0SWQJALgIAQUFaXNzdWUJAJQKAgkAzAgCBQVpc3N1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgURa2V5TmZ0VG90YWxJc3N1ZWQFCW5mdFNlcmlhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFWtleU5mdE51bWJlckJ5QXNzZXRJZAEJANgEAQUKbmZ0QXNzZXRJZAUJbmZ0U2VyaWFsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBGFkZHIAAQUKbmZ0QXNzZXRJZAUDbmlsBQpuZnRBc3NldElkARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAgNhbXQHYWRkcmVzcwQJd2xnUmVzdWx0CQD8BwQFC3dsZ0NvbnRyYWN0AhJvblN0YWtlVW5zdGFrZUxhbmQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUJd2xnUmVzdWx0BQl3bGdSZXN1bHQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEB3RpbWVLZXkJARhrZXlBY3Jlc1N0YWtlZFRpbWVCeVVzZXIBBQdhZGRyZXNzBAlhbW91bnRLZXkJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFB2FkZHJlc3MEDm9sZEFjcmVzQW1vdW50CQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAAAwMJAGYCAAAFA2FtdAkAZgIAAAkAZAIFDm9sZEFjcmVzQW1vdW50BQNhbXQHCQACAQkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAQpmaXhlZFBvaW50AgUOb2xkQWNyZXNBbW91bnQACAIgIEFDUkVTIHN0YWtlZCwgdHJpZWQgdG8gdW5zdGFrZSAJAQpmaXhlZFBvaW50AgkBAS0BBQNhbXQACAQObmV3QWNyZXNBbW91bnQJAGQCBQ5vbGRBY3Jlc0Ftb3VudAUDYW10BAhvbGRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJhY3Jlc1N0YWtkVG90YWxLZXkAAAQJdXNlckZwS2V5CQEVa2V5RmFybWluZ1Bvd2VyQnlVc2VyAQUHYWRkcmVzcwQFb2xkRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJdXNlckZwS2V5AAAEBW5ld0ZwCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFDm5ld0FjcmVzQW1vdW50BApvbGRUb3RhbEZwCQELdmFsdWVPckVsc2UCCQCfCAEFFHRvdGFsRmFybWluZ1Bvd2VyS2V5AAAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIFCWFtb3VudEtleQUObmV3QWNyZXNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEmFjcmVzU3Rha2RUb3RhbEtleQkAZAIFCG9sZFRvdGFsBQNhbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFCXVzZXJGcEtleQUFbmV3RnAJAMwIAgkBDEludGVnZXJFbnRyeQIFFHRvdGFsRmFybWluZ1Bvd2VyS2V5CQBkAgkAZQIFCm9sZFRvdGFsRnAFBW9sZEZwBQVuZXdGcAUDbmlsBQl3bGdSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BC2dldFdsZ1ByaWNlARV1c2R0QmFsYW5jZUNvcnJlY3Rpb24EDGlzc3VlZEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFC3dsZ0NvbnRyYWN0BQ93bGdJc3N1ZWRBbXRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQGd2xnVXNkCQDwBwIFC3dsZ0NvbnRyYWN0BQt1c2R0QXNzZXRJZAQJYWNyZXMyVXNkCQBlAgkA8AcCBQ5hY3JlczJDb250cmFjdAULdXNkdEFzc2V0SWQFFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRJpbnZlc3RGdW5kQ29udHJhY3QFC3VzZHRBc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFEmludmVzdEZ1bmRDb250cmFjdAUOemJJc3N1ZWRBbXRLZXkAAAQNdG90YWxGdW5kc1VzZAkAZAIJAGQCBQlhY3JlczJVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsCQBrAwUNdG90YWxGdW5kc1VzZAUFTVVMVDgFDGlzc3VlZEFtb3VudAERZ2V0U3dhcExpbWl0QWNyZXMABAZ3bGdVc2QJAPAHAgULd2xnQ29udHJhY3QFC3VzZHRBc3NldElkBAlhY3JlczJVc2QJAPAHAgUEdGhpcwULdXNkdEFzc2V0SWQED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgUSaW52ZXN0RnVuZENvbnRyYWN0BQt1c2R0QXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJpbnZlc3RGdW5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEDGRlZmF1bHRMaW1pdAkAaQIJAGQCCQBkAgUJYWNyZXMyVXNkBQZ3bGdVc2QFD2ludmVzdEZ1bmRUb3RhbAUTT05FX1BFUkNFTlRfRElWSVNPUgQNbGFzdExpbWl0TGVmdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRBrZXlMYXN0TGltaXRMZWZ0BQxkZWZhdWx0TGltaXQECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFFGtleUxhc3RBY3Jlc1NlbGxUaW1lAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEDGN1cnJlbnRMaW1pdAkAZAIFDWxhc3RMaW1pdExlZnQJAGsDBQxkZWZhdWx0TGltaXQJAGUCBQNub3cFCGxhc3RUaW1lBQpEQVlfTUlMTElTBA1saW1pdExlZnRVc2R0CQCXAwEJAMwIAgUMY3VycmVudExpbWl0CQDMCAIFDGRlZmF1bHRMaW1pdAUDbmlsCQCUCgIJAQxJbnRlZ2VyRW50cnkCBRRrZXlMYXN0QWNyZXNTZWxsVGltZQUDbm93BQ1saW1pdExlZnRVc2R0DgFpAQpzYXZlTGFzdFR4AAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgULd2xnQ29udHJhY3QFA25pbAgFAWkGY2FsbGVyCQACAQINQWNjZXNzIGRlbmllZAkAlAoCCQEGcHJvbG9nAQUBaQAqAWkBDWNvbnN0cnVjdG9yVjECCXJlc3QyQWRkcg5vbGRBY3JDb250cmFjdAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA5vbGRBY3JDb250QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUOb2xkQWNyQ29udHJhY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFFGFjcmVzSXNzdWVkQW1vdW50S2V5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ5vbGRBY3JDb250QWRkcgUUYWNyZXNJc3N1ZWRBbW91bnRLZXkJAMwIAgkBC0JpbmFyeUVudHJ5AgUPYWNyZXNBc3NldElkS2V5CQERQGV4dHJOYXRpdmUoMTA1MikCBQ5vbGRBY3JDb250QWRkcgUPYWNyZXNBc3NldElkS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlSZXN0MkFkZHJlc3MABQlyZXN0MkFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUTb2xkQWNyZXNDb250cmFjdEtleQUOb2xkQWNyQ29udHJhY3QFA25pbAFpAQpzZXRCbG9ja2VkAQlpc0Jsb2NrZWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCmtleUJsb2NrZWQABQlpc0Jsb2NrZWQFA25pbAFpAQx1bnN0YWtlQWNyZXMBBmFtb3VudAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQBnAgAABQZhbW91bnQJAAIBAhlBbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBA5hcmJSZWxlYXNlVGltZQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgULd2xnQ29udHJhY3QJARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQUHYWRkcmVzcwAABQ5hcmJpdHJhZ2VEZWxheQMJAGYCBQ5hcmJSZWxlYXNlVGltZQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAAIBCQCsAgICLVlvdSB0cmFkZWQgc29tZSBXTEdPTEQsIGNhbm5vdCB1bnN0YWtlIHVudGlsIAkApAMBBQ5hcmJSZWxlYXNlVGltZQQLJHQwNzQzMzc1MTAJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAgkBAS0BBQZhbW91bnQFB2FkZHJlc3MEB2FjdGlvbnMIBQskdDA3NDMzNzUxMAJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFCyR0MDc0MzM3NTEwAl8yCQCUCgIJAM4IAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAUMYWNyZXNBc3NldElkBQ1wcm9sb2dBY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCnN0YWtlQWNyZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFDGFjcmVzQXNzZXRJZAkAAgECFEFDUkVTIHBheW1lbnRzIG9ubHkhBAskdDA3OTYxODAzNAkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwCBQNhbXQFB2FkZHJlc3MEB2FjdGlvbnMIBQskdDA3OTYxODAzNAJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFCyR0MDc5NjE4MDM0Al8yCQCUCgIJAM4IAgUHYWN0aW9ucwUNcHJvbG9nQWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAFpAQhidXlBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAECnVzZHRBbW91bnQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkAZgIFBU1VTFQ2BQp1c2R0QW1vdW50CQACAQkArAICCQCsAgICFk1pbiBwYXltZW50IHNob3VsZCBiZSAJAQpmaXhlZFBvaW50AgUFTVVMVDYABgIFIFVTRFQEC2FjcmVzQW1vdW50CQBoAgUKdXNkdEFtb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSBAl3bGdBbW91bnQJAGsDBQp1c2R0QW1vdW50BQVNVUxUOAkBC2dldFdsZ1ByaWNlAQUKdXNkdEFtb3VudAQPb2xkQWNyZXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRNvbGRBY3Jlc0NvbnRyYWN0S2V5BANyZXEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhRyZXF1ZXN0QWNyZXNDYWxsYmFjawkAzAgCBQthY3Jlc0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUDcmVxBQNyZXEECXdsZ1JlbWFpbgkBBWFzSW50AQkA/AcEBQt3bGdDb250cmFjdAIKYnVybldsZ29sZAkAzAgCBQl3bGdBbW91bnQFA25pbAUDbmlsCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2FjcmVzQW1vdW50BQxhY3Jlc0Fzc2V0SWQFA25pbAUNcHJvbG9nQWN0aW9ucwUJd2xnUmVtYWluCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGJ1eUFjcmVzUkVBRE9OTFkBCnVzZHRBbW91bnQEC2FjcmVzQW1vdW50CQBoAgUKdXNkdEFtb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSBAl3bGdUb0J1cm4JAGsDBQp1c2R0QW1vdW50BQVNVUxUOAkBC2dldFdsZ1ByaWNlAQUKdXNkdEFtb3VudAkAlAoCBQNuaWwJAMwIAgULYWNyZXNBbW91bnQJAMwIAgUFTVVMVDYJAMwIAgULYWNyZXNBbW91bnQJAMwIAgUJd2xnVG9CdXJuBQNuaWwBaQEJc2VsbEFjcmVzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQLYWNyZXNBbW91bnQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUMYWNyZXNBc3NldElkCQACAQIUQUNSRVMgcGF5bWVudHMgb25seSEDCQBmAgUFTVVMVDcFC2FjcmVzQW1vdW50CQACAQkArAICCQCsAgICFk1pbiBwYXltZW50IHNob3VsZCBiZSAJAQpmaXhlZFBvaW50AgUFTVVMVDcACAIGIEFDUkVTBARhZGRyCQClCAEIBQFpBmNhbGxlcgQLJHQwOTg5MTk5MzkJARFnZXRTd2FwTGltaXRBY3JlcwAEC2xpbWl0QWN0aW9uCAULJHQwOTg5MTk5MzkCXzEEB21heFVzZHQIBQskdDA5ODkxOTkzOQJfMgQIbWF4QWNyZXMJAGgCBQdtYXhVc2R0BRVVU0RUMkFDUkVTX01VTFRJUExJRVIDCQBmAgULYWNyZXNBbW91bnQFCG1heEFjcmVzCQACAQkArAICCQCsAgICEVlvdSBjYW4gc2VsbCBtYXggCQEKZml4ZWRQb2ludAIFCG1heEFjcmVzAAgCBiBBQ1JFUwQKdXNkdEFtb3VudAkAaQIJAGkCBQthY3Jlc0Ftb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAAIJAJQKAgkAzggCCQDMCAIFC2xpbWl0QWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlMYXN0TGltaXRMZWZ0CQBlAgUHbWF4VXNkdAUKdXNkdEFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCnVzZHRBbW91bnQFC3VzZHRBc3NldElkBQNuaWwFDXByb2xvZ0FjdGlvbnMFCnVzZHRBbW91bnQBaQERc2VsbEFjcmVzUkVBRE9OTFkCB2FkZHJlc3MLYWNyZXNBbW91bnQEDSR0MDEwNDM1MTA0ODMJARFnZXRTd2FwTGltaXRBY3JlcwAEC2xpbWl0QWN0aW9uCAUNJHQwMTA0MzUxMDQ4MwJfMQQHbWF4VXNkdAgFDSR0MDEwNDM1MTA0ODMCXzIECnVzZHRBbW91bnQJAGkCCQBpAgULYWNyZXNBbW91bnQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgACCQCUCgIFA25pbAkAzAgCBQp1c2R0QW1vdW50CQDMCAIFBU1VTFQ3CQDMCAIJAGgCBQdtYXhVc2R0BRVVU0RUMkFDUkVTX01VTFRJUExJRVIJAMwIAgAABQNuaWwBaQEQY29udmVydE9sZFN0YWtlcwADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhRUZW1wb3JhcmlseSBkaXNhYmxlZAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQPb2xkQWNyZXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRNvbGRBY3Jlc0NvbnRyYWN0S2V5BAZhbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPb2xkQWNyZXNBZGRyZXNzCQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQdhZGRyZXNzAAAECWdvdEFjcmVzMAMJAGYCBQZhbW91bnQAAAkBDGFzVHVwbGUySW50cwEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhR1bnN0YWtlQWNyZXNDYWxsYmFjawkAzAgCBQZhbW91bnQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJQKAgAAAAAEEW9sZFN0YWtpbmdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRVvbGRTdGFraW5nQ29udHJhY3RTdHIECGxhbmRzU3RyCQCdCAIFEW9sZFN0YWtpbmdBZGRyZXNzCQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUHYWRkcmVzcwQLbGFuZHNSZXN1bHQDCQEJaXNEZWZpbmVkAQUIbGFuZHNTdHIEBWxhbmRzCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfCgEHb25lTGFuZAIDYWNjC2xhbmRBc3NldElkAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQBcgkBDGFzVHVwbGU1SW50cwEJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCE3Vuc3Rha2VMYW5kQ2FsbGJhY2sJAMwIAgULbGFuZEFzc2V0SWQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJYKBAkAZAIIBQNhY2MCXzEIBQFyAl8xCQBkAggFA2FjYwJfMggFAXICXzIJAGQCCAUDYWNjAl8zCAUBcgJfMwkAZAIIBQNhY2MCXzQIBQFyAl80BAJycgoAAiRsBQVsYW5kcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdvbmVMYW5kAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhVMaXN0IHNpemUgZXhjZWVkcyAxMDAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZAQIZmluYWxpemUJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCHHVuc3Rha2VMYW5kc0ZpbmFsaXplQ2FsbGJhY2sJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUIZmluYWxpemUFCGZpbmFsaXplBANyZXEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhRyZXF1ZXN0QWNyZXNDYWxsYmFjawkAzAgCCQBkAgkAZAIJAGQCCAUCcnICXzEIBQJycgJfMggFAnJyAl8zCAUCcnICXzQFA25pbAUDbmlsAwkAAAIFA3JlcQUDcmVxBA0kdDAxMjM1NTEyNDM1CQEQaXNzdWVORlRpbnRlcm5hbAIFFUlkeER0eDNQZXJjQ29udmVyc2lvbggFAWkGY2FsbGVyBApuZnRBY3Rpb25zCAUNJHQwMTIzNTUxMjQzNQJfMQQKbmZ0QXNzZXRJZAgFDSR0MDEyMzU1MTI0MzUCXzIJAJcKBQgFAnJyAl8xCAUCcnICXzIIBQJycgJfMwgFAnJyAl80BQpuZnRBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCXCgUAAAAAAAAAAAUDbmlsBAtkdWNrQXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAnQgCBRFvbGRTdGFraW5nQWRkcmVzcwkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwIABApkdWNrUmVzdWx0AwkBAiE9AgULZHVja0Fzc2V0SWQCAAkBDGFzVHVwbGUzSW50cwEJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCE3Vuc3Rha2VEdWNrQ2FsbGJhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJUKAwAAAAAAAAQBeAkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwCCQBkAgkAZAIJAGQCCQBkAgkAZAIJAGQCCQBkAggFCWdvdEFjcmVzMAJfMQgFC2xhbmRzUmVzdWx0Al8xCAULbGFuZHNSZXN1bHQCXzIIBQtsYW5kc1Jlc3VsdAJfMwgFC2xhbmRzUmVzdWx0Al80CAUKZHVja1Jlc3VsdAJfMQgFCmR1Y2tSZXN1bHQCXzIIBQpkdWNrUmVzdWx0Al8zBQdhZGRyZXNzCQCUCgIJAM4IAggFC2xhbmRzUmVzdWx0Al81CAUBeAJfMQgFAXgCXzIBaQEUdW5zdGFrZUxhbmRzUkVBRE9OTFkBB2FkZHJlc3MEEW9sZFN0YWtpbmdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRVvbGRTdGFraW5nQ29udHJhY3RTdHIECGxhbmRzU3RyCQCdCAIFEW9sZFN0YWtpbmdBZGRyZXNzCQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUHYWRkcmVzcwQLbGFuZHNSZXN1bHQDCQEJaXNEZWZpbmVkAQUIbGFuZHNTdHIEBWxhbmRzCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfCgEHb25lTGFuZAIDYWNjC2xhbmRBc3NldElkAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQBcgkBDGFzVHVwbGU0SW50cwEJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCE3Vuc3Rha2VMYW5kUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJYKBAkAZAIIBQNhY2MCXzEIBQFyAl8xCQBkAggFA2FjYwJfMggFAXICXzIJAGQCCAUDYWNjAl8zCAUBcgJfMwkAZAIIBQNhY2MCXzQIBQFyAl80CgACJGwFBWxhbmRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAAAAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB29uZUxhbmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFUxpc3Qgc2l6ZSBleGNlZWRzIDEwMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkCQCWCgQAAAAAAAAAAAkAlAoCBQNuaWwFC2xhbmRzUmVzdWx0AWkBEnN0YWtlQWNyZXNDYWxsYmFjawEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUVb2xkU3Rha2luZ0NvbnRyYWN0U3RyCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBGFkZHIBaQEac2ltdWxhdGVTdGFrZUFjcmVzUkVBRE9OTFkCB2FkZHJlc3MLYWRkZWRBbW91bnQECWFtb3VudEtleQkBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQUHYWRkcmVzcwQObmV3QWNyZXNBbW91bnQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAABQthZGRlZEFtb3VudAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSYWNyZXNTdGFrZFRvdGFsS2V5AAAECXVzZXJGcEtleQkBFWtleUZhcm1pbmdQb3dlckJ5VXNlcgEFB2FkZHJlc3MEBW9sZEZwCQELdmFsdWVPckVsc2UCCQCfCAEFCXVzZXJGcEtleQAABAVuZXdGcAkBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBQ5uZXdBY3Jlc0Ftb3VudAQKb2xkVG90YWxGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRR0b3RhbEZhcm1pbmdQb3dlcktleQAABApuZXdUb3RhbEZwCQBkAgkAZQIFCm9sZFRvdGFsRnAFBW9sZEZwBQVuZXdGcAkAlAoCBQNuaWwJAMwIAgUFb2xkRnAJAMwIAgUFbmV3RnAJAMwIAgUKb2xkVG90YWxGcAkAzAgCBQpuZXdUb3RhbEZwBQNuaWwBaQEIaXNzdWVORlQCCmZvckFkZHJlc3MIbmZ0SW5kZXgDCQECIT0CCAUBaQZjYWxsZXIFC3dsZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQJARBpc3N1ZU5GVGludGVybmFsAgUIbmZ0SW5kZXgJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCmZvckFkZHJlc3MAMeAvIw==", "height": 3382763, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: b9pot6JkR7Qxo98BvwKAy32KiVhCG3eC6i34CPByJuF Next: Hr2KEJ7XcawRiWrsfsnDxKjocAURw7wixBjzGyXyfAsH Diff:
OldNewDifferences
8989 func keyBlocked () = "contractsBlocked"
9090
9191
92-func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
92+func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
93+
94+
95+func keyCurWeekTxIdByUser (addr) = ("curWeekTxIdByUser_" + addr)
9396
9497
9598 let acresIssuedAmountKey = "acresIssuedAmount"
157160
158161 let M8_ = 100000000
159162
163+let WEEK_BLOCKS = 10080
164+
160165 let wlgIssuedAmtKey = "wlg_issuedAmount"
161166
162167 let zbIssuedAmtKey = "zbill_issuedAmount"
199204 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
200205
201206
207+let keyNftTotalIssued = "nftTotalIssued"
208+
209+func keyNftNumberByAssetId (assetId) = ("nftNumberByAssetId_" + assetId)
210+
211+
202212 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
203213
204214
211221 if ((base58'2W' == $match0))
212222 then nil
213223 else if ((base58'2T' == $match0))
214- then nil
224+ then ["Cy1b1cu6E5Vx67Mo2wvWi2pvJzT28exsb81maoyYPmvu", "6GEyPU5H2giZahjKnUfZ4djSMacEhSWswVp23Xr8B7wy"]
215225 else throw("Unknown chain")
216226 }
217227
218-let nftDescriptions = ["FarmingPower +3% NFT for WavesLands loyal players", "FarmingPower +1% NFT"]
228+let nftDescriptions = ["{\"name\": \"Gold shovel\", \"description\": \"Reward for early birds\", \"rare\": \"Promo\", \"bonus\": 3, \"bonusType\": \"FarmPower\"}", "{\"name\": \"Pickaxe\", \"description\": \"Increases FarmPower\", \"rare\": \"Common\", \"bonus\": 1, \"bonusType\": \"FarmPower\"}"]
219229
220-let nftNames = ["FPOWER+3%", "FPOWER1"]
230+let nftNames = ["SHOVEL-P3", "PICKAXE-C1"]
221231
222232 func prolog (i) = if (if ((i.originCaller != rest2Contract))
223233 then valueOrElse(getBoolean(keyBlocked()), false)
224234 else false)
225235 then throw("Contracts are under maintenance")
226- else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
236+ else {
237+ let addr = toString(i.originCaller)
238+ let week = (height / WEEK_BLOCKS)
239+ let lastWeekTxIdByUser = getString(keyLastWeekTxIdByUser(addr))
240+ let txId = toBase58String(i.transactionId)
241+ let wtx = ((toString(week) + "_") + txId)
242+ if (isDefined(lastWeekTxIdByUser))
243+ then {
244+ let lastWeekTx = split(value(lastWeekTxIdByUser), "_")
245+ if ((lastWeekTx[0] == toString(week)))
246+ then [StringEntry(keyLastWeekTxIdByUser(addr), wtx), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
247+ else if ((lastWeekTx[0] == toString((week - 1))))
248+ then [StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
249+ else {
250+ let curWeekTxIdByUser = getStringValue(keyLastWeekTxIdByUser(addr))
251+ let curWeekTx = split(curWeekTxIdByUser, "_")
252+ if ((curWeekTx[0] == toString(week)))
253+ then [StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
254+ else [StringEntry(keyLastWeekTxIdByUser(addr), curWeekTxIdByUser), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
255+ }
256+ }
257+ else [StringEntry(keyLastWeekTxIdByUser(addr), wtx), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
258+ }
227259
228260
229-func issueNFTinternal (nftIndex) = if ((nftIndex >= size(dtxArray)))
261+func issueNFTinternal (nftIndex,addr) = if ((nftIndex >= size(dtxArray)))
230262 then throw("nftIndex out of bounds")
231263 else {
232- let issue = Issue(nftNames[nftIndex], ((dtxArray[nftIndex] + SEP) + nftDescriptions[nftIndex]), 1, 0, false)
233- $Tuple2(issue, calculateAssetId(issue))
264+ let nftSerial = (valueOrElse(getInteger(keyNftTotalIssued), -1) + 1)
265+ let issue = Issue(nftNames[nftIndex], makeString_2C([dtxArray[nftIndex], toString(nftSerial), nftDescriptions[nftIndex]], SEP), 1, 0, false)
266+ let nftAssetId = calculateAssetId(issue)
267+ $Tuple2([issue, IntegerEntry(keyNftTotalIssued, nftSerial), IntegerEntry(keyNftNumberByAssetId(toBase58String(nftAssetId)), nftSerial), ScriptTransfer(addr, 1, nftAssetId)], nftAssetId)
234268 }
235269
236270
322356 if ((arbReleaseTime > lastBlock.timestamp))
323357 then throw(("You traded some WLGOLD, cannot unstake until " + toString(arbReleaseTime)))
324358 else {
325- let $t053235400 = stakeUnstakeAcresInternal(-(amount), address)
326- let actions = $t053235400._1
327- let wlgClaimedAmount = $t053235400._2
359+ let $t074337510 = stakeUnstakeAcresInternal(-(amount), address)
360+ let actions = $t074337510._1
361+ let wlgClaimedAmount = $t074337510._2
328362 $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
329363 }
330364 }
347381 else (value(pmt.assetId) != acresAssetId))
348382 then throw("ACRES payments only!")
349383 else {
350- let $t058515924 = stakeUnstakeAcresInternal(amt, address)
351- let actions = $t058515924._1
352- let wlgClaimedAmount = $t058515924._2
384+ let $t079618034 = stakeUnstakeAcresInternal(amt, address)
385+ let actions = $t079618034._1
386+ let wlgClaimedAmount = $t079618034._2
353387 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
354388 }
355389 }
413447 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
414448 else {
415449 let addr = toString(i.caller)
416- let $t077817829 = getSwapLimitAcres()
417- let limitAction = $t077817829._1
418- let maxUsdt = $t077817829._2
450+ let $t098919939 = getSwapLimitAcres()
451+ let limitAction = $t098919939._1
452+ let maxUsdt = $t098919939._2
419453 let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
420454 if ((acresAmount > maxAcres))
421455 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
431465
432466 @Callable(i)
433467 func sellAcresREADONLY (address,acresAmount) = {
434- let $t083258373 = getSwapLimitAcres()
435- let limitAction = $t083258373._1
436- let maxUsdt = $t083258373._2
468+ let $t01043510483 = getSwapLimitAcres()
469+ let limitAction = $t01043510483._1
470+ let maxUsdt = $t01043510483._2
437471 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
438472 $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
439473 }
485519 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
486520 if ((req == req))
487521 then {
488- let $t01024510310 = issueNFTinternal(IdxDtx3PercConversion)
489- let issue = $t01024510310._1
490- let nftAssetId = $t01024510310._2
491- $Tuple5(rr._1, rr._2, rr._3, rr._4, [issue, ScriptTransfer(i.caller, 1, nftAssetId)])
522+ let $t01235512435 = issueNFTinternal(IdxDtx3PercConversion, i.caller)
523+ let nftActions = $t01235512435._1
524+ let nftAssetId = $t01235512435._2
525+ $Tuple5(rr._1, rr._2, rr._3, rr._4, nftActions)
492526 }
493527 else throw("Strict value is not equal to itself.")
494528 }
564598 @Callable(i)
565599 func issueNFT (forAddress,nftIndex) = if ((i.caller != wlgContract))
566600 then throw("Permission denied")
567- else {
568- let $t01276912821 = issueNFTinternal(nftIndex)
569- let issue = $t01276912821._1
570- let nftAssetId = $t01276912821._2
571- $Tuple2([issue, ScriptTransfer(addressFromStringValue(forAddress), 1, nftAssetId)], nftAssetId)
572- }
601+ else issueNFTinternal(nftIndex, addressFromStringValue(forAddress))
573602
574603
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT7 = 10000000
99
1010 let MULT8 = 100000000
1111
1212 let DAY_MILLIS = 86400000
1313
1414 let USDT2ACRES_MULTIPLIER = 10
1515
1616 let ONE_PERCENT_DIVISOR = 100
1717
1818 let chain = take(drop(this.bytes, 1), 1)
1919
2020 let usdtAssetId = match chain {
2121 case _ =>
2222 if ((base58'2W' == $match0))
2323 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
2424 else if ((base58'2T' == $match0))
2525 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
2626 else throw("Unknown chain")
2727 }
2828
2929 let defaultRest2AddressStr = match chain {
3030 case _ =>
3131 if ((base58'2W' == $match0))
3232 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
3333 else if ((base58'2T' == $match0))
3434 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
3535 else throw("Unknown chain")
3636 }
3737
3838 let arbitrageDelay = match chain {
3939 case _ =>
4040 if ((base58'2W' == $match0))
4141 then DAY_MILLIS
4242 else if ((base58'2T' == $match0))
4343 then 60000
4444 else throw("Unknown chain")
4545 }
4646
4747 let oldStakingContractStr = match chain {
4848 case _ =>
4949 if ((base58'2W' == $match0))
5050 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
5151 else if ((base58'2T' == $match0))
5252 then "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm"
5353 else throw("Unknown chain")
5454 }
5555
5656 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
5757
5858
5959 let IdxCfgAcres2Dapp = 1
6060
6161 let IdxCfgWlgDapp = 2
6262
6363 let IdxCfgInvestFundDapp = 5
6464
6565 func keyRestCfg () = "%s__restConfig"
6666
6767
6868 func keyRest2Address () = "%s__rest2Addr"
6969
7070
7171 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
7272
7373
7474 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
7575
7676
7777 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
7878
7979 let rest2Cfg = readRestCfgOrFail(rest2Contract)
8080
8181 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
8282
8383 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
8484
8585 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
8686
8787 let oldAcresContractKey = "oldAcresContract"
8888
8989 func keyBlocked () = "contractsBlocked"
9090
9191
92-func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
92+func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
93+
94+
95+func keyCurWeekTxIdByUser (addr) = ("curWeekTxIdByUser_" + addr)
9396
9497
9598 let acresIssuedAmountKey = "acresIssuedAmount"
9699
97100 let acresAssetIdKey = "acresAssetId"
98101
99102 let acresAssetId = valueOrErrorMessage(getBinary(acres2Contract, acresAssetIdKey), "ACRES is not issued yet")
100103
101104 func keyAcresStakedTimeByUser (addr) = ("acresStakedTimeByUser_" + addr)
102105
103106
104107 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
105108
106109
107110 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
108111
109112
110113 func asInt (v) = match v {
111114 case n: Int =>
112115 n
113116 case _ =>
114117 throw("fail to cast into Int")
115118 }
116119
117120
118121 func asTuple5Ints (val) = match val {
119122 case t: (Int, Int, Int, Int, Int) =>
120123 t
121124 case _ =>
122125 throw("fail to cast into (Int, Int, Int, Int, Int)")
123126 }
124127
125128
126129 func asTuple4Ints (val) = match val {
127130 case t: (Int, Int, Int, Int) =>
128131 t
129132 case _ =>
130133 throw("fail to cast into (Int, Int, Int, Int)")
131134 }
132135
133136
134137 func asTuple3Ints (val) = match val {
135138 case t: (Int, Int, Int) =>
136139 t
137140 case _ =>
138141 throw("fail to cast into (Int, Int, Int)")
139142 }
140143
141144
142145 func asTuple2Ints (val) = match val {
143146 case t: (Int, Int) =>
144147 t
145148 case _ =>
146149 throw("fail to cast into (Int, Int)")
147150 }
148151
149152
150153 func fixedPoint (val,decimals) = {
151154 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
152155 let lowPart = toString((val % tenPow))
153156 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
154157 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
155158 }
156159
157160
158161 let M8_ = 100000000
159162
163+let WEEK_BLOCKS = 10080
164+
160165 let wlgIssuedAmtKey = "wlg_issuedAmount"
161166
162167 let zbIssuedAmtKey = "zbill_issuedAmount"
163168
164169 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
165170
166171
167172 func keyFarmingPowerByUser (addr) = ("farmingPowerByUser_" + addr)
168173
169174
170175 let acresStakdTotalKey = "acresStakedAmountTotal"
171176
172177 let totalFarmingPowerKey = "totalFarmingPower"
173178
174179 let IdxDtx3PercConversion = 0
175180
176181 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
177182
178183 func getLevelByAcres (acres) = {
179184 let acr = ((acres + 99999999) / M8_)
180185 func checker (acc,item) = if ((item >= acr))
181186 then acc
182187 else (acc + 1)
183188
184189 let $l = levelAcres
185190 let $s = size($l)
186191 let $acc0 = 0
187192 func $f0_1 ($a,$i) = if (($i >= $s))
188193 then $a
189194 else checker($a, $l[$i])
190195
191196 func $f0_2 ($a,$i) = if (($i >= $s))
192197 then $a
193198 else throw("List size exceeds 10")
194199
195200 $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)
196201 }
197202
198203
199204 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
200205
201206
207+let keyNftTotalIssued = "nftTotalIssued"
208+
209+func keyNftNumberByAssetId (assetId) = ("nftNumberByAssetId_" + assetId)
210+
211+
202212 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
203213
204214
205215 let keyLastAcresSellTime = "lastAcresSellTime"
206216
207217 let keyLastLimitLeft = "lastLimitLeft"
208218
209219 let dtxArray = match chain {
210220 case _ =>
211221 if ((base58'2W' == $match0))
212222 then nil
213223 else if ((base58'2T' == $match0))
214- then nil
224+ then ["Cy1b1cu6E5Vx67Mo2wvWi2pvJzT28exsb81maoyYPmvu", "6GEyPU5H2giZahjKnUfZ4djSMacEhSWswVp23Xr8B7wy"]
215225 else throw("Unknown chain")
216226 }
217227
218-let nftDescriptions = ["FarmingPower +3% NFT for WavesLands loyal players", "FarmingPower +1% NFT"]
228+let nftDescriptions = ["{\"name\": \"Gold shovel\", \"description\": \"Reward for early birds\", \"rare\": \"Promo\", \"bonus\": 3, \"bonusType\": \"FarmPower\"}", "{\"name\": \"Pickaxe\", \"description\": \"Increases FarmPower\", \"rare\": \"Common\", \"bonus\": 1, \"bonusType\": \"FarmPower\"}"]
219229
220-let nftNames = ["FPOWER+3%", "FPOWER1"]
230+let nftNames = ["SHOVEL-P3", "PICKAXE-C1"]
221231
222232 func prolog (i) = if (if ((i.originCaller != rest2Contract))
223233 then valueOrElse(getBoolean(keyBlocked()), false)
224234 else false)
225235 then throw("Contracts are under maintenance")
226- else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
236+ else {
237+ let addr = toString(i.originCaller)
238+ let week = (height / WEEK_BLOCKS)
239+ let lastWeekTxIdByUser = getString(keyLastWeekTxIdByUser(addr))
240+ let txId = toBase58String(i.transactionId)
241+ let wtx = ((toString(week) + "_") + txId)
242+ if (isDefined(lastWeekTxIdByUser))
243+ then {
244+ let lastWeekTx = split(value(lastWeekTxIdByUser), "_")
245+ if ((lastWeekTx[0] == toString(week)))
246+ then [StringEntry(keyLastWeekTxIdByUser(addr), wtx), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
247+ else if ((lastWeekTx[0] == toString((week - 1))))
248+ then [StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
249+ else {
250+ let curWeekTxIdByUser = getStringValue(keyLastWeekTxIdByUser(addr))
251+ let curWeekTx = split(curWeekTxIdByUser, "_")
252+ if ((curWeekTx[0] == toString(week)))
253+ then [StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
254+ else [StringEntry(keyLastWeekTxIdByUser(addr), curWeekTxIdByUser), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
255+ }
256+ }
257+ else [StringEntry(keyLastWeekTxIdByUser(addr), wtx), StringEntry(keyCurWeekTxIdByUser(addr), wtx)]
258+ }
227259
228260
229-func issueNFTinternal (nftIndex) = if ((nftIndex >= size(dtxArray)))
261+func issueNFTinternal (nftIndex,addr) = if ((nftIndex >= size(dtxArray)))
230262 then throw("nftIndex out of bounds")
231263 else {
232- let issue = Issue(nftNames[nftIndex], ((dtxArray[nftIndex] + SEP) + nftDescriptions[nftIndex]), 1, 0, false)
233- $Tuple2(issue, calculateAssetId(issue))
264+ let nftSerial = (valueOrElse(getInteger(keyNftTotalIssued), -1) + 1)
265+ let issue = Issue(nftNames[nftIndex], makeString_2C([dtxArray[nftIndex], toString(nftSerial), nftDescriptions[nftIndex]], SEP), 1, 0, false)
266+ let nftAssetId = calculateAssetId(issue)
267+ $Tuple2([issue, IntegerEntry(keyNftTotalIssued, nftSerial), IntegerEntry(keyNftNumberByAssetId(toBase58String(nftAssetId)), nftSerial), ScriptTransfer(addr, 1, nftAssetId)], nftAssetId)
234268 }
235269
236270
237271 func stakeUnstakeAcresInternal (amt,address) = {
238272 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
239273 if ((wlgResult == wlgResult))
240274 then {
241275 let now = lastBlock.timestamp
242276 let timeKey = keyAcresStakedTimeByUser(address)
243277 let amountKey = keyAcresStakedAmtByUser(address)
244278 let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
245279 if (if ((0 > amt))
246280 then (0 > (oldAcresAmount + amt))
247281 else false)
248282 then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(-(amt), 8)))
249283 else {
250284 let newAcresAmount = (oldAcresAmount + amt)
251285 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
252286 let userFpKey = keyFarmingPowerByUser(address)
253287 let oldFp = valueOrElse(getInteger(userFpKey), 0)
254288 let newFp = getFarmingPowerByAcres(newAcresAmount)
255289 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
256290 $Tuple2([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt)), IntegerEntry(userFpKey, newFp), IntegerEntry(totalFarmingPowerKey, ((oldTotalFp - oldFp) + newFp))], wlgResult)
257291 }
258292 }
259293 else throw("Strict value is not equal to itself.")
260294 }
261295
262296
263297 func getWlgPrice (usdtBalanceCorrection) = {
264298 let issuedAmount = valueOrErrorMessage(getInteger(wlgContract, wlgIssuedAmtKey), "WLGOLD is not issued yet")
265299 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
266300 let acres2Usd = (assetBalance(acres2Contract, usdtAssetId) - usdtBalanceCorrection)
267301 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
268302 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
269303 fraction(totalFundsUsd, MULT8, issuedAmount)
270304 }
271305
272306
273307 func getSwapLimitAcres () = {
274308 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
275309 let acres2Usd = assetBalance(this, usdtAssetId)
276310 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
277311 let defaultLimit = (((acres2Usd + wlgUsd) + investFundTotal) / ONE_PERCENT_DIVISOR)
278312 let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
279313 let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
280314 let now = lastBlock.timestamp
281315 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (now - lastTime), DAY_MILLIS))
282316 let limitLeftUsdt = min([currentLimit, defaultLimit])
283317 $Tuple2(IntegerEntry(keyLastAcresSellTime, now), limitLeftUsdt)
284318 }
285319
286320
287321 @Callable(i)
288322 func saveLastTx () = if (!(containsElement([wlgContract], i.caller)))
289323 then throw("Access denied")
290324 else $Tuple2(prolog(i), 42)
291325
292326
293327
294328 @Callable(i)
295329 func constructorV1 (rest2Addr,oldAcrContract) = if ((i.caller != this))
296330 then throw("Permission denied")
297331 else {
298332 let oldAcrContAddr = addressFromStringValue(oldAcrContract)
299333 [IntegerEntry(acresIssuedAmountKey, getIntegerValue(oldAcrContAddr, acresIssuedAmountKey)), BinaryEntry(acresAssetIdKey, getBinaryValue(oldAcrContAddr, acresAssetIdKey)), StringEntry(keyRest2Address(), rest2Addr), StringEntry(oldAcresContractKey, oldAcrContract)]
300334 }
301335
302336
303337
304338 @Callable(i)
305339 func setBlocked (isBlocked) = if ((i.caller != this))
306340 then throw("permission denied")
307341 else [BooleanEntry(keyBlocked(), isBlocked)]
308342
309343
310344
311345 @Callable(i)
312346 func unstakeAcres (amount) = {
313347 let prologActions = prolog(i)
314348 if ((0 >= amount))
315349 then throw("Amount should be positive")
316350 else {
317351 let address = toString(i.caller)
318352 if ((size(i.payments) != 0))
319353 then throw("No payments required")
320354 else {
321355 let arbReleaseTime = (valueOrElse(getInteger(wlgContract, keyLastWlgTradeTimeByUser(address)), 0) + arbitrageDelay)
322356 if ((arbReleaseTime > lastBlock.timestamp))
323357 then throw(("You traded some WLGOLD, cannot unstake until " + toString(arbReleaseTime)))
324358 else {
325- let $t053235400 = stakeUnstakeAcresInternal(-(amount), address)
326- let actions = $t053235400._1
327- let wlgClaimedAmount = $t053235400._2
359+ let $t074337510 = stakeUnstakeAcresInternal(-(amount), address)
360+ let actions = $t074337510._1
361+ let wlgClaimedAmount = $t074337510._2
328362 $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
329363 }
330364 }
331365 }
332366 }
333367
334368
335369
336370 @Callable(i)
337371 func stakeAcres () = {
338372 let prologActions = prolog(i)
339373 let address = toString(i.caller)
340374 if ((size(i.payments) != 1))
341375 then throw("exactly 1 payment must be attached")
342376 else {
343377 let pmt = i.payments[0]
344378 let amt = pmt.amount
345379 if (if (!(isDefined(pmt.assetId)))
346380 then true
347381 else (value(pmt.assetId) != acresAssetId))
348382 then throw("ACRES payments only!")
349383 else {
350- let $t058515924 = stakeUnstakeAcresInternal(amt, address)
351- let actions = $t058515924._1
352- let wlgClaimedAmount = $t058515924._2
384+ let $t079618034 = stakeUnstakeAcresInternal(amt, address)
385+ let actions = $t079618034._1
386+ let wlgClaimedAmount = $t079618034._2
353387 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
354388 }
355389 }
356390 }
357391
358392
359393
360394 @Callable(i)
361395 func buyAcres () = {
362396 let prologActions = prolog(i)
363397 if ((size(i.payments) != 1))
364398 then throw("exactly 1 payment must be attached")
365399 else {
366400 let pmt = i.payments[0]
367401 let usdtAmount = pmt.amount
368402 if (if (!(isDefined(pmt.assetId)))
369403 then true
370404 else (value(pmt.assetId) != usdtAssetId))
371405 then throw("USDT payments only!")
372406 else if ((MULT6 > usdtAmount))
373407 then throw((("Min payment should be " + fixedPoint(MULT6, 6)) + " USDT"))
374408 else {
375409 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
376410 let wlgAmount = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
377411 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
378412 let req = invoke(oldAcresAddress, "requestAcresCallback", [acresAmount], nil)
379413 if ((req == req))
380414 then {
381415 let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [wlgAmount], nil))
382416 $Tuple2(([ScriptTransfer(i.caller, acresAmount, acresAssetId)] ++ prologActions), wlgRemain)
383417 }
384418 else throw("Strict value is not equal to itself.")
385419 }
386420 }
387421 }
388422
389423
390424
391425 @Callable(i)
392426 func buyAcresREADONLY (usdtAmount) = {
393427 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
394428 let wlgToBurn = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
395429 $Tuple2(nil, [acresAmount, MULT6, acresAmount, wlgToBurn])
396430 }
397431
398432
399433
400434 @Callable(i)
401435 func sellAcres () = {
402436 let prologActions = prolog(i)
403437 if ((size(i.payments) != 1))
404438 then throw("exactly 1 payment must be attached")
405439 else {
406440 let pmt = i.payments[0]
407441 let acresAmount = pmt.amount
408442 if (if (!(isDefined(pmt.assetId)))
409443 then true
410444 else (value(pmt.assetId) != acresAssetId))
411445 then throw("ACRES payments only!")
412446 else if ((MULT7 > acresAmount))
413447 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
414448 else {
415449 let addr = toString(i.caller)
416- let $t077817829 = getSwapLimitAcres()
417- let limitAction = $t077817829._1
418- let maxUsdt = $t077817829._2
450+ let $t098919939 = getSwapLimitAcres()
451+ let limitAction = $t098919939._1
452+ let maxUsdt = $t098919939._2
419453 let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
420454 if ((acresAmount > maxAcres))
421455 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
422456 else {
423457 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
424458 $Tuple2(([limitAction, IntegerEntry(keyLastLimitLeft, (maxUsdt - usdtAmount)), ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
425459 }
426460 }
427461 }
428462 }
429463
430464
431465
432466 @Callable(i)
433467 func sellAcresREADONLY (address,acresAmount) = {
434- let $t083258373 = getSwapLimitAcres()
435- let limitAction = $t083258373._1
436- let maxUsdt = $t083258373._2
468+ let $t01043510483 = getSwapLimitAcres()
469+ let limitAction = $t01043510483._1
470+ let maxUsdt = $t01043510483._2
437471 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
438472 $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
439473 }
440474
441475
442476
443477 @Callable(i)
444478 func convertOldStakes () = if ((i.caller != this))
445479 then throw("Temporarily disabled")
446480 else {
447481 let address = toString(i.caller)
448482 if ((size(i.payments) != 0))
449483 then throw("No payments required")
450484 else {
451485 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
452486 let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
453487 let gotAcres0 = if ((amount > 0))
454488 then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
455489 else $Tuple2(0, 0)
456490 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
457491 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
458492 let landsResult = if (isDefined(landsStr))
459493 then {
460494 let lands = split_51C(value(landsStr), "_")
461495 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
462496 then throw("landAssetId is required")
463497 else {
464498 let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
465499 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
466500 }
467501
468502 let rr = {
469503 let $l = lands
470504 let $s = size($l)
471505 let $acc0 = $Tuple4(0, 0, 0, 0)
472506 func $f0_1 ($a,$i) = if (($i >= $s))
473507 then $a
474508 else oneLand($a, $l[$i])
475509
476510 func $f0_2 ($a,$i) = if (($i >= $s))
477511 then $a
478512 else throw("List size exceeds 100")
479513
480514 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
481515 }
482516 let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
483517 if ((finalize == finalize))
484518 then {
485519 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
486520 if ((req == req))
487521 then {
488- let $t01024510310 = issueNFTinternal(IdxDtx3PercConversion)
489- let issue = $t01024510310._1
490- let nftAssetId = $t01024510310._2
491- $Tuple5(rr._1, rr._2, rr._3, rr._4, [issue, ScriptTransfer(i.caller, 1, nftAssetId)])
522+ let $t01235512435 = issueNFTinternal(IdxDtx3PercConversion, i.caller)
523+ let nftActions = $t01235512435._1
524+ let nftAssetId = $t01235512435._2
525+ $Tuple5(rr._1, rr._2, rr._3, rr._4, nftActions)
492526 }
493527 else throw("Strict value is not equal to itself.")
494528 }
495529 else throw("Strict value is not equal to itself.")
496530 }
497531 else $Tuple5(0, 0, 0, 0, nil)
498532 let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
499533 let duckResult = if ((duckAssetId != ""))
500534 then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
501535 else $Tuple3(0, 0, 0)
502536 let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
503537 $Tuple2((landsResult._5 ++ x._1), x._2)
504538 }
505539 }
506540
507541
508542
509543 @Callable(i)
510544 func unstakeLandsREADONLY (address) = {
511545 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
512546 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
513547 let landsResult = if (isDefined(landsStr))
514548 then {
515549 let lands = split_51C(value(landsStr), "_")
516550 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
517551 then throw("landAssetId is required")
518552 else {
519553 let r = asTuple4Ints(invoke(oldStakingAddress, "unstakeLandREADONLY", [landAssetId, address], nil))
520554 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
521555 }
522556
523557 let $l = lands
524558 let $s = size($l)
525559 let $acc0 = $Tuple4(0, 0, 0, 0)
526560 func $f0_1 ($a,$i) = if (($i >= $s))
527561 then $a
528562 else oneLand($a, $l[$i])
529563
530564 func $f0_2 ($a,$i) = if (($i >= $s))
531565 then $a
532566 else throw("List size exceeds 100")
533567
534568 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
535569 }
536570 else $Tuple4(0, 0, 0, 0)
537571 $Tuple2(nil, landsResult)
538572 }
539573
540574
541575
542576 @Callable(i)
543577 func stakeAcresCallback (addr) = if ((i.caller != addressFromStringValue(oldStakingContractStr)))
544578 then throw("Permission denied")
545579 else stakeUnstakeAcresInternal(i.payments[0].amount, addr)
546580
547581
548582
549583 @Callable(i)
550584 func simulateStakeAcresREADONLY (address,addedAmount) = {
551585 let amountKey = keyAcresStakedAmtByUser(address)
552586 let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + addedAmount)
553587 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
554588 let userFpKey = keyFarmingPowerByUser(address)
555589 let oldFp = valueOrElse(getInteger(userFpKey), 0)
556590 let newFp = getFarmingPowerByAcres(newAcresAmount)
557591 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
558592 let newTotalFp = ((oldTotalFp - oldFp) + newFp)
559593 $Tuple2(nil, [oldFp, newFp, oldTotalFp, newTotalFp])
560594 }
561595
562596
563597
564598 @Callable(i)
565599 func issueNFT (forAddress,nftIndex) = if ((i.caller != wlgContract))
566600 then throw("Permission denied")
567- else {
568- let $t01276912821 = issueNFTinternal(nftIndex)
569- let issue = $t01276912821._1
570- let nftAssetId = $t01276912821._2
571- $Tuple2([issue, ScriptTransfer(addressFromStringValue(forAddress), 1, nftAssetId)], nftAssetId)
572- }
601+ else issueNFTinternal(nftIndex, addressFromStringValue(forAddress))
573602
574603

github/deemru/w8io/026f985 
69.25 ms