tx · 2xcrEprGkH6o3eoKGURZMJMmLxiW8yKd3rG3CRWyvBe8

3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh:  -0.01600000 Waves

2024.11.12 23:55 [3368710] smart account 3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh > SELF 0.00000000 Waves

{ "type": 13, "id": "2xcrEprGkH6o3eoKGURZMJMmLxiW8yKd3rG3CRWyvBe8", "fee": 1600000, "feeAssetId": null, "timestamp": 1731445013107, "version": 2, "chainId": 84, "sender": "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh", "senderPublicKey": "3QtfC1XbLZXdeawMDeSERy9vvjUmj1XYd2GFmrvx7pWQ", "proofs": [ "Vt61CdfrcAsSAxA2k2GoMbEbmepv5CADcjjP7Qu6Jc4wG3sucUsWgszVga94J5kSgmVa9xqoEY3o6746iym96CG" ], "script": "base64:BgI3CAISABIECgIICBIDCgEEEgMKAQESABIAEgMKAQESABIECgIIARIAEgMKAQgSAwoBCBIECgIIATgAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDcAgK3iBAAFTVVMVDgAgMLXLwAKREFZX01JTExJUwCAuJkpABVVU0RUMkFDUkVTX01VTFRJUExJRVIACgATT05FX1BFUkNFTlRfRElWSVNPUgBkAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BGd1l0YThiaUV6MzF6cGVGZTVESks4d0U1dHJTcFFWRjgDCQAAAgEBVAUHJG1hdGNoMAIjM043VXVZYXI2MjY0UDU4RkJoVldLUFFBaDRZdWEyaGduZ3YJAAIBAg1Vbmtub3duIGNoYWluABVvbGRTdGFraW5nQ29udHJhY3RTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQTG5jWHRTMVU4M0Q2Y1FiRkQzSDhyQkhQTGd6eFNGS1oxAwkAAAIBAVQFByRtYXRjaDACIzNOREN5Qkc1cTg1SnVhUmlpZ1VlRXRhaW55akNRVDNYcFptCQACAQINVW5rbm93biBjaGFpbgEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEElkeENmZ0FjcmVzMkRhcHAAAQANSWR4Q2ZnV2xnRGFwcAACABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAFAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBD2tleVJlc3QyQWRkcmVzcwACDSVzX19yZXN0MkFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAghyZXN0MkNmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCHJlc3QyQ2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAIcmVzdDJDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDXJlc3QyQ29udHJhY3QADmFjcmVzMkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFEElkeENmZ0FjcmVzMkRhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFDUlkeENmZ1dsZ0RhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBRRJZHhDZmdJbnZlc3RGdW5kRGFwcAATb2xkQWNyZXNDb250cmFjdEtleQIQb2xkQWNyZXNDb250cmFjdAEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBEWtleUxhc3RUeElkQnlVc2VyAQRhZGRyCQCsAgICD2xhc3RUeElkQnlVc2VyXwUEYWRkcgAUYWNyZXNJc3N1ZWRBbW91bnRLZXkCEWFjcmVzSXNzdWVkQW1vdW50AA9hY3Jlc0Fzc2V0SWRLZXkCDGFjcmVzQXNzZXRJZAAMYWNyZXNBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgUOYWNy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BQAGAAcACAAJAAoBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBWFjcmVzCQBoAgkAaAIFBWFjcmVzABQJAGQCCQEPZ2V0TGV2ZWxCeUFjcmVzAQUFYWNyZXMABAEGcHJvbG9nAQFpAwMJAQIhPQIIBQFpDG9yaWdpbkNhbGxlcgUNcmVzdDJDb250cmFjdAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEKa2V5QmxvY2tlZAAHBwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhc3RUeElkQnlVc2VyAQkApQgBCAUBaQxvcmlnaW5DYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAgNhbXQHYWRkcmVzcwQJd2xnUmVzdWx0CQD8BwQFC3dsZ0NvbnRyYWN0AhJvblN0YWtlVW5zdGFrZUxhbmQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUJd2xnUmVzdWx0BQl3bGdSZXN1bHQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEB3RpbWVLZXkJARhrZXlBY3Jlc1N0YWtlZFRpbWVCeVVzZXIBBQdhZGRyZXNzBAlhbW91bnRLZXkJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFB2FkZHJlc3MEDm9sZEFjcmVzQW1vdW50CQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAAAwMJAGYCAAAFA2FtdAkAZgIAAAkAZAIFDm9sZEFjcmVzQW1vdW50BQNhbXQHCQACAQkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAQpmaXhlZFBvaW50AgUOb2xkQWNyZXNBbW91bnQACAIgIEFDUkVTIHN0YWtlZCwgdHJpZWQgdG8gdW5zdGFrZSAJAQpmaXhlZFBvaW50AgkBAS0BBQNhbXQACAQObmV3QWNyZXNBbW91bnQJAGQCBQ5vbGRBY3Jlc0Ftb3VudAUDYW10BAhvbGRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJhY3Jlc1N0YWtkVG90YWxLZXkAAAQJdXNlckZwS2V5CQEVa2V5RmFybWluZ1Bvd2VyQnlVc2VyAQUHYWRkcmVzcwQFb2xkRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJdXNlckZwS2V5AAAEBW5ld0ZwCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFDm5ld0FjcmVzQW1vdW50BApvbGRUb3RhbEZwCQELdmFsdWVPckVsc2UCCQCfCAEFFHRvdGFsRmFybWluZ1Bvd2VyS2V5AAAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIFCWFtb3VudEtleQUObmV3QWNyZXNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEmFjcmVzU3Rha2RUb3RhbEtleQkAZAIFCG9sZFRvdGFsBQNhbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFCXVzZXJGcEtleQUFbmV3RnAJAMwIAgkBDEludGVnZXJFbnRyeQIFFHRvdGFsRmFybWluZ1Bvd2VyS2V5CQBkAgkAZQIFCm9sZFRvdGFsRnAFBW9sZEZwBQVuZXdGcAUDbmlsBQl3bGdSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BC2dldFdsZ1ByaWNlARV1c2R0QmFsYW5jZUNvcnJlY3Rpb24EDGlzc3VlZEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFC3dsZ0NvbnRyYWN0BQ93bGdJc3N1ZWRBbXRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQGd2xnVXNkCQDwBwIFC3dsZ0NvbnRyYWN0BQt1c2R0QXNzZXRJZAQJYWNyZXMyVXNkCQBlAgkA8AcCBQ5hY3JlczJDb250cmFjdAULdXNkdEFzc2V0SWQFFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRJpbnZlc3RGdW5kQ29udHJhY3QFC3VzZHRBc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFEmludmVzdEZ1bmRDb250cmFjdAUOemJJc3N1ZWRBbXRLZXkAAAQNdG90YWxGdW5kc1VzZAkAZAIJAGQCBQlhY3JlczJVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsCQBrAwUNdG90YWxGdW5kc1VzZAUFTVVMVDgFDGlzc3VlZEFtb3VudAAUa2V5TGFzdEFjcmVzU2VsbFRpbWUCEWxhc3RBY3Jlc1NlbGxUaW1lABBrZXlMYXN0TGltaXRMZWZ0Ag1sYXN0TGltaXRMZWZ0AA9rZXlMYXN0U2F2ZWRUVkwCDGxhc3RTYXZlZFRWTAERZ2V0U3dhcExpbWl0QWNyZXMABAZ3bGdVc2QJAPAHAgULd2xnQ29udHJhY3QFC3VzZHRBc3NldElkBAlhY3JlczJVc2QJAPAHAgUEdGhpcwULdXNkdEFzc2V0SWQED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgUSaW52ZXN0RnVuZENvbnRyYWN0BQt1c2R0QXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJpbnZlc3RGdW5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEB2N1cnJUVkwJAGQCCQBkAgUJYWNyZXMyVXNkBQZ3bGdVc2QFD2ludmVzdEZ1bmRUb3RhbAQMZGVmYXVsdExpbWl0CQBpAgUHY3VyclRWTAUTT05FX1BFUkNFTlRfRElWSVNPUgQNbGFzdExpbWl0TGVmdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRBrZXlMYXN0TGltaXRMZWZ0BQxkZWZhdWx0TGltaXQEDGxhc3RTYXZlZFRWTAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9rZXlMYXN0U2F2ZWRUVkwFB2N1cnJUVkwECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFFGtleUxhc3RBY3Jlc1NlbGxUaW1lAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEDGN1cnJlbnRMaW1pdAkAZAIFDWxhc3RMaW1pdExlZnQJAGsDBQxsYXN0U2F2ZWRUVkwJAGUCBQNub3cFCGxhc3RUaW1lCQBoAgUKREFZX01JTExJUwUTT05FX1BFUkNFTlRfRElWSVNPUgQNbGltaXRMZWZ0VXNkdAkAlwMBCQDMCAIFDGN1cnJlbnRMaW1pdAkAzAgCBQxkZWZhdWx0TGltaXQFA25pbAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rZXlMYXN0U2F2ZWRUVkwFB2N1cnJUVkwJAMwIAgkBDEludGVnZXJFbnRyeQIFFGtleUxhc3RBY3Jlc1NlbGxUaW1lBQNub3cFA25pbAUNbGltaXRMZWZ0VXNkdA0BaQEKc2F2ZUxhc3RUeAADCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFC3dsZ0NvbnRyYWN0BQNuaWwIBQFpBmNhbGxlcgkAAgECDUFjY2VzcyBkZW5pZWQJAJQKAgkBBnByb2xvZwEFAWkAKgFpAQ1jb25zdHJ1Y3RvclYxAglyZXN0MkFkZHIOb2xkQWNyQ29udHJhY3QDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQOb2xkQWNyQ29udEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDm9sZEFjckNvbnRyYWN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRhY3Jlc0lzc3VlZEFtb3VudEtleQkBEUBleHRyTmF0aXZlKDEwNTApAgUOb2xkQWNyQ29udEFkZHIFFGFjcmVzSXNzdWVkQW1vdW50S2V5CQDMCAIJAQtCaW5hcnlFbnRyeQIFD2FjcmVzQXNzZXRJZEtleQkBEUBleHRyTmF0aXZlKDEwNTIpAgUOb2xkQWNyQ29udEFkZHIFD2FjcmVzQXNzZXRJZEtleQkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5UmVzdDJBZGRyZXNzAAUJcmVzdDJBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFE29sZEFjcmVzQ29udHJhY3RLZXkFDm9sZEFjckNvbnRyYWN0BQNuaWwBaQEKc2V0QmxvY2tlZAEJaXNCbG9ja2VkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRcGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQprZXlCbG9ja2VkAAUJaXNCbG9ja2VkBQNuaWwBaQEMdW5zdGFrZUFjcmVzAQZhbW91bnQEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkAZwIAAAUGYW1vdW50CQACAQIZQW1vdW50IHNob3VsZCBiZSBwb3NpdGl2ZQQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQLJHQwNDc0NjQ4MjMJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAgkBAS0BBQZhbW91bnQFB2FkZHJlc3MEB2FjdGlvbnMIBQskdDA0NzQ2NDgyMwJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFCyR0MDQ3NDY0ODIzAl8yCQCUCgIJAM4IAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAUMYWNyZXNBc3NldElkBQ1wcm9sb2dBY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCnN0YWtlQWNyZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFDGFjcmVzQXNzZXRJZAkAAgECFEFDUkVTIHBheW1lbnRzIG9ubHkhBAskdDA1Mjc0NTM0NwkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwCBQNhbXQFB2FkZHJlc3MEB2FjdGlvbnMIBQskdDA1Mjc0NTM0NwJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFCyR0MDUyNzQ1MzQ3Al8yCQCUCgIJAM4IAgUHYWN0aW9ucwUNcHJvbG9nQWN0aW9ucwUQd2xnQ2xhaW1lZEFtb3VudAFpAQhidXlBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAECnVzZHRBbW91bnQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkAZgIFBU1VTFQ2BQp1c2R0QW1vdW50CQACAQkArAICCQCsAgICFk1pbiBwYXltZW50IHNob3VsZCBiZSAJAQpmaXhlZFBvaW50AgUFTVVMVDYABgIFIFVTRFQEC2FjcmVzQW1vdW50CQBoAgUKdXNkdEFtb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSBAl3bGdBbW91bnQJAGsDBQp1c2R0QW1vdW50BQVNVUxUOAkBC2dldFdsZ1ByaWNlAQUKdXNkdEFtb3VudAQPb2xkQWNyZXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRNvbGRBY3Jlc0NvbnRyYWN0S2V5BANyZXEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhRyZXF1ZXN0QWNyZXNDYWxsYmFjawkAzAgCBQthY3Jlc0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUDcmVxBQNyZXEECXdsZ1JlbWFpbgkBBWFzSW50AQkA/AcEBQt3bGdDb250cmFjdAIKYnVybldsZ29sZAkAzAgCBQl3bGdBbW91bnQFA25pbAUDbmlsCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2FjcmVzQW1vdW50BQxhY3Jlc0Fzc2V0SWQFA25pbAUNcHJvbG9nQWN0aW9ucwUJd2xnUmVtYWluCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGJ1eUFjcmVzUkVBRE9OTFkBCnVzZHRBbW91bnQEC2FjcmVzQW1vdW50CQBoAgUKdXNkdEFtb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSBAl3bGdUb0J1cm4JAGsDBQp1c2R0QW1vdW50BQVNVUxUOAkBC2dldFdsZ1ByaWNlAQUKdXNkdEFtb3VudAkAlAoCBQNuaWwJAMwIAgULYWNyZXNBbW91bnQJAMwIAgUFTVVMVDYJAMwIAgULYWNyZXNBbW91bnQJAMwIAgUJd2xnVG9CdXJuBQNuaWwBaQEJc2VsbEFjcmVzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQLYWNyZXNBbW91bnQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUMYWNyZXNBc3NldElkCQACAQIUQUNSRVMgcGF5bWVudHMgb25seSEDCQBmAgUFTVVMVDcFC2FjcmVzQW1vdW50CQACAQkArAICCQCsAgICFk1pbiBwYXltZW50IHNob3VsZCBiZSAJAQpmaXhlZFBvaW50AgUFTVVMVDcACAIGIEFDUkVTBARhZGRyCQClCAEIBQFpBmNhbGxlcgQLJHQwNzIwNDcyNTMJARFnZXRTd2FwTGltaXRBY3JlcwAEDGxpbWl0QWN0aW9ucwgFCyR0MDcyMDQ3MjUzAl8xBAdtYXhVc2R0CAULJHQwNzIwNDcyNTMCXzIECG1heEFjcmVzCQBoAgUHbWF4VXNkdAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAwkAZgIFC2FjcmVzQW1vdW50BQhtYXhBY3JlcwkAAgEJAKwCAgkArAICAhFZb3UgY2FuIHNlbGwgbWF4IAkBCmZpeGVkUG9pbnQCBQhtYXhBY3JlcwAIAgYgQUNSRVMECnVzZHRBbW91bnQJAGkCCQBpAgULYWNyZXNBbW91bnQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgACCQCUCgIJAM4IAgkAzQgCCQDNCAIFDGxpbWl0QWN0aW9ucwkBDEludGVnZXJFbnRyeQIFEGtleUxhc3RMaW1pdExlZnQJAGUCBQdtYXhVc2R0BQp1c2R0QW1vdW50CQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCnVzZHRBbW91bnQFC3VzZHRBc3NldElkBQ1wcm9sb2dBY3Rpb25zBQp1c2R0QW1vdW50AWkBEXNlbGxBY3Jlc1JFQURPTkxZAgdhZGRyZXNzC2FjcmVzQW1vdW50BAskdDA3NzQ0Nzc5MwkBEWdldFN3YXBMaW1pdEFjcmVzAAQMbGltaXRBY3Rpb25zCAULJHQwNzc0NDc3OTMCXzEEB21heFVzZHQIBQskdDA3NzQ0Nzc5MwJfMgQKdXNkdEFtb3VudAkAaQIJAGkCBQthY3Jlc0Ftb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAAIJAJQKAgUDbmlsCQDMCAIFCnVzZHRBbW91bnQJAMwIAgUFTVVMVDcJAMwIAgkAaAIFB21heFVzZHQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgkAzAgCAAAFA25pbAFpARBjb252ZXJ0T2xkU3Rha2VzAAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECFFRlbXBvcmFyaWx5IGRpc2FibGVkBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBA9vbGRBY3Jlc0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFE29sZEFjcmVzQ29udHJhY3RLZXkEBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9vbGRBY3Jlc0FkZHJlc3MJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFB2FkZHJlc3MAAAQJZ290QWNyZXMwAwkAZgIFBmFtb3VudAAACQEMYXNUdXBsZTJJbnRzAQkA/AcEBQ9vbGRBY3Jlc0FkZHJlc3MCFHVuc3Rha2VBY3Jlc0NhbGxiYWNrCQDMCAIFBmFtb3VudAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAkAlAoCAAAAAAQRb2xkU3Rha2luZ0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFW9sZFN0YWtpbmdDb250cmFjdFN0cgQIbGFuZHNTdHIJAJ0IAgURb2xkU3Rha2luZ0FkZHJlc3MJARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBBQdhZGRyZXNzBAtsYW5kc1Jlc3VsdAMJAQlpc0RlZmluZWQBBQhsYW5kc1N0cgQFbGFuZHMJAL0JAgkBBXZhbHVlAQUIbGFuZHNTdHICAV8KAQdvbmVMYW5kAgNhY2ML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YXJtaW5nUG93ZXIgKzEwJSBORlQgZm9yIFdhdmVzTGFuZHMgZ2FtZQABAAAHCQCXCgUIBQJycgJfMQgFAnJyAl8yCAUCcnICXzMIBQJycgJfNAkAzAgCBQVpc3N1ZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQkAuAgBBQVpc3N1ZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCXCgUAAAAAAAAAAAUDbmlsBAtkdWNrQXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAnQgCBRFvbGRTdGFraW5nQWRkcmVzcwkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwIABApkdWNrUmVzdWx0AwkBAiE9AgULZHVja0Fzc2V0SWQCAAkBDGFzVHVwbGUzSW50cwEJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCE3Vuc3Rha2VEdWNrQ2FsbGJhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJUKAwAAAAAAAAQBeAkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwCCQBkAgkAZAIJAGQCCQBkAgkAZAIJAGQCCQBkAggFCWdvdEFjcmVzMAJfMQgFC2xhbmRzUmVzdWx0Al8xCAULbGFuZHNSZXN1bHQCXzIIBQtsYW5kc1Jlc3VsdAJfMwgFC2xhbmRzUmVzdWx0Al80CAUKZHVja1Jlc3VsdAJfMQgFCmR1Y2tSZXN1bHQCXzIIBQpkdWNrUmVzdWx0Al8zBQdhZGRyZXNzCQCUCgIJAM4IAggFC2xhbmRzUmVzdWx0Al81CAUBeAJfMQgFAXgCXzIBaQEUdW5zdGFrZUxhbmRzUkVBRE9OTFkBB2FkZHJlc3MEEW9sZFN0YWtpbmdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRVvbGRTdGFraW5nQ29udHJhY3RTdHIECGxhbmRzU3RyCQCdCAIFEW9sZFN0YWtpbmdBZGRyZXNzCQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUHYWRkcmVzcwQLbGFuZHNSZXN1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cGF5bWVudHMAAAZhbW91bnQFBGFkZHIBaQEac2ltdWxhdGVTdGFrZUFjcmVzUkVBRE9OTFkCB2FkZHJlc3MLYWRkZWRBbW91bnQECWFtb3VudEtleQkBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQUHYWRkcmVzcwQObmV3QWNyZXNBbW91bnQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAABQthZGRlZEFtb3VudAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSYWNyZXNTdGFrZFRvdGFsS2V5AAAECXVzZXJGcEtleQkBFWtleUZhcm1pbmdQb3dlckJ5VXNlcgEFB2FkZHJlc3MEBW9sZEZwCQELdmFsdWVPckVsc2UCCQCfCAEFCXVzZXJGcEtleQAABAVuZXdGcAkBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBQ5uZXdBY3Jlc0Ftb3VudAQKb2xkVG90YWxGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRR0b3RhbEZhcm1pbmdQb3dlcktleQAABApuZXdUb3RhbEZwCQBkAgkAZQIFCm9sZFRvdGFsRnAFBW9sZEZwBQVuZXdGcAkAlAoCBQNuaWwJAMwIAgUFb2xkRnAJAMwIAgUFbmV3RnAJAMwIAgUKb2xkVG90YWxGcAkAzAgCBQpuZXdUb3RhbEZwBQNuaWwAd8unlA==", "height": 3368710, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CHgYFmgf7FyQfZSVTYNKVTAN6q3ey6uUCAUWGipqP3mx Next: none Diff:
OldNewDifferences
241241 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
242242 let acres2Usd = assetBalance(this, usdtAssetId)
243243 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
244- let newTVL = ((acres2Usd + wlgUsd) + investFundTotal)
245- let defaultLimit = (newTVL / ONE_PERCENT_DIVISOR)
244+ let currTVL = ((acres2Usd + wlgUsd) + investFundTotal)
245+ let defaultLimit = (currTVL / ONE_PERCENT_DIVISOR)
246246 let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
247- let lastTVL = valueOrElse(getInteger(keyLastSavedTVL), newTVL)
247+ let lastSavedTVL = valueOrElse(getInteger(keyLastSavedTVL), currTVL)
248248 let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
249249 let now = lastBlock.timestamp
250- let currentLimit = (lastLimitLeft + fraction(lastTVL, (now - lastTime), (DAY_MILLIS * ONE_PERCENT_DIVISOR)))
250+ let currentLimit = (lastLimitLeft + fraction(lastSavedTVL, (now - lastTime), (DAY_MILLIS * ONE_PERCENT_DIVISOR)))
251251 let limitLeftUsdt = min([currentLimit, defaultLimit])
252- $Tuple2([IntegerEntry(keyLastLimitLeft, limitLeftUsdt), IntegerEntry(keyLastSavedTVL, lastTVL), IntegerEntry(keyLastAcresSellTime, now)], (limitLeftUsdt * USDT2ACRES_MULTIPLIER))
252+ $Tuple2([IntegerEntry(keyLastSavedTVL, currTVL), IntegerEntry(keyLastAcresSellTime, now)], limitLeftUsdt)
253253 }
254254
255255
287287 if ((size(i.payments) != 0))
288288 then throw("No payments required")
289289 else {
290- let $t047524829 = stakeUnstakeAcresInternal(-(amount), address)
291- let actions = $t047524829._1
292- let wlgClaimedAmount = $t047524829._2
290+ let $t047464823 = stakeUnstakeAcresInternal(-(amount), address)
291+ let actions = $t047464823._1
292+ let wlgClaimedAmount = $t047464823._2
293293 $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
294294 }
295295 }
311311 else (value(pmt.assetId) != acresAssetId))
312312 then throw("ACRES payments only!")
313313 else {
314- let $t052805353 = stakeUnstakeAcresInternal(amt, address)
315- let actions = $t052805353._1
316- let wlgClaimedAmount = $t052805353._2
314+ let $t052745347 = stakeUnstakeAcresInternal(amt, address)
315+ let actions = $t052745347._1
316+ let wlgClaimedAmount = $t052745347._2
317317 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
318318 }
319319 }
377377 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
378378 else {
379379 let addr = toString(i.caller)
380- let $t072107260 = getSwapLimitAcres()
381- let limitActions = $t072107260._1
382- let maxAcres = $t072107260._2
380+ let $t072047253 = getSwapLimitAcres()
381+ let limitActions = $t072047253._1
382+ let maxUsdt = $t072047253._2
383+ let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
383384 if ((acresAmount > maxAcres))
384385 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
385386 else {
386387 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
387- $Tuple2(((limitActions :+ ScriptTransfer(i.caller, usdtAmount, usdtAssetId)) ++ prologActions), usdtAmount)
388+ $Tuple2((((limitActions :+ IntegerEntry(keyLastLimitLeft, (maxUsdt - usdtAmount))) :+ ScriptTransfer(i.caller, usdtAmount, usdtAssetId)) ++ prologActions), usdtAmount)
388389 }
389390 }
390391 }
394395
395396 @Callable(i)
396397 func sellAcresREADONLY (address,acresAmount) = {
397- let $t076467696 = getSwapLimitAcres()
398- let limitActions = $t076467696._1
399- let maxAcres = $t076467696._2
398+ let $t077447793 = getSwapLimitAcres()
399+ let limitActions = $t077447793._1
400+ let maxUsdt = $t077447793._2
400401 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
401- $Tuple2(nil, [usdtAmount, MULT7, maxAcres, 0])
402+ $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
402403 }
403404
404405
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 oldStakingContractStr = match chain {
3939 case _ =>
4040 if ((base58'2W' == $match0))
4141 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
4242 else if ((base58'2T' == $match0))
4343 then "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm"
4444 else throw("Unknown chain")
4545 }
4646
4747 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
4848
4949
5050 let IdxCfgAcres2Dapp = 1
5151
5252 let IdxCfgWlgDapp = 2
5353
5454 let IdxCfgInvestFundDapp = 5
5555
5656 func keyRestCfg () = "%s__restConfig"
5757
5858
5959 func keyRest2Address () = "%s__rest2Addr"
6060
6161
6262 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
6363
6464
6565 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
6666
6767
6868 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
6969
7070 let rest2Cfg = readRestCfgOrFail(rest2Contract)
7171
7272 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
7373
7474 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
7575
7676 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
7777
7878 let oldAcresContractKey = "oldAcresContract"
7979
8080 func keyBlocked () = "contractsBlocked"
8181
8282
8383 func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
8484
8585
8686 let acresIssuedAmountKey = "acresIssuedAmount"
8787
8888 let acresAssetIdKey = "acresAssetId"
8989
9090 let acresAssetId = valueOrErrorMessage(getBinary(acres2Contract, acresAssetIdKey), "ACRES is not issued yet")
9191
9292 func keyAcresStakedTimeByUser (addr) = ("acresStakedTimeByUser_" + addr)
9393
9494
9595 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
9696
9797
9898 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
9999
100100
101101 func asInt (v) = match v {
102102 case n: Int =>
103103 n
104104 case _ =>
105105 throw("fail to cast into Int")
106106 }
107107
108108
109109 func asTuple5Ints (val) = match val {
110110 case t: (Int, Int, Int, Int, Int) =>
111111 t
112112 case _ =>
113113 throw("fail to cast into (Int, Int, Int, Int, Int)")
114114 }
115115
116116
117117 func asTuple4Ints (val) = match val {
118118 case t: (Int, Int, Int, Int) =>
119119 t
120120 case _ =>
121121 throw("fail to cast into (Int, Int, Int, Int)")
122122 }
123123
124124
125125 func asTuple3Ints (val) = match val {
126126 case t: (Int, Int, Int) =>
127127 t
128128 case _ =>
129129 throw("fail to cast into (Int, Int, Int)")
130130 }
131131
132132
133133 func asTuple2Ints (val) = match val {
134134 case t: (Int, Int) =>
135135 t
136136 case _ =>
137137 throw("fail to cast into (Int, Int)")
138138 }
139139
140140
141141 func fixedPoint (val,decimals) = {
142142 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
143143 let lowPart = toString((val % tenPow))
144144 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
145145 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
146146 }
147147
148148
149149 let M8_ = 100000000
150150
151151 let wlgIssuedAmtKey = "wlg_issuedAmount"
152152
153153 let zbIssuedAmtKey = "zbill_issuedAmount"
154154
155155 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
156156
157157
158158 func keyFarmingPowerByUser (addr) = ("farmingPowerByUser_" + addr)
159159
160160
161161 let acresStakdTotalKey = "acresStakedAmountTotal"
162162
163163 let totalFarmingPowerKey = "totalFarmingPower"
164164
165165 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
166166
167167 func getLevelByAcres (acres) = {
168168 let acr = ((acres + 99999999) / M8_)
169169 func checker (acc,item) = if ((item >= acr))
170170 then acc
171171 else (acc + 1)
172172
173173 let $l = levelAcres
174174 let $s = size($l)
175175 let $acc0 = 0
176176 func $f0_1 ($a,$i) = if (($i >= $s))
177177 then $a
178178 else checker($a, $l[$i])
179179
180180 func $f0_2 ($a,$i) = if (($i >= $s))
181181 then $a
182182 else throw("List size exceeds 10")
183183
184184 $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)
185185 }
186186
187187
188188 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
189189
190190
191191 func prolog (i) = if (if ((i.originCaller != rest2Contract))
192192 then valueOrElse(getBoolean(keyBlocked()), false)
193193 else false)
194194 then throw("Contracts are under maintenance")
195195 else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
196196
197197
198198 func stakeUnstakeAcresInternal (amt,address) = {
199199 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
200200 if ((wlgResult == wlgResult))
201201 then {
202202 let now = lastBlock.timestamp
203203 let timeKey = keyAcresStakedTimeByUser(address)
204204 let amountKey = keyAcresStakedAmtByUser(address)
205205 let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
206206 if (if ((0 > amt))
207207 then (0 > (oldAcresAmount + amt))
208208 else false)
209209 then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(-(amt), 8)))
210210 else {
211211 let newAcresAmount = (oldAcresAmount + amt)
212212 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
213213 let userFpKey = keyFarmingPowerByUser(address)
214214 let oldFp = valueOrElse(getInteger(userFpKey), 0)
215215 let newFp = getFarmingPowerByAcres(newAcresAmount)
216216 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
217217 $Tuple2([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt)), IntegerEntry(userFpKey, newFp), IntegerEntry(totalFarmingPowerKey, ((oldTotalFp - oldFp) + newFp))], wlgResult)
218218 }
219219 }
220220 else throw("Strict value is not equal to itself.")
221221 }
222222
223223
224224 func getWlgPrice (usdtBalanceCorrection) = {
225225 let issuedAmount = valueOrErrorMessage(getInteger(wlgContract, wlgIssuedAmtKey), "WLGOLD is not issued yet")
226226 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
227227 let acres2Usd = (assetBalance(acres2Contract, usdtAssetId) - usdtBalanceCorrection)
228228 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
229229 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
230230 fraction(totalFundsUsd, MULT8, issuedAmount)
231231 }
232232
233233
234234 let keyLastAcresSellTime = "lastAcresSellTime"
235235
236236 let keyLastLimitLeft = "lastLimitLeft"
237237
238238 let keyLastSavedTVL = "lastSavedTVL"
239239
240240 func getSwapLimitAcres () = {
241241 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
242242 let acres2Usd = assetBalance(this, usdtAssetId)
243243 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
244- let newTVL = ((acres2Usd + wlgUsd) + investFundTotal)
245- let defaultLimit = (newTVL / ONE_PERCENT_DIVISOR)
244+ let currTVL = ((acres2Usd + wlgUsd) + investFundTotal)
245+ let defaultLimit = (currTVL / ONE_PERCENT_DIVISOR)
246246 let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
247- let lastTVL = valueOrElse(getInteger(keyLastSavedTVL), newTVL)
247+ let lastSavedTVL = valueOrElse(getInteger(keyLastSavedTVL), currTVL)
248248 let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
249249 let now = lastBlock.timestamp
250- let currentLimit = (lastLimitLeft + fraction(lastTVL, (now - lastTime), (DAY_MILLIS * ONE_PERCENT_DIVISOR)))
250+ let currentLimit = (lastLimitLeft + fraction(lastSavedTVL, (now - lastTime), (DAY_MILLIS * ONE_PERCENT_DIVISOR)))
251251 let limitLeftUsdt = min([currentLimit, defaultLimit])
252- $Tuple2([IntegerEntry(keyLastLimitLeft, limitLeftUsdt), IntegerEntry(keyLastSavedTVL, lastTVL), IntegerEntry(keyLastAcresSellTime, now)], (limitLeftUsdt * USDT2ACRES_MULTIPLIER))
252+ $Tuple2([IntegerEntry(keyLastSavedTVL, currTVL), IntegerEntry(keyLastAcresSellTime, now)], limitLeftUsdt)
253253 }
254254
255255
256256 @Callable(i)
257257 func saveLastTx () = if (!(containsElement([wlgContract], i.caller)))
258258 then throw("Access denied")
259259 else $Tuple2(prolog(i), 42)
260260
261261
262262
263263 @Callable(i)
264264 func constructorV1 (rest2Addr,oldAcrContract) = if ((i.caller != this))
265265 then throw("Permission denied")
266266 else {
267267 let oldAcrContAddr = addressFromStringValue(oldAcrContract)
268268 [IntegerEntry(acresIssuedAmountKey, getIntegerValue(oldAcrContAddr, acresIssuedAmountKey)), BinaryEntry(acresAssetIdKey, getBinaryValue(oldAcrContAddr, acresAssetIdKey)), StringEntry(keyRest2Address(), rest2Addr), StringEntry(oldAcresContractKey, oldAcrContract)]
269269 }
270270
271271
272272
273273 @Callable(i)
274274 func setBlocked (isBlocked) = if ((i.caller != this))
275275 then throw("permission denied")
276276 else [BooleanEntry(keyBlocked(), isBlocked)]
277277
278278
279279
280280 @Callable(i)
281281 func unstakeAcres (amount) = {
282282 let prologActions = prolog(i)
283283 if ((0 >= amount))
284284 then throw("Amount should be positive")
285285 else {
286286 let address = toString(i.caller)
287287 if ((size(i.payments) != 0))
288288 then throw("No payments required")
289289 else {
290- let $t047524829 = stakeUnstakeAcresInternal(-(amount), address)
291- let actions = $t047524829._1
292- let wlgClaimedAmount = $t047524829._2
290+ let $t047464823 = stakeUnstakeAcresInternal(-(amount), address)
291+ let actions = $t047464823._1
292+ let wlgClaimedAmount = $t047464823._2
293293 $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
294294 }
295295 }
296296 }
297297
298298
299299
300300 @Callable(i)
301301 func stakeAcres () = {
302302 let prologActions = prolog(i)
303303 let address = toString(i.caller)
304304 if ((size(i.payments) != 1))
305305 then throw("exactly 1 payment must be attached")
306306 else {
307307 let pmt = i.payments[0]
308308 let amt = pmt.amount
309309 if (if (!(isDefined(pmt.assetId)))
310310 then true
311311 else (value(pmt.assetId) != acresAssetId))
312312 then throw("ACRES payments only!")
313313 else {
314- let $t052805353 = stakeUnstakeAcresInternal(amt, address)
315- let actions = $t052805353._1
316- let wlgClaimedAmount = $t052805353._2
314+ let $t052745347 = stakeUnstakeAcresInternal(amt, address)
315+ let actions = $t052745347._1
316+ let wlgClaimedAmount = $t052745347._2
317317 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
318318 }
319319 }
320320 }
321321
322322
323323
324324 @Callable(i)
325325 func buyAcres () = {
326326 let prologActions = prolog(i)
327327 if ((size(i.payments) != 1))
328328 then throw("exactly 1 payment must be attached")
329329 else {
330330 let pmt = i.payments[0]
331331 let usdtAmount = pmt.amount
332332 if (if (!(isDefined(pmt.assetId)))
333333 then true
334334 else (value(pmt.assetId) != usdtAssetId))
335335 then throw("USDT payments only!")
336336 else if ((MULT6 > usdtAmount))
337337 then throw((("Min payment should be " + fixedPoint(MULT6, 6)) + " USDT"))
338338 else {
339339 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
340340 let wlgAmount = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
341341 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
342342 let req = invoke(oldAcresAddress, "requestAcresCallback", [acresAmount], nil)
343343 if ((req == req))
344344 then {
345345 let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [wlgAmount], nil))
346346 $Tuple2(([ScriptTransfer(i.caller, acresAmount, acresAssetId)] ++ prologActions), wlgRemain)
347347 }
348348 else throw("Strict value is not equal to itself.")
349349 }
350350 }
351351 }
352352
353353
354354
355355 @Callable(i)
356356 func buyAcresREADONLY (usdtAmount) = {
357357 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
358358 let wlgToBurn = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
359359 $Tuple2(nil, [acresAmount, MULT6, acresAmount, wlgToBurn])
360360 }
361361
362362
363363
364364 @Callable(i)
365365 func sellAcres () = {
366366 let prologActions = prolog(i)
367367 if ((size(i.payments) != 1))
368368 then throw("exactly 1 payment must be attached")
369369 else {
370370 let pmt = i.payments[0]
371371 let acresAmount = pmt.amount
372372 if (if (!(isDefined(pmt.assetId)))
373373 then true
374374 else (value(pmt.assetId) != acresAssetId))
375375 then throw("ACRES payments only!")
376376 else if ((MULT7 > acresAmount))
377377 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
378378 else {
379379 let addr = toString(i.caller)
380- let $t072107260 = getSwapLimitAcres()
381- let limitActions = $t072107260._1
382- let maxAcres = $t072107260._2
380+ let $t072047253 = getSwapLimitAcres()
381+ let limitActions = $t072047253._1
382+ let maxUsdt = $t072047253._2
383+ let maxAcres = (maxUsdt * USDT2ACRES_MULTIPLIER)
383384 if ((acresAmount > maxAcres))
384385 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
385386 else {
386387 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
387- $Tuple2(((limitActions :+ ScriptTransfer(i.caller, usdtAmount, usdtAssetId)) ++ prologActions), usdtAmount)
388+ $Tuple2((((limitActions :+ IntegerEntry(keyLastLimitLeft, (maxUsdt - usdtAmount))) :+ ScriptTransfer(i.caller, usdtAmount, usdtAssetId)) ++ prologActions), usdtAmount)
388389 }
389390 }
390391 }
391392 }
392393
393394
394395
395396 @Callable(i)
396397 func sellAcresREADONLY (address,acresAmount) = {
397- let $t076467696 = getSwapLimitAcres()
398- let limitActions = $t076467696._1
399- let maxAcres = $t076467696._2
398+ let $t077447793 = getSwapLimitAcres()
399+ let limitActions = $t077447793._1
400+ let maxUsdt = $t077447793._2
400401 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
401- $Tuple2(nil, [usdtAmount, MULT7, maxAcres, 0])
402+ $Tuple2(nil, [usdtAmount, MULT7, (maxUsdt * USDT2ACRES_MULTIPLIER), 0])
402403 }
403404
404405
405406
406407 @Callable(i)
407408 func convertOldStakes () = if ((i.caller != this))
408409 then throw("Temporarily disabled")
409410 else {
410411 let address = toString(i.caller)
411412 if ((size(i.payments) != 0))
412413 then throw("No payments required")
413414 else {
414415 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
415416 let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
416417 let gotAcres0 = if ((amount > 0))
417418 then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
418419 else $Tuple2(0, 0)
419420 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
420421 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
421422 let landsResult = if (isDefined(landsStr))
422423 then {
423424 let lands = split_51C(value(landsStr), "_")
424425 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
425426 then throw("landAssetId is required")
426427 else {
427428 let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
428429 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
429430 }
430431
431432 let rr = {
432433 let $l = lands
433434 let $s = size($l)
434435 let $acc0 = $Tuple4(0, 0, 0, 0)
435436 func $f0_1 ($a,$i) = if (($i >= $s))
436437 then $a
437438 else oneLand($a, $l[$i])
438439
439440 func $f0_2 ($a,$i) = if (($i >= $s))
440441 then $a
441442 else throw("List size exceeds 100")
442443
443444 $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)
444445 }
445446 let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
446447 if ((finalize == finalize))
447448 then {
448449 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
449450 if ((req == req))
450451 then {
451452 let issue = Issue("FPOWER10", "FarmingPower +10% NFT for WavesLands game", 1, 0, false)
452453 $Tuple5(rr._1, rr._2, rr._3, rr._4, [issue, ScriptTransfer(i.caller, 1, calculateAssetId(issue))])
453454 }
454455 else throw("Strict value is not equal to itself.")
455456 }
456457 else throw("Strict value is not equal to itself.")
457458 }
458459 else $Tuple5(0, 0, 0, 0, nil)
459460 let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
460461 let duckResult = if ((duckAssetId != ""))
461462 then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
462463 else $Tuple3(0, 0, 0)
463464 let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
464465 $Tuple2((landsResult._5 ++ x._1), x._2)
465466 }
466467 }
467468
468469
469470
470471 @Callable(i)
471472 func unstakeLandsREADONLY (address) = {
472473 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
473474 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
474475 let landsResult = if (isDefined(landsStr))
475476 then {
476477 let lands = split_51C(value(landsStr), "_")
477478 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
478479 then throw("landAssetId is required")
479480 else {
480481 let r = asTuple4Ints(invoke(oldStakingAddress, "unstakeLandREADONLY", [landAssetId, address], nil))
481482 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
482483 }
483484
484485 let $l = lands
485486 let $s = size($l)
486487 let $acc0 = $Tuple4(0, 0, 0, 0)
487488 func $f0_1 ($a,$i) = if (($i >= $s))
488489 then $a
489490 else oneLand($a, $l[$i])
490491
491492 func $f0_2 ($a,$i) = if (($i >= $s))
492493 then $a
493494 else throw("List size exceeds 100")
494495
495496 $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)
496497 }
497498 else $Tuple4(0, 0, 0, 0)
498499 $Tuple2(nil, landsResult)
499500 }
500501
501502
502503
503504 @Callable(i)
504505 func stakeAcresCallback (addr) = if ((i.caller != addressFromStringValue(oldStakingContractStr)))
505506 then throw("Permission denied")
506507 else stakeUnstakeAcresInternal(i.payments[0].amount, addr)
507508
508509
509510
510511 @Callable(i)
511512 func simulateStakeAcresREADONLY (address,addedAmount) = {
512513 let amountKey = keyAcresStakedAmtByUser(address)
513514 let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + addedAmount)
514515 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
515516 let userFpKey = keyFarmingPowerByUser(address)
516517 let oldFp = valueOrElse(getInteger(userFpKey), 0)
517518 let newFp = getFarmingPowerByAcres(newAcresAmount)
518519 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
519520 let newTotalFp = ((oldTotalFp - oldFp) + newFp)
520521 $Tuple2(nil, [oldFp, newFp, oldTotalFp, newTotalFp])
521522 }
522523
523524

github/deemru/w8io/026f985 
54.06 ms