tx · CHgYFmgf7FyQfZSVTYNKVTAN6q3ey6uUCAUWGipqP3mx

3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh:  -0.01600000 Waves

2024.11.11 01:54 [3365978] smart account 3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh > SELF 0.00000000 Waves

{ "type": 13, "id": "CHgYFmgf7FyQfZSVTYNKVTAN6q3ey6uUCAUWGipqP3mx", "fee": 1600000, "feeAssetId": null, "timestamp": 1731279306145, "version": 2, "chainId": 84, "sender": "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh", "senderPublicKey": "3QtfC1XbLZXdeawMDeSERy9vvjUmj1XYd2GFmrvx7pWQ", "proofs": [ "4QLKWZGr55XT2GmsTWmJMdwhr4gqhaKc6eSnFX8BtytPY672wErBPJ1qJF63xZ3J2TAj4R9cpRCvHRLnyS6eMWEk" ], "script": "base64:BgI3CAISABIECgIICBIDCgEEEgMKAQESABIAEgMKAQESABIECgIIARIAEgMKAQgSAwoBCBIECgIIATgAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDcAgK3iBAAFTVVMVDgAgMLXLwAKREFZX01JTExJUwCAuJkpABVVU0RUMkFDUkVTX01VTFRJUExJRVIACgATT05FX1BFUkNFTlRfRElWSVNPUgBkAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BGd1l0YThiaUV6MzF6cGVGZTVESks4d0U1dHJTcFFWRjgDCQAAAgEBVAUHJG1hdGNoMAIjM043VXVZYXI2MjY0UDU4RkJoVldLUFFBaDRZdWEyaGduZ3YJAAIBAg1Vbmtub3duIGNoYWluABVvbGRTdGFraW5nQ29udHJhY3RTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQTG5jWHRTMVU4M0Q2Y1FiRkQzSDhyQkhQTGd6eFNGS1oxAwkAAAIBAVQFByRtYXRjaDACIzNOREN5Qkc1cTg1SnVhUmlpZ1VlRXRhaW55akNRVDNYcFptCQACAQINVW5rbm93biBjaGFpbgEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEElkeENmZ0FjcmVzMkRhcHAAAQANSWR4Q2ZnV2xnRGFwcAACABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAFAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBD2tleVJlc3QyQWRkcmVzcwACDSVzX19yZXN0MkFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAghyZXN0MkNmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCHJlc3QyQ2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAIcmVzdDJDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDXJlc3QyQ29udHJhY3QADmFjcmVzMkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFEElkeENmZ0FjcmVzMkRhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFDUlkeENmZ1dsZ0RhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBRRJZHhDZmdJbnZlc3RGdW5kRGFwcAATb2xkQWNyZXNDb250cmFjdEtleQIQb2xkQWNyZXNDb250cmFjdAEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBEWtleUxhc3RUeElkQnlVc2VyAQRhZGRyCQCsAgICD2xhc3RUeElkQnlVc2VyXwUEYWRkcgAUYWNyZXNJc3N1ZWRBbW91bnRLZXkCEWFjcmVzSXNzdWVkQW1vdW50AA9hY3Jlc0Fzc2V0SWRLZXkCDGFjcmVzQXNzZXRJZAAMYWNyZXNBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgUOYWNy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BQAGAAcACAAJAAoBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBWFjcmVzCQBoAgkAaAIFBWFjcmVzABQJAGQCCQEPZ2V0TGV2ZWxCeUFjcmVzAQUFYWNyZXMABAEGcHJvbG9nAQFpAwMJAQIhPQIIBQFpDG9yaWdpbkNhbGxlcgUNcmVzdDJDb250cmFjdAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEKa2V5QmxvY2tlZAAHBwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhc3RUeElkQnlVc2VyAQkApQgBCAUBaQxvcmlnaW5DYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsARlzdGFrZVVuc3Rha2VBY3Jlc0ludGVybmFsAgNhbXQHYWRkcmVzcwQJd2xnUmVzdWx0CQD8BwQFC3dsZ0NvbnRyYWN0AhJvblN0YWtlVW5zdGFrZUxhbmQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUJd2xnUmVzdWx0BQl3bGdSZXN1bHQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEB3RpbWVLZXkJARhrZXlBY3Jlc1N0YWtlZFRpbWVCeVVzZXIBBQdhZGRyZXNzBAlhbW91bnRLZXkJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFB2FkZHJlc3MEDm9sZEFjcmVzQW1vdW50CQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAAAwMJAGYCAAAFA2FtdAkAZgIAAAkAZAIFDm9sZEFjcmVzQW1vdW50BQNhbXQHCQACAQkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAQpmaXhlZFBvaW50AgUOb2xkQWNyZXNBbW91bnQACAIgIEFDUkVTIHN0YWtlZCwgdHJpZWQgdG8gdW5zdGFrZSAJAQpmaXhlZFBvaW50AgkBAS0BBQNhbXQACAQObmV3QWNyZXNBbW91bnQJAGQCBQ5vbGRBY3Jlc0Ftb3VudAUDYW10BAhvbGRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJhY3Jlc1N0YWtkVG90YWxLZXkAAAQJdXNlckZwS2V5CQEVa2V5RmFybWluZ1Bvd2VyQnlVc2VyAQUHYWRkcmVzcwQFb2xkRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJdXNlckZwS2V5AAAEBW5ld0ZwCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFDm5ld0FjcmVzQW1vdW50BApvbGRUb3RhbEZwCQELdmFsdWVPckVsc2UCCQCfCAEFFHRvdGFsRmFybWluZ1Bvd2VyS2V5AAAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIFCWFtb3VudEtleQUObmV3QWNyZXNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEmFjcmVzU3Rha2RUb3RhbEtleQkAZAIFCG9sZFRvdGFsBQNhbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFCXVzZXJGcEtleQUFbmV3RnAJAMwIAgkBDEludGVnZXJFbnRyeQIFFHRvdGFsRmFybWluZ1Bvd2VyS2V5CQBkAgkAZQIFCm9sZFRvdGFsRnAFBW9sZEZwBQVuZXdGcAUDbmlsBQl3bGdSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BC2dldFdsZ1ByaWNlARV1c2R0QmFsYW5jZUNvcnJlY3Rpb24EDGlzc3VlZEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFC3dsZ0NvbnRyYWN0BQ93bGdJc3N1ZWRBbXRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQGd2xnVXNkCQDwBwIFC3dsZ0NvbnRyYWN0BQt1c2R0QXNzZXRJZAQJYWNyZXMyVXNkCQBlAgkA8AcCBQ5hY3JlczJDb250cmFjdAULdXNkdEFzc2V0SWQFFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRJpbnZlc3RGdW5kQ29udHJhY3QFC3VzZHRBc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFEmludmVzdEZ1bmRDb250cmFjdAUOemJJc3N1ZWRBbXRLZXkAAAQNdG90YWxGdW5kc1VzZAkAZAIJAGQCBQlhY3JlczJVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsCQBrAwUNdG90YWxGdW5kc1VzZAUFTVVMVDgFDGlzc3VlZEFtb3VudAAUa2V5TGFzdEFjcmVzU2VsbFRpbWUCEWxhc3RBY3Jlc1NlbGxUaW1lABBrZXlMYXN0TGltaXRMZWZ0Ag1sYXN0TGltaXRMZWZ0AA9rZXlMYXN0U2F2ZWRUVkwCDGxhc3RTYXZlZFRWTAERZ2V0U3dhcExpbWl0QWNyZXMABAZ3bGdVc2QJAPAHAgULd2xnQ29udHJhY3QFC3VzZHRBc3NldElkBAlhY3JlczJVc2QJAPAHAgUEdGhpcwULdXNkdEFzc2V0SWQED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgUSaW52ZXN0RnVuZENvbnRyYWN0BQt1c2R0QXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJpbnZlc3RGdW5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEBm5ld1RWTAkAZAIJAGQCBQlhY3JlczJVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsBAxkZWZhdWx0TGltaXQJAGkCBQZuZXdUVkwFE09ORV9QRVJDRU5UX0RJVklTT1IEDWxhc3RMaW1pdExlZnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUQa2V5TGFzdExpbWl0TGVmdAUMZGVmYXVsdExpbWl0BAdsYXN0VFZMCQELdmFsdWVPckVsc2UCCQCfCAEFD2tleUxhc3RTYXZlZFRWTAUGbmV3VFZMBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBRRrZXlMYXN0QWNyZXNTZWxsVGltZQAABANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAxjdXJyZW50TGltaXQJAGQCBQ1sYXN0TGltaXRMZWZ0CQBrAwUHbGFzdFRWTAkAZQIFA25vdwUIbGFzdFRpbWUJAGgCBQpEQVlfTUlMTElTBRNPTkVfUEVSQ0VOVF9ESVZJU09SBA1saW1pdExlZnRVc2R0CQCXAwEJAMwIAgUMY3VycmVudExpbWl0CQDMCAIFDGRlZmF1bHRMaW1pdAUDbmlsCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleUxhc3RMaW1pdExlZnQFDWxpbWl0TGVmdFVzZHQJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tleUxhc3RTYXZlZFRWTAUHbGFzdFRWTAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5TGFzdEFjcmVzU2VsbFRpbWUFA25vdwUDbmlsCQBoAgUNbGltaXRMZWZ0VXNkdAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSDQFpAQpzYXZlTGFzdFR4AAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgULd2xnQ29udHJhY3QFA25pbAgFAWkGY2FsbGVyCQACAQINQWNjZXNzIGRlbmllZAkAlAoCCQEGcHJvbG9nAQUBaQAqAWkBDWNvbnN0cnVjdG9yVjECCXJlc3QyQWRkcg5vbGRBY3JDb250cmFjdAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA5vbGRBY3JDb250QWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUOb2xkQWNyQ29udHJhY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFFGFjcmVzSXNzdWVkQW1vdW50S2V5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ5vbGRBY3JDb250QWRkcgUUYWNyZXNJc3N1ZWRBbW91bnRLZXkJAMwIAgkBC0JpbmFyeUVudHJ5AgUPYWNyZXNBc3NldElkS2V5CQERQGV4dHJOYXRpdmUoMTA1MikCBQ5vbGRBY3JDb250QWRkcgUPYWNyZXNBc3NldElkS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlSZXN0MkFkZHJlc3MABQlyZXN0MkFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUTb2xkQWNyZXNDb250cmFjdEtleQUOb2xkQWNyQ29udHJhY3QFA25pbAFpAQpzZXRCbG9ja2VkAQlpc0Jsb2NrZWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCmtleUJsb2NrZWQABQlpc0Jsb2NrZWQFA25pbAFpAQx1bnN0YWtlQWNyZXMBBmFtb3VudAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQBnAgAABQZhbW91bnQJAAIBAhlBbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAskdDA0NzUyNDgyOQkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwCCQEBLQEFBmFtb3VudAUHYWRkcmVzcwQHYWN0aW9ucwgFCyR0MDQ3NTI0ODI5Al8xBBB3bGdDbGFpbWVkQW1vdW50CAULJHQwNDc1MjQ4MjkCXzIJAJQKAgkAzggCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGYW1vdW50BQxhY3Jlc0Fzc2V0SWQFDXByb2xvZ0FjdGlvbnMFEHdsZ0NsYWltZWRBbW91bnQBaQEKc3Rha2VBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUMYWNyZXNBc3NldElkCQACAQIUQUNSRVMgcGF5bWVudHMgb25seSEECyR0MDUyODA1MzUzCQEZc3Rha2VVbnN0YWtlQWNyZXNJbnRlcm5hbAIFA2FtdAUHYWRkcmVzcwQHYWN0aW9ucwgFCyR0MDUyODA1MzUzAl8xBBB3bGdDbGFpbWVkQW1vdW50CAULJHQwNTI4MDUzNTMCXzIJAJQKAgkAzggCBQdhY3Rpb25zBQ1wcm9sb2dBY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCGJ1eUFjcmVzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQKdXNkdEFtb3VudAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEDCQBmAgUFTVVMVDYFCnVzZHRBbW91bnQJAAIBCQCsAgIJAKwCAgIWTWluIHBheW1lbnQgc2hvdWxkIGJlIAkBCmZpeGVkUG9pbnQCBQVNVUxUNgAGAgUgVVNEVAQLYWNyZXNBbW91bnQJAGgCBQp1c2R0QW1vdW50BRVVU0RUMkFDUkVTX01VTFRJUExJRVIECXdsZ0Ftb3VudAkAawMFCnVzZHRBbW91bnQFBU1VTFQ4CQELZ2V0V2xnUHJpY2UBBQp1c2R0QW1vdW50BA9vbGRBY3Jlc0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFE29sZEFjcmVzQ29udHJhY3RLZXkEA3JlcQkA/AcEBQ9vbGRBY3Jlc0FkZHJlc3MCFHJlcXVlc3RBY3Jlc0NhbGxiYWNrCQDMCAIFC2FjcmVzQW1vdW50BQNuaWwFA25pbAMJAAACBQNyZXEFA3JlcQQJd2xnUmVtYWluCQEFYXNJbnQBCQD8BwQFC3dsZ0NvbnRyYWN0AgpidXJuV2xnb2xkCQDMCAIFCXdsZ0Ftb3VudAUDbmlsBQNuaWwJAJQKAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULYWNyZXNBbW91bnQFDGFjcmVzQXNzZXRJZAUDbmlsBQ1wcm9sb2dBY3Rpb25zBQl3bGdSZW1haW4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQYnV5QWNyZXNSRUFET05MWQEKdXNkdEFtb3VudAQLYWNyZXNBbW91bnQJAGgCBQp1c2R0QW1vdW50BRVVU0RUMkFDUkVTX01VTFRJUExJRVIECXdsZ1RvQnVybgkAawMFCnVzZHRBbW91bnQFBU1VTFQ4CQELZ2V0V2xnUHJpY2UBBQp1c2R0QW1vdW50CQCUCgIFA25pbAkAzAgCBQthY3Jlc0Ftb3VudAkAzAgCBQVNVUxUNgkAzAgCBQthY3Jlc0Ftb3VudAkAzAgCBQl3bGdUb0J1cm4FA25pbAFpAQlzZWxsQWNyZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAthY3Jlc0Ftb3VudAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQxhY3Jlc0Fzc2V0SWQJAAIBAhRBQ1JFUyBwYXltZW50cyBvbmx5IQMJAGYCBQVNVUxUNwULYWNyZXNBbW91bnQJAAIBCQCsAgIJAKwCAgIWTWluIHBheW1lbnQgc2hvdWxkIGJlIAkBCmZpeGVkUG9pbnQCBQVNVUxUNwAIAgYgQUNSRVMEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAskdDA3MjEwNzI2MAkBEWdldFN3YXBMaW1pdEFjcmVzAAQMbGltaXRBY3Rpb25zCAULJHQwNzIxMDcyNjACXzEECG1heEFjcmVzCAULJHQwNzIxMDcyNjACXzIDCQBmAgULYWNyZXNBbW91bnQFCG1heEFjcmVzCQACAQkArAICCQCsAgICEVlvdSBjYW4gc2VsbCBtYXggCQEKZml4ZWRQb2ludAIFCG1heEFjcmVzAAgCBiBBQ1JFUwQKdXNkdEFtb3VudAkAaQIJAGkCBQthY3Jlc0Ftb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAAIJAJQKAgkAzggCCQDNCAIFDGxpbWl0QWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQp1c2R0QW1vdW50BQt1c2R0QXNzZXRJZAUNcHJvbG9nQWN0aW9ucwUKdXNkdEFtb3VudAFpARFzZWxsQWNyZXNSRUFET05MWQIHYWRkcmVzcwthY3Jlc0Ftb3VudAQLJHQwNzY0Njc2OTYJARFnZXRTd2FwTGltaXRBY3JlcwAEDGxpbWl0QWN0aW9ucwgFCyR0MDc2NDY3Njk2Al8xBAhtYXhBY3JlcwgFCyR0MDc2NDY3Njk2Al8yBAp1c2R0QW1vdW50CQBpAgkAaQIFC2FjcmVzQW1vdW50BRVVU0RUMkFDUkVTX01VTFRJUExJRVIAAgkAlAoCBQNuaWwJAMwIAgUKdXNkdEFtb3VudAkAzAgCBQVNVUxUNwkAzAgCBQhtYXhBY3JlcwkAzAgCAAAFA25pbAFpARBjb252ZXJ0T2xkU3Rha2VzAAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECFFRlbXBvcmFyaWx5IGRpc2FibGVkBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBA9vbGRBY3Jlc0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFE29sZEFjcmVzQ29udHJhY3RLZXkEBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9vbGRBY3Jlc0FkZHJlc3MJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFB2FkZHJlc3MAAAQJZ290QWNyZXMwAwkAZgIFBmFtb3VudAAACQEMYXNUdXBsZTJJbnRzAQkA/AcEBQ9vbGRBY3Jlc0FkZHJlc3MCFHVuc3Rha2VBY3Jlc0NhbGxiYWNrCQDMCAIFBmFtb3VudAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAkAlAoCAAAAAAQRb2xkU3Rha2luZ0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFW9sZFN0YWtpbmdDb250cmFjdFN0cgQIbGFuZHNTdHIJAJ0IAgURb2xkU3Rha2luZ0FkZHJlc3MJARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBBQdhZGRyZXNzBAtsYW5kc1Jlc3VsdAMJAQlpc0RlZmluZWQBBQhsYW5kc1N0cgQFbGFuZHMJAL0JAgkBBXZhbHVlAQUIbGFuZHNTdHICAV8KAQdvbmVMYW5kAgNhY2MLbGFuZEFzc2V0SWQDCQAAAgULbGFuZEFzc2V0SWQCAAkAAgECF2xhbmRBc3NldElkIGlzIHJlcXVpcmVkBAFyCQEM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CAUCcnICXzMIBQJycgJfNAkAzAgCBQVpc3N1ZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQkAuAgBBQVpc3N1ZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCXCgUAAAAAAAAAAAUDbmlsBAtkdWNrQXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAnQgCBRFvbGRTdGFraW5nQWRkcmVzcwkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwIABApkdWNrUmVzdWx0AwkBAiE9AgULZHVja0Fzc2V0SWQCAAkBDGFzVHVwbGUzSW50cwEJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCE3Vuc3Rha2VEdWNrQ2FsbGJhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJUKAwAAAAAAAAQBeAkBGXN0YWtlVW5zdGFrZUFjcmVzSW50ZXJuYWwCCQBkAgkAZAIJAGQCCQBkAgkAZAIJAGQCCQBkAggFCWdvdEFjcmVzMAJfMQgFC2xhbmRzUmVzdWx0Al8xCAULbGFuZHNSZXN1bHQCXzIIBQtsYW5kc1Jlc3VsdAJfMwgFC2xhbmRzUmVzdWx0Al80CAUKZHVja1Jlc3VsdAJfMQgFCmR1Y2tSZXN1bHQCXzIIBQpkdWNrUmVzdWx0Al8zBQdhZGRyZXNzCQCUCgIJAM4IAggFC2xhbmRzUmVzdWx0Al81CAUBeAJfMQgFAXgCXzIBaQEUdW5zdGFrZUxhbmRzUkVBRE9OTFkBB2FkZHJlc3MEEW9sZFN0YWtpbmdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRVvbGRTdGFraW5nQ29udHJhY3RTdHIECGxhbmRzU3RyCQCdCAIFEW9sZFN0YWtpbmdBZGRyZXNzCQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUHYWRkcmVzcwQLbGFuZHNSZXN1bHQDCQEJaXNEZWZpbmVkAQUIbGFuZHNTdHIEBWxhbmRzCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfCgEHb25l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ZWRBbW91bnQECWFtb3VudEtleQkBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQUHYWRkcmVzcwQObmV3QWNyZXNBbW91bnQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAABQthZGRlZEFtb3VudAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSYWNyZXNTdGFrZFRvdGFsS2V5AAAECXVzZXJGcEtleQkBFWtleUZhcm1pbmdQb3dlckJ5VXNlcgEFB2FkZHJlc3MEBW9sZEZwCQELdmFsdWVPckVsc2UCCQCfCAEFCXVzZXJGcEtleQAABAVuZXdGcAkBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBQ5uZXdBY3Jlc0Ftb3VudAQKb2xkVG90YWxGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRR0b3RhbEZhcm1pbmdQb3dlcktleQAABApuZXdUb3RhbEZwCQBkAgkAZQIFCm9sZFRvdGFsRnAFBW9sZEZwBQVuZXdGcAkAlAoCBQNuaWwJAMwIAgUFb2xkRnAJAMwIAgUFbmV3RnAJAMwIAgUKb2xkVG90YWxGcAkAzAgCBQpuZXdUb3RhbEZwBQNuaWwAemZCHQ==", "height": 3365978, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HB2x49k7A9oWjG78FcVY4GPQte9cVqLnqDcVYPZ1Xu58 Next: 2xcrEprGkH6o3eoKGURZMJMmLxiW8yKd3rG3CRWyvBe8 Diff:
OldNewDifferences
404404
405405
406406 @Callable(i)
407-func convertOldStakes () = {
408- let address = toString(i.caller)
409- if ((size(i.payments) != 0))
410- then throw("No payments required")
411- else {
412- let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
413- let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
414- let gotAcres0 = if ((amount > 0))
415- then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
416- else $Tuple2(0, 0)
417- let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
418- let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
419- let landsResult = if (isDefined(landsStr))
420- then {
421- let lands = split_51C(value(landsStr), "_")
422- func oneLand (acc,landAssetId) = if ((landAssetId == ""))
423- then throw("landAssetId is required")
424- else {
425- let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
426- $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
407+func convertOldStakes () = if ((i.caller != this))
408+ then throw("Temporarily disabled")
409+ else {
410+ let address = toString(i.caller)
411+ if ((size(i.payments) != 0))
412+ then throw("No payments required")
413+ else {
414+ let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
415+ let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
416+ let gotAcres0 = if ((amount > 0))
417+ then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
418+ else $Tuple2(0, 0)
419+ let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
420+ let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
421+ let landsResult = if (isDefined(landsStr))
422+ then {
423+ let lands = split_51C(value(landsStr), "_")
424+ func oneLand (acc,landAssetId) = if ((landAssetId == ""))
425+ then throw("landAssetId is required")
426+ else {
427+ let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
428+ $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
429+ }
430+
431+ let rr = {
432+ let $l = lands
433+ let $s = size($l)
434+ let $acc0 = $Tuple4(0, 0, 0, 0)
435+ func $f0_1 ($a,$i) = if (($i >= $s))
436+ then $a
437+ else oneLand($a, $l[$i])
438+
439+ func $f0_2 ($a,$i) = if (($i >= $s))
440+ then $a
441+ else throw("List size exceeds 100")
442+
443+ $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)
427444 }
428-
429- let rr = {
430- let $l = lands
431- let $s = size($l)
432- let $acc0 = $Tuple4(0, 0, 0, 0)
433- func $f0_1 ($a,$i) = if (($i >= $s))
434- then $a
435- else oneLand($a, $l[$i])
436-
437- func $f0_2 ($a,$i) = if (($i >= $s))
438- then $a
439- else throw("List size exceeds 100")
440-
441- $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)
445+ let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
446+ if ((finalize == finalize))
447+ then {
448+ let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
449+ if ((req == req))
450+ then {
451+ let issue = Issue("FPOWER10", "FarmingPower +10% NFT for WavesLands game", 1, 0, false)
452+ $Tuple5(rr._1, rr._2, rr._3, rr._4, [issue, ScriptTransfer(i.caller, 1, calculateAssetId(issue))])
453+ }
454+ else throw("Strict value is not equal to itself.")
455+ }
456+ else throw("Strict value is not equal to itself.")
442457 }
443- let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
444- if ((finalize == finalize))
445- then {
446- let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
447- if ((req == req))
448- then {
449- let issue = Issue("FPOWER10", "FarmingPower +10% NFT for WavesLands game", 1, 0, false)
450- $Tuple5(rr._1, rr._2, rr._3, rr._4, [issue, ScriptTransfer(i.caller, 1, calculateAssetId(issue))])
451- }
452- else throw("Strict value is not equal to itself.")
453- }
454- else throw("Strict value is not equal to itself.")
455- }
456- else $Tuple5(0, 0, 0, 0, nil)
457- let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
458- let duckResult = if ((duckAssetId != ""))
459- then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
460- else $Tuple3(0, 0, 0)
461- let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
462- $Tuple2((landsResult._5 ++ x._1), x._2)
463- }
464- }
458+ else $Tuple5(0, 0, 0, 0, nil)
459+ let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
460+ let duckResult = if ((duckAssetId != ""))
461+ then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
462+ else $Tuple3(0, 0, 0)
463+ let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
464+ $Tuple2((landsResult._5 ++ x._1), x._2)
465+ }
466+ }
465467
466468
467469
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))
244244 let newTVL = ((acres2Usd + wlgUsd) + investFundTotal)
245245 let defaultLimit = (newTVL / ONE_PERCENT_DIVISOR)
246246 let lastLimitLeft = valueOrElse(getInteger(keyLastLimitLeft), defaultLimit)
247247 let lastTVL = valueOrElse(getInteger(keyLastSavedTVL), newTVL)
248248 let lastTime = valueOrElse(getInteger(keyLastAcresSellTime), 0)
249249 let now = lastBlock.timestamp
250250 let currentLimit = (lastLimitLeft + fraction(lastTVL, (now - lastTime), (DAY_MILLIS * ONE_PERCENT_DIVISOR)))
251251 let limitLeftUsdt = min([currentLimit, defaultLimit])
252252 $Tuple2([IntegerEntry(keyLastLimitLeft, limitLeftUsdt), IntegerEntry(keyLastSavedTVL, lastTVL), IntegerEntry(keyLastAcresSellTime, now)], (limitLeftUsdt * USDT2ACRES_MULTIPLIER))
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 {
290290 let $t047524829 = stakeUnstakeAcresInternal(-(amount), address)
291291 let actions = $t047524829._1
292292 let wlgClaimedAmount = $t047524829._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 {
314314 let $t052805353 = stakeUnstakeAcresInternal(amt, address)
315315 let actions = $t052805353._1
316316 let wlgClaimedAmount = $t052805353._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)
380380 let $t072107260 = getSwapLimitAcres()
381381 let limitActions = $t072107260._1
382382 let maxAcres = $t072107260._2
383383 if ((acresAmount > maxAcres))
384384 then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
385385 else {
386386 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
387387 $Tuple2(((limitActions :+ ScriptTransfer(i.caller, usdtAmount, usdtAssetId)) ++ prologActions), usdtAmount)
388388 }
389389 }
390390 }
391391 }
392392
393393
394394
395395 @Callable(i)
396396 func sellAcresREADONLY (address,acresAmount) = {
397397 let $t076467696 = getSwapLimitAcres()
398398 let limitActions = $t076467696._1
399399 let maxAcres = $t076467696._2
400400 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
401401 $Tuple2(nil, [usdtAmount, MULT7, maxAcres, 0])
402402 }
403403
404404
405405
406406 @Callable(i)
407-func convertOldStakes () = {
408- let address = toString(i.caller)
409- if ((size(i.payments) != 0))
410- then throw("No payments required")
411- else {
412- let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
413- let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
414- let gotAcres0 = if ((amount > 0))
415- then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
416- else $Tuple2(0, 0)
417- let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
418- let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
419- let landsResult = if (isDefined(landsStr))
420- then {
421- let lands = split_51C(value(landsStr), "_")
422- func oneLand (acc,landAssetId) = if ((landAssetId == ""))
423- then throw("landAssetId is required")
424- else {
425- let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
426- $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
407+func convertOldStakes () = if ((i.caller != this))
408+ then throw("Temporarily disabled")
409+ else {
410+ let address = toString(i.caller)
411+ if ((size(i.payments) != 0))
412+ then throw("No payments required")
413+ else {
414+ let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
415+ let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
416+ let gotAcres0 = if ((amount > 0))
417+ then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
418+ else $Tuple2(0, 0)
419+ let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
420+ let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
421+ let landsResult = if (isDefined(landsStr))
422+ then {
423+ let lands = split_51C(value(landsStr), "_")
424+ func oneLand (acc,landAssetId) = if ((landAssetId == ""))
425+ then throw("landAssetId is required")
426+ else {
427+ let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
428+ $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
429+ }
430+
431+ let rr = {
432+ let $l = lands
433+ let $s = size($l)
434+ let $acc0 = $Tuple4(0, 0, 0, 0)
435+ func $f0_1 ($a,$i) = if (($i >= $s))
436+ then $a
437+ else oneLand($a, $l[$i])
438+
439+ func $f0_2 ($a,$i) = if (($i >= $s))
440+ then $a
441+ else throw("List size exceeds 100")
442+
443+ $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)
427444 }
428-
429- let rr = {
430- let $l = lands
431- let $s = size($l)
432- let $acc0 = $Tuple4(0, 0, 0, 0)
433- func $f0_1 ($a,$i) = if (($i >= $s))
434- then $a
435- else oneLand($a, $l[$i])
436-
437- func $f0_2 ($a,$i) = if (($i >= $s))
438- then $a
439- else throw("List size exceeds 100")
440-
441- $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)
445+ let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
446+ if ((finalize == finalize))
447+ then {
448+ let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
449+ if ((req == req))
450+ then {
451+ let issue = Issue("FPOWER10", "FarmingPower +10% NFT for WavesLands game", 1, 0, false)
452+ $Tuple5(rr._1, rr._2, rr._3, rr._4, [issue, ScriptTransfer(i.caller, 1, calculateAssetId(issue))])
453+ }
454+ else throw("Strict value is not equal to itself.")
455+ }
456+ else throw("Strict value is not equal to itself.")
442457 }
443- let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
444- if ((finalize == finalize))
445- then {
446- let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
447- if ((req == req))
448- then {
449- let issue = Issue("FPOWER10", "FarmingPower +10% NFT for WavesLands game", 1, 0, false)
450- $Tuple5(rr._1, rr._2, rr._3, rr._4, [issue, ScriptTransfer(i.caller, 1, calculateAssetId(issue))])
451- }
452- else throw("Strict value is not equal to itself.")
453- }
454- else throw("Strict value is not equal to itself.")
455- }
456- else $Tuple5(0, 0, 0, 0, nil)
457- let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
458- let duckResult = if ((duckAssetId != ""))
459- then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
460- else $Tuple3(0, 0, 0)
461- let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
462- $Tuple2((landsResult._5 ++ x._1), x._2)
463- }
464- }
458+ else $Tuple5(0, 0, 0, 0, nil)
459+ let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
460+ let duckResult = if ((duckAssetId != ""))
461+ then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
462+ else $Tuple3(0, 0, 0)
463+ let x = stakeUnstakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
464+ $Tuple2((landsResult._5 ++ x._1), x._2)
465+ }
466+ }
465467
466468
467469
468470 @Callable(i)
469471 func unstakeLandsREADONLY (address) = {
470472 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
471473 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
472474 let landsResult = if (isDefined(landsStr))
473475 then {
474476 let lands = split_51C(value(landsStr), "_")
475477 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
476478 then throw("landAssetId is required")
477479 else {
478480 let r = asTuple4Ints(invoke(oldStakingAddress, "unstakeLandREADONLY", [landAssetId, address], nil))
479481 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
480482 }
481483
482484 let $l = lands
483485 let $s = size($l)
484486 let $acc0 = $Tuple4(0, 0, 0, 0)
485487 func $f0_1 ($a,$i) = if (($i >= $s))
486488 then $a
487489 else oneLand($a, $l[$i])
488490
489491 func $f0_2 ($a,$i) = if (($i >= $s))
490492 then $a
491493 else throw("List size exceeds 100")
492494
493495 $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)
494496 }
495497 else $Tuple4(0, 0, 0, 0)
496498 $Tuple2(nil, landsResult)
497499 }
498500
499501
500502
501503 @Callable(i)
502504 func stakeAcresCallback (addr) = if ((i.caller != addressFromStringValue(oldStakingContractStr)))
503505 then throw("Permission denied")
504506 else stakeUnstakeAcresInternal(i.payments[0].amount, addr)
505507
506508
507509
508510 @Callable(i)
509511 func simulateStakeAcresREADONLY (address,addedAmount) = {
510512 let amountKey = keyAcresStakedAmtByUser(address)
511513 let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + addedAmount)
512514 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
513515 let userFpKey = keyFarmingPowerByUser(address)
514516 let oldFp = valueOrElse(getInteger(userFpKey), 0)
515517 let newFp = getFarmingPowerByAcres(newAcresAmount)
516518 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
517519 let newTotalFp = ((oldTotalFp - oldFp) + newFp)
518520 $Tuple2(nil, [oldFp, newFp, oldTotalFp, newTotalFp])
519521 }
520522
521523

github/deemru/w8io/026f985 
52.70 ms