tx · 5Qbz3sH9461GhuXfrNruA47KgdDVG9otm2MeVkMjGVMF

3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh:  -0.01600000 Waves

2024.11.04 23:30 [3357205] smart account 3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh > SELF 0.00000000 Waves

{ "type": 13, "id": "5Qbz3sH9461GhuXfrNruA47KgdDVG9otm2MeVkMjGVMF", "fee": 1600000, "feeAssetId": null, "timestamp": 1730752253619, "version": 2, "chainId": 84, "sender": "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh", "senderPublicKey": "3QtfC1XbLZXdeawMDeSERy9vvjUmj1XYd2GFmrvx7pWQ", "proofs": [ "nfu8Z3ajdYP1TURNaEomUnW9H1H9CQ2UcVYUbZFYkTWsLdLMZXbSNPmHYJr7Bm6grZRnyNBJ1JZXTXAPBYBK2eo" ], "script": "base64:BgI3CAISABIECgIICBIDCgEEEgMKAQESABIAEgMKAQESABIECgIIARIAEgMKAQgSAwoBCBIECgIIATgAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDcAgK3iBAAFTVVMVDgAgMLXLwAKREFZX01JTExJUwCAuJkpABVVU0RUMkFDUkVTX01VTFRJUExJRVIACgATT05FX1BFUkNFTlRfRElWSVNPUgBkAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BGd1l0YThiaUV6MzF6cGVGZTVESks4d0U1dHJTcFFWRjgDCQAAAgEBVAUHJG1hdGNoMAIjM043VXVZYXI2MjY0UDU4RkJoVldLUFFBaDRZdWEyaGduZ3YJAAIBAg1Vbmtub3duIGNoYWluABVvbGRTdGFraW5nQ29udHJhY3RTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQTG5jWHRTMVU4M0Q2Y1FiRkQzSDhyQkhQTGd6eFNGS1oxAwkAAAIBAVQFByRtYXRjaDACIzNOREN5Qkc1cTg1SnVhUmlpZ1VlRXRhaW55akNRVDNYcFptCQACAQINVW5rbm93biBjaGFpbgEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEElkeENmZ0FjcmVzMkRhcHAAAQANSWR4Q2ZnV2xnRGFwcAACABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAFAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBD2tleVJlc3QyQWRkcmVzcwACDSVzX19yZXN0MkFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAghyZXN0MkNmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCHJlc3QyQ2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAIcmVzdDJDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDXJlc3QyQ29udHJhY3QADmFjcmVzMkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFEElkeENmZ0FjcmVzMkRhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFDUlkeENmZ1dsZ0RhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBRRJZHhDZmdJbnZlc3RGdW5kRGFwcAATb2xkQWNyZXNDb250cmFjdEtleQIQb2xkQWNyZXNDb250cmFjdAEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBEWtleUxhc3RUeElkQnlVc2VyAQRhZGRyCQCsAgICD2xhc3RUeElkQnlVc2VyXwUEYWRkcgAUYWNyZXNJc3N1ZWRBbW91bnRLZXkCEWFjcmVzSXNzdWVkQW1vdW50AA9hY3Jlc0Fzc2V0SWRLZXkCDGFjcmVzQXNzZXRJZAAMYWNyZXNBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgUOYWNy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BQAGAAcACAAJAAoBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBWFjcmVzCQBoAgkAaAIFBWFjcmVzABQJAGQCCQEPZ2V0TGV2ZWxCeUFjcmVzAQUFYWNyZXMABAEGcHJvbG9nAQFpAwMJAQIhPQIIBQFpDG9yaWdpbkNhbGxlcgUNcmVzdDJDb250cmFjdAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEKa2V5QmxvY2tlZAAHBwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhc3RUeElkQnlVc2VyAQkApQgBCAUBaQxvcmlnaW5DYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAgNhbXQHYWRkcmVzcwQJd2xnUmVzdWx0CQD8BwQFC3dsZ0NvbnRyYWN0AhJvblN0YWtlVW5zdGFrZUxhbmQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUJd2xnUmVzdWx0BQl3bGdSZXN1bHQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEB3RpbWVLZXkJARhrZXlBY3Jlc1N0YWtlZFRpbWVCeVVzZXIBBQdhZGRyZXNzBAlhbW91bnRLZXkJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFB2FkZHJlc3MEDm9sZEFjcmVzQW1vdW50CQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAAAwMJAGYCAAAFA2FtdAkAZgIAAAkAZAIFDm9sZEFjcmVzQW1vdW50BQNhbXQHCQACAQkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAQpmaXhlZFBvaW50AgUOb2xkQWNyZXNBbW91bnQACAIgIEFDUkVTIHN0YWtlZCwgdHJpZWQgdG8gdW5zdGFrZSAJAQpmaXhlZFBvaW50AgkBAS0BBQNhbXQACAQObmV3QWNyZXNBbW91bnQJAGQCBQ5vbGRBY3Jlc0Ftb3VudAUDYW10BAhvbGRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJhY3Jlc1N0YWtkVG90YWxLZXkAAAQJdXNlckZwS2V5CQEVa2V5RmFybWluZ1Bvd2VyQnlVc2VyAQUHYWRkcmVzcwQFb2xkRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJdXNlckZwS2V5AAAEBW5ld0ZwCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFDm5ld0FjcmVzQW1vdW50BApvbGRUb3RhbEZwCQELdmFsdWVPckVsc2UCCQCfCAEFFHRvdGFsRmFybWluZ1Bvd2VyS2V5AAAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIFCWFtb3VudEtleQUObmV3QWNyZXNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEmFjcmVzU3Rha2RUb3RhbEtleQkAZAIFCG9sZFRvdGFsBQNhbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFCXVzZXJGcEtleQUFbmV3RnAJAMwIAgkBDEludGVnZXJFbnRyeQIFFHRvdGFsRmFybWluZ1Bvd2VyS2V5CQBkAgkAZQIFCm9sZFRvdGFsRnAFBW9sZEZwBQVuZXdGcAUDbmlsBQl3bGdSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BC2dldFdsZ1ByaWNlARV1c2R0QmFsYW5jZUNvcnJlY3Rpb24EDGlzc3VlZEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFC3dsZ0NvbnRyYWN0BQ93bGdJc3N1ZWRBbXRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQGd2xnVXNkCQDwBwIFC3dsZ0NvbnRyYWN0BQt1c2R0QXNzZXRJZAQJYWNyZXMyVXNkCQBlAgkA8AcCBQ5hY3JlczJDb250cmFjdAULdXNkdEFzc2V0SWQFFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRJpbnZlc3RGdW5kQ29udHJhY3QFC3VzZHRBc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFEmludmVzdEZ1bmRDb250cmFjdAUOemJJc3N1ZWRBbXRLZXkAAAQNdG90YWxGdW5kc1VzZAkAZAIJAGQCBQlhY3JlczJVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsCQBrAwUNdG90YWxGdW5kc1VzZAUFTVVMVDgFDGlzc3VlZEFtb3VudAAUa2V5TGFzdEFjcmVzU2VsbFRpbWUCEWxhc3RBY3Jlc1NlbGxUaW1lABBrZXlMYXN0TGltaXRMZWZ0Ag1sYXN0TGltaXRMZWZ0AA9rZXlMYXN0U2F2ZWRUVkwCDGxhc3RTYXZlZFRWTAERZ2V0U3dhcExpbWl0QWNyZXMABAZ3bGdVc2QJAPAHAgULd2xnQ29udHJhY3QFC3VzZHRBc3NldElkBAlhY3JlczJVc2QJAPAHAgUEdGhpcwULdXNkdEFzc2V0SWQED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgUSaW52ZXN0RnVuZENvbnRyYWN0BQt1c2R0QXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJpbnZlc3RGdW5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEBm5ld1RWTAkAZAIJAGQCBQlhY3JlczJVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsBAxkZWZhdWx0TGltaXQJAGkCBQZuZXdUVkwFE09ORV9QRVJDRU5UX0RJVklTT1IEDWxhc3RMaW1pdExlZnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUQa2V5TGFzdExpbWl0TGVmdAUMZGVmYXVsdExpbWl0BAdsYXN0VFZMCQELdmFsdWVPckVsc2UCCQCfCAEFD2tleUxhc3RTYXZlZFRWTAUGbmV3VFZMBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBRRrZXlMYXN0QWNyZXNTZWxsVGltZQAABANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAxjdXJyZW50TGltaXQJAGQCBQ1sYXN0TGltaXRMZWZ0CQBrAwUHbGFzdFRWTAkAZQIFCGxhc3RUaW1lBQNub3cJAGgCBQpEQVlfTUlMTElTBRNPTkVfUEVSQ0VOVF9ESVZJU09SBA1saW1pdExlZnRVc2R0CQCXAwEJAMwIAgUMY3VycmVudExpbWl0CQDMCAIFDGRlZmF1bHRMaW1pdAUDbmlsCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleUxhc3RMaW1pdExlZnQFDWxpbWl0TGVmdFVzZHQJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tleUxhc3RTYXZlZFRWTAUHbGFzdFRWTAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5TGFzdEFjcmVzU2VsbFRpbWUFA25vdwUDbmlsCQBoAgUNbGltaXRMZWZ0VXNkdAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSDQFpAQpzYXZlTGFzdFR4AAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgULd2xnQ29udHJhY3QFA25pbAgFAWkGY2FsbGVyCQACAQINQWNjZXNzIGRlbmllZAkAlAoCCQEGcHJvbG9nAQUBaQAqAWkBDWNvbnN0cnVjdG9yVjECCXJlc3QyQWRkcg5vbGRBY3JDb250cmFjdAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA5vbGRBY3JDb250QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUOb2xkQWNyQ29udHJhY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFFGFjcmVzSXNzdWVkQW1vdW50S2V5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ5vbGRBY3JDb250QWRkcgUUYWNyZXNJc3N1ZWRBbW91bnRLZXkJAMwIAgkBC0JpbmFyeUVudHJ5AgUPYWNyZXNBc3NldElkS2V5CQERQGV4dHJOYXRpdmUoMTA1MikCBQ5vbGRBY3JDb250QWRkcgUPYWNyZXNBc3NldElkS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlSZXN0MkFkZHJlc3MABQlyZXN0MkFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUTb2xkQWNyZXNDb250cmFjdEtleQUOb2xkQWNyQ29udHJhY3QFA25pbAFpAQpzZXRCbG9ja2VkAQlpc0Jsb2NrZWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCmtleUJsb2NrZWQABQlpc0Jsb2NrZWQFA25pbAFpAQx1bnN0YWtlQWNyZXMBBmFtb3VudAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQBnAgAABQZhbW91bnQJAAIBAhlBbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAskdDA0NzUyNDgyOQkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwCCQEBLQEFBmFtb3VudAUHYWRkcmVzcwQHYWN0aW9ucwgFCyR0MDQ3NTI0ODI5Al8xBBB3bGdDbGFpbWVkQW1vdW50CAULJHQwNDc1MjQ4MjkCXzIJAJQKAgkAzggCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGYW1vdW50BQxhY3Jlc0Fzc2V0SWQFDXByb2xvZ0FjdGlvbnMFEHdsZ0NsYWltZWRBbW91bnQBaQEKc3Rha2VBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUMYWNyZXNBc3NldElkCQACAQIUQUNSRVMgcGF5bWVudHMgb25seSEECyR0MDUyODA1MzUzCQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAIFA2FtdAUHYWRkcmVzcwQHYWN0aW9ucwgFCyR0MDUyODA1MzUzAl8xBBB3bGdDbGFpbWVkQW1vdW50CAULJHQwNTI4MDUzNTMCXzIJAJQKAgkAzggCBQdhY3Rpb25zBQ1wcm9sb2dBY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCGJ1eUFjcmVzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQKdXNkdEFtb3VudAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEDCQBmAgUFTVVMVDYFCnVzZHRBbW91bnQJAAIBCQCsAgIJAKwCAgIWTWluIHBheW1lbnQgc2hvdWxkIGJlIAkBCmZpeGVkUG9pbnQCBQVNVUxUNgAGAgUgVVNEVAQLYWNyZXNBbW91bnQJAGgCBQp1c2R0QW1vdW50BRVVU0RUMkFDUkVTX01VTFRJUExJRVIECXdsZ0Ftb3VudAkAawMFCnVzZHRBbW91bnQFBU1VTFQ4CQELZ2V0V2xnUHJpY2UBBQp1c2R0QW1vdW50BA9vbGRBY3Jlc0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFE29sZEFjcmVzQ29udHJhY3RLZXkEA3JlcQkA/AcEBQ9vbGRBY3Jlc0FkZHJlc3MCFHJlcXVlc3RBY3Jlc0NhbGxiYWNrCQDMCAIFC2FjcmVzQW1vdW50BQNuaWwFA25pbAMJAAACBQNyZXEFA3JlcQQJd2xnUmVtYWluCQEFYXNJbnQBCQD8BwQFC3dsZ0NvbnRyYWN0AgpidXJuV2xnb2xkCQDMCAIFCXdsZ0Ftb3VudAUDbmlsBQNuaWwJAJQKAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULYWNyZXNBbW91bnQFDGFjcmVzQXNzZXRJZAUDbmlsBQ1wcm9sb2dBY3Rpb25zBQl3bGdSZW1haW4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQYnV5QWNyZXNSRUFET05MWQEKdXNkdEFtb3VudAQLYWNyZXNBbW91bnQJAGgCBQp1c2R0QW1vdW50BRVVU0RUMkFDUkVTX01VTFRJUExJRVIECXdsZ1RvQnVybgkAawMFCnVzZHRBbW91bnQFBU1VTFQ4CQELZ2V0V2xnUHJpY2UBBQp1c2R0QW1vdW50CQCUCgIFA25pbAkAzAgCBQthY3Jlc0Ftb3VudAkAzAgCBQVNVUxUNgkAzAgCBQthY3Jlc0Ftb3VudAkAzAgCBQl3bGdUb0J1cm4FA25pbAFpAQlzZWxsQWNyZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAthY3Jlc0Ftb3VudAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQxhY3Jlc0Fzc2V0SWQJAAIBAhRBQ1JFUyBwYXltZW50cyBvbmx5IQMJAGYCBQVNVUxUNwULYWNyZXNBbW91bnQJAAIBCQCsAgIJAKwCAgIWTWluIHBheW1lbnQgc2hvdWxkIGJlIAkBCmZpeGVkUG9pbnQCBQVNVUxUNwAIAgYgQUNSRVMEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAskdDA3MjEwNzI2MAkBEWdldFN3YXBMaW1pdEFjcmVzAAQMbGltaXRBY3Rpb25zCAULJHQwNzIxMDcyNjACXzEECG1heEFjcmVzCAULJHQwNzIxMDcyNjACXzIDCQBmAgULYWNyZXNBbW91bnQFCG1heEFjcmVzCQACAQkArAICCQCsAgICEVlvdSBjYW4gc2VsbCBtYXggCQEKZml4ZWRQb2ludAIFCG1heEFjcmVzAAgCBiBBQ1JFUwQKdXNkdEFtb3VudAkAaQIJAGkCBQthY3Jlc0Ftb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAAIJAJQKAgkAzggCCQDNCAIFDGxpbWl0QWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQp1c2R0QW1vdW50BQt1c2R0QXNzZXRJZAUNcHJvbG9nQWN0aW9ucwUKdXNkdEFtb3VudAFpARFzZWxsQWNyZXNSRUFET05MWQIHYWRkcmVzcwthY3Jlc0Ftb3VudAQLJHQwNzY0Njc2OTYJARFnZXRTd2FwTGltaXRBY3JlcwAEDGxpbWl0QWN0aW9ucwgFCyR0MDc2NDY3Njk2Al8xBAhtYXhBY3JlcwgFCyR0MDc2NDY3Njk2Al8yBAp1c2R0QW1vdW50CQBpAgkAaQIFC2FjcmVzQW1vdW50BRVVU0RUMkFDUkVTX01VTFRJUExJRVIAAgkAlAoCBQNuaWwJAMwIAgUKdXNkdEFtb3VudAkAzAgCBQVNVUxUNwkAzAgCBQhtYXhBY3JlcwkAzAgCAAAFA25pbAFpARBjb252ZXJ0T2xkU3Rha2VzAAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQPb2xkQWNyZXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRNvbGRBY3Jlc0NvbnRyYWN0S2V5BAZhbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPb2xkQWNyZXNBZGRyZXNzCQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQdhZGRyZXNzAAAECWdvdEFjcmVzMAMJAGYCBQZhbW91bnQAAAkBDGFzVHVwbGUySW50cwEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhR1bnN0YWtlQWNyZXNDYWxsYmFjawkAzAgCBQZhbW91bnQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJQKAgAAAAAEEW9sZFN0YWtpbmdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRVvbGRTdGFraW5nQ29udHJhY3RTdHIECGxhbmRzU3RyCQCdCAIFEW9sZFN0YWtpbmdBZGRyZXNzCQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUHYWRkcmVzcwQLbGFuZHNSZXN1bHQDCQEJaXNEZWZpbmVkAQUIbGFuZHNTdHIEBWxhbmRzCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfCgEHb25lTGFuZAIDYWNjC2xhbmRBc3NldElkAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQBcgkBDGFzVHVwbGU1SW50cwEJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCE3Vuc3Rha2VMYW5k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AwgFAWkGY2FsbGVyAAEJALgIAQUFaXNzdWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlwoFAAAAAAAAAAAFA25pbAQLZHVja0Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgURb2xkU3Rha2luZ0FkZHJlc3MJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MCAAQKZHVja1Jlc3VsdAMJAQIhPQIFC2R1Y2tBc3NldElkAgAJAQxhc1R1cGxlM0ludHMBCQD8BwQFEW9sZFN0YWtpbmdBZGRyZXNzAhN1bnN0YWtlRHVja0NhbGxiYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsCQCVCgMAAAAAAAAEAXgJARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAgkAZAIJAGQCCQBkAgkAZAIJAGQCCQBkAgkAZAIIBQlnb3RBY3JlczACXzEIBQtsYW5kc1Jlc3VsdAJfMQgFC2xhbmRzUmVzdWx0Al8yCAULbGFuZHNSZXN1bHQCXzMIBQtsYW5kc1Jlc3VsdAJfNAgFCmR1Y2tSZXN1bHQCXzEIBQpkdWNrUmVzdWx0Al8yCAUKZHVja1Jlc3VsdAJfMwUHYWRkcmVzcwkAlAoCCQDOCAIIBQtsYW5kc1Jlc3VsdAJfNQgFAXgCXzEIBQF4Al8yAWkBFHVuc3Rha2VMYW5kc1JFQURPTkxZAQdhZGRyZXNzBBFvbGRTdGFraW5nQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUVb2xkU3Rha2luZ0NvbnRyYWN0U3RyBAhsYW5kc1N0cgkAnQgCBRFvbGRTdGFraW5nQWRkcmVzcwkBFWtleVN0YWtlZExhbmRzQnlPd25lcgEFB2FkZHJlc3MEC2xhbmRzUmVzdWx0AwkBCWlzRGVmaW5lZAEFCGxhbmRzU3RyBAVsYW5kcwkAvQkCCQEFdmFsdWUBBQhsYW5kc1N0cgIBXwoBB29uZUxhbmQCA2FjYwtsYW5kQXNzZXRJZAMJAAACBQtsYW5kQXNzZXRJZAIACQACAQIXbGFuZEFzc2V0SWQgaXMgcmVxdWlyZWQEAXIJAQxhc1R1cGxlNEludHMBCQD8BwQFEW9sZFN0YWtpbmdBZGRyZXNzAhN1bnN0YWtlTGFuZFJFQURPTkxZCQDMCAIFC2xhbmRBc3NldElkCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsCQCWCgQJAGQCCAUDYWNjAl8xCAUBcgJfMQkAZAIIBQNhY2MCXzIIBQFyAl8yCQBkAggFA2FjYwJfMwgFAXICXzMJAGQCCAUDYWNjAl80CAUBcgJfNAoAAiRsBQVsYW5kcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdvbmVMYW5kAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhVMaXN0IHNpemUgZXhjZWVkcyAxMDAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZAkAlgoEAAAAAAAAAAAJAJQKAgUDbmlsBQtsYW5kc1Jlc3VsdAFpARJzdGFrZUFjcmVzQ2FsbGJhY2sBBGFkZHIDCQECIT0CCAUBaQZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFW9sZFN0YWtpbmdDb250cmFjdFN0cgkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQRhZGRyAWkBGnNpbXVsYXRlU3Rha2VBY3Jlc1JFQURPTkxZAgdhZGRyZXNzC2FkZGVkQW1vdW50BAlhbW91bnRLZXkJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFB2FkZHJlc3MEDm5ld0FjcmVzQW1vdW50CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlhbW91bnRLZXkAAAULYWRkZWRBbW91bnQECG9sZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFEmFjcmVzU3Rha2RUb3RhbEtleQAABAl1c2VyRnBLZXkJARVrZXlGYXJtaW5nUG93ZXJCeVVzZXIBBQdhZGRyZXNzBAVvbGRGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQl1c2VyRnBLZXkAAAQFbmV3RnAJARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQUObmV3QWNyZXNBbW91bnQECm9sZFRvdGFsRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUdG90YWxGYXJtaW5nUG93ZXJLZXkAAAQKbmV3VG90YWxGcAkAZAIJAGUCBQpvbGRUb3RhbEZwBQVvbGRGcAUFbmV3RnAJAJQKAgUDbmlsCQDMCAIFBW9sZEZwCQDMCAIFBW5ld0ZwCQDMCAIFCm9sZFRvdGFsRnAJAMwIAgUKbmV3VG90YWxGcAUDbmlsAOddDpI=", "height": 3357205, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HfmKKXdTwSKr4dozFiD6K4dzdR8vU9UgrR5pFbjtLbnq Next: HB2x49k7A9oWjG78FcVY4GPQte9cVqLnqDcVYPZ1Xu58 Diff:
OldNewDifferences
1313
1414 let USDT2ACRES_MULTIPLIER = 10
1515
16-let ACRES_LIMIT_DIVISOR = 10
16+let ONE_PERCENT_DIVISOR = 100
1717
1818 let chain = take(drop(this.bytes, 1), 1)
1919
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
4435 else throw("Unknown chain")
4536 }
4637
204195 else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
205196
206197
207-func stakeAcresInternal (amt,address) = {
198+func stakeUnstakeAcresInternal (amt,address) = {
208199 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
209200 if ((wlgResult == wlgResult))
210201 then {
211202 let now = lastBlock.timestamp
212203 let timeKey = keyAcresStakedTimeByUser(address)
213204 let amountKey = keyAcresStakedAmtByUser(address)
214- let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + amt)
215- let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
216- let userFpKey = keyFarmingPowerByUser(address)
217- let oldFp = valueOrElse(getInteger(userFpKey), 0)
218- let newFp = getFarmingPowerByAcres(newAcresAmount)
219- let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
220- $Tuple2([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt)), IntegerEntry(userFpKey, newFp), IntegerEntry(totalFarmingPowerKey, ((oldTotalFp - oldFp) + newFp))], wlgResult)
205+ let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
206+ if (if ((0 > amt))
207+ then (0 > (oldAcresAmount + amt))
208+ else false)
209+ then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(-(amt), 8)))
210+ else {
211+ let newAcresAmount = (oldAcresAmount + amt)
212+ let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
213+ let userFpKey = keyFarmingPowerByUser(address)
214+ let oldFp = valueOrElse(getInteger(userFpKey), 0)
215+ let newFp = getFarmingPowerByAcres(newAcresAmount)
216+ let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
217+ $Tuple2([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt)), IntegerEntry(userFpKey, newFp), IntegerEntry(totalFarmingPowerKey, ((oldTotalFp - oldFp) + newFp))], wlgResult)
218+ }
221219 }
222220 else throw("Strict value is not equal to itself.")
223221 }
233231 }
234232
235233
236-func keyLastAcresSellTimeByUser (addr) = ("lastAcresSellTimeUser_" + addr)
234+let keyLastAcresSellTime = "lastAcresSellTime"
237235
236+let keyLastLimitLeft = "lastLimitLeft"
238237
239-func getSwapLimitAcres (addr) = {
240- let lastTime = valueOrElse(getInteger(keyLastAcresSellTimeByUser(addr)), 0)
238+let keyLastSavedTVL = "lastSavedTVL"
239+
240+func getSwapLimitAcres () = {
241+ let wlgUsd = assetBalance(wlgContract, usdtAssetId)
242+ let acres2Usd = assetBalance(this, usdtAssetId)
243+ let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
244+ let newTVL = ((acres2Usd + wlgUsd) + investFundTotal)
245+ let defaultLimit = (newTVL / ONE_PERCENT_DIVISOR)
246+ let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
247+ let lastTVL = valueOrElse(getInteger(keyLastSavedTVL), newTVL)
248+ let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
241249 let now = lastBlock.timestamp
242- if ((arbitrageDelay > (now - lastTime)))
243- then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "min"))
244- else {
245- let wlgUsd = assetBalance(wlgContract, usdtAssetId)
246- let acres2Usd = assetBalance(this, usdtAssetId)
247- let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
248- (((acres2Usd + wlgUsd) + investFundTotal) / ACRES_LIMIT_DIVISOR)
249- }
250+ let currentLimit = (lastLimitLeft + fraction(lastTVL, (lastTime - now), (DAY_MILLIS * ONE_PERCENT_DIVISOR)))
251+ let limitLeftUsdt = min([currentLimit, defaultLimit])
252+ $Tuple2([IntegerEntry(keyLastLimitLeft, limitLeftUsdt), IntegerEntry(keyLastSavedTVL, lastTVL), IntegerEntry(keyLastAcresSellTime, now)], (limitLeftUsdt * USDT2ACRES_MULTIPLIER))
250253 }
251254
252255
268271
269272
270273 @Callable(i)
271-func saveInteger (key,amount) = if ((i.caller != this))
272- then throw("saveInteger is not public method")
273- else [IntegerEntry(key, amount)]
274-
275-
276-
277-@Callable(i)
278274 func setBlocked (isBlocked) = if ((i.caller != this))
279275 then throw("permission denied")
280276 else [BooleanEntry(keyBlocked(), isBlocked)]
291287 if ((size(i.payments) != 0))
292288 then throw("No payments required")
293289 else {
294- let timeKey = keyAcresStakedTimeByUser(address)
295- let amountKey = keyAcresStakedAmtByUser(address)
296- let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
297- if ((amount > oldAcresAmount))
298- then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(amount, 8)))
299- else {
300- let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
301- let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
302- let newAcresAmount = (oldAcresAmount - amount)
303- let userFpKey = keyFarmingPowerByUser(address)
304- let oldFp = valueOrElse(getInteger(userFpKey), 0)
305- let newFp = getFarmingPowerByAcres(newAcresAmount)
306- let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
307- $Tuple2(([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(amountKey, (oldAcresAmount - amount)), IntegerEntry(acresStakdTotalKey, (oldTotal - amount)), IntegerEntry(userFpKey, newFp), IntegerEntry(totalFarmingPowerKey, ((oldTotalFp - oldFp) + newFp)), ScriptTransfer(i.caller, amount, acresAssetId)] ++ prologActions), wlgResult)
308- }
290+ let $t047524829 = stakeUnstakeAcresInternal(-(amount), address)
291+ let actions = $t047524829._1
292+ let wlgClaimedAmount = $t047524829._2
293+ $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
309294 }
310295 }
311296 }
326311 else (value(pmt.assetId) != acresAssetId))
327312 then throw("ACRES payments only!")
328313 else {
329- let $t053465412 = stakeAcresInternal(amt, address)
330- let actions = $t053465412._1
331- let wlgClaimedAmount = $t053465412._2
314+ let $t052805353 = stakeUnstakeAcresInternal(amt, address)
315+ let actions = $t052805353._1
316+ let wlgClaimedAmount = $t052805353._2
332317 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
333318 }
334319 }
392377 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
393378 else {
394379 let addr = toString(i.caller)
395- let maxAcres = getSwapLimitAcres(addr)
380+ let $t072107260 = getSwapLimitAcres()
381+ let limitActions = $t072107260._1
382+ let maxAcres = $t072107260._2
396383 if ((acresAmount > maxAcres))
397384 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
398385 else {
399386 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
400- $Tuple2(([IntegerEntry(keyLastAcresSellTimeByUser(addr), lastBlock.timestamp), ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
387+ $Tuple2(((limitActions :+ ScriptTransfer(i.caller, usdtAmount, usdtAssetId)) ++ prologActions), usdtAmount)
401388 }
402389 }
403390 }
407394
408395 @Callable(i)
409396 func sellAcresREADONLY (address,acresAmount) = {
410- let maxAcres = getSwapLimitAcres(address)
397+ let $t076467696 = getSwapLimitAcres()
398+ let limitActions = $t076467696._1
399+ let maxAcres = $t076467696._2
411400 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
412401 $Tuple2(nil, [usdtAmount, MULT7, maxAcres, 0])
413402 }
469458 let duckResult = if ((duckAssetId != ""))
470459 then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
471460 else $Tuple3(0, 0, 0)
472- let x = stakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
461+ let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
473462 $Tuple2((landsResult._5 ++ x._1), x._2)
474463 }
475464 }
512501 @Callable(i)
513502 func stakeAcresCallback (addr) = if ((i.caller != addressFromStringValue(oldStakingContractStr)))
514503 then throw("Permission denied")
515- else stakeAcresInternal(i.payments[0].amount, addr)
504+ else stakeUnstakeAcresInternal(i.payments[0].amount, addr)
516505
517506
518507
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
16-let ACRES_LIMIT_DIVISOR = 10
16+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
4435 else throw("Unknown chain")
4536 }
4637
4738 let oldStakingContractStr = match chain {
4839 case _ =>
4940 if ((base58'2W' == $match0))
5041 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
5142 else if ((base58'2T' == $match0))
5243 then "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm"
5344 else throw("Unknown chain")
5445 }
5546
5647 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
5748
5849
5950 let IdxCfgAcres2Dapp = 1
6051
6152 let IdxCfgWlgDapp = 2
6253
6354 let IdxCfgInvestFundDapp = 5
6455
6556 func keyRestCfg () = "%s__restConfig"
6657
6758
6859 func keyRest2Address () = "%s__rest2Addr"
6960
7061
7162 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
7263
7364
7465 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
7566
7667
7768 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
7869
7970 let rest2Cfg = readRestCfgOrFail(rest2Contract)
8071
8172 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
8273
8374 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
8475
8576 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
8677
8778 let oldAcresContractKey = "oldAcresContract"
8879
8980 func keyBlocked () = "contractsBlocked"
9081
9182
9283 func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
9384
9485
9586 let acresIssuedAmountKey = "acresIssuedAmount"
9687
9788 let acresAssetIdKey = "acresAssetId"
9889
9990 let acresAssetId = valueOrErrorMessage(getBinary(acres2Contract, acresAssetIdKey), "ACRES is not issued yet")
10091
10192 func keyAcresStakedTimeByUser (addr) = ("acresStakedTimeByUser_" + addr)
10293
10394
10495 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
10596
10697
10798 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
10899
109100
110101 func asInt (v) = match v {
111102 case n: Int =>
112103 n
113104 case _ =>
114105 throw("fail to cast into Int")
115106 }
116107
117108
118109 func asTuple5Ints (val) = match val {
119110 case t: (Int, Int, Int, Int, Int) =>
120111 t
121112 case _ =>
122113 throw("fail to cast into (Int, Int, Int, Int, Int)")
123114 }
124115
125116
126117 func asTuple4Ints (val) = match val {
127118 case t: (Int, Int, Int, Int) =>
128119 t
129120 case _ =>
130121 throw("fail to cast into (Int, Int, Int, Int)")
131122 }
132123
133124
134125 func asTuple3Ints (val) = match val {
135126 case t: (Int, Int, Int) =>
136127 t
137128 case _ =>
138129 throw("fail to cast into (Int, Int, Int)")
139130 }
140131
141132
142133 func asTuple2Ints (val) = match val {
143134 case t: (Int, Int) =>
144135 t
145136 case _ =>
146137 throw("fail to cast into (Int, Int)")
147138 }
148139
149140
150141 func fixedPoint (val,decimals) = {
151142 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
152143 let lowPart = toString((val % tenPow))
153144 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
154145 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
155146 }
156147
157148
158149 let M8_ = 100000000
159150
160151 let wlgIssuedAmtKey = "wlg_issuedAmount"
161152
162153 let zbIssuedAmtKey = "zbill_issuedAmount"
163154
164155 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
165156
166157
167158 func keyFarmingPowerByUser (addr) = ("farmingPowerByUser_" + addr)
168159
169160
170161 let acresStakdTotalKey = "acresStakedAmountTotal"
171162
172163 let totalFarmingPowerKey = "totalFarmingPower"
173164
174165 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
175166
176167 func getLevelByAcres (acres) = {
177168 let acr = ((acres + 99999999) / M8_)
178169 func checker (acc,item) = if ((item >= acr))
179170 then acc
180171 else (acc + 1)
181172
182173 let $l = levelAcres
183174 let $s = size($l)
184175 let $acc0 = 0
185176 func $f0_1 ($a,$i) = if (($i >= $s))
186177 then $a
187178 else checker($a, $l[$i])
188179
189180 func $f0_2 ($a,$i) = if (($i >= $s))
190181 then $a
191182 else throw("List size exceeds 10")
192183
193184 $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)
194185 }
195186
196187
197188 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
198189
199190
200191 func prolog (i) = if (if ((i.originCaller != rest2Contract))
201192 then valueOrElse(getBoolean(keyBlocked()), false)
202193 else false)
203194 then throw("Contracts are under maintenance")
204195 else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
205196
206197
207-func stakeAcresInternal (amt,address) = {
198+func stakeUnstakeAcresInternal (amt,address) = {
208199 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
209200 if ((wlgResult == wlgResult))
210201 then {
211202 let now = lastBlock.timestamp
212203 let timeKey = keyAcresStakedTimeByUser(address)
213204 let amountKey = keyAcresStakedAmtByUser(address)
214- let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + amt)
215- let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
216- let userFpKey = keyFarmingPowerByUser(address)
217- let oldFp = valueOrElse(getInteger(userFpKey), 0)
218- let newFp = getFarmingPowerByAcres(newAcresAmount)
219- let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
220- $Tuple2([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt)), IntegerEntry(userFpKey, newFp), IntegerEntry(totalFarmingPowerKey, ((oldTotalFp - oldFp) + newFp))], wlgResult)
205+ let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
206+ if (if ((0 > amt))
207+ then (0 > (oldAcresAmount + amt))
208+ else false)
209+ then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(-(amt), 8)))
210+ else {
211+ let newAcresAmount = (oldAcresAmount + amt)
212+ let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
213+ let userFpKey = keyFarmingPowerByUser(address)
214+ let oldFp = valueOrElse(getInteger(userFpKey), 0)
215+ let newFp = getFarmingPowerByAcres(newAcresAmount)
216+ let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
217+ $Tuple2([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt)), IntegerEntry(userFpKey, newFp), IntegerEntry(totalFarmingPowerKey, ((oldTotalFp - oldFp) + newFp))], wlgResult)
218+ }
221219 }
222220 else throw("Strict value is not equal to itself.")
223221 }
224222
225223
226224 func getWlgPrice (usdtBalanceCorrection) = {
227225 let issuedAmount = valueOrErrorMessage(getInteger(wlgContract, wlgIssuedAmtKey), "WLGOLD is not issued yet")
228226 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
229227 let acres2Usd = (assetBalance(acres2Contract, usdtAssetId) - usdtBalanceCorrection)
230228 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
231229 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
232230 fraction(totalFundsUsd, MULT8, issuedAmount)
233231 }
234232
235233
236-func keyLastAcresSellTimeByUser (addr) = ("lastAcresSellTimeUser_" + addr)
234+let keyLastAcresSellTime = "lastAcresSellTime"
237235
236+let keyLastLimitLeft = "lastLimitLeft"
238237
239-func getSwapLimitAcres (addr) = {
240- let lastTime = valueOrElse(getInteger(keyLastAcresSellTimeByUser(addr)), 0)
238+let keyLastSavedTVL = "lastSavedTVL"
239+
240+func getSwapLimitAcres () = {
241+ let wlgUsd = assetBalance(wlgContract, usdtAssetId)
242+ let acres2Usd = assetBalance(this, usdtAssetId)
243+ let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
244+ let newTVL = ((acres2Usd + wlgUsd) + investFundTotal)
245+ let defaultLimit = (newTVL / ONE_PERCENT_DIVISOR)
246+ let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
247+ let lastTVL = valueOrElse(getInteger(keyLastSavedTVL), newTVL)
248+ let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
241249 let now = lastBlock.timestamp
242- if ((arbitrageDelay > (now - lastTime)))
243- then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "min"))
244- else {
245- let wlgUsd = assetBalance(wlgContract, usdtAssetId)
246- let acres2Usd = assetBalance(this, usdtAssetId)
247- let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
248- (((acres2Usd + wlgUsd) + investFundTotal) / ACRES_LIMIT_DIVISOR)
249- }
250+ let currentLimit = (lastLimitLeft + fraction(lastTVL, (lastTime - now), (DAY_MILLIS * ONE_PERCENT_DIVISOR)))
251+ let limitLeftUsdt = min([currentLimit, defaultLimit])
252+ $Tuple2([IntegerEntry(keyLastLimitLeft, limitLeftUsdt), IntegerEntry(keyLastSavedTVL, lastTVL), IntegerEntry(keyLastAcresSellTime, now)], (limitLeftUsdt * USDT2ACRES_MULTIPLIER))
250253 }
251254
252255
253256 @Callable(i)
254257 func saveLastTx () = if (!(containsElement([wlgContract], i.caller)))
255258 then throw("Access denied")
256259 else $Tuple2(prolog(i), 42)
257260
258261
259262
260263 @Callable(i)
261264 func constructorV1 (rest2Addr,oldAcrContract) = if ((i.caller != this))
262265 then throw("Permission denied")
263266 else {
264267 let oldAcrContAddr = addressFromStringValue(oldAcrContract)
265268 [IntegerEntry(acresIssuedAmountKey, getIntegerValue(oldAcrContAddr, acresIssuedAmountKey)), BinaryEntry(acresAssetIdKey, getBinaryValue(oldAcrContAddr, acresAssetIdKey)), StringEntry(keyRest2Address(), rest2Addr), StringEntry(oldAcresContractKey, oldAcrContract)]
266269 }
267270
268271
269272
270273 @Callable(i)
271-func saveInteger (key,amount) = if ((i.caller != this))
272- then throw("saveInteger is not public method")
273- else [IntegerEntry(key, amount)]
274-
275-
276-
277-@Callable(i)
278274 func setBlocked (isBlocked) = if ((i.caller != this))
279275 then throw("permission denied")
280276 else [BooleanEntry(keyBlocked(), isBlocked)]
281277
282278
283279
284280 @Callable(i)
285281 func unstakeAcres (amount) = {
286282 let prologActions = prolog(i)
287283 if ((0 >= amount))
288284 then throw("Amount should be positive")
289285 else {
290286 let address = toString(i.caller)
291287 if ((size(i.payments) != 0))
292288 then throw("No payments required")
293289 else {
294- let timeKey = keyAcresStakedTimeByUser(address)
295- let amountKey = keyAcresStakedAmtByUser(address)
296- let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
297- if ((amount > oldAcresAmount))
298- then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(amount, 8)))
299- else {
300- let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
301- let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
302- let newAcresAmount = (oldAcresAmount - amount)
303- let userFpKey = keyFarmingPowerByUser(address)
304- let oldFp = valueOrElse(getInteger(userFpKey), 0)
305- let newFp = getFarmingPowerByAcres(newAcresAmount)
306- let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
307- $Tuple2(([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(amountKey, (oldAcresAmount - amount)), IntegerEntry(acresStakdTotalKey, (oldTotal - amount)), IntegerEntry(userFpKey, newFp), IntegerEntry(totalFarmingPowerKey, ((oldTotalFp - oldFp) + newFp)), ScriptTransfer(i.caller, amount, acresAssetId)] ++ prologActions), wlgResult)
308- }
290+ let $t047524829 = stakeUnstakeAcresInternal(-(amount), address)
291+ let actions = $t047524829._1
292+ let wlgClaimedAmount = $t047524829._2
293+ $Tuple2(((actions :+ ScriptTransfer(i.caller, amount, acresAssetId)) ++ prologActions), wlgClaimedAmount)
309294 }
310295 }
311296 }
312297
313298
314299
315300 @Callable(i)
316301 func stakeAcres () = {
317302 let prologActions = prolog(i)
318303 let address = toString(i.caller)
319304 if ((size(i.payments) != 1))
320305 then throw("exactly 1 payment must be attached")
321306 else {
322307 let pmt = i.payments[0]
323308 let amt = pmt.amount
324309 if (if (!(isDefined(pmt.assetId)))
325310 then true
326311 else (value(pmt.assetId) != acresAssetId))
327312 then throw("ACRES payments only!")
328313 else {
329- let $t053465412 = stakeAcresInternal(amt, address)
330- let actions = $t053465412._1
331- let wlgClaimedAmount = $t053465412._2
314+ let $t052805353 = stakeUnstakeAcresInternal(amt, address)
315+ let actions = $t052805353._1
316+ let wlgClaimedAmount = $t052805353._2
332317 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
333318 }
334319 }
335320 }
336321
337322
338323
339324 @Callable(i)
340325 func buyAcres () = {
341326 let prologActions = prolog(i)
342327 if ((size(i.payments) != 1))
343328 then throw("exactly 1 payment must be attached")
344329 else {
345330 let pmt = i.payments[0]
346331 let usdtAmount = pmt.amount
347332 if (if (!(isDefined(pmt.assetId)))
348333 then true
349334 else (value(pmt.assetId) != usdtAssetId))
350335 then throw("USDT payments only!")
351336 else if ((MULT6 > usdtAmount))
352337 then throw((("Min payment should be " + fixedPoint(MULT6, 6)) + " USDT"))
353338 else {
354339 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
355340 let wlgAmount = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
356341 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
357342 let req = invoke(oldAcresAddress, "requestAcresCallback", [acresAmount], nil)
358343 if ((req == req))
359344 then {
360345 let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [wlgAmount], nil))
361346 $Tuple2(([ScriptTransfer(i.caller, acresAmount, acresAssetId)] ++ prologActions), wlgRemain)
362347 }
363348 else throw("Strict value is not equal to itself.")
364349 }
365350 }
366351 }
367352
368353
369354
370355 @Callable(i)
371356 func buyAcresREADONLY (usdtAmount) = {
372357 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
373358 let wlgToBurn = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
374359 $Tuple2(nil, [acresAmount, MULT6, acresAmount, wlgToBurn])
375360 }
376361
377362
378363
379364 @Callable(i)
380365 func sellAcres () = {
381366 let prologActions = prolog(i)
382367 if ((size(i.payments) != 1))
383368 then throw("exactly 1 payment must be attached")
384369 else {
385370 let pmt = i.payments[0]
386371 let acresAmount = pmt.amount
387372 if (if (!(isDefined(pmt.assetId)))
388373 then true
389374 else (value(pmt.assetId) != acresAssetId))
390375 then throw("ACRES payments only!")
391376 else if ((MULT7 > acresAmount))
392377 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
393378 else {
394379 let addr = toString(i.caller)
395- let maxAcres = getSwapLimitAcres(addr)
380+ let $t072107260 = getSwapLimitAcres()
381+ let limitActions = $t072107260._1
382+ let maxAcres = $t072107260._2
396383 if ((acresAmount > maxAcres))
397384 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
398385 else {
399386 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
400- $Tuple2(([IntegerEntry(keyLastAcresSellTimeByUser(addr), lastBlock.timestamp), ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
387+ $Tuple2(((limitActions :+ ScriptTransfer(i.caller, usdtAmount, usdtAssetId)) ++ prologActions), usdtAmount)
401388 }
402389 }
403390 }
404391 }
405392
406393
407394
408395 @Callable(i)
409396 func sellAcresREADONLY (address,acresAmount) = {
410- let maxAcres = getSwapLimitAcres(address)
397+ let $t076467696 = getSwapLimitAcres()
398+ let limitActions = $t076467696._1
399+ let maxAcres = $t076467696._2
411400 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
412401 $Tuple2(nil, [usdtAmount, MULT7, maxAcres, 0])
413402 }
414403
415404
416405
417406 @Callable(i)
418407 func convertOldStakes () = {
419408 let address = toString(i.caller)
420409 if ((size(i.payments) != 0))
421410 then throw("No payments required")
422411 else {
423412 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
424413 let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
425414 let gotAcres0 = if ((amount > 0))
426415 then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
427416 else $Tuple2(0, 0)
428417 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
429418 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
430419 let landsResult = if (isDefined(landsStr))
431420 then {
432421 let lands = split_51C(value(landsStr), "_")
433422 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
434423 then throw("landAssetId is required")
435424 else {
436425 let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
437426 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
438427 }
439428
440429 let rr = {
441430 let $l = lands
442431 let $s = size($l)
443432 let $acc0 = $Tuple4(0, 0, 0, 0)
444433 func $f0_1 ($a,$i) = if (($i >= $s))
445434 then $a
446435 else oneLand($a, $l[$i])
447436
448437 func $f0_2 ($a,$i) = if (($i >= $s))
449438 then $a
450439 else throw("List size exceeds 100")
451440
452441 $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)
453442 }
454443 let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
455444 if ((finalize == finalize))
456445 then {
457446 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
458447 if ((req == req))
459448 then {
460449 let issue = Issue("FPOWER10", "FarmingPower +10% NFT for WavesLands game", 1, 0, false)
461450 $Tuple5(rr._1, rr._2, rr._3, rr._4, [issue, ScriptTransfer(i.caller, 1, calculateAssetId(issue))])
462451 }
463452 else throw("Strict value is not equal to itself.")
464453 }
465454 else throw("Strict value is not equal to itself.")
466455 }
467456 else $Tuple5(0, 0, 0, 0, nil)
468457 let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
469458 let duckResult = if ((duckAssetId != ""))
470459 then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
471460 else $Tuple3(0, 0, 0)
472- let x = stakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
461+ let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
473462 $Tuple2((landsResult._5 ++ x._1), x._2)
474463 }
475464 }
476465
477466
478467
479468 @Callable(i)
480469 func unstakeLandsREADONLY (address) = {
481470 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
482471 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
483472 let landsResult = if (isDefined(landsStr))
484473 then {
485474 let lands = split_51C(value(landsStr), "_")
486475 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
487476 then throw("landAssetId is required")
488477 else {
489478 let r = asTuple4Ints(invoke(oldStakingAddress, "unstakeLandREADONLY", [landAssetId, address], nil))
490479 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
491480 }
492481
493482 let $l = lands
494483 let $s = size($l)
495484 let $acc0 = $Tuple4(0, 0, 0, 0)
496485 func $f0_1 ($a,$i) = if (($i >= $s))
497486 then $a
498487 else oneLand($a, $l[$i])
499488
500489 func $f0_2 ($a,$i) = if (($i >= $s))
501490 then $a
502491 else throw("List size exceeds 100")
503492
504493 $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)
505494 }
506495 else $Tuple4(0, 0, 0, 0)
507496 $Tuple2(nil, landsResult)
508497 }
509498
510499
511500
512501 @Callable(i)
513502 func stakeAcresCallback (addr) = if ((i.caller != addressFromStringValue(oldStakingContractStr)))
514503 then throw("Permission denied")
515- else stakeAcresInternal(i.payments[0].amount, addr)
504+ else stakeUnstakeAcresInternal(i.payments[0].amount, addr)
516505
517506
518507
519508 @Callable(i)
520509 func simulateStakeAcresREADONLY (address,addedAmount) = {
521510 let amountKey = keyAcresStakedAmtByUser(address)
522511 let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + addedAmount)
523512 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
524513 let userFpKey = keyFarmingPowerByUser(address)
525514 let oldFp = valueOrElse(getInteger(userFpKey), 0)
526515 let newFp = getFarmingPowerByAcres(newAcresAmount)
527516 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
528517 let newTotalFp = ((oldTotalFp - oldFp) + newFp)
529518 $Tuple2(nil, [oldFp, newFp, oldTotalFp, newTotalFp])
530519 }
531520
532521

github/deemru/w8io/169f3d6 
114.23 ms