tx · 97dEm8KT6r5hsdpGrhCgGmSYVtaPqoCdHq2rEWbm7VZb

3N7dQeENwSgKPp9Ki4aEHhRWWKVjn1DE9Qg:  -0.01100000 Waves

2023.11.18 13:21 [2848680] smart account 3N7dQeENwSgKPp9Ki4aEHhRWWKVjn1DE9Qg > SELF 0.00000000 Waves

{ "type": 13, "id": "97dEm8KT6r5hsdpGrhCgGmSYVtaPqoCdHq2rEWbm7VZb", "fee": 1100000, "feeAssetId": null, "timestamp": 1700302959852, "version": 2, "chainId": 84, "sender": "3N7dQeENwSgKPp9Ki4aEHhRWWKVjn1DE9Qg", "senderPublicKey": "5BN6FQeKuMm2XJYToUZvbBX4UELGpE3Z47P4q6sP46PG", "proofs": [ "4SBJ4fJp4siKUGQocopLcsftks35mA3oD5TmGFFb3BvEWaE8kAZZBwwUcTpWnJYEJND2qUd9tRse27BamPPMta7D" ], "script": "base64:BgIqCAISBAoCCAESABIDCgEBEgASBAoCCAESBQoDCAEBEgMKAQESABIDCgEILQAITUlMTElPTjYAgIDpg7HeFgAJREFZTUlMTElTAIC4mSkBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgEaa2V5QWNyZXNMb2NrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNMb2NrZWRBbW91bnRCeVVzZXJfBQRhZGRyARdrZXlBY3Jlc0xvY2tlZEV0YUJ5VXNlcgEEYWRkcgkArAICAhVhY3Jlc0xvY2tlZEV0YUJ5VXNlcl8FBGFkZHIAE2FjcmVzU3Rha2VkVG90YWxLZXkCFmFjcmVzU3Rha2VkQW1vdW50VG90YWwACnhwTmV3U0xhbmQAwJaxAgAPREFJTFlSRVNCWVBJRUNFAID40gEAFVVTRFQyQUNSRVNfTVVMVElQTElFUgAKAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEAEUlkeENmZ0Vjb25vbXlEYXBwAAIADUlkeENmZ1dsZ0RhcHAABAAPSWR4Q2ZnQWNyZXNEYXBwAAgBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHAAD2Vjb25vbXlDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ0Vjb25vbXlEYXBwAAt3bGdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFDUlkeENmZ1dsZ0RhcHAADWFjcmVzQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ9JZHhDZmdBY3Jlc0RhcHAAFGFjcmVzSXNzdWVkQW1vdW50S2V5AhFhY3Jlc0lzc3VlZEFtb3VudAAPYWNyZXNBc3NldElkS2V5AgxhY3Jlc0Fzc2V0SWQADGFjcmVzQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFDWFjcmVzQ29udHJhY3QFD2FjcmVzQXNzZXRJZEtleQIXQUNSRVMgaXMgbm90IGlzc3VlZCB5ZXQBGGtleUFjcmVzU3Rha2VkVGltZUJ5VXNlcgEEYWRkcgkArAICAhZhY3Jlc1N0YWtlZFRpbWVCeVVzZXJfBQRhZGRyAAtJZHhFZmZUb3RhbAAAARFrZXlSZXNQcm9wb3J0aW9ucwACE3Jlc1R5cGVzUHJvcG9ydGlvbnMBFmtleVN0YWtlZFBpZWNlc0J5T3duZXIBCW93bmVyQWRkcgkArAICAhRzdGFrZWRQaWVjZXNCeU93bmVyXwUJb3duZXJBZGRyAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBDmFzVHdvSW50c1R1cGxlAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBAJ0MgUHJG1hdGNoMAUCdDIJAAIBAhxmYWlsIHRvIGNhc3QgaW50byAoSW50LCBJbnQpAQ5nZXRWb3RpbmdQb3dlcgESdXNlckFkZHJTdHJPckVtcHR5BAVwcm9wcwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBEWtleVJlc1Byb3BvcnRpb25zAAILMF8wXzBfMF8wXzACAV8KAQVhZGRlcgIDYWNjBGl0ZW0JAGQCBQNhY2MJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQQKdG90YWxQb3dlcgoAAiRsBQVwcm9wcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYECnVzZXJzUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkUGllY2VzQnlPd25lcgEFEnVzZXJBZGRyU3RyT3JFbXB0eQAACQDMCAIFCnRvdGFsUG93ZXIJAMwIAgUKdXNlcnNQb3dlcgUDbmlsAQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAEGcHJvbG9nAAkBBWFzSW50AQkA/QcEBQ9zdGFraW5nQ29udHJhY3QCCnNhdmVMYXN0VHgFA25pbAUDbmlsARJjbGFpbUFjcmVzSW50ZXJuYWwDBGFkZHILYWNyZXNBbW91bnQNbGFzdENsYWltVGltZQQJZGVsdGFUaW1lCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFDWxhc3RDbGFpbVRpbWUECGF2YWlsUmVzCQBrAwUJZGVsdGFUaW1lCQBoAgUPREFJTFlSRVNCWVBJRUNFBQthY3Jlc0Ftb3VudAkAaAIFCURBWU1JTExJUwUFTVVMVDgECmNhbkdldFVzZHQJAQVhc0ludAEJAPwHBAUPZWNvbm9teUNvbnRyYWN0AhpzZWxsUmVzb3VyY2VzV29ybGRSRUFET05MWQkAzAgCBQhhdmFpbFJlcwUDbmlsBQNuaWwEB2dvdFVzZHQJAJYDAQkAzAgCAAAJAMwIAgUKY2FuR2V0VXNkdAUDbmlsCQBoAgUHZ290VXNkdAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSAQ1jbGFpbUludGVybmFsAwRhZGRyC2FjcmVzQW1vdW50DWxhc3RDbGFpbVRpbWUECWRlbHRhVGltZQkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQ1sYXN0Q2xhaW1UaW1lAwkAZgIAAAUJZGVsdGFUaW1lCQACAQkArAICCQCsAgIJAKwCAgImU2F2ZWQgdGltZXN0YW1wIGlzIGluIGZ1dHVyZSwgc2F2ZWQgPSAJAKQDAQUNbGFzdENsYWltVGltZQIMLCBjdXJyZW50ID0gCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAhhdmFpbFJlcwkAawMFCWRlbHRhVGltZQkAaAIFD0RBSUxZUkVTQllQSUVDRQULYWNyZXNBbW91bnQJAGgCBQlEQVlNSUxMSVMFBU1VTFQ4BApjYW5HZXRVc2R0CQEFYXNJbnQBCQD8BwQFD2Vjb25vbXlDb250cmFjdAIac2VsbFJlc291cmNlc1dvcmxkUkVBRE9OTFkJAMwIAgUIYXZhaWxSZXMFA25pbAUDbmlsBAdnb3RVc2R0AwkAZwIAAAUKY2FuR2V0VXNkdAAACAkBDmFzVHdvSW50c1R1cGxlAQkA/AcEBQ9lY29ub215Q29udHJhY3QCEnNlbGxSZXNvdXJjZXNXb3JsZAkAzAgCBQRhZGRyCQDMCAIFCGF2YWlsUmVzBQNuaWwFA25pbAJfMQkAaAIFB2dvdFVzZHQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgELbWVyZ2VMb2NrZWQECW9sZEFtb3VudAZvbGRFVEEJbmV3QW1vdW50Bm5ld0VUQQQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQDZHQxCQCWAwEJAMwIAgAACQDMCAIJAGUCBQZvbGRFVEEFA25vdwUDbmlsBANkdDIJAJYDAQkAzAgCAAAJAMwIAgkAZQIFBm5ld0VUQQUDbm93BQNuaWwEA3N1bQkAZAIFCW9sZEFtb3VudAUJbmV3QW1vdW50BAJkdAMJAAACBQNzdW0AAAAACQBkAgkAawMFA2R0MQUJb2xkQW1vdW50BQNzdW0JAGsDBQNkdDIFCW5ld0Ftb3VudAUDc3VtCQBkAgUDbm93BQJkdAkBaQENY29uc3RydWN0b3JWMQIIcmVzdEFkZHIOdW5zdGFrZWRQaWVjZXMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAMJAQlpc0RlZmluZWQBCQChCAEFD2FjcmVzQXNzZXRJZEtleQkAAgECE0FscmVhZHkgaW5pdGlhbGl6ZWQECG5mdEFjcmVzCQBkAgkAkQMCCQEOZ2V0Vm90aW5nUG93ZXIBAgAFC0lkeEVmZlRvdGFsBQ51bnN0YWtlZFBpZWNlcwQMaXNzdWVkQW1vdW50CQBlAgUITUlMTElPTjYJAGgCBQhuZnRBY3JlcwUFTVVMVDgEBWlzc3VlCQDDCAcCBUFDUkVTAiZXYXZlc0xhbmRzIGxhbmQgYWNyZXMgaW52ZXN0bWVudCB0b2tlbgUMaXNzdWVkQW1vdW50AAgHBQR1bml0AAAEB2Fzc2V0SWQJALgIAQUFaXNzdWUJAMwIAgUFaXNzdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFFGFjcmVzSXNzdWVkQW1vdW50S2V5BQxpc3N1ZWRBbW91bnQJAMwIAgkBC0JpbmFyeUVudHJ5AgUPYWNyZXNBc3NldElkS2V5BQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyBQNuaWwBaQEKc3Rha2VBY3JlcwAEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQxhY3Jlc0Fzc2V0SWQJAAIBAhRBQ1JFUyBwYXltZW50cyBvbmx5IQQHdGltZUtleQkBGGtleUFjcmVzU3Rha2VkVGltZUJ5VXNlcgEFB2FkZHJlc3MECWFtb3VudEtleQkBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQUHYWRkcmVzcwQOb2xkQWNyZXNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJYW1vdW50S2V5AAAECG9sZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFE2FjcmVzU3Rha2VkVG90YWxLZXkAAAQJd2xnUmVzdWx0CQD8BwQFC3dsZ0NvbnRyYWN0AhJvblN0YWtlVW5zdGFrZUxhbmQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwEDGNsYWltZWRBY3JlcwkBDWNsYWltSW50ZXJuYWwDBQdhZGRyZXNzBQ5vbGRBY3Jlc0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd0aW1lS2V5AAAJAJQKAgkAzQgCCQDNCAIJAM0IAgMJAAACBQxjbGFpbWVkQWNyZXMAAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUMY2xhaW1lZEFjcmVzBQxhY3Jlc0Fzc2V0SWQFA25pbAkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQEMSW50ZWdlckVudHJ5AgUJYW1vdW50S2V5CQBkAgUOb2xkQWNyZXNBbW91bnQFA2FtdAkBDEludGVnZXJFbnRyeQIFE2FjcmVzU3Rha2VkVG90YWxLZXkJAGQCBQhvbGRUb3RhbAUDYW10CQCUCgIFDHByb2xvZ1Jlc3VsdAUJd2xnUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVuc3Rha2VBY3JlcwEGYW1vdW50BAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkAZwIAAAUGYW1vdW50CQACAQIZQW1vdW50IHNob3VsZCBiZSBwb3NpdGl2ZQQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQHdGltZUtleQkBGGtleUFjcmVzU3Rha2VkVGltZUJ5VXNlcgEFB2FkZHJlc3MECWFtb3VudEtleQkBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQUHYWRkcmVzcwQOb2xkQWNyZXNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJYW1vdW50S2V5AAADCQBmAgUGYW1vdW50BQ5vbGRBY3Jlc0Ftb3VudAkAAgEJAKwCAgkArAICCQCsAgICDllvdSBoYXZlIG9ubHkgCQEKZml4ZWRQb2ludAIFDm9sZEFjcmVzQW1vdW50AAgCICBBQ1JFUyBzdGFrZWQsIHRyaWVkIHRvIHVuc3Rha2UgCQEKZml4ZWRQb2ludAIFBmFtb3VudAAIBAxsb2NrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGmtleUFjcmVzTG9ja2VkQW1vdW50QnlVc2VyAQUHYWRkcmVzcwAABAlsb2NrZWRFVEEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBF2tleUFjcmVzTG9ja2VkRXRhQnlVc2VyAQUHYWRkcmVzcwAABANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBBB1bnN0YWthYmxlQW1vdW50CQBlAgUOb2xkQWNyZXNBbW91bnQFDGxvY2tlZEFtb3VudAMDCQBmAgUJbG9ja2VkRVRBBQNub3cJAGYCBQZhbW91bnQFEHVuc3Rha2FibGVBbW91bnQHCQACAQkArAICCQCsAgIJAKwCAgIFT25seSAJAQpmaXhlZFBvaW50AgUQdW5zdGFrYWJsZUFtb3VudAAIAicgQUNSRVMgY2FuIGJlIHVuc3Rha2VkIG5vdywgd2FpdCB1bnRpbCAJAKQDAQUJbG9ja2VkRVRBBAhvbGRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRNhY3Jlc1N0YWtlZFRvdGFsS2V5AAAECXdsZ1Jlc3VsdAkA/AcEBQt3bGdDb250cmFjdAISb25TdGFrZVVuc3Rha2VMYW5kCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsBAxjbGFpbWVkQWNyZXMJAQ1jbGFpbUludGVybmFsAwUHYWRkcmVzcwUOb2xkQWNyZXNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdGltZUtleQAACQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlhbW91bnRLZXkJAGUCBQ5vbGRBY3Jlc0Ftb3VudAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNhY3Jlc1N0YWtlZFRvdGFsS2V5CQBlAgUIb2xkVG90YWwFBmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGQCBQZhbW91bnQFDGNsYWltZWRBY3JlcwUMYWNyZXNBc3NldElkBQNuaWwJAJQKAgUMcHJvbG9nUmVzdWx0BQl3bGdSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIYnV5QWNyZXMABAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0BAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkAZgIFBU1VTFQ2BQNhbXQJAAIBCQCsAgIJAKwCAgIWTWluIHBheW1lbnQgc2hvdWxkIGJlIAkBCmZpeGVkUG9pbnQCBQVNVUxUNgAGAgUgVVNEVAQLYWNyZXNBbW91bnQJAGgCBQNhbXQFFVVTRFQyQUNSRVNfTVVMVElQTElFUgQOYWNjU3RhdHNSZXN1bHQJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVBY2NTdGF0cwkAzAgCBQdhZGRyZXNzCQDMCAIJAGsDBQp4cE5ld1NMYW5kBQthY3Jlc0Ftb3VudAkAaAIAGQUFTVVMVDgFA25pbAUDbmlsCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPZWNvbm9teUNvbnRyYWN0BQNhbXQFC3VzZHRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULYWNyZXNBbW91bnQFDGFjcmVzQXNzZXRJZAUDbmlsCQCUCgIFDHByb2xvZ1Jlc3VsdAUOYWNjU3RhdHNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJc2VuZEFjcmVzAgRhZGRyBmFtb3VudAMJAQIhPQIIBQFpBmNhbGxlcgUPZWNvbm9teUNvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRhZGRyBQZhbW91bnQFDGFjcmVzQXNzZXRJZAUDbmlsBQZhbW91bnQBaQEPc2VuZExvY2tlZEFjcmVzAwRhZGRyBmFtb3VudAhsb2NrRGF5cwMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAQIhPQIIBQFpBmNhbGxlcgUMcmVzdENvbnRyYWN0BwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAd0aW1lS2V5CQEYa2V5QWNyZXNTdGFrZWRUaW1lQnlVc2VyAQUEYWRkcgQJYW1vdW50S2V5CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBQRhZGRyBA5vbGRBY3Jlc0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlhbW91bnRLZXkAAAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUTYWNyZXNTdGFrZWRUb3RhbEtleQAABAdvbGRUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFB3RpbWVLZXkFA25vdwQGZXRhS2V5CQEXa2V5QWNyZXNMb2NrZWRFdGFCeVVzZXIBBQRhZGRyBA9sb2NrZWRBbW91bnRLZXkJARprZXlBY3Jlc0xvY2tlZEFtb3VudEJ5VXNlcgEFBGFkZHIED29sZExvY2tlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9sb2NrZWRBbW91bnRLZXkAAAQMb2xkTG9ja2VkRVRBCQELdmFsdWVPckVsc2UCCQCfCAEFBmV0YUtleQAABAltZXJnZWRFVEEJAQttZXJnZUxvY2tlZAQFD29sZExvY2tlZEFtb3VudAUMb2xkTG9ja2VkRVRBBQZhbW91bnQJAGQCBQNub3cJAGgCBQhsb2NrRGF5cwUJREFZTUlMTElTCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkFB29sZFRpbWUJAMwIAgkBDEludGVnZXJFbnRyeQIFCWFtb3VudEtleQkAZAIFDm9sZEFjcmVzQW1vdW50BQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2FjcmVzU3Rha2VkVG90YWxLZXkJAGQCBQhvbGRUb3RhbAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQZldGFLZXkFCW1lcmdlZEVUQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPbG9ja2VkQW1vdW50S2V5CQBkAgUPb2xkTG9ja2VkQW1vdW50BQZhbW91bnQFA25pbAUGYW1vdW50AWkBCWJ1cm5BY3JlcwEGYW1vdW50AwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQKYW1vdW50TGVmdAkAZQIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUYWNyZXNJc3N1ZWRBbW91bnRLZXkAAAUGYW1vdW50AwkAZgIAAAUKYW1vdW50TGVmdAkAAgECJ0F0dGVtcHQgdG8gYnVybiBtb3JlIEFDUkVTLCB0aGFuIGV4aXN0cwkAlAoCCQDMCAIJAQRCdXJuAgUMYWNyZXNBc3NldElkBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFGFjcmVzSXNzdWVkQW1vdW50S2V5BQphbW91bnRMZWZ0BQNuaWwFBmFtb3VudAFpAQpjbGFpbUFjcmVzAAQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQHdGltZUtleQkBGGtleUFjcmVzU3Rha2VkVGltZUJ5VXNlcgEFB2FkZHJlc3MECWFtb3VudEtleQkBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQUHYWRkcmVzcwQLYWNyZXNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJYW1vdW50S2V5AAAECXdsZ1Jlc3VsdAkA/AcEBQt3bGdDb250cmFjdAISb25TdGFrZVVuc3Rha2VMYW5kCQDMCAIFB2FkZHJlc3MFA25pbAUDbmlsBAxjbGFpbWVkQWNyZXMJAQ1jbGFpbUludGVybmFsAwUHYWRkcmVzcwULYWNyZXNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdGltZUtleQAACQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUMY2xhaW1lZEFjcmVzBQxhY3Jlc0Fzc2V0SWQFA25pbAkAlAoCBQxwcm9sb2dSZXN1bHQFCXdsZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJjbGFpbUFjcmVzUkVBRE9OTFkBB2FkZHJlc3MEB3RpbWVLZXkJARhrZXlBY3Jlc1N0YWtlZFRpbWVCeVVzZXIBBQdhZGRyZXNzBAlhbW91bnRLZXkJARprZXlBY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcgEFB2FkZHJlc3MEC2FjcmVzQW1vdW50CQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAABAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd0aW1lS2V5AAAEDGNsYWltZWRBY3JlcwkBEmNsYWltQWNyZXNJbnRlcm5hbAMFB2FkZHJlc3MFC2FjcmVzQW1vdW50BQhsYXN0VGltZQkAlAoCBQNuaWwJAMwIAgUMY2xhaW1lZEFjcmVzCQDMCAIFCGxhc3RUaW1lBQNuaWwAnDu8KQ==", "height": 2848680, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FS295iH75ceJZ8nuzkf3fJzBfarATZQuAPuxTMPCEGUx Next: E2JN3F1oqYzoP5pTv4TtpwMPbvRbYFbCHmniF6ijiSig Diff:
OldNewDifferences
44 let MILLION6 = 100000000000000
55
66 let DAYMILLIS = 86400000
7-
8-let ACRES_UNLOCK_PERIOD = 1209600000
97
108 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
119
312310
313311
314312 @Callable(i)
315-func sendLockedAcres (addr,amount) = if ((i.caller != this))
313+func sendLockedAcres (addr,amount,lockDays) = if (if ((i.caller != this))
314+ then (i.caller != restContract)
315+ else false)
316316 then throw("Permission denied")
317317 else {
318318 let now = lastBlock.timestamp
325325 let lockedAmountKey = keyAcresLockedAmountByUser(addr)
326326 let oldLockedAmount = valueOrElse(getInteger(lockedAmountKey), 0)
327327 let oldLockedETA = valueOrElse(getInteger(etaKey), 0)
328- let mergedETA = mergeLocked(oldLockedAmount, oldLockedETA, amount, (now + ACRES_UNLOCK_PERIOD))
329- $Tuple2([IntegerEntry(timeKey, oldTime), IntegerEntry(amountKey, (oldAcresAmount + amount)), IntegerEntry(acresStakedTotalKey, (oldTotal + amount)), IntegerEntry(etaKey, mergedETA), IntegerEntry(lockedAmountKey, (oldLockedAmount + amount))], 0)
328+ let mergedETA = mergeLocked(oldLockedAmount, oldLockedETA, amount, (now + (lockDays * DAYMILLIS)))
329+ $Tuple2([IntegerEntry(timeKey, oldTime), IntegerEntry(amountKey, (oldAcresAmount + amount)), IntegerEntry(acresStakedTotalKey, (oldTotal + amount)), IntegerEntry(etaKey, mergedETA), IntegerEntry(lockedAmountKey, (oldLockedAmount + amount))], amount)
330330 }
331331
332332
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let MILLION6 = 100000000000000
55
66 let DAYMILLIS = 86400000
7-
8-let ACRES_UNLOCK_PERIOD = 1209600000
97
108 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
119
1210
1311 func keyAcresLockedAmountByUser (addr) = ("acresLockedAmountByUser_" + addr)
1412
1513
1614 func keyAcresLockedEtaByUser (addr) = ("acresLockedEtaByUser_" + addr)
1715
1816
1917 let acresStakedTotalKey = "acresStakedAmountTotal"
2018
2119 let xpNewSLand = 5000000
2220
2321 let DAILYRESBYPIECE = 3456000
2422
2523 let USDT2ACRES_MULTIPLIER = 10
2624
2725 let chain = take(drop(this.bytes, 1), 1)
2826
2927 let usdtAssetId = match chain {
3028 case _ =>
3129 if ((base58'2W' == $match0))
3230 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
3331 else if ((base58'2T' == $match0))
3432 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
3533 else throw("Unknown chain")
3634 }
3735
3836 let defaultRestAddressStr = match chain {
3937 case _ =>
4038 if ((base58'2W' == $match0))
4139 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
4240 else if ((base58'2T' == $match0))
4341 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
4442 else throw("Unknown chain")
4543 }
4644
4745 let SEP = "__"
4846
4947 let MULT6 = 1000000
5048
5149 let MULT8 = 100000000
5250
5351 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
5452
5553
5654 let IdxCfgStakingDapp = 1
5755
5856 let IdxCfgEconomyDapp = 2
5957
6058 let IdxCfgWlgDapp = 4
6159
6260 let IdxCfgAcresDapp = 8
6361
6462 func keyRestCfg () = "%s__restConfig"
6563
6664
6765 func keyRestAddress () = "%s__restAddr"
6866
6967
7068 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
7169
7270
7371 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
7472
7573
7674 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
7775
7876 let restCfg = readRestCfgOrFail(restContract)
7977
8078 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
8179
8280 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
8381
8482 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
8583
8684 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
8785
8886 let acresIssuedAmountKey = "acresIssuedAmount"
8987
9088 let acresAssetIdKey = "acresAssetId"
9189
9290 let acresAssetId = valueOrErrorMessage(getBinary(acresContract, acresAssetIdKey), "ACRES is not issued yet")
9391
9492 func keyAcresStakedTimeByUser (addr) = ("acresStakedTimeByUser_" + addr)
9593
9694
9795 let IdxEffTotal = 0
9896
9997 func keyResProportions () = "resTypesProportions"
10098
10199
102100 func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
103101
104102
105103 func asInt (v) = match v {
106104 case n: Int =>
107105 n
108106 case _ =>
109107 throw("fail to cast into Int")
110108 }
111109
112110
113111 func asTwoIntsTuple (val) = match val {
114112 case t2: (Int, Int) =>
115113 t2
116114 case _ =>
117115 throw("fail to cast into (Int, Int)")
118116 }
119117
120118
121119 func getVotingPower (userAddrStrOrEmpty) = {
122120 let props = split(valueOrElse(getString(stakingContract, keyResProportions()), "0_0_0_0_0_0"), "_")
123121 func adder (acc,item) = (acc + parseIntValue(item))
124122
125123 let totalPower = {
126124 let $l = props
127125 let $s = size($l)
128126 let $acc0 = 0
129127 func $f0_1 ($a,$i) = if (($i >= $s))
130128 then $a
131129 else adder($a, $l[$i])
132130
133131 func $f0_2 ($a,$i) = if (($i >= $s))
134132 then $a
135133 else throw("List size exceeds 6")
136134
137135 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
138136 }
139137 let usersPower = valueOrElse(getInteger(stakingContract, keyStakedPiecesByOwner(userAddrStrOrEmpty)), 0)
140138 [totalPower, usersPower]
141139 }
142140
143141
144142 func fixedPoint (val,decimals) = {
145143 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
146144 let lowPart = toString((val % tenPow))
147145 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
148146 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
149147 }
150148
151149
152150 func prolog () = asInt(reentrantInvoke(stakingContract, "saveLastTx", nil, nil))
153151
154152
155153 func claimAcresInternal (addr,acresAmount,lastClaimTime) = {
156154 let deltaTime = (lastBlock.timestamp - lastClaimTime)
157155 let availRes = fraction(deltaTime, (DAILYRESBYPIECE * acresAmount), (DAYMILLIS * MULT8))
158156 let canGetUsdt = asInt(invoke(economyContract, "sellResourcesWorldREADONLY", [availRes], nil))
159157 let gotUsdt = max([0, canGetUsdt])
160158 (gotUsdt * USDT2ACRES_MULTIPLIER)
161159 }
162160
163161
164162 func claimInternal (addr,acresAmount,lastClaimTime) = {
165163 let deltaTime = (lastBlock.timestamp - lastClaimTime)
166164 if ((0 > deltaTime))
167165 then throw(((("Saved timestamp is in future, saved = " + toString(lastClaimTime)) + ", current = ") + toString(lastBlock.timestamp)))
168166 else {
169167 let availRes = fraction(deltaTime, (DAILYRESBYPIECE * acresAmount), (DAYMILLIS * MULT8))
170168 let canGetUsdt = asInt(invoke(economyContract, "sellResourcesWorldREADONLY", [availRes], nil))
171169 let gotUsdt = if ((0 >= canGetUsdt))
172170 then 0
173171 else asTwoIntsTuple(invoke(economyContract, "sellResourcesWorld", [addr, availRes], nil))._1
174172 (gotUsdt * USDT2ACRES_MULTIPLIER)
175173 }
176174 }
177175
178176
179177 func mergeLocked (oldAmount,oldETA,newAmount,newETA) = {
180178 let now = lastBlock.timestamp
181179 let dt1 = max([0, (oldETA - now)])
182180 let dt2 = max([0, (newETA - now)])
183181 let sum = (oldAmount + newAmount)
184182 let dt = if ((sum == 0))
185183 then 0
186184 else (fraction(dt1, oldAmount, sum) + fraction(dt2, newAmount, sum))
187185 (now + dt)
188186 }
189187
190188
191189 @Callable(i)
192190 func constructorV1 (restAddr,unstakedPieces) = if ((i.caller != this))
193191 then throw("Permission denied")
194192 else if (isDefined(getBinary(acresAssetIdKey)))
195193 then throw("Already initialized")
196194 else {
197195 let nftAcres = (getVotingPower("")[IdxEffTotal] + unstakedPieces)
198196 let issuedAmount = (MILLION6 - (nftAcres * MULT8))
199197 let issue = Issue("ACRES", "WavesLands land acres investment token", issuedAmount, 8, false, unit, 0)
200198 let assetId = calculateAssetId(issue)
201199 [issue, IntegerEntry(acresIssuedAmountKey, issuedAmount), BinaryEntry(acresAssetIdKey, assetId), StringEntry(keyRestAddress(), restAddr)]
202200 }
203201
204202
205203
206204 @Callable(i)
207205 func stakeAcres () = {
208206 let prologResult = prolog()
209207 if ((prologResult == prologResult))
210208 then {
211209 let address = toString(i.caller)
212210 if ((size(i.payments) != 1))
213211 then throw("exactly 1 payment must be attached")
214212 else {
215213 let pmt = i.payments[0]
216214 let amt = pmt.amount
217215 if (if (!(isDefined(pmt.assetId)))
218216 then true
219217 else (value(pmt.assetId) != acresAssetId))
220218 then throw("ACRES payments only!")
221219 else {
222220 let timeKey = keyAcresStakedTimeByUser(address)
223221 let amountKey = keyAcresStakedAmountByUser(address)
224222 let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
225223 let oldTotal = valueOrElse(getInteger(acresStakedTotalKey), 0)
226224 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
227225 let claimedAcres = claimInternal(address, oldAcresAmount, valueOrElse(getInteger(timeKey), 0))
228226 $Tuple2(((((if ((claimedAcres == 0))
229227 then nil
230228 else [ScriptTransfer(i.caller, claimedAcres, acresAssetId)]) :+ IntegerEntry(timeKey, lastBlock.timestamp)) :+ IntegerEntry(amountKey, (oldAcresAmount + amt))) :+ IntegerEntry(acresStakedTotalKey, (oldTotal + amt))), $Tuple2(prologResult, wlgResult))
231229 }
232230 }
233231 }
234232 else throw("Strict value is not equal to itself.")
235233 }
236234
237235
238236
239237 @Callable(i)
240238 func unstakeAcres (amount) = {
241239 let prologResult = prolog()
242240 if ((prologResult == prologResult))
243241 then if ((0 >= amount))
244242 then throw("Amount should be positive")
245243 else {
246244 let address = toString(i.caller)
247245 if ((size(i.payments) != 0))
248246 then throw("No payments required")
249247 else {
250248 let timeKey = keyAcresStakedTimeByUser(address)
251249 let amountKey = keyAcresStakedAmountByUser(address)
252250 let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
253251 if ((amount > oldAcresAmount))
254252 then throw(((("You have only " + fixedPoint(oldAcresAmount, 8)) + " ACRES staked, tried to unstake ") + fixedPoint(amount, 8)))
255253 else {
256254 let lockedAmount = valueOrElse(getInteger(keyAcresLockedAmountByUser(address)), 0)
257255 let lockedETA = valueOrElse(getInteger(keyAcresLockedEtaByUser(address)), 0)
258256 let now = lastBlock.timestamp
259257 let unstakableAmount = (oldAcresAmount - lockedAmount)
260258 if (if ((lockedETA > now))
261259 then (amount > unstakableAmount)
262260 else false)
263261 then throw(((("Only " + fixedPoint(unstakableAmount, 8)) + " ACRES can be unstaked now, wait until ") + toString(lockedETA)))
264262 else {
265263 let oldTotal = valueOrElse(getInteger(acresStakedTotalKey), 0)
266264 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
267265 let claimedAcres = claimInternal(address, oldAcresAmount, valueOrElse(getInteger(timeKey), 0))
268266 $Tuple2([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(amountKey, (oldAcresAmount - amount)), IntegerEntry(acresStakedTotalKey, (oldTotal - amount)), ScriptTransfer(i.caller, (amount + claimedAcres), acresAssetId)], $Tuple2(prologResult, wlgResult))
269267 }
270268 }
271269 }
272270 }
273271 else throw("Strict value is not equal to itself.")
274272 }
275273
276274
277275
278276 @Callable(i)
279277 func buyAcres () = {
280278 let prologResult = prolog()
281279 if ((prologResult == prologResult))
282280 then {
283281 let address = toString(i.caller)
284282 if ((size(i.payments) != 1))
285283 then throw("exactly 1 payment must be attached")
286284 else {
287285 let pmt = i.payments[0]
288286 let amt = pmt.amount
289287 if (if (!(isDefined(pmt.assetId)))
290288 then true
291289 else (value(pmt.assetId) != usdtAssetId))
292290 then throw("USDT payments only!")
293291 else if ((MULT6 > amt))
294292 then throw((("Min payment should be " + fixedPoint(MULT6, 6)) + " USDT"))
295293 else {
296294 let acresAmount = (amt * USDT2ACRES_MULTIPLIER)
297295 let accStatsResult = asInt(invoke(stakingContract, "updateAccStats", [address, fraction(xpNewSLand, acresAmount, (25 * MULT8))], nil))
298296 $Tuple2([ScriptTransfer(economyContract, amt, usdtAssetId), ScriptTransfer(i.caller, acresAmount, acresAssetId)], $Tuple2(prologResult, accStatsResult))
299297 }
300298 }
301299 }
302300 else throw("Strict value is not equal to itself.")
303301 }
304302
305303
306304
307305 @Callable(i)
308306 func sendAcres (addr,amount) = if ((i.caller != economyContract))
309307 then throw("Permission denied")
310308 else $Tuple2([ScriptTransfer(addressFromStringValue(addr), amount, acresAssetId)], amount)
311309
312310
313311
314312 @Callable(i)
315-func sendLockedAcres (addr,amount) = if ((i.caller != this))
313+func sendLockedAcres (addr,amount,lockDays) = if (if ((i.caller != this))
314+ then (i.caller != restContract)
315+ else false)
316316 then throw("Permission denied")
317317 else {
318318 let now = lastBlock.timestamp
319319 let timeKey = keyAcresStakedTimeByUser(addr)
320320 let amountKey = keyAcresStakedAmountByUser(addr)
321321 let oldAcresAmount = valueOrElse(getInteger(amountKey), 0)
322322 let oldTotal = valueOrElse(getInteger(acresStakedTotalKey), 0)
323323 let oldTime = valueOrElse(getInteger(timeKey), now)
324324 let etaKey = keyAcresLockedEtaByUser(addr)
325325 let lockedAmountKey = keyAcresLockedAmountByUser(addr)
326326 let oldLockedAmount = valueOrElse(getInteger(lockedAmountKey), 0)
327327 let oldLockedETA = valueOrElse(getInteger(etaKey), 0)
328- let mergedETA = mergeLocked(oldLockedAmount, oldLockedETA, amount, (now + ACRES_UNLOCK_PERIOD))
329- $Tuple2([IntegerEntry(timeKey, oldTime), IntegerEntry(amountKey, (oldAcresAmount + amount)), IntegerEntry(acresStakedTotalKey, (oldTotal + amount)), IntegerEntry(etaKey, mergedETA), IntegerEntry(lockedAmountKey, (oldLockedAmount + amount))], 0)
328+ let mergedETA = mergeLocked(oldLockedAmount, oldLockedETA, amount, (now + (lockDays * DAYMILLIS)))
329+ $Tuple2([IntegerEntry(timeKey, oldTime), IntegerEntry(amountKey, (oldAcresAmount + amount)), IntegerEntry(acresStakedTotalKey, (oldTotal + amount)), IntegerEntry(etaKey, mergedETA), IntegerEntry(lockedAmountKey, (oldLockedAmount + amount))], amount)
330330 }
331331
332332
333333
334334 @Callable(i)
335335 func burnAcres (amount) = if ((i.caller != stakingContract))
336336 then throw("Permission denied")
337337 else {
338338 let amountLeft = (valueOrElse(getInteger(acresIssuedAmountKey), 0) - amount)
339339 if ((0 > amountLeft))
340340 then throw("Attempt to burn more ACRES, than exists")
341341 else $Tuple2([Burn(acresAssetId, amount), IntegerEntry(acresIssuedAmountKey, amountLeft)], amount)
342342 }
343343
344344
345345
346346 @Callable(i)
347347 func claimAcres () = {
348348 let prologResult = prolog()
349349 if ((prologResult == prologResult))
350350 then {
351351 let address = toString(i.caller)
352352 if ((size(i.payments) != 0))
353353 then throw("No payments required")
354354 else {
355355 let timeKey = keyAcresStakedTimeByUser(address)
356356 let amountKey = keyAcresStakedAmountByUser(address)
357357 let acresAmount = valueOrElse(getInteger(amountKey), 0)
358358 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
359359 let claimedAcres = claimInternal(address, acresAmount, valueOrElse(getInteger(timeKey), 0))
360360 $Tuple2([IntegerEntry(timeKey, lastBlock.timestamp), ScriptTransfer(i.caller, claimedAcres, acresAssetId)], $Tuple2(prologResult, wlgResult))
361361 }
362362 }
363363 else throw("Strict value is not equal to itself.")
364364 }
365365
366366
367367
368368 @Callable(i)
369369 func claimAcresREADONLY (address) = {
370370 let timeKey = keyAcresStakedTimeByUser(address)
371371 let amountKey = keyAcresStakedAmountByUser(address)
372372 let acresAmount = valueOrElse(getInteger(amountKey), 0)
373373 let lastTime = valueOrElse(getInteger(timeKey), 0)
374374 let claimedAcres = claimAcresInternal(address, acresAmount, lastTime)
375375 $Tuple2(nil, [claimedAcres, lastTime])
376376 }
377377
378378

github/deemru/w8io/169f3d6 
53.74 ms