tx · GVi6WuHrgeKrY4qHr1Frevp3Z3jbVwSibLHicxWo4DHK

3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh:  -0.01600000 Waves

2024.10.25 18:44 [3342560] smart account 3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh > SELF 0.00000000 Waves

{ "type": 13, "id": "GVi6WuHrgeKrY4qHr1Frevp3Z3jbVwSibLHicxWo4DHK", "fee": 1600000, "feeAssetId": null, "timestamp": 1729871109242, "version": 2, "chainId": 84, "sender": "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh", "senderPublicKey": "3QtfC1XbLZXdeawMDeSERy9vvjUmj1XYd2GFmrvx7pWQ", "proofs": [ "3RX1rCZaFSM6apkipUwX5VhVPcz1AcTGDXVvYgCrFU1zXc18yyx7HqgzXv2keY6SQr2Ls5H81DAeBsKvKeyEHCNn" ], "script": "base64:BgI7CAISBAoCCAgSBAoCCAESAwoBBBIDCgEBEgASABIDCgEBEgASBAoCCAESABIDCgEIEgMKAQgSBAoCCAE3AANTRVACAl9fAAVNVUxUNgDAhD0ABU1VTFQ3AICt4gQABU1VTFQ4AIDC1y8ACkRBWV9NSUxMSVMAgLiZKQAVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAAoAE0FDUkVTX0xJTUlUX0RJVklTT1IACgAFY2hhaW4JAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAC3VzZHRBc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwASCE2nqyCAM/TtG7yo7ui5O8yYLdC136B5ao1CP5qA//uQMJAAACAQFUBQckbWF0Y2gwASBVsdifcoeC7+XjW42sBatl3ppDoS8WuwXzGreHpfHFGAkAAgECDVVua25vd24gY2hhaW4AFmRlZmF1bHRSZXN0MkFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQRndZdGE4YmlFejMxenBlRmU1REpLOHdFNXRyU3BRVkY4AwkAAAIBAVQFByRtYXRjaDACIzNON1V1WWFyNjI2NFA1OEZCaFZXS1BRQWg0WXVhMmhnbmd2CQACAQINVW5rbm93biBjaGFpbgAOYXJiaXRyYWdlRGVsYXkEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAFCkRBWV9NSUxMSVMDCQAAAgEBVAUHJG1hdGNoMADg1AMJAAIBAg1Vbmtub3duIGNoYWluABVvbGRTdGFraW5nQ29udHJhY3RTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQTG5jWHRTMVU4M0Q2Y1FiRkQzSDhyQkhQTGd6eFNGS1oxAwkAAAIBAVQFByRtYXRjaDACIzNOREN5Qkc1cTg1SnVhUmlpZ1VlRXRhaW55akNRVDNYcFptCQACAQINVW5rbm93biBjaGFpbgEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEElkeENmZ0FjcmVzMkRhcHAAAQANSWR4Q2ZnV2xnRGFwcAACABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAFAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBD2tleVJlc3QyQWRkcmVzcwACDSVzX19yZXN0MkFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAghyZXN0MkNmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCHJlc3QyQ2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAIcmVzdDJDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDXJlc3QyQ29udHJhY3QADmFjcmVzMkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFEElkeENmZ0FjcmVzMkRhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFDUlkeENmZ1dsZ0RhcHAAEmludmVzdEZ1bmRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBRRJZHhDZmdJbnZlc3RGdW5kRGFwcAATb2xkQWNyZXNDb250cmFjdEtleQIQb2xkQWNyZXNDb250cmFjdAEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBEWtleUxhc3RUeElkQnlVc2VyAQRhZGRyCQCsAgICD2xhc3RUeElkQnlVc2VyXwUEYWRkcgAUYWNyZXNJc3N1ZWRBbW91bnRLZXkCEWFjcmVzSXNzdWVkQW1vdW50AA9hY3Jlc0Fzc2V0SWRLZXkCDGFjcmVzQXNzZXRJZAAMYWNyZXNBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgUOYWNyZXMyQ29udHJhY3QFD2FjcmVzQXNzZXRJZEtleQIXQUNSRVMgaXMgbm90IGlzc3VlZCB5ZXQBGGtleUFjcmVzU3Rha2VkVGltZUJ5VXNlcgEEYWRkcgkArAICAhZhY3Jlc1N0YWtlZFRpbWVCeVVzZXJfBQRhZGRyARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBCW93bmVyQWRkcgkArAICAhNzdGFrZWRMYW5kc0J5T3duZXJfBQlvd25lckFkZHIBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEMYXNUdXBsZTVJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAhkoSW50LCBJbnQsIEludCwgSW50LCBJbnQpBAF0BQckbWF0Y2gwBQF0CQACAQIrZmFpbCB0byBjYXN0IGludG8gKEludCwgSW50LCBJbnQsIEludCwgSW50KQEMYXNUdXBsZTRJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAhQoSW50LCBJbnQsIEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECJmZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCwgSW50LCBJbnQpAQxhc1R1cGxlM0ludHMBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACDyhJbnQsIEludCwgSW50KQQBdAUHJG1hdGNoMAUBdAkAAgECIWZhaWwgdG8gY2FzdCBpbnRvIChJbnQsIEludCwgSW50KQEMYXNUdXBsZTJJbnRzAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBAF0BQckbWF0Y2gwBQF0CQACAQIcZmFpbCB0byBjYXN0IGludG8gKEludCwgSW50KQEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAdsb3dQYXJ0CQCkAwEJAGoCBQN2YWwFBnRlblBvdwQGemVyb2VzCQCwAgIJAKQDAQUGdGVuUG93CQBkAgABCQCxAgEFB2xvd1BhcnQJAKwCAgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuBQZ6ZXJvZXMFB2xvd1BhcnQAA004XwCAwtcvAA93bGdJc3N1ZWRBbXRLZXkCEHdsZ19pc3N1ZWRBbW91bnQADnpiSXNzdWVkQW10S2V5AhJ6YmlsbF9pc3N1ZWRBbW91bnQBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgEVa2V5RmFybWluZ1Bvd2VyQnlVc2VyAQRhZGRyCQCsAgICE2Zhcm1pbmdQb3dlckJ5VXNlcl8FBGFkZHIAEmFjcmVzU3Rha2RUb3RhbEtleQIWYWNyZXNTdGFrZWRBbW91bnRUb3RhbAAUdG90YWxGYXJtaW5nUG93ZXJLZXkCEXRvdGFsRmFybWluZ1Bvd2VyAApsZXZlbEFjcmVzCQDMCAIAAAkAzAgCAAoJAMwIAgAUCQDMCAIAKAkAzAgCAFAJAMwIAgCWAQkAzAgCAPoBCQDMCAIAkAMJAMwIAgC8BQkAzAgCAOgHBQNuaWwBD2dldExldmVsQnlBY3JlcwEFYWNyZXMEA2FjcgkAaQIJAGQCBQVhY3JlcwD/wdcvBQNNOF8KAQdjaGVja2VyAgNhY2MEaXRlbQMJAGcCBQRpdGVtBQNhY3IFA2FjYwkAZAIFA2FjYwABCgACJGwFCmxldmVsQWNyZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2NoZWNrZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBWFjcmVzCQBoAgkAaAIFBWFjcmVzABQJAGQCCQEPZ2V0TGV2ZWxCeUFjcmVzAQUFYWNyZXMABAEGcHJvbG9nAQFpAwMJAQIhPQIIBQFpDG9yaWdpbkNhbGxlcgUNcmVzdDJDb250cmFjdAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEKa2V5QmxvY2tlZAAHBwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhc3RUeElkQnlVc2VyAQkApQgBCAUBaQxvcmlnaW5DYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsARJzdGFrZUFjcmVzSW50ZXJuYWwCA2FtdAdhZGRyZXNzBAl3bGdSZXN1bHQJAPwHBAULd2xnQ29udHJhY3QCEm9uU3Rha2VVbnN0YWtlTGFuZAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAMJAAACBQl3bGdSZXN1bHQFCXdsZ1Jlc3VsdAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQHdGltZUtleQkBGGtleUFjcmVzU3Rha2VkVGltZUJ5VXNlcgEFB2FkZHJlc3MECWFtb3VudEtleQkBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQUHYWRkcmVzcwQObmV3QWNyZXNBbW91bnQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAABQNhbXQECG9sZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFEmFjcmVzU3Rha2RUb3RhbEtleQAABAl1c2VyRnBLZXkJARVrZXlGYXJtaW5nUG93ZXJCeVVzZXIBBQdhZGRyZXNzBAVvbGRGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQl1c2VyRnBLZXkAAAQFbmV3RnAJARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQUObmV3QWNyZXNBbW91bnQECm9sZFRvdGFsRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUdG90YWxGYXJtaW5nUG93ZXJLZXkAAAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd0aW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJYW1vdW50S2V5BQ5uZXdBY3Jlc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSYWNyZXNTdGFrZFRvdGFsS2V5CQBkAgUIb2xkVG90YWwFA2FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJdXNlckZwS2V5BQVuZXdGcAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUdG90YWxGYXJtaW5nUG93ZXJLZXkJAGQCCQBlAgUKb2xkVG90YWxGcAUFb2xkRnAFBW5ld0ZwBQNuaWwFCXdsZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELZ2V0V2xnUHJpY2UBFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQMaXNzdWVkQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgULd2xnQ29udHJhY3QFD3dsZ0lzc3VlZEFtdEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0BAZ3bGdVc2QJAPAHAgULd2xnQ29udHJhY3QFC3VzZHRBc3NldElkBAlhY3JlczJVc2QJAGUCCQDwBwIFDmFjcmVzMkNvbnRyYWN0BQt1c2R0QXNzZXRJZAUVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBA9pbnZlc3RGdW5kVG90YWwJAGQCCQDwBwIFEmludmVzdEZ1bmRDb250cmFjdAULdXNkdEFzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQ56Yklzc3VlZEFtdEtleQAABA10b3RhbEZ1bmRzVXNkCQBkAgkAZAIFCWFjcmVzMlVzZAUGd2xnVXNkBQ9pbnZlc3RGdW5kVG90YWwJAGsDBQ10b3RhbEZ1bmRzVXNkBQVNVUxUOAUMaXNzdWVkQW1vdW50ARprZXlMYXN0QWNyZXNTZWxsVGltZUJ5VXNlcgEEYWRkcgkArAICAhZsYXN0QWNyZXNTZWxsVGltZVVzZXJfBQRhZGRyARFnZXRTd2FwTGltaXRBY3JlcwEEYWRkcgQIbGFzdFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGmtleUxhc3RBY3Jlc1NlbGxUaW1lQnlVc2VyAQUEYWRkcgAABANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wAwkAZgIFDmFyYml0cmFnZURlbGF5CQBlAgUDbm93BQhsYXN0VGltZQkAAgEJAKwCAgkArAICAh9BcmJpdHJhZ2VzIGFyZSBwb3NzaWJsZSBvbmNlIGEgCQCkAwEJAGkCBQ5hcmJpdHJhZ2VEZWxheQDg1AMCA21pbgQGd2xnVXNkCQDwBwIFC3dsZ0NvbnRyYWN0BQt1c2R0QXNzZXRJZAQJYWNyZXMyVXNkCQDwBwIFBHRoaXMFC3VzZHRBc3NldElkBA9pbnZlc3RGdW5kVG90YWwJAGQCCQDwBwIFEmludmVzdEZ1bmRDb250cmFjdAULdXNkdEFzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQ56Yklzc3VlZEFtdEtleQAACQBpAgkAZAIJAGQCBQlhY3JlczJVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsBRNBQ1JFU19MSU1JVF9ESVZJU09SDQFpAQ1jb25zdHJ1Y3RvclYxAglyZXN0MkFkZHIOb2xkQWNyQ29udHJhY3QDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQOb2xkQWNyQ29udEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDm9sZEFjckNvbnRyYWN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRhY3Jlc0lzc3VlZEFtb3VudEtleQkBEUBleHRyTmF0aXZlKDEwNTApAgUOb2xkQWNyQ29udEFkZHIFFGFjcmVzSXNzdWVkQW1vdW50S2V5CQDMCAIJAQtCaW5hcnlFbnRyeQIFD2FjcmVzQXNzZXRJZEtleQkBEUBleHRyTmF0aXZlKDEwNTIpAgUOb2xkQWNyQ29udEFkZHIFD2FjcmVzQXNzZXRJZEtleQkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5UmVzdDJBZGRyZXNzAAUJcmVzdDJBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFE29sZEFjcmVzQ29udHJhY3RLZXkFDm9sZEFjckNvbnRyYWN0BQNuaWwBaQELc2F2ZUludGVnZXICA2tleQZhbW91bnQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAiBzYXZlSW50ZWdlciBpcyBub3QgcHVibGljIG1ldGhvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQZhbW91bnQFA25pbAFpAQpzZXRCbG9ja2VkAQlpc0Jsb2NrZWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCmtleUJsb2NrZWQABQlpc0Jsb2NrZWQFA25pbAFpAQx1bnN0YWtlQWNyZXMBBmFtb3VudAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQBnAgAABQZhbW91bnQJAAIBAhlBbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAd0aW1lS2V5CQEYa2V5QWNyZXNTdGFrZWRUaW1lQnlVc2VyAQUHYWRkcmVzcwQJYW1vdW50S2V5CQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQdhZGRyZXNzBA5vbGRBY3Jlc0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlhbW91bnRLZXkAAAMJAGYCBQZhbW91bnQFDm9sZEFjcmVzQW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIOWW91IGhhdmUgb25seSAJAQpmaXhlZFBvaW50AgUOb2xkQWNyZXNBbW91bnQACAIgIEFDUkVTIHN0YWtlZCwgdHJpZWQgdG8gdW5zdGFrZSAJAQpmaXhlZFBvaW50AgUGYW1vdW50AAgECG9sZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFEmFjcmVzU3Rha2RUb3RhbEtleQAABAl3bGdSZXN1bHQJAPwHBAULd2xnQ29udHJhY3QCEm9uU3Rha2VVbnN0YWtlTGFuZAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAQObmV3QWNyZXNBbW91bnQJAGUCBQ5vbGRBY3Jlc0Ftb3VudAUGYW1vdW50BAl1c2VyRnBLZXkJARVrZXlGYXJtaW5nUG93ZXJCeVVzZXIBBQdhZGRyZXNzBAVvbGRGcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQl1c2VyRnBLZXkAAAQFbmV3RnAJARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQUObmV3QWNyZXNBbW91bnQECm9sZFRvdGFsRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUdG90YWxGYXJtaW5nUG93ZXJLZXkAAAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlhbW91bnRLZXkJAGUCBQ5vbGRBY3Jlc0Ftb3VudAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJhY3Jlc1N0YWtkVG90YWxLZXkJAGUCBQhvbGRUb3RhbAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQl1c2VyRnBLZXkFBW5ld0ZwCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRR0b3RhbEZhcm1pbmdQb3dlcktleQkAZAIJAGUCBQpvbGRUb3RhbEZwBQVvbGRGcAUFbmV3RnAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQFDGFjcmVzQXNzZXRJZAUDbmlsBQ1wcm9sb2dBY3Rpb25zBQl3bGdSZXN1bHQBaQEKc3Rha2VBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUMYWNyZXNBc3NldElkCQACAQIUQUNSRVMgcGF5bWVudHMgb25seSEECyR0MDUxNzM1MjM5CQESc3Rha2VBY3Jlc0ludGVybmFsAgUDYW10BQdhZGRyZXNzBAdhY3Rpb25zCAULJHQwNTE3MzUyMzkCXzEEEHdsZ0NsYWltZWRBbW91bnQIBQskdDA1MTczNTIzOQJfMgkAlAoCCQDOCAIFB2FjdGlvbnMFDXByb2xvZ0FjdGlvbnMFEHdsZ0NsYWltZWRBbW91bnQBaQEIYnV5QWNyZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAp1c2R0QW1vdW50CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQMJAGYCBQVNVUxUNgUKdXNkdEFtb3VudAkAAgEJAKwCAgkArAICAhZNaW4gcGF5bWVudCBzaG91bGQgYmUgCQEKZml4ZWRQb2ludAIFBU1VTFQ2AAYCBSBVU0RUBAthY3Jlc0Ftb3VudAkAaAIFCnVzZHRBbW91bnQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgQJd2xnQW1vdW50CQBrAwUKdXNkdEFtb3VudAUFTVVMVDgJAQtnZXRXbGdQcmljZQEFCnVzZHRBbW91bnQED29sZEFjcmVzQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTgpAQUTb2xkQWNyZXNDb250cmFjdEtleQQDcmVxCQD8BwQFD29sZEFjcmVzQWRkcmVzcwIUcmVxdWVzdEFjcmVzQ2FsbGJhY2sJAMwIAgULYWNyZXNBbW91bnQFA25pbAUDbmlsAwkAAAIFA3JlcQUDcmVxBAl3bGdSZW1haW4JAQVhc0ludAEJAPwHBAULd2xnQ29udHJhY3QCCmJ1cm5XbGdvbGQJAMwIAgUJd2xnQW1vdW50BQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQthY3Jlc0Ftb3VudAUMYWNyZXNBc3NldElkBQNuaWwFDXByb2xvZ0FjdGlvbnMFCXdsZ1JlbWFpbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBidXlBY3Jlc1JFQURPTkxZAQp1c2R0QW1vdW50AwkAZgIFBU1VTFQ2BQp1c2R0QW1vdW50CQACAQkArAICCQCsAgICFk1pbiBwYXltZW50IHNob3VsZCBiZSAJAQpmaXhlZFBvaW50AgUFTVVMVDYABgIFIFVTRFQEC2FjcmVzQW1vdW50CQBoAgUKdXNkdEFtb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSBAl3bGdUb0J1cm4JAGsDBQp1c2R0QW1vdW50BQVNVUxUOAkBC2dldFdsZ1ByaWNlAQUKdXNkdEFtb3VudAkAlAoCBQNuaWwJAMwIAgULYWNyZXNBbW91bnQJAMwIAgUJd2xnVG9CdXJuBQNuaWwBaQEJc2VsbEFjcmVzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQLYWNyZXNBbW91bnQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUMYWNyZXNBc3NldElkCQACAQIUQUNSRVMgcGF5bWVudHMgb25seSEDCQBmAgUFTVVMVDcFC2FjcmVzQW1vdW50CQACAQkArAICCQCsAgICFk1pbiBwYXltZW50IHNob3VsZCBiZSAJAQpmaXhlZFBvaW50AgUFTVVMVDcACAIGIEFDUkVTBARhZGRyCQClCAEIBQFpBmNhbGxlcgQIbWF4QWNyZXMJARFnZXRTd2FwTGltaXRBY3JlcwEFBGFkZHIDCQBmAgULYWNyZXNBbW91bnQFCG1heEFjcmVzCQACAQkArAICCQCsAgICEVlvdSBjYW4gc2VsbCBtYXggCQEKZml4ZWRQb2ludAIFCG1heEFjcmVzAAgCBiBBQ1JFUwQKdXNkdEFtb3VudAkAaQIJAGkCBQthY3Jlc0Ftb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAAIJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5TGFzdEFjcmVzU2VsbFRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCnVzZHRBbW91bnQFC3VzZHRBc3NldElkBQNuaWwFDXByb2xvZ0FjdGlvbnMFCnVzZHRBbW91bnQBaQERc2VsbEFjcmVzUkVBRE9OTFkCB2FkZHJlc3MLYWNyZXNBbW91bnQDCQBmAgUFTVVMVDcFC2FjcmVzQW1vdW50CQACAQkArAICCQCsAgICFk1pbiBwYXltZW50IHNob3VsZCBiZSAJAQpmaXhlZFBvaW50AgUFTVVMVDcACAIGIEFDUkVTBAhtYXhBY3JlcwkBEWdldFN3YXBMaW1pdEFjcmVzAQUHYWRkcmVzcwQKdXNkdEFtb3VudAkAaQIJAGkCBQthY3Jlc0Ftb3VudAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAAIJAJQKAgUDbmlsCQDMCAIFCnVzZHRBbW91bnQJAMwIAgUIbWF4QWNyZXMFA25pbAFpARBjb252ZXJ0T2xkU3Rha2VzAAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQPb2xkQWNyZXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRNvbGRBY3Jlc0NvbnRyYWN0S2V5BAZhbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPb2xkQWNyZXNBZGRyZXNzCQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQdhZGRyZXNzAAAECWdvdEFjcmVzMAMJAGYCBQZhbW91bnQAAAkBDGFzVHVwbGUySW50cwEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhR1bnN0YWtlQWNyZXNDYWxsYmFjawkAzAgCBQZhbW91bnQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJQKAgAAAAAEEW9sZFN0YWtpbmdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRVvbGRTdGFraW5nQ29udHJhY3RTdHIECGxhbmRzU3RyCQCdCAIFEW9sZFN0YWtpbmdBZGRyZXNzCQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUHYWRkcmVzcwQLbGFuZHNSZXN1bHQDCQEJaXNEZWZpbmVkAQUIbGFuZHNTdHIEBWxhbmRzCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfCgEHb25lTGFuZAIDYWNjC2xhbmRBc3NldElkAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQBcgkBDGFzVHVwbGU1SW50cwEJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCE3Vuc3Rha2VMYW5kQ2FsbGJhY2sJAMwIAgULbGFuZEFzc2V0SWQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJYKBAkAZAIIBQNhY2MCXzEIBQFyAl8xCQBkAggFA2FjYwJfMggFAXICXzIJAGQCCAUDYWNjAl8zCAUBcgJfMwkAZAIIBQNhY2MCXzQIBQFyAl80BAJycgoAAiRsBQVsYW5kcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdvbmVMYW5kAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhVMaXN0IHNpemUgZXhjZWVkcyAxMDAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZAQIZmluYWxpemUJAPwHBAURb2xkU3Rha2luZ0FkZHJlc3MCHHVuc3Rha2VMYW5kc0ZpbmFsaXplQ2FsbGJhY2sJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUIZmluYWxpemUFCGZpbmFsaXplBANyZXEJAPwHBAUPb2xkQWNyZXNBZGRyZXNzAhRyZXF1ZXN0QWNyZXNDYWxsYmFjawkAzAgCCQBkAgkAZAIJAGQCCAUCcnICXzEIBQJycgJfMggFAnJyAl8zCAUCcnICXzQFA25pbAUDbmlsAwkAAAIFA3JlcQUDcmVxBAVpc3N1ZQkAwggFAghGUE9XRVIxMAIpRmFybWluZ1Bvd2VyICsxMCUgTkZUIGZvciBXYXZlc0xhbmRzIGdhbWUAAQAABwkAlwoFCAUCcnICXzEIBQJycgJfMggFAnJyAl8zCAUCcnICXzQJAMwIAgUFaXNzdWUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEJALgIAQUFaXNzdWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlwoFAAAAAAAAAAAFA25pbAQLZHVja0Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgURb2xkU3Rha2luZ0FkZHJlc3MJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MCAAQKZHVja1Jlc3VsdAMJAQIhPQIFC2R1Y2tBc3NldElkAgAJAQxhc1R1cGxlM0ludHMBCQD8BwQFEW9sZFN0YWtpbmdBZGRyZXNzAhN1bnN0YWtlRHVja0NhbGxiYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsCQCVCgMAAAAAAAAEAXgJARJzdGFrZUFjcmVzSW50ZXJuYWwCCQBkAgkAZAIJAGQCCQBkAgkAZAIJAGQCCQBkAggFCWdvdEFjcmVzMAJfMQgFC2xhbmRzUmVzdWx0Al8xCAULbGFuZHNSZXN1bHQCXzIIBQtsYW5kc1Jlc3VsdAJfMwgFC2xhbmRzUmVzdWx0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OQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkCQCWCgQAAAAAAAAAAAkAlAoCBQNuaWwFC2xhbmRzUmVzdWx0AWkBEnN0YWtlQWNyZXNDYWxsYmFjawEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUVb2xkU3Rha2luZ0NvbnRyYWN0U3RyCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJARJzdGFrZUFjcmVzSW50ZXJuYWwCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUEYWRkcgFpARpzaW11bGF0ZVN0YWtlQWNyZXNSRUFET05MWQIHYWRkcmVzcwthZGRlZEFtb3VudAQJYW1vdW50S2V5CQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQdhZGRyZXNzBA5uZXdBY3Jlc0Ftb3VudAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJYW1vdW50S2V5AAAFC2FkZGVkQW1vdW50BAhvbGRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJhY3Jlc1N0YWtkVG90YWxLZXkAAAQJdXNlckZwS2V5CQEVa2V5RmFybWluZ1Bvd2VyQnlVc2VyAQUHYWRkcmVzcwQFb2xkRnAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJdXNlckZwS2V5AAAEBW5ld0ZwCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFDm5ld0FjcmVzQW1vdW50BApvbGRUb3RhbEZwCQELdmFsdWVPckVsc2UCCQCfCAEFFHRvdGFsRmFybWluZ1Bvd2VyS2V5AAAECm5ld1RvdGFsRnAJAGQCCQBlAgUKb2xkVG90YWxGcAUFb2xkRnAFBW5ld0ZwCQCUCgIFA25pbAkAzAgCBQVvbGRGcAkAzAgCBQVuZXdGcAkAzAgCBQpvbGRUb3RhbEZwCQDMCAIFCm5ld1RvdGFsRnAFA25pbAC/C1Fr", "height": 3342560, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2AJLspzycKDjS6EbnuvyvEvynNH4gUfxSuDNWj8RyJxm Next: 29DHVjpK6WqrGyFhzLeHQCxEEWbzJzzkp8s9aRfRM1nt Diff:
OldNewDifferences
99
1010 let MULT8 = 100000000
1111
12+let DAY_MILLIS = 86400000
13+
1214 let USDT2ACRES_MULTIPLIER = 10
15+
16+let ACRES_LIMIT_DIVISOR = 10
1317
1418 let chain = take(drop(this.bytes, 1), 1)
1519
2832 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
2933 else if ((base58'2T' == $match0))
3034 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
3144 else throw("Unknown chain")
3245 }
3346
220233 }
221234
222235
236+func keyLastAcresSellTimeByUser (addr) = ("lastAcresSellTimeUser_" + addr)
237+
238+
239+func getSwapLimitAcres (addr) = {
240+ let lastTime = valueOrElse(getInteger(keyLastAcresSellTimeByUser(addr)), 0)
241+ 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+ }
251+
252+
223253 @Callable(i)
224254 func constructorV1 (rest2Addr,oldAcrContract) = if ((i.caller != this))
225255 then throw("Permission denied")
289319 else (value(pmt.assetId) != acresAssetId))
290320 then throw("ACRES payments only!")
291321 else {
292- let $t045094575 = stakeAcresInternal(amt, address)
293- let actions = $t045094575._1
294- let wlgClaimedAmount = $t045094575._2
322+ let $t051735239 = stakeAcresInternal(amt, address)
323+ let actions = $t051735239._1
324+ let wlgClaimedAmount = $t051735239._2
295325 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
296326 }
297327 }
356386 else if ((MULT7 > acresAmount))
357387 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
358388 else {
359- let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
360- $Tuple2(([ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
389+ let addr = toString(i.caller)
390+ let maxAcres = getSwapLimitAcres(addr)
391+ if ((acresAmount > maxAcres))
392+ then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
393+ else {
394+ let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
395+ $Tuple2(([IntegerEntry(keyLastAcresSellTimeByUser(addr), lastBlock.timestamp), ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
396+ }
361397 }
362398 }
363399 }
365401
366402
367403 @Callable(i)
368-func sellAcresREADONLY (acresAmount) = if ((MULT7 > acresAmount))
404+func sellAcresREADONLY (address,acresAmount) = if ((MULT7 > acresAmount))
369405 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
370406 else {
407+ let maxAcres = getSwapLimitAcres(address)
371408 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
372- $Tuple2(nil, usdtAmount)
409+ $Tuple2(nil, [usdtAmount, maxAcres])
373410 }
374411
375412
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
12+let DAY_MILLIS = 86400000
13+
1214 let USDT2ACRES_MULTIPLIER = 10
15+
16+let ACRES_LIMIT_DIVISOR = 10
1317
1418 let chain = take(drop(this.bytes, 1), 1)
1519
1620 let usdtAssetId = match chain {
1721 case _ =>
1822 if ((base58'2W' == $match0))
1923 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
2024 else if ((base58'2T' == $match0))
2125 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
2226 else throw("Unknown chain")
2327 }
2428
2529 let defaultRest2AddressStr = match chain {
2630 case _ =>
2731 if ((base58'2W' == $match0))
2832 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
2933 else if ((base58'2T' == $match0))
3034 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
3144 else throw("Unknown chain")
3245 }
3346
3447 let oldStakingContractStr = match chain {
3548 case _ =>
3649 if ((base58'2W' == $match0))
3750 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
3851 else if ((base58'2T' == $match0))
3952 then "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm"
4053 else throw("Unknown chain")
4154 }
4255
4356 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
4457
4558
4659 let IdxCfgAcres2Dapp = 1
4760
4861 let IdxCfgWlgDapp = 2
4962
5063 let IdxCfgInvestFundDapp = 5
5164
5265 func keyRestCfg () = "%s__restConfig"
5366
5467
5568 func keyRest2Address () = "%s__rest2Addr"
5669
5770
5871 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
5972
6073
6174 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
6275
6376
6477 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
6578
6679 let rest2Cfg = readRestCfgOrFail(rest2Contract)
6780
6881 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
6982
7083 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
7184
7285 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
7386
7487 let oldAcresContractKey = "oldAcresContract"
7588
7689 func keyBlocked () = "contractsBlocked"
7790
7891
7992 func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
8093
8194
8295 let acresIssuedAmountKey = "acresIssuedAmount"
8396
8497 let acresAssetIdKey = "acresAssetId"
8598
8699 let acresAssetId = valueOrErrorMessage(getBinary(acres2Contract, acresAssetIdKey), "ACRES is not issued yet")
87100
88101 func keyAcresStakedTimeByUser (addr) = ("acresStakedTimeByUser_" + addr)
89102
90103
91104 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
92105
93106
94107 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
95108
96109
97110 func asInt (v) = match v {
98111 case n: Int =>
99112 n
100113 case _ =>
101114 throw("fail to cast into Int")
102115 }
103116
104117
105118 func asTuple5Ints (val) = match val {
106119 case t: (Int, Int, Int, Int, Int) =>
107120 t
108121 case _ =>
109122 throw("fail to cast into (Int, Int, Int, Int, Int)")
110123 }
111124
112125
113126 func asTuple4Ints (val) = match val {
114127 case t: (Int, Int, Int, Int) =>
115128 t
116129 case _ =>
117130 throw("fail to cast into (Int, Int, Int, Int)")
118131 }
119132
120133
121134 func asTuple3Ints (val) = match val {
122135 case t: (Int, Int, Int) =>
123136 t
124137 case _ =>
125138 throw("fail to cast into (Int, Int, Int)")
126139 }
127140
128141
129142 func asTuple2Ints (val) = match val {
130143 case t: (Int, Int) =>
131144 t
132145 case _ =>
133146 throw("fail to cast into (Int, Int)")
134147 }
135148
136149
137150 func fixedPoint (val,decimals) = {
138151 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
139152 let lowPart = toString((val % tenPow))
140153 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
141154 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
142155 }
143156
144157
145158 let M8_ = 100000000
146159
147160 let wlgIssuedAmtKey = "wlg_issuedAmount"
148161
149162 let zbIssuedAmtKey = "zbill_issuedAmount"
150163
151164 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
152165
153166
154167 func keyFarmingPowerByUser (addr) = ("farmingPowerByUser_" + addr)
155168
156169
157170 let acresStakdTotalKey = "acresStakedAmountTotal"
158171
159172 let totalFarmingPowerKey = "totalFarmingPower"
160173
161174 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
162175
163176 func getLevelByAcres (acres) = {
164177 let acr = ((acres + 99999999) / M8_)
165178 func checker (acc,item) = if ((item >= acr))
166179 then acc
167180 else (acc + 1)
168181
169182 let $l = levelAcres
170183 let $s = size($l)
171184 let $acc0 = 0
172185 func $f0_1 ($a,$i) = if (($i >= $s))
173186 then $a
174187 else checker($a, $l[$i])
175188
176189 func $f0_2 ($a,$i) = if (($i >= $s))
177190 then $a
178191 else throw("List size exceeds 10")
179192
180193 $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)
181194 }
182195
183196
184197 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
185198
186199
187200 func prolog (i) = if (if ((i.originCaller != rest2Contract))
188201 then valueOrElse(getBoolean(keyBlocked()), false)
189202 else false)
190203 then throw("Contracts are under maintenance")
191204 else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
192205
193206
194207 func stakeAcresInternal (amt,address) = {
195208 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
196209 if ((wlgResult == wlgResult))
197210 then {
198211 let now = lastBlock.timestamp
199212 let timeKey = keyAcresStakedTimeByUser(address)
200213 let amountKey = keyAcresStakedAmtByUser(address)
201214 let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + amt)
202215 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
203216 let userFpKey = keyFarmingPowerByUser(address)
204217 let oldFp = valueOrElse(getInteger(userFpKey), 0)
205218 let newFp = getFarmingPowerByAcres(newAcresAmount)
206219 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
207220 $Tuple2([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(amountKey, newAcresAmount), IntegerEntry(acresStakdTotalKey, (oldTotal + amt)), IntegerEntry(userFpKey, newFp), IntegerEntry(totalFarmingPowerKey, ((oldTotalFp - oldFp) + newFp))], wlgResult)
208221 }
209222 else throw("Strict value is not equal to itself.")
210223 }
211224
212225
213226 func getWlgPrice (usdtBalanceCorrection) = {
214227 let issuedAmount = valueOrErrorMessage(getInteger(wlgContract, wlgIssuedAmtKey), "WLGOLD is not issued yet")
215228 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
216229 let acres2Usd = (assetBalance(acres2Contract, usdtAssetId) - usdtBalanceCorrection)
217230 let investFundTotal = (assetBalance(investFundContract, usdtAssetId) + valueOrElse(getInteger(investFundContract, zbIssuedAmtKey), 0))
218231 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
219232 fraction(totalFundsUsd, MULT8, issuedAmount)
220233 }
221234
222235
236+func keyLastAcresSellTimeByUser (addr) = ("lastAcresSellTimeUser_" + addr)
237+
238+
239+func getSwapLimitAcres (addr) = {
240+ let lastTime = valueOrElse(getInteger(keyLastAcresSellTimeByUser(addr)), 0)
241+ 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+ }
251+
252+
223253 @Callable(i)
224254 func constructorV1 (rest2Addr,oldAcrContract) = if ((i.caller != this))
225255 then throw("Permission denied")
226256 else {
227257 let oldAcrContAddr = addressFromStringValue(oldAcrContract)
228258 [IntegerEntry(acresIssuedAmountKey, getIntegerValue(oldAcrContAddr, acresIssuedAmountKey)), BinaryEntry(acresAssetIdKey, getBinaryValue(oldAcrContAddr, acresAssetIdKey)), StringEntry(keyRest2Address(), rest2Addr), StringEntry(oldAcresContractKey, oldAcrContract)]
229259 }
230260
231261
232262
233263 @Callable(i)
234264 func saveInteger (key,amount) = if ((i.caller != this))
235265 then throw("saveInteger is not public method")
236266 else [IntegerEntry(key, amount)]
237267
238268
239269
240270 @Callable(i)
241271 func setBlocked (isBlocked) = if ((i.caller != this))
242272 then throw("permission denied")
243273 else [BooleanEntry(keyBlocked(), isBlocked)]
244274
245275
246276
247277 @Callable(i)
248278 func unstakeAcres (amount) = {
249279 let prologActions = prolog(i)
250280 if ((0 >= amount))
251281 then throw("Amount should be positive")
252282 else {
253283 let address = toString(i.caller)
254284 if ((size(i.payments) != 0))
255285 then throw("No payments required")
256286 else {
257287 let timeKey = keyAcresStakedTimeByUser(address)
258288 let amountKey = keyAcresStakedAmtByUser(address)
259289 let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
260290 if ((amount > oldAcresAmount))
261291 then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(amount, 8)))
262292 else {
263293 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
264294 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
265295 let newAcresAmount = (oldAcresAmount - amount)
266296 let userFpKey = keyFarmingPowerByUser(address)
267297 let oldFp = valueOrElse(getInteger(userFpKey), 0)
268298 let newFp = getFarmingPowerByAcres(newAcresAmount)
269299 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
270300 $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)
271301 }
272302 }
273303 }
274304 }
275305
276306
277307
278308 @Callable(i)
279309 func stakeAcres () = {
280310 let prologActions = prolog(i)
281311 let address = toString(i.caller)
282312 if ((size(i.payments) != 1))
283313 then throw("exactly 1 payment must be attached")
284314 else {
285315 let pmt = i.payments[0]
286316 let amt = pmt.amount
287317 if (if (!(isDefined(pmt.assetId)))
288318 then true
289319 else (value(pmt.assetId) != acresAssetId))
290320 then throw("ACRES payments only!")
291321 else {
292- let $t045094575 = stakeAcresInternal(amt, address)
293- let actions = $t045094575._1
294- let wlgClaimedAmount = $t045094575._2
322+ let $t051735239 = stakeAcresInternal(amt, address)
323+ let actions = $t051735239._1
324+ let wlgClaimedAmount = $t051735239._2
295325 $Tuple2((actions ++ prologActions), wlgClaimedAmount)
296326 }
297327 }
298328 }
299329
300330
301331
302332 @Callable(i)
303333 func buyAcres () = {
304334 let prologActions = prolog(i)
305335 if ((size(i.payments) != 1))
306336 then throw("exactly 1 payment must be attached")
307337 else {
308338 let pmt = i.payments[0]
309339 let usdtAmount = pmt.amount
310340 if (if (!(isDefined(pmt.assetId)))
311341 then true
312342 else (value(pmt.assetId) != usdtAssetId))
313343 then throw("USDT payments only!")
314344 else if ((MULT6 > usdtAmount))
315345 then throw((("Min payment should be " + fixedPoint(MULT6, 6)) + " USDT"))
316346 else {
317347 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
318348 let wlgAmount = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
319349 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
320350 let req = invoke(oldAcresAddress, "requestAcresCallback", [acresAmount], nil)
321351 if ((req == req))
322352 then {
323353 let wlgRemain = asInt(invoke(wlgContract, "burnWlgold", [wlgAmount], nil))
324354 $Tuple2(([ScriptTransfer(i.caller, acresAmount, acresAssetId)] ++ prologActions), wlgRemain)
325355 }
326356 else throw("Strict value is not equal to itself.")
327357 }
328358 }
329359 }
330360
331361
332362
333363 @Callable(i)
334364 func buyAcresREADONLY (usdtAmount) = if ((MULT6 > usdtAmount))
335365 then throw((("Min payment should be " + fixedPoint(MULT6, 6)) + " USDT"))
336366 else {
337367 let acresAmount = (usdtAmount * USDT2ACRES_MULTIPLIER)
338368 let wlgToBurn = fraction(usdtAmount, MULT8, getWlgPrice(usdtAmount))
339369 $Tuple2(nil, [acresAmount, wlgToBurn])
340370 }
341371
342372
343373
344374 @Callable(i)
345375 func sellAcres () = {
346376 let prologActions = prolog(i)
347377 if ((size(i.payments) != 1))
348378 then throw("exactly 1 payment must be attached")
349379 else {
350380 let pmt = i.payments[0]
351381 let acresAmount = pmt.amount
352382 if (if (!(isDefined(pmt.assetId)))
353383 then true
354384 else (value(pmt.assetId) != acresAssetId))
355385 then throw("ACRES payments only!")
356386 else if ((MULT7 > acresAmount))
357387 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
358388 else {
359- let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
360- $Tuple2(([ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
389+ let addr = toString(i.caller)
390+ let maxAcres = getSwapLimitAcres(addr)
391+ if ((acresAmount > maxAcres))
392+ then throw((("You can sell max " + fixedPoint(maxAcres, 8)) + " ACRES"))
393+ else {
394+ let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
395+ $Tuple2(([IntegerEntry(keyLastAcresSellTimeByUser(addr), lastBlock.timestamp), ScriptTransfer(i.caller, usdtAmount, usdtAssetId)] ++ prologActions), usdtAmount)
396+ }
361397 }
362398 }
363399 }
364400
365401
366402
367403 @Callable(i)
368-func sellAcresREADONLY (acresAmount) = if ((MULT7 > acresAmount))
404+func sellAcresREADONLY (address,acresAmount) = if ((MULT7 > acresAmount))
369405 then throw((("Min payment should be " + fixedPoint(MULT7, 8)) + " ACRES"))
370406 else {
407+ let maxAcres = getSwapLimitAcres(address)
371408 let usdtAmount = ((acresAmount / USDT2ACRES_MULTIPLIER) / 2)
372- $Tuple2(nil, usdtAmount)
409+ $Tuple2(nil, [usdtAmount, maxAcres])
373410 }
374411
375412
376413
377414 @Callable(i)
378415 func convertOldStakes () = {
379416 let address = toString(i.caller)
380417 if ((size(i.payments) != 0))
381418 then throw("No payments required")
382419 else {
383420 let oldAcresAddress = addressFromStringValue(getStringValue(oldAcresContractKey))
384421 let amount = valueOrElse(getInteger(oldAcresAddress, keyAcresStakedAmtByUser(address)), 0)
385422 let gotAcres0 = if ((amount > 0))
386423 then asTuple2Ints(invoke(oldAcresAddress, "unstakeAcresCallback", [amount, address], nil))
387424 else $Tuple2(0, 0)
388425 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
389426 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
390427 let landsResult = if (isDefined(landsStr))
391428 then {
392429 let lands = split_51C(value(landsStr), "_")
393430 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
394431 then throw("landAssetId is required")
395432 else {
396433 let r = asTuple5Ints(invoke(oldStakingAddress, "unstakeLandCallback", [landAssetId, address], nil))
397434 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
398435 }
399436
400437 let rr = {
401438 let $l = lands
402439 let $s = size($l)
403440 let $acc0 = $Tuple4(0, 0, 0, 0)
404441 func $f0_1 ($a,$i) = if (($i >= $s))
405442 then $a
406443 else oneLand($a, $l[$i])
407444
408445 func $f0_2 ($a,$i) = if (($i >= $s))
409446 then $a
410447 else throw("List size exceeds 100")
411448
412449 $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)
413450 }
414451 let finalize = invoke(oldStakingAddress, "unstakeLandsFinalizeCallback", [address], nil)
415452 if ((finalize == finalize))
416453 then {
417454 let req = invoke(oldAcresAddress, "requestAcresCallback", [(((rr._1 + rr._2) + rr._3) + rr._4)], nil)
418455 if ((req == req))
419456 then {
420457 let issue = Issue("FPOWER10", "FarmingPower +10% NFT for WavesLands game", 1, 0, false)
421458 $Tuple5(rr._1, rr._2, rr._3, rr._4, [issue, ScriptTransfer(i.caller, 1, calculateAssetId(issue))])
422459 }
423460 else throw("Strict value is not equal to itself.")
424461 }
425462 else throw("Strict value is not equal to itself.")
426463 }
427464 else $Tuple5(0, 0, 0, 0, nil)
428465 let duckAssetId = valueOrElse(getString(oldStakingAddress, keyStakedDuckByOwner(address)), "")
429466 let duckResult = if ((duckAssetId != ""))
430467 then asTuple3Ints(invoke(oldStakingAddress, "unstakeDuckCallback", [duckAssetId, address], nil))
431468 else $Tuple3(0, 0, 0)
432469 let x = stakeAcresInternal((((((((gotAcres0._1 + landsResult._1) + landsResult._2) + landsResult._3) + landsResult._4) + duckResult._1) + duckResult._2) + duckResult._3), address)
433470 $Tuple2((landsResult._5 ++ x._1), x._2)
434471 }
435472 }
436473
437474
438475
439476 @Callable(i)
440477 func unstakeLandsREADONLY (address) = {
441478 let oldStakingAddress = addressFromStringValue(oldStakingContractStr)
442479 let landsStr = getString(oldStakingAddress, keyStakedLandsByOwner(address))
443480 let landsResult = if (isDefined(landsStr))
444481 then {
445482 let lands = split_51C(value(landsStr), "_")
446483 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
447484 then throw("landAssetId is required")
448485 else {
449486 let r = asTuple4Ints(invoke(oldStakingAddress, "unstakeLandREADONLY", [landAssetId, address], nil))
450487 $Tuple4((acc._1 + r._1), (acc._2 + r._2), (acc._3 + r._3), (acc._4 + r._4))
451488 }
452489
453490 let $l = lands
454491 let $s = size($l)
455492 let $acc0 = $Tuple4(0, 0, 0, 0)
456493 func $f0_1 ($a,$i) = if (($i >= $s))
457494 then $a
458495 else oneLand($a, $l[$i])
459496
460497 func $f0_2 ($a,$i) = if (($i >= $s))
461498 then $a
462499 else throw("List size exceeds 100")
463500
464501 $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)
465502 }
466503 else $Tuple4(0, 0, 0, 0)
467504 $Tuple2(nil, landsResult)
468505 }
469506
470507
471508
472509 @Callable(i)
473510 func stakeAcresCallback (addr) = if ((i.caller != addressFromStringValue(oldStakingContractStr)))
474511 then throw("Permission denied")
475512 else stakeAcresInternal(i.payments[0].amount, addr)
476513
477514
478515
479516 @Callable(i)
480517 func simulateStakeAcresREADONLY (address,addedAmount) = {
481518 let amountKey = keyAcresStakedAmtByUser(address)
482519 let newAcresAmount = (valueOrElse(getInteger(amountKey), 0) + addedAmount)
483520 let oldTotal = valueOrElse(getInteger(acresStakdTotalKey), 0)
484521 let userFpKey = keyFarmingPowerByUser(address)
485522 let oldFp = valueOrElse(getInteger(userFpKey), 0)
486523 let newFp = getFarmingPowerByAcres(newAcresAmount)
487524 let oldTotalFp = valueOrElse(getInteger(totalFarmingPowerKey), 0)
488525 let newTotalFp = ((oldTotalFp - oldFp) + newFp)
489526 $Tuple2(nil, [oldFp, newFp, oldTotalFp, newTotalFp])
490527 }
491528
492529

github/deemru/w8io/026f985 
69.06 ms