tx · FcTWp4WzTCLigzVMZSH4PvkNe1HfREUgqRqna38yowBC

3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh:  -0.01600000 Waves

2024.11.17 18:23 [3375628] smart account 3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh > SELF 0.00000000 Waves

{ "type": 13, "id": "FcTWp4WzTCLigzVMZSH4PvkNe1HfREUgqRqna38yowBC", "fee": 1600000, "feeAssetId": null, "timestamp": 1731857029750, "version": 2, "chainId": 84, "sender": "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh", "senderPublicKey": "3QtfC1XbLZXdeawMDeSERy9vvjUmj1XYd2GFmrvx7pWQ", "proofs": [ "21RKBXfL8gQXw3jVXhAs183WaZ7GUAAg6PiGMyvCcY97yM1oHho2LAa7nABnf7QMbD5SAqjTUgzpdJ1YWmrL64sr" ], "script": "base64:BgI3CAISABIECgIICBIDCgEEEgMKAQESABIAEgMKAQESABIECgIIARIAEgMKAQgSAwoBCBIECgIIATkAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDcAgK3iBAAFTVVMVDgAgMLXLwAKREFZX01JTExJUwCAuJkpABVVU0RUMkFDUkVTX01VTFRJUExJRVIACgATT05FX1BFUkNFTlRfRElWSVNPUgBkAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BGd1l0YThiaUV6MzF6cGVGZTVESks4d0U1dHJTcFFWRjgDCQAAAgEBVAUHJG1hdGNoMAIjM043VXVZYXI2MjY0UDU4RkJoVldLUFFBaDRZdWEyaGduZ3YJAAIBAg1Vbmtub3duIGNoYWluAA5hcmJpdHJhZ2VEZWxheQQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAUKREFZX01JTExJUwMJAAACAQFUBQckbWF0Y2gwAODUAwkAAgECDVVua25vd24gY2hhaW4AFW9sZFN0YWtpbmdDb250cmFjdFN0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BMbmNYdFMxVTgzRDZjUWJGRDNIOHJCSFBMZ3p4U0ZLWjEDCQAAAgEBVAUHJG1hdGNoMAIjM05EQ3lCRzVxODVKdWFSaWlnVWVFdGFpbnlqQ1FUM1hwWm0JAAIBAg1Vbmtub3duIGNoYWluAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAAQSWR4Q2ZnQWNyZXMyRGFwcAABAA1JZHhDZmdXbGdEYXBwAAIAFElkeENmZ0ludmVzdEZ1bmREYXBwAAUBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEPa2V5UmVzdDJBZGRyZXNzAAINJXNfX3Jlc3QyQWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCCHJlc3QyQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUIcmVzdDJDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AA1yZXN0MkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ9rZXlSZXN0MkFkZHJlc3MABRZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyAAhyZXN0MkNmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUNcmVzdDJDb250cmFjdAAOYWNyZXMyQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUQSWR4Q2ZnQWNyZXMyRGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUNSWR4Q2ZnV2xnRGFwcAASaW52ZXN0RnVuZENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFFElkeENmZ0ludmVzdEZ1bmREYXBwABNvbGRBY3Jlc0NvbnRyYWN0S2V5AhBvbGRBY3Jlc0NvbnRyYWN0AQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAERa2V5TGFzdFR4SWRCeVVzZXIBBGFkZHIJAKwCAgIPbGFzdFR4SWRCeVVzZXJfBQRhZGRyABRhY3Jlc0lzc3VlZEFtb3VudEtleQIRYWNyZXNJc3N1ZWRBbW91bnQAD2FjcmVzQXNzZXRJZEtleQIMYWNyZXNBc3NldElkAAxhY3Jlc0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQ5hY3JlczJDb250cmFjdAUPYWNyZXNBc3NldElkS2V5AhdBQ1JFUyBpcyBub3QgaXNzdWVkIHlldAEYa2V5QWNyZXNTdGFrZWRUaW1lQnlVc2VyAQRhZGRyCQCsAgICFmFjcmVzU3Rha2VkVGltZUJ5VXNlcl8FBGFkZHIBFWtleVN0YWtlZExhbmRzQnlPd25lcgEJb3duZXJBZGRyCQCsAgICE3N0YWtlZExhbmRzQnlPd25lcl8FCW93bmVyQWRkcgEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQxhc1R1cGxlNUludHMBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACGShJbnQsIEludCwgSW50LCBJbnQsIEludCkEAXQFByRtYXRjaDAFAXQJAAIBAitmYWlsIHRvIGNhc3QgaW50byAoSW50LCBJbnQsIEludCwgSW50LCBJbnQpAQxhc1R1cGxlNEludHMBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACFChJbnQsIEludCwgSW50LCBJbnQpBAF0BQckbWF0Y2gwBQF0CQACAQImZmFpbCB0byBjYXN0IGludG8gKEludCwgSW50LCBJbnQsIEludCkBDGFzVHVwbGUzSW50cwEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIPKEludCwgSW50LCBJbnQpBAF0BQckbWF0Y2gwBQF0CQACAQIhZmFpbCB0byBjYXN0IGludG8gKEludCwgSW50LCBJbnQpAQxhc1R1cGxlMkludHMBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACCihJbnQsIEludCkEAXQFByRtYXRjaDAFAXQJAAIBAhxmYWlsIHRvIGNhc3QgaW50byAoSW50LCBJbnQpAQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAADTThfAIDC1y8AD3dsZ0lzc3VlZEFtdEtleQIQd2xnX2lzc3VlZEFtb3VudAAOemJJc3N1ZWRBbXRLZXkCEnpiaWxsX2lzc3VlZEFtb3VudAEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyARVrZXlGYXJtaW5nUG93ZXJCeVVzZXIBBGFkZHIJAKwCAgITZmFybWluZ1Bvd2VyQnlVc2VyXwUEYWRkcgASYWNyZXNTdGFrZFRvdGFsS2V5AhZhY3Jlc1N0YWtlZEFtb3VudFRvdGFsABR0b3RhbEZhcm1pbmdQb3dlcktleQIRdG90YWxGYXJtaW5nUG93ZXIACmxldmVsQWNyZXMJAMwIAgAACQDMCAIACgkAzAgCABQJAMwIAgAoCQDMCAIAUAkAzAgCAJYBCQDMCAIA+gEJAMwIAgCQAwkAzAgCALwFCQDMCAIA6AcFA25pbAEPZ2V0TGV2ZWxCeUFjcmVzAQVhY3JlcwQDYWNyCQBpAgkAZAIFBWFjcmVzAP/B1y8FA004XwoBB2NoZWNrZXICA2FjYwRpdGVtAwkAZwIFBGl0ZW0FA2FjcgUDYWNjCQBkAgUDYWNjAAEKAAIkbAUKbGV2ZWxBY3JlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHY2hlY2tlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFYWNyZXMJAGgCCQBoAgUFYWNyZXMAFAkAZAIJAQ9nZXRMZXZlbEJ5QWNyZXMBBQVhY3JlcwAEARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIBBnByb2xvZwEBaQMDCQECIT0CCAUBaQxvcmlnaW5DYWxsZXIFDXJlc3QyQ29udHJhY3QJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBCmtleUJsb2NrZWQABwcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYXN0VHhJZEJ5VXNlcgEJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFA25pbAEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAIDYW10B2FkZHJlc3MECXdsZ1Jlc3VsdAkA/AcEBQt3bGdDb250cmFjdAISb25TdGFrZVVuc3Rha2VMYW5kCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsAwkAAAIFCXdsZ1Jlc3VsdAUJd2xnUmVzdWx0BANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAd0aW1lS2V5CQEYa2V5QWNyZXNTdGFrZWRUaW1lQnlVc2VyAQUHYWRkcmVzcwQJYW1vdW50S2V5CQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQdhZGRyZXNzBA5vbGRBY3Jlc0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlhbW91bnRLZXkAAAMDCQBmAgAABQNhbXQJAGYCAAAJAGQCBQ5vbGRBY3Jlc0Ftb3VudAUDYW10BwkAAgEJAKwCAgkArAICCQCsAgICDllvdSBoYXZlIG9ubHkgCQEKZml4ZWRQb2ludAIFDm9sZEFjcmVzQW1vdW50AAgCICBBQ1JFUyBzdGFrZWQsIHRyaWVkIHRvIHVuc3Rha2UgCQEKZml4ZWRQb2ludAIJAQEtAQUDYW10AAgEDm5ld0FjcmVzQW1vdW50CQBkAgUOb2xkQWNyZXNBbW91bnQFA2FtdAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSYWNyZXNTdGFrZFRvdGFsS2V5AAAECXVzZXJGcEtleQkBFWtleUZhcm1pbmdQb3dlckJ5VXNlcgEFB2FkZHJlc3MEBW9sZEZwCQELdmFsdWVPckVsc2UCCQCfCAEFCXVzZXJGcEtleQAABAVuZXdGcAkBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBQ5uZXdBY3Jlc0Ftb3VudAQKb2xkVG90YWxGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRR0b3RhbEZhcm1pbmdQb3dlcktleQAACQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlhbW91bnRLZXkFDm5ld0FjcmVzQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJhY3Jlc1N0YWtkVG90YWxLZXkJAGQCBQhvbGRUb3RhbAUDYW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQl1c2VyRnBLZXkFBW5ld0ZwCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRR0b3RhbEZhcm1pbmdQb3dlcktleQkAZAIJAGUCBQpvbGRUb3RhbEZwBQVvbGRGcAUFbmV3RnAFA25pbAUJd2xnUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRXbGdQcmljZQEVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAxpc3N1ZWRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQt3bGdDb250cmFjdAUPd2xnSXNzdWVkQW10S2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQEBndsZ1VzZAkA8AcCBQt3bGdDb250cmFjdAULdXNkdEFzc2V0SWQECWFjcmVzMlVzZAkAZQIJAPAHAgUOYWNyZXMyQ29udHJhY3QFC3VzZHRBc3NldElkBRV1c2R0QmFsYW5jZUNvcnJlY3Rpb24ED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgUSaW52ZXN0RnVuZENvbnRyYWN0BQt1c2R0QXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJpbnZlc3RGdW5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEDXRvdGFsRnVuZHNVc2QJAGQCCQBkAgUJYWNyZXMyVXNkBQZ3bGdVc2QFD2ludmVzdEZ1bmRUb3RhbAkAawMFDXRvdGFsRnVuZHNVc2QFBU1VTFQ4BQxpc3N1ZWRBbW91bnQAFGtleUxhc3RBY3Jlc1NlbGxUaW1lAhFsYXN0QWNyZXNTZWxsVGltZQAQa2V5TGFzdExpbWl0TGVmdAINbGFzdExpbWl0TGVmdAERZ2V0U3dhcExpbWl0QWNyZXMABAZ3bGdVc2QJAPAHAgULd2xnQ29udHJhY3QFC3VzZHRBc3NldElkBAlhY3JlczJVc2QJAPAHAgUEdGhpcwULdXNkdEFzc2V0SWQED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgUSaW52ZXN0RnVuZENvbnRyYWN0BQt1c2R0QXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJpbnZlc3RGdW5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEDGRlZmF1bHRMaW1pdAkAaQIJAGQCCQBkAgUJYWNyZXMyVXNkBQZ3bGdVc2QFD2ludmVzdEZ1bmRUb3RhbAUTT05FX1BFUkNFTlRfRElWSVNPUgQNbGFzdExpbWl0TGVmdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRBrZXlMYXN0TGltaXRMZWZ0BQxkZWZhdWx0TGltaXQECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFFGtleUxhc3RBY3Jlc1NlbGxUaW1lAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEDGN1cnJlbnRMaW1pdAkAZAIFDWxhc3RMaW1pdExlZnQJAGsDBQxkZWZhdWx0TGltaXQJAGUCBQNub3cFCGxhc3RUaW1lBQpEQVlfTUlMTElTBA1saW1pdExlZnRVc2R0CQCXAwEJAMwIAgUMY3VycmVudExpbWl0CQDMCAIFDGRlZmF1bHRMaW1pdAUDbmlsCQCUCgIJAQxJbnRlZ2VyRW50cnkCBRRrZXlMYXN0QWNyZXNTZWxsVGltZQUDbm93BQ1saW1pdExlZnRVc2R0DQFpAQpzYXZlTGFzdFR4AAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgULd2xnQ29udHJhY3QFA25pbAgFAWkGY2FsbGVyCQACAQINQWNjZXNzIGRlbmllZAkAlAoCCQEGcHJvbG9nAQUBaQAqAWkBDWNvbnN0cnVjdG9yVjECCXJlc3QyQWRkcg5vbGRBY3JDb250cmFjdAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA5vbGRBY3JDb250QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUOb2xkQWNyQ29udHJhY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFFGFjcmVzSXNzdWVkQW1vdW50S2V5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ5vbGRBY3JDb250QWRkcgUUYWNyZXNJc3N1ZWRBbW91bnRLZXkJAMwIAgkBC0JpbmFyeUVudHJ5AgUPYWNyZXNBc3NldElkS2V5CQERQGV4dHJOYXRpdmUoMTA1MikCBQ5vbGRBY3JDb250QWRkcgUPYWNyZXNBc3NldElkS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlSZXN0MkFkZHJlc3MABQlyZXN0MkFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUTb2xkQWNyZXNDb250cmFjdEtleQUOb2xkQWNyQ29udHJhY3QFA25pbAFpAQpzZXRCbG9ja2VkAQlpc0Jsb2NrZWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCmtleUJsb2NrZWQABQlpc0Jsb2NrZWQFA25pbAFpAQx1bnN0YWtlQWNyZXMBBmFtb3VudAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQBnAgAABQZhbW91bnQJAAIBAhlBbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBA5hcmJSZWxlYXNlVGltZQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgULd2xnQ29udHJhY3QJARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQUHYWRkcmVzcwAABQ5hcmJpdHJhZ2VEZWxheQMJAGYCBQ5hcmJSZWxlYXNlVGltZQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAAIBCQCsAgICLVlvdSB0cmFkZWQgc29tZSBXTEdPTEQsIGNhbm5vdCB1bnN0YWtlIHVudGlsIAkApAMBBQ5hcmJSZWxlYXNlVGltZQQLJHQwNDc1NjQ4MzMJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAgkBAS0BBQZhbW91bnQFB2FkZHJlc3MEB2FjdGlvbnMIBQskdDA0NzU2NDgzMwJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFCyR0MDQ3NTY0ODMzAl8yCQCUCgIJAM4IAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAUMYWNyZXNBc3NldElkBQ1wcm9sb2dBY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCnN0YWtlQWNyZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFDGFjcmVzQXNzZXRJZAkAAgECFEFDUkVTIHBheW1lbnRzIG9ubHkhBAskdDA1Mjg0NTM1NwkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwCBQNhbXQFB2FkZHJlc3MEB2FjdGlvbnMIBQskdDA1Mjg0NTM1NwJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFCyR0MDUyODQ1MzU3Al8yCQCUCgIJAM4IAgUHYWN0aW9ucwUNcHJvbG9nQWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAFpAQhidXlBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAECnVzZHRBbW91bnQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkAZgIFBU1VTFQ2BQp1c2R0QW1vdW50CQACAQkArAICCQCsAgICFk1pbiBwYXltZW50IHNob3VsZCBiZSAJAQpmaXhlZFBvaW50AgUFTVVMVDYABgIFIFVTRFQEC2FjcmVzQW1vdW50CQBoAgUKdXNkdEFtb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSBAl3bGdBbW91bnQJAGsDBQp1c2R0QW1vdW50BQVNVUxUOAkBC2dldFdsZ1ByaWNlAQUKdXNkdEFtb3VudAQPb2xkQWNyZXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRNvbGRBY3Jlc0NvbnRyYWN0S2V5BANyZXEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhRyZXF1ZXN0QWNyZXNDYWxsYmFjawkAzAgCBQthY3Jlc0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUDcmVxBQNyZXEECXdsZ1JlbWFpbgkBBWFzSW50AQkA/AcEBQt3bGdDb250cmFjdAIKYnVybldsZ29sZAkAzAgCBQl3bGdBbW91bnQFA25pbAUDbmlsCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2FjcmVzQW1vdW50BQxhY3Jlc0Fzc2V0SWQFA25pbAUNcHJvbG9nQWN0aW9ucwUJd2xnUmVtYWluCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGJ1eUFjcmVzUkVBRE9OTFkBCnVzZHRBbW91bnQEC2FjcmVzQW1vdW50CQBoAgUKdXNkdEFtb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSBAl3bGdUb0J1cm4JAGsDBQp1c2R0QW1vdW50BQVNVUxUOAkBC2dldFdsZ1ByaWNlAQUKdXNkdEFtb3VudAkAlAoCBQNuaWwJAMwIAgULYWNyZXNBbW91bnQJAMwIAgUFTVVMVDYJAMwIAgULYWNyZXNBbW91bnQJAMwIAgUJd2xnVG9CdXJuBQNuaWwBaQEJc2VsbEFjcmVzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQLYWNyZXNBbW91bnQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUMYWNyZXNBc3NldElkCQACAQIUQUNSRVMgcGF5bWVudHMgb25seSEDCQBmAgUFTVVMVDcFC2FjcmVzQW1vdW50CQACAQkArAICCQCsAgICFk1pbiBwYXltZW50IHNob3VsZCBiZSAJAQpmaXhlZFBvaW50AgUFTVVMVDcACAIGIEFDUkVTBARhZGRyCQClCAEIBQFpBmNhbGxlcgQLJHQwNzIxNDcyNjIJARFnZXRTd2FwTGltaXRBY3JlcwAEC2xpbWl0QWN0aW9uCAULJHQwNzIxNDcyNjICXzEEB21heFVzZHQIBQskdDA3MjE0NzI2MgJfMgQIbWF4QWNyZXMJAGgCBQdtYXhVc2R0BRVVU0RUMkFDUkVTX01VTFRJUExJRVIDCQBmAgULYWNyZXNBbW91bnQFCG1heEFjcmVzCQACAQkArAICCQCsAgICEVlvdSBjYW4gc2VsbCBtYXggCQEKZml4ZWRQb2ludAIFCG1heEFjcmVzAAgCBiBBQ1JFUwQKdXNkdEFtb3VudAkAaQIJAGkCBQthY3Jlc0Ftb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAAIJAJQKAgkAzggCCQDMCAIFC2xpbWl0QWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlMYXN0TGltaXRMZWZ0CQBlAgUHbWF4VXNkdAUKdXNkdEFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCnVzZHRBbW91bnQFC3VzZHRBc3NldElkBQNuaWwFDXByb2xvZ0FjdGlvbnMFCnVzZHRBbW91bnQBaQERc2VsbEFjcmVzUkVBRE9OTFkCB2FkZHJlc3MLYWNyZXNBbW91bnQECyR0MDc3NTg3ODA2CQERZ2V0U3dhcExpbWl0QWNyZXMABAtsaW1pdEFjdGlvbggFCyR0MDc3NTg3ODA2Al8xBAdtYXhVc2R0CAULJHQwNzc1ODc4MDYCXzIECnVzZHRBbW91bnQJAGkCCQBpAgULYWNyZXNBbW91bnQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgACCQCUCgIFA25pbAkAzAgCBQp1c2R0QW1vdW50CQDMCAIFBU1VTFQ3CQDMCAIJAGgCBQdtYXhVc2R0BRVVU0RUMkFDUkVTX01VTFRJUExJRVIJAMwIAgAABQNuaWwBaQEQY29udmVydE9sZFN0YWtlcwADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhRUZW1wb3JhcmlseSBkaXNhYmxlZAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQPb2xkQWNyZXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRNvbGRBY3Jlc0NvbnRyYWN0S2V5BAZhbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPb2xkQWNyZXNBZGRyZXNzCQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQdhZGRyZXNzAAAECWdvdEFjcmVzMAMJAGYCBQZhbW91bnQAAAkBDGFzVHVwbGUySW50cwEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhR1bnN0YWtlQWNyZXNDYWxsYmFjawkAzAgCBQZhbW91bnQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJQKAgAAAAAEEW9sZFN0YWtp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aXplQ2FsbGJhY2sJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUIZmluYWxpemUFCGZpbmFsaXplBANyZXEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhRyZXF1ZXN0QWNyZXNDYWxsYmFjawkAzAgCCQBkAgkAZAIJAGQCCAUCcnICXzEIBQJycgJfMggFAnJyAl8zCAUCcnICXzQFA25pbAUDbmlsAwkAAAIFA3JlcQUDcmVxBAVpc3N1ZQkAwggFAghGUE9XRVIxMAIpRmFybWluZ1Bvd2VyICsxMCUgTkZUIGZvciBXYXZlc0xhbmRzIGdhbWUAAQAABwkAlwoFCAUCcnICXzEIBQJycgJfMggFAnJyAl8zCAUCcnICXzQJAMwIAgUFaXNzdWUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEJALgIAQUFaXNzdWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlwoFAAAAAAAAAAAFA25pbAQLZHVja0Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgURb2xkU3Rha2luZ0FkZHJlc3MJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MCAAQKZHVja1Jlc3VsdAMJAQIhPQIFC2R1Y2tBc3NldElkAgAJAQxhc1R1cGxlM0ludHMBCQD8BwQFEW9sZFN0YWtpbmdBZGRyZXNzAhN1bnN0YWtlRHVja0NhbGxiYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsCQCVCgMAAAAAAAAEAXgJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAgkAZAIJAGQCCQBkAgkAZAIJAGQCCQBkAgkAZAIIBQlnb3RBY3JlczACXzEIBQtsYW5kc1Jlc3VsdAJfMQgFC2xhbmRzUmVzdWx0Al8yCAULbGFuZHNSZXN1bHQCXzMIBQtsYW5kc1Jlc3VsdAJfNAgFCmR1Y2tSZXN1bHQCXzEIBQpkdWNrUmVzdWx0Al8yCAUKZHVja1Jlc3VsdAJfMwUHYWRkcmVzcwkAlAoCCQDO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WwBcAF0AXgBfAGAAYQBiAGMAZAkAlgoEAAAAAAAAAAAJAJQKAgUDbmlsBQtsYW5kc1Jlc3VsdAFpARJzdGFrZUFjcmVzQ2FsbGJhY2sBBGFkZHIDCQECIT0CCAUBaQZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFW9sZFN0YWtpbmdDb250cmFjdFN0cgkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQRhZGRyAWkBGnNpbXVsYXRlU3Rha2VBY3Jlc1JFQURPTkxZAgdhZGRyZXNzC2FkZGVkQW1vdW50BAlhbW91bnRLZXkJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFB2FkZHJlc3MEDm5ld0FjcmVzQW1vdW50CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlhbW91bnRLZXkAAAULYWRkZWRBbW91bnQECG9sZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFEmFjcmVzU3Rha2RUb3RhbEtleQAABAl1c2VyRnBLZXkJARVrZXlGYXJtaW5nUG93ZXJCeVVzZXIBBQdhZGRyZXNzBAVvbGRGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQl1c2VyRnBLZXkAAAQFbmV3RnAJARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQUObmV3QWNyZXNBbW91bnQECm9sZFRvdGFsRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUdG90YWxGYXJtaW5nUG93ZXJLZXkAAAQKbmV3VG90YWxGcAkAZAIJAGUCBQpvbGRUb3RhbEZwBQVvbGRGcAUFbmV3RnAJAJQKAgUDbmlsCQDMCAIFBW9sZEZwCQDMCAIFBW5ld0ZwCQDMCAIFCm9sZFRvdGFsRnAJAMwIAgUKbmV3VG90YWxGcAUDbmlsAA5DGwY=", "height": 3375628, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2xcrEprGkH6o3eoKGURZMJMmLxiW8yKd3rG3CRWyvBe8 Next: b9pot6JkR7Qxo98BvwKAy32KiVhCG3eC6i34CPByJuF Diff:
OldNewDifferences
3232 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
3333 else if ((base58'2T' == $match0))
3434 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
35+ else throw("Unknown chain")
36+}
37+
38+let arbitrageDelay = match chain {
39+ case _ =>
40+ if ((base58'2W' == $match0))
41+ then DAY_MILLIS
42+ else if ((base58'2T' == $match0))
43+ then 60000
3544 else throw("Unknown chain")
3645 }
3746
188197 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
189198
190199
200+func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
201+
202+
191203 func prolog (i) = if (if ((i.originCaller != rest2Contract))
192204 then valueOrElse(getBoolean(keyBlocked()), false)
193205 else false)
235247
236248 let keyLastLimitLeft = "lastLimitLeft"
237249
238-let keyLastSavedTVL = "lastSavedTVL"
239-
240250 func getSwapLimitAcres () = {
241251 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
242252 let acres2Usd = assetBalance(this, usdtAssetId)
243253 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
244- let currTVL = ((acres2Usd + wlgUsd) + investFundTotal)
245- let defaultLimit = (currTVL / ONE_PERCENT_DIVISOR)
254+ let defaultLimit = (((acres2Usd + wlgUsd) + investFundTotal) / ONE_PERCENT_DIVISOR)
246255 let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
247- let lastSavedTVL = valueOrElse(getInteger(keyLastSavedTVL), currTVL)
248256 let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
249257 let now = lastBlock.timestamp
250- let currentLimit = (lastLimitLeft + fraction(lastSavedTVL, (now - lastTime), (DAY_MILLIS * ONE_PERCENT_DIVISOR)))
258+ let currentLimit = (lastLimitLeft + fraction(defaultLimit, (now - lastTime), DAY_MILLIS))
251259 let limitLeftUsdt = min([currentLimit, defaultLimit])
252- $Tuple2([IntegerEntry(keyLastSavedTVL, currTVL), IntegerEntry(keyLastAcresSellTime, now)], limitLeftUsdt)
260+ $Tuple2(IntegerEntry(keyLastAcresSellTime, now), limitLeftUsdt)
253261 }
254262
255263
287295 if ((size(i.payments) != 0))
288296 then throw("No payments required")
289297 else {
290- let $t047464823 = stakeUnstakeAcresInternal(-(amount), address)
291- let actions = $t047464823._1
292- let wlgClaimedAmount = $t047464823._2
293- $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
298+ let arbReleaseTime = (valueOrElse(getInteger(wlgContract, keyLastWlgTradeTimeByUser(address)), 0) + arbitrageDelay)
299+ if ((arbReleaseTime > lastBlock.timestamp))
300+ then throw(("You traded some WLGOLD, cannot unstake until " + toString(arbReleaseTime)))
301+ else {
302+ let $t047564833 = stakeUnstakeAcresInternal(-(amount), address)
303+ let actions = $t047564833._1
304+ let wlgClaimedAmount = $t047564833._2
305+ $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
306+ }
294307 }
295308 }
296309 }
311324 else (value(pmt.assetId) != acresAssetId))
312325 then throw("ACRES payments only!")
313326 else {
314- let $t052745347 = stakeUnstakeAcresInternal(amt, address)
315- let actions = $t052745347._1
316- let wlgClaimedAmount = $t052745347._2
327+ let $t052845357 = stakeUnstakeAcresInternal(amt, address)
328+ let actions = $t052845357._1
329+ let wlgClaimedAmount = $t052845357._2
317330 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
318331 }
319332 }
377390 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
378391 else {
379392 let addr = toString(i.caller)
380- let $t072047253 = getSwapLimitAcres()
381- let limitActions = $t072047253._1
382- let maxUsdt = $t072047253._2
393+ let $t072147262 = getSwapLimitAcres()
394+ let limitAction = $t072147262._1
395+ let maxUsdt = $t072147262._2
383396 let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
384397 if ((acresAmount > maxAcres))
385398 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
386399 else {
387400 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
388- $Tuple2((((limitActions :+ IntegerEntry(keyLastLimitLeft, (maxUsdt - usdtAmount))) :+ ScriptTransfer(i.caller, usdtAmount, usdtAssetId)) ++ prologActions), usdtAmount)
401+ $Tuple2(([limitAction, IntegerEntry(keyLastLimitLeft, (maxUsdt - usdtAmount)), ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
389402 }
390403 }
391404 }
395408
396409 @Callable(i)
397410 func sellAcresREADONLY (address,acresAmount) = {
398- let $t077447793 = getSwapLimitAcres()
399- let limitActions = $t077447793._1
400- let maxUsdt = $t077447793._2
411+ let $t077587806 = getSwapLimitAcres()
412+ let limitAction = $t077587806._1
413+ let maxUsdt = $t077587806._2
401414 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
402415 $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
403416 }
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"
35+ else throw("Unknown chain")
36+}
37+
38+let arbitrageDelay = match chain {
39+ case _ =>
40+ if ((base58'2W' == $match0))
41+ then DAY_MILLIS
42+ else if ((base58'2T' == $match0))
43+ then 60000
3544 else throw("Unknown chain")
3645 }
3746
3847 let oldStakingContractStr = match chain {
3948 case _ =>
4049 if ((base58'2W' == $match0))
4150 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
4251 else if ((base58'2T' == $match0))
4352 then "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm"
4453 else throw("Unknown chain")
4554 }
4655
4756 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
4857
4958
5059 let IdxCfgAcres2Dapp = 1
5160
5261 let IdxCfgWlgDapp = 2
5362
5463 let IdxCfgInvestFundDapp = 5
5564
5665 func keyRestCfg () = "%s__restConfig"
5766
5867
5968 func keyRest2Address () = "%s__rest2Addr"
6069
6170
6271 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
6372
6473
6574 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
6675
6776
6877 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
6978
7079 let rest2Cfg = readRestCfgOrFail(rest2Contract)
7180
7281 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
7382
7483 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
7584
7685 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
7786
7887 let oldAcresContractKey = "oldAcresContract"
7988
8089 func keyBlocked () = "contractsBlocked"
8190
8291
8392 func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
8493
8594
8695 let acresIssuedAmountKey = "acresIssuedAmount"
8796
8897 let acresAssetIdKey = "acresAssetId"
8998
9099 let acresAssetId = valueOrErrorMessage(getBinary(acres2Contract, acresAssetIdKey), "ACRES is not issued yet")
91100
92101 func keyAcresStakedTimeByUser (addr) = ("acresStakedTimeByUser_" + addr)
93102
94103
95104 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
96105
97106
98107 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
99108
100109
101110 func asInt (v) = match v {
102111 case n: Int =>
103112 n
104113 case _ =>
105114 throw("fail to cast into Int")
106115 }
107116
108117
109118 func asTuple5Ints (val) = match val {
110119 case t: (Int, Int, Int, Int, Int) =>
111120 t
112121 case _ =>
113122 throw("fail to cast into (Int, Int, Int, Int, Int)")
114123 }
115124
116125
117126 func asTuple4Ints (val) = match val {
118127 case t: (Int, Int, Int, Int) =>
119128 t
120129 case _ =>
121130 throw("fail to cast into (Int, Int, Int, Int)")
122131 }
123132
124133
125134 func asTuple3Ints (val) = match val {
126135 case t: (Int, Int, Int) =>
127136 t
128137 case _ =>
129138 throw("fail to cast into (Int, Int, Int)")
130139 }
131140
132141
133142 func asTuple2Ints (val) = match val {
134143 case t: (Int, Int) =>
135144 t
136145 case _ =>
137146 throw("fail to cast into (Int, Int)")
138147 }
139148
140149
141150 func fixedPoint (val,decimals) = {
142151 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
143152 let lowPart = toString((val % tenPow))
144153 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
145154 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
146155 }
147156
148157
149158 let M8_ = 100000000
150159
151160 let wlgIssuedAmtKey = "wlg_issuedAmount"
152161
153162 let zbIssuedAmtKey = "zbill_issuedAmount"
154163
155164 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
156165
157166
158167 func keyFarmingPowerByUser (addr) = ("farmingPowerByUser_" + addr)
159168
160169
161170 let acresStakdTotalKey = "acresStakedAmountTotal"
162171
163172 let totalFarmingPowerKey = "totalFarmingPower"
164173
165174 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
166175
167176 func getLevelByAcres (acres) = {
168177 let acr = ((acres + 99999999) / M8_)
169178 func checker (acc,item) = if ((item >= acr))
170179 then acc
171180 else (acc + 1)
172181
173182 let $l = levelAcres
174183 let $s = size($l)
175184 let $acc0 = 0
176185 func $f0_1 ($a,$i) = if (($i >= $s))
177186 then $a
178187 else checker($a, $l[$i])
179188
180189 func $f0_2 ($a,$i) = if (($i >= $s))
181190 then $a
182191 else throw("List size exceeds 10")
183192
184193 $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)
185194 }
186195
187196
188197 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
189198
190199
200+func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
201+
202+
191203 func prolog (i) = if (if ((i.originCaller != rest2Contract))
192204 then valueOrElse(getBoolean(keyBlocked()), false)
193205 else false)
194206 then throw("Contracts are under maintenance")
195207 else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
196208
197209
198210 func stakeUnstakeAcresInternal (amt,address) = {
199211 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
200212 if ((wlgResult == wlgResult))
201213 then {
202214 let now = lastBlock.timestamp
203215 let timeKey = keyAcresStakedTimeByUser(address)
204216 let amountKey = keyAcresStakedAmtByUser(address)
205217 let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
206218 if (if ((0 > amt))
207219 then (0 > (oldAcresAmount + amt))
208220 else false)
209221 then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(-(amt), 8)))
210222 else {
211223 let newAcresAmount = (oldAcresAmount + amt)
212224 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
213225 let userFpKey = keyFarmingPowerByUser(address)
214226 let oldFp = valueOrElse(getInteger(userFpKey), 0)
215227 let newFp = getFarmingPowerByAcres(newAcresAmount)
216228 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
217229 $Tuple2([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt)), IntegerEntry(userFpKey, newFp), IntegerEntry(totalFarmingPowerKey, ((oldTotalFp - oldFp) + newFp))], wlgResult)
218230 }
219231 }
220232 else throw("Strict value is not equal to itself.")
221233 }
222234
223235
224236 func getWlgPrice (usdtBalanceCorrection) = {
225237 let issuedAmount = valueOrErrorMessage(getInteger(wlgContract, wlgIssuedAmtKey), "WLGOLD is not issued yet")
226238 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
227239 let acres2Usd = (assetBalance(acres2Contract, usdtAssetId) - usdtBalanceCorrection)
228240 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
229241 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
230242 fraction(totalFundsUsd, MULT8, issuedAmount)
231243 }
232244
233245
234246 let keyLastAcresSellTime = "lastAcresSellTime"
235247
236248 let keyLastLimitLeft = "lastLimitLeft"
237249
238-let keyLastSavedTVL = "lastSavedTVL"
239-
240250 func getSwapLimitAcres () = {
241251 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
242252 let acres2Usd = assetBalance(this, usdtAssetId)
243253 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
244- let currTVL = ((acres2Usd + wlgUsd) + investFundTotal)
245- let defaultLimit = (currTVL / ONE_PERCENT_DIVISOR)
254+ let defaultLimit = (((acres2Usd + wlgUsd) + investFundTotal) / ONE_PERCENT_DIVISOR)
246255 let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
247- let lastSavedTVL = valueOrElse(getInteger(keyLastSavedTVL), currTVL)
248256 let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
249257 let now = lastBlock.timestamp
250- let currentLimit = (lastLimitLeft + fraction(lastSavedTVL, (now - lastTime), (DAY_MILLIS * ONE_PERCENT_DIVISOR)))
258+ let currentLimit = (lastLimitLeft + fraction(defaultLimit, (now - lastTime), DAY_MILLIS))
251259 let limitLeftUsdt = min([currentLimit, defaultLimit])
252- $Tuple2([IntegerEntry(keyLastSavedTVL, currTVL), IntegerEntry(keyLastAcresSellTime, now)], limitLeftUsdt)
260+ $Tuple2(IntegerEntry(keyLastAcresSellTime, now), limitLeftUsdt)
253261 }
254262
255263
256264 @Callable(i)
257265 func saveLastTx () = if (!(containsElement([wlgContract], i.caller)))
258266 then throw("Access denied")
259267 else $Tuple2(prolog(i), 42)
260268
261269
262270
263271 @Callable(i)
264272 func constructorV1 (rest2Addr,oldAcrContract) = if ((i.caller != this))
265273 then throw("Permission denied")
266274 else {
267275 let oldAcrContAddr = addressFromStringValue(oldAcrContract)
268276 [IntegerEntry(acresIssuedAmountKey, getIntegerValue(oldAcrContAddr, acresIssuedAmountKey)), BinaryEntry(acresAssetIdKey, getBinaryValue(oldAcrContAddr, acresAssetIdKey)), StringEntry(keyRest2Address(), rest2Addr), StringEntry(oldAcresContractKey, oldAcrContract)]
269277 }
270278
271279
272280
273281 @Callable(i)
274282 func setBlocked (isBlocked) = if ((i.caller != this))
275283 then throw("permission denied")
276284 else [BooleanEntry(keyBlocked(), isBlocked)]
277285
278286
279287
280288 @Callable(i)
281289 func unstakeAcres (amount) = {
282290 let prologActions = prolog(i)
283291 if ((0 >= amount))
284292 then throw("Amount should be positive")
285293 else {
286294 let address = toString(i.caller)
287295 if ((size(i.payments) != 0))
288296 then throw("No payments required")
289297 else {
290- let $t047464823 = stakeUnstakeAcresInternal(-(amount), address)
291- let actions = $t047464823._1
292- let wlgClaimedAmount = $t047464823._2
293- $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
298+ let arbReleaseTime = (valueOrElse(getInteger(wlgContract, keyLastWlgTradeTimeByUser(address)), 0) + arbitrageDelay)
299+ if ((arbReleaseTime > lastBlock.timestamp))
300+ then throw(("You traded some WLGOLD, cannot unstake until " + toString(arbReleaseTime)))
301+ else {
302+ let $t047564833 = stakeUnstakeAcresInternal(-(amount), address)
303+ let actions = $t047564833._1
304+ let wlgClaimedAmount = $t047564833._2
305+ $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
306+ }
294307 }
295308 }
296309 }
297310
298311
299312
300313 @Callable(i)
301314 func stakeAcres () = {
302315 let prologActions = prolog(i)
303316 let address = toString(i.caller)
304317 if ((size(i.payments) != 1))
305318 then throw("exactly 1 payment must be attached")
306319 else {
307320 let pmt = i.payments[0]
308321 let amt = pmt.amount
309322 if (if (!(isDefined(pmt.assetId)))
310323 then true
311324 else (value(pmt.assetId) != acresAssetId))
312325 then throw("ACRES payments only!")
313326 else {
314- let $t052745347 = stakeUnstakeAcresInternal(amt, address)
315- let actions = $t052745347._1
316- let wlgClaimedAmount = $t052745347._2
327+ let $t052845357 = stakeUnstakeAcresInternal(amt, address)
328+ let actions = $t052845357._1
329+ let wlgClaimedAmount = $t052845357._2
317330 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
318331 }
319332 }
320333 }
321334
322335
323336
324337 @Callable(i)
325338 func buyAcres () = {
326339 let prologActions = prolog(i)
327340 if ((size(i.payments) != 1))
328341 then throw("exactly 1 payment must be attached")
329342 else {
330343 let pmt = i.payments[0]
331344 let usdtAmount = pmt.amount
332345 if (if (!(isDefined(pmt.assetId)))
333346 then true
334347 else (value(pmt.assetId) != usdtAssetId))
335348 then throw("USDT payments only!")
336349 else if ((MULT6 > usdtAmount))
337350 then throw((("Min payment should be " + fixedPoint(MULT6, 6)) + " USDT"))
338351 else {
339352 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
340353 let wlgAmount = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
341354 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
342355 let req = invoke(oldAcresAddress, "requestAcresCallback", [acresAmount], nil)
343356 if ((req == req))
344357 then {
345358 let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [wlgAmount], nil))
346359 $Tuple2(([ScriptTransfer(i.caller, acresAmount, acresAssetId)] ++ prologActions), wlgRemain)
347360 }
348361 else throw("Strict value is not equal to itself.")
349362 }
350363 }
351364 }
352365
353366
354367
355368 @Callable(i)
356369 func buyAcresREADONLY (usdtAmount) = {
357370 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
358371 let wlgToBurn = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
359372 $Tuple2(nil, [acresAmount, MULT6, acresAmount, wlgToBurn])
360373 }
361374
362375
363376
364377 @Callable(i)
365378 func sellAcres () = {
366379 let prologActions = prolog(i)
367380 if ((size(i.payments) != 1))
368381 then throw("exactly 1 payment must be attached")
369382 else {
370383 let pmt = i.payments[0]
371384 let acresAmount = pmt.amount
372385 if (if (!(isDefined(pmt.assetId)))
373386 then true
374387 else (value(pmt.assetId) != acresAssetId))
375388 then throw("ACRES payments only!")
376389 else if ((MULT7 > acresAmount))
377390 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
378391 else {
379392 let addr = toString(i.caller)
380- let $t072047253 = getSwapLimitAcres()
381- let limitActions = $t072047253._1
382- let maxUsdt = $t072047253._2
393+ let $t072147262 = getSwapLimitAcres()
394+ let limitAction = $t072147262._1
395+ let maxUsdt = $t072147262._2
383396 let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
384397 if ((acresAmount > maxAcres))
385398 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
386399 else {
387400 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
388- $Tuple2((((limitActions :+ IntegerEntry(keyLastLimitLeft, (maxUsdt - usdtAmount))) :+ ScriptTransfer(i.caller, usdtAmount, usdtAssetId)) ++ prologActions), usdtAmount)
401+ $Tuple2(([limitAction, IntegerEntry(keyLastLimitLeft, (maxUsdt - usdtAmount)), ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
389402 }
390403 }
391404 }
392405 }
393406
394407
395408
396409 @Callable(i)
397410 func sellAcresREADONLY (address,acresAmount) = {
398- let $t077447793 = getSwapLimitAcres()
399- let limitActions = $t077447793._1
400- let maxUsdt = $t077447793._2
411+ let $t077587806 = getSwapLimitAcres()
412+ let limitAction = $t077587806._1
413+ let maxUsdt = $t077587806._2
401414 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
402415 $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
403416 }
404417
405418
406419
407420 @Callable(i)
408421 func convertOldStakes () = if ((i.caller != this))
409422 then throw("Temporarily disabled")
410423 else {
411424 let address = toString(i.caller)
412425 if ((size(i.payments) != 0))
413426 then throw("No payments required")
414427 else {
415428 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
416429 let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
417430 let gotAcres0 = if ((amount > 0))
418431 then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
419432 else $Tuple2(0, 0)
420433 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
421434 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
422435 let landsResult = if (isDefined(landsStr))
423436 then {
424437 let lands = split_51C(value(landsStr), "_")
425438 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
426439 then throw("landAssetId is required")
427440 else {
428441 let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
429442 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
430443 }
431444
432445 let rr = {
433446 let $l = lands
434447 let $s = size($l)
435448 let $acc0 = $Tuple4(0, 0, 0, 0)
436449 func $f0_1 ($a,$i) = if (($i >= $s))
437450 then $a
438451 else oneLand($a, $l[$i])
439452
440453 func $f0_2 ($a,$i) = if (($i >= $s))
441454 then $a
442455 else throw("List size exceeds 100")
443456
444457 $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)
445458 }
446459 let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
447460 if ((finalize == finalize))
448461 then {
449462 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
450463 if ((req == req))
451464 then {
452465 let issue = Issue("FPOWER10", "FarmingPower +10% NFT for WavesLands game", 1, 0, false)
453466 $Tuple5(rr._1, rr._2, rr._3, rr._4, [issue, ScriptTransfer(i.caller, 1, calculateAssetId(issue))])
454467 }
455468 else throw("Strict value is not equal to itself.")
456469 }
457470 else throw("Strict value is not equal to itself.")
458471 }
459472 else $Tuple5(0, 0, 0, 0, nil)
460473 let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
461474 let duckResult = if ((duckAssetId != ""))
462475 then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
463476 else $Tuple3(0, 0, 0)
464477 let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
465478 $Tuple2((landsResult._5 ++ x._1), x._2)
466479 }
467480 }
468481
469482
470483
471484 @Callable(i)
472485 func unstakeLandsREADONLY (address) = {
473486 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
474487 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
475488 let landsResult = if (isDefined(landsStr))
476489 then {
477490 let lands = split_51C(value(landsStr), "_")
478491 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
479492 then throw("landAssetId is required")
480493 else {
481494 let r = asTuple4Ints(invoke(oldStakingAddress, "unstakeLandREADONLY", [landAssetId, address], nil))
482495 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
483496 }
484497
485498 let $l = lands
486499 let $s = size($l)
487500 let $acc0 = $Tuple4(0, 0, 0, 0)
488501 func $f0_1 ($a,$i) = if (($i >= $s))
489502 then $a
490503 else oneLand($a, $l[$i])
491504
492505 func $f0_2 ($a,$i) = if (($i >= $s))
493506 then $a
494507 else throw("List size exceeds 100")
495508
496509 $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)
497510 }
498511 else $Tuple4(0, 0, 0, 0)
499512 $Tuple2(nil, landsResult)
500513 }
501514
502515
503516
504517 @Callable(i)
505518 func stakeAcresCallback (addr) = if ((i.caller != addressFromStringValue(oldStakingContractStr)))
506519 then throw("Permission denied")
507520 else stakeUnstakeAcresInternal(i.payments[0].amount, addr)
508521
509522
510523
511524 @Callable(i)
512525 func simulateStakeAcresREADONLY (address,addedAmount) = {
513526 let amountKey = keyAcresStakedAmtByUser(address)
514527 let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + addedAmount)
515528 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
516529 let userFpKey = keyFarmingPowerByUser(address)
517530 let oldFp = valueOrElse(getInteger(userFpKey), 0)
518531 let newFp = getFarmingPowerByAcres(newAcresAmount)
519532 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
520533 let newTotalFp = ((oldTotalFp - oldFp) + newFp)
521534 $Tuple2(nil, [oldFp, newFp, oldTotalFp, newTotalFp])
522535 }
523536
524537

github/deemru/w8io/026f985 
74.61 ms