tx · 5AuCRTKPmL113uJfCffYgi449kJaf5NdZ1YEzfsikzyG 3P8FgFUEvZCD1c6FkZM3zT5eYezocydyxDD: -0.01000000 Waves 2023.01.16 13:29 [3472868] smart account 3P8FgFUEvZCD1c6FkZM3zT5eYezocydyxDD > SELF 0.00000000 Waves
{ "type": 13, "id": "5AuCRTKPmL113uJfCffYgi449kJaf5NdZ1YEzfsikzyG", "fee": 1000000, "feeAssetId": null, "timestamp": 1673864987151, "version": 2, "chainId": 87, "sender": "3P8FgFUEvZCD1c6FkZM3zT5eYezocydyxDD", "senderPublicKey": "DkxqS5tLpEQJtue73P7Cwt117bTL6nZjvnLiSnkEd1QQ", "proofs": [ "3e4QhP1PvvFwVyCTfo7sVvxkhSV64hN6NwDtHAchejL4gErKu4j1XjTFkiQCAgLvQZisKSpd73mNZEgSbjSRpFtH" ], "script": "base64:BgIkCAISBAoCAQESBAoCCAgSBQoDGAgIEgMKAQgSAwoBCBIDCgEIEgEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEMdHJ5R2V0U3RyaW5nAQNrZXkJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIFBHRoaXMFA2tleQEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAmggCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDXRyeUdldEludGVnZXIBA2tleQkBFXRyeUdldEludGVnZXJFeHRlcm5hbAIFBHRoaXMFA2tleQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIeUkFJOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwECFHN0YXRpY19vcmFjbGVBZGRyZXNzAQ5nZXRIdW50QWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEMdHJ5R2V0U3RyaW5nAQISc3RhdGljX2h1bnRBZGRyZXNzARFnZXRCcmVlZGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIVc3RhdGljX2JyZWVkZXJBZGRyZXNzAQ1nZXRFZ2dBc3NldElkAAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIRc3RhdGljX2VnZ0Fzc2V0SWQBD2dldER1Y2tPd25lcktleQEEZHVjawkArAICCQCsAgICBWR1Y2tfBQRkdWNrAgZfb3duZXIBEGdldER1Y2tTdGF0dXNLZXkBBGR1Y2sJAKwCAgkArAICAgVkdWNrXwUEZHVjawIHX3N0YXR1cwESZ2V0RHVja1JlbnRlZEJ5S2V5AQRkdWNrCQCsAgIJAKwCAgIFZHVja18FBGR1Y2sCCV9yZW50ZWRCeQESZ2V0RHVja0R1cmF0aW9uS2V5AQRkdWNrCQCsAgIJAKwCAgIFZHVja18FBGR1Y2sCCV9kdXJhdGlvbgETZ2V0RHVja1JlbnRzdGFydEtleQEEZHVjawkArAICCQCsAgICBWR1Y2tfBQRkdWNrAglfc3RhcnRfdHMBFGdldER1Y2tQZXJjZW50YWdlS2V5AQRkdWNrCQCsAgIJAKwCAgIFZHVja18FBGR1Y2sCC19wZXJjZW50YWdlARJnZXREdWNrTGFzdFBhaWRLZXkBBGR1Y2sJAKwCAgkArAICAgVkdWNrXwUEZHVjawIJX2xhc3RQYWlkAQ5rZXlTcG90c0JvdWdodAEKYWRkcmVzc1N0cgkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgxfc3BvdHNCb3VnaHQBDGtleVNwb3RzQnVzeQEKYWRkcmVzc1N0cgkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgpfc3BvdHNCdXN5BgFpAQpwdXRGb3JSZW50AgxkdXJhdGlvbkluTXMKcGVyY2VudGFnZQQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmR1Y2tJZAkA2AQBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQDCQECIT0CCAUMZmlyc3RQYXltZW50BmFtb3VudAABCQACAQIZUlBGUjogTkZUIGlzIG5vdCBhdHRhY2hlZAQIY2hpbGRyZW4JAQVhc0ludAEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWdmFsaWRhdGVBbmRHZXRDaGlsZHJlbgkAzAgCBQZkdWNrSWQFA25pbAUDbmlsAwkAAAIFCGNoaWxkcmVuBQhjaGlsZHJlbgQLYm91Z2h0U3BvdHMJARV0cnlHZXRJbnRlZ2VyRXh0ZXJuYWwCCQEOZ2V0SHVudEFkZHJlc3MACQEOa2V5U3BvdHNCb3VnaHQBCQClCAEIBQFpBmNhbGxlcgQJYnVzeVNwb3RzCQEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgkBDmdldEh1bnRBZGRyZXNzAAkBDGtleVNwb3RzQnVzeQEJAKUIAQgFAWkGY2FsbGVyAwkAZwIFCWJ1c3lTcG90cwULYm91Z2h0U3BvdHMJAAIBAhRSUEZSOiBObyBmcmVlIHNwb3RzIQMDCQBmAgUKcGVyY2VudGFnZQBQBgkAZgIABQUKcGVyY2VudGFnZQkAAgECMFJQRlI6IHBsZWFzZSBwaWNrIGEgcGVyY2VudGFnZSBiZXR3ZWVuIDUgYW5kIDgwJQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGdldER1Y2tQZXJjZW50YWdlS2V5AQUGZHVja0lkBQpwZXJjZW50YWdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESZ2V0RHVja0R1cmF0aW9uS2V5AQUGZHVja0lkBQxkdXJhdGlvbkluTXMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2dldER1Y2tPd25lcktleQEFBmR1Y2tJZAkApQgBCAUBaQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGdldER1Y2tTdGF0dXNLZXkBBQZkdWNrSWQCBElETEUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARByZW50RHVja0Zyb21Vc2VyAgZkdWNrSWQEZ2FtZQQKZHVja1N0YXR1cwkBDHRyeUdldFN0cmluZwEJARBnZXREdWNrU3RhdHVzS2V5AQUGZHVja0lkAwkBAiE9AgUKZHVja1N0YXR1cwIESURMRQkAAgEJAKwCAgJBUlJERlU6IFlvdSBjYW4gb25seSByZW50IGR1Y2tzIHdpdGggSURMRSBzdGF0dXMuIEN1cnJlbnQgc3RhdHVzOiAFCmR1Y2tTdGF0dXMECWR1Y2tPd25lcgkBDHRyeUdldFN0cmluZwEJAQ9nZXREdWNrT3duZXJLZXkBBQZkdWNrSWQEC2JvdWdodFNwb3RzCQEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgkBDmdldEh1bnRBZGRyZXNzAAkBDmtleVNwb3RzQm91Z2h0AQUJZHVja093bmVyBAlidXN5U3BvdHMJARV0cnlHZXRJbnRlZ2VyRXh0ZXJuYWwCCQEOZ2V0SHVudEFkZHJlc3MACQEMa2V5U3BvdHNCdXN5AQUJZHVja093bmVyAwkAZwIFCWJ1c3lTcG90cwULYm91Z2h0U3BvdHMJAAIBAhVSUkRGVTogTm8gZnJlZSBzcG90cyEDCQECIT0CBQRnYW1lAgRIVU5UCQACAQIYUlJERlU6IFVuc3VwcG9ydGVkIGdhbWUhBAdzdGFydFRzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQOc2VuZFRvSHVudERhdGEJAPwHBAkBDmdldEh1bnRBZGRyZXNzAAIPbG9ja0R1Y2tSZW50aW5nCQDMCAIFCWR1Y2tPd25lcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFBmR1Y2tJZAABBQNuaWwDCQAAAgUOc2VuZFRvSHVudERhdGEFDnNlbmRUb0h1bnREYXRhCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETZ2V0RHVja1JlbnRzdGFydEtleQEFBmR1Y2tJZAUHc3RhcnRUcwkAzAgCCQELU3RyaW5nRW50cnkCCQEQZ2V0RHVja1N0YXR1c0tleQEFBmR1Y2tJZAIGUkVOVEVECQDMCAIJAQtTdHJpbmdFbnRyeQIJARJnZXREdWNrUmVudGVkQnlLZXkBBQZkdWNrSWQJAKUIAQgFAWkGY2FsbGVyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMdG9wVXBSZXdhcmRzAxRkdWNrSWRBbmRBbW91bnRzTGlzdAdhbW91bnRzB2Fzc2V0SWQKAQtoYW5kbGVUb3BVcAIDYWNjD2R1Y2tJZEFuZEFtb3VudAQKc3BsaXRBcnJheQkAtQkCBQ9kdWNrSWRBbmRBbW91bnQCAToEBmR1Y2tJZAkAkQMCBQpzcGxpdEFycmF5AAAEBmFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnNwbGl0QXJyYXkAAQQJZHVja093bmVyCQEMdHJ5R2V0U3RyaW5nAQkBD2dldER1Y2tPd25lcktleQEFBmR1Y2tJZAQGcmVudGVyCQEMdHJ5R2V0U3RyaW5nAQkBEmdldER1Y2tSZW50ZWRCeUtleQEFBmR1Y2tJZAQNZmVlUGVyY2VudGFnZQkBDXRyeUdldEludGVnZXIBCQEUZ2V0RHVja1BlcmNlbnRhZ2VLZXkBBQZkdWNrSWQEDmZvck93bmVyQW1vdW50CQBrAwUGYW1vdW50BQ1mZWVQZXJjZW50YWdlAGQED2ZvclBsYXllckFtb3VudAkAZQIFBmFtb3VudAUOZm9yT3duZXJBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJZHVja093bmVyCQBoAgUOZm9yT3duZXJBbW91bnQAoI0GCQDZBAEFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUGcmVudGVyCQBoAgUPZm9yUGxheWVyQW1vdW50AKCNBgkA2QQBBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESZ2V0RHVja0xhc3RQYWlkS2V5AQUGZHVja0lkCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUDbmlsCgACJGwFFGR1Y2tJZEFuZEFtb3VudHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQtoYW5kbGVUb3BVcAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8BaQENY2xhaW1EdWNrQmFjawEGZHVja0lkBAlkdWNrT3duZXIJAQx0cnlHZXRTdHJpbmcBCQEPZ2V0RHVja093bmVyS2V5AQUGZHVja0lkAwkBAiE9AgUJZHVja093bmVyCQClCAEIBQFpBmNhbGxlcgkAAgECMlJDREI6IFBsZWFzZSBkb24ndCB0cnkgdG8gc3RlYWwgc29tZW9uZSBlbHNlIGR1Y2shBApkdWNrU3RhdHVzCQEMdHJ5R2V0U3RyaW5nAQkBEGdldER1Y2tTdGF0dXNLZXkBBQZkdWNrSWQDCQAAAgUKZHVja1N0YXR1cwIESURMRQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQkA2QQBBQZkdWNrSWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEGdldER1Y2tTdGF0dXNLZXkBBQZkdWNrSWQFA25pbAQHc3RhcnRUcwkBDXRyeUdldEludGVnZXIBCQETZ2V0RHVja1JlbnRzdGFydEtleQEFBmR1Y2tJZAMJAGYCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZAIFB3N0YXJ0VHMJAQ10cnlHZXRJbnRlZ2VyAQkBEmdldER1Y2tEdXJhdGlvbktleQEFBmR1Y2tJZAQGcGxheWVyCQEMdHJ5R2V0U3RyaW5nAQkBEmdldER1Y2tSZW50ZWRCeUtleQEFBmR1Y2tJZAQOcmVtb3ZlRnJvbUh1bnQJAPwHBAkBDmdldEh1bnRBZGRyZXNzAAIRdW5sb2NrRHVja1JlbnRpbmcJAMwIAgUJZHVja093bmVyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUGZHVja0lkAAEFA25pbAMJAAACBQ5yZW1vdmVGcm9tSHVudAUOcmVtb3ZlRnJvbUh1bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUGcGxheWVyAIDC1y8JAQ1nZXRFZ2dBc3NldElkAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlkdWNrT3duZXIAAQkA2QQBBQZkdWNrSWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEGdldER1Y2tTdGF0dXNLZXkBBQZkdWNrSWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmdldER1Y2tSZW50ZWRCeUtleQEFBmR1Y2tJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAtsYXN0UGF5bWVudAkBDXRyeUdldEludGVnZXIBCQESZ2V0RHVja0xhc3RQYWlkS2V5AQUGZHVja0lkBA10aHJlZURheXNJbk1zCQBoAgkAaAIJAGgCAAMAGAA8AOgHAwkAZgIIBQlsYXN0QmxvY2sGaGVpZ2h0CQBkAgULbGFzdFBheW1lbnQFDXRocmVlRGF5c0luTXMEB3Vuc3Rha2UJAPwHBAkBDmdldEh1bnRBZGRyZXNzAAIRdW5sb2NrRHVja1JlbnRpbmcJAMwIAgUJZHVja093bmVyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUGZHVja0lkAAEFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCWR1Y2tPd25lcgABCQDZBAEFBmR1Y2tJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEQZ2V0RHVja1N0YXR1c0tleQEFBmR1Y2tJZAkAzAgCCQELRGVsZXRlRW50cnkBCQESZ2V0RHVja1JlbnRlZEJ5S2V5AQUGZHVja0lkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAjZSQ0RCOiBSZW50aW5nIHBlcmlvZCBpcyBub3Qgb3ZlciBhbmQgcGxheWVyIGlzIGFjdGl2ZSEBaQEMc2VuZER1Y2tCYWNrAQZkdWNrSWQECHJlbnRlZEJ5CQEMdHJ5R2V0U3RyaW5nAQkBEmdldER1Y2tSZW50ZWRCeUtleQEFBmR1Y2tJZAMJAQIhPQIFCHJlbnRlZEJ5CQClCAEIBQFpBmNhbGxlcgkAAgECIFJTREI6IFlvdSBkaWRuJ3QgcmVudCB0aGlzIGR1Y2shBAlkdWNrT3duZXIJAQx0cnlHZXRTdHJpbmcBCQEPZ2V0RHVja093bmVyS2V5AQUGZHVja0lkBA5yZW1vdmVGcm9tSHVudAkA/AcECQEOZ2V0SHVudEFkZHJlc3MAAhF1bmxvY2tEdWNrUmVudGluZwkAzAgCBQlkdWNrT3duZXIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQZkdWNrSWQAAQUDbmlsAwkAAAIFDnJlbW92ZUZyb21IdW50BQ5yZW1vdmVGcm9tSHVudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAgMLXLwkBDWdldEVnZ0Fzc2V0SWQACQDMCAIJAQtTdHJpbmdFbnRyeQIJARBnZXREdWNrU3RhdHVzS2V5AQUGZHVja0lkAgRJRExFCQDMCAIJAQtEZWxldGVFbnRyeQEJARBnZXREdWNrU3RhdHVzS2V5AQUGZHVja0lkCQDMCAIJAQtEZWxldGVFbnRyeQEJARJnZXREdWNrUmVudGVkQnlLZXkBBQZkdWNrSWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ9jb25maWd1cmVPcmFjbGUBBm9yYWNsZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECD1JDTzogYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwUGb3JhY2xlBQNuaWwADUEwTg==", "height": 3472868, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 6HwidBTWdeJaxsxSQmRbtjVf75diPKVun9hvC2H4uwve Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | func tryGetStringExternal (address,key) = match getString(address, key) { | |
5 | + | case a: String => | |
6 | + | a | |
7 | + | case _ => | |
8 | + | "" | |
9 | + | } | |
10 | + | ||
11 | + | ||
12 | + | func tryGetString (key) = tryGetStringExternal(this, key) | |
13 | + | ||
14 | + | ||
15 | + | func tryGetIntegerExternal (address,key) = match getInteger(address, key) { | |
16 | + | case b: Int => | |
17 | + | b | |
18 | + | case _ => | |
19 | + | 0 | |
20 | + | } | |
21 | + | ||
22 | + | ||
23 | + | func tryGetInteger (key) = tryGetIntegerExternal(this, key) | |
24 | + | ||
25 | + | ||
26 | + | func asInt (value) = match value { | |
27 | + | case int: Int => | |
28 | + | int | |
29 | + | case _ => | |
30 | + | throw("RAI: wrong type, expected: Int") | |
31 | + | } | |
32 | + | ||
33 | + | ||
34 | + | func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress"))) | |
35 | + | ||
36 | + | ||
37 | + | func getHuntAddress () = Address(fromBase58String(tryGetString("static_huntAddress"))) | |
38 | + | ||
39 | + | ||
40 | + | func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress"))) | |
41 | + | ||
42 | + | ||
43 | + | func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId")) | |
44 | + | ||
45 | + | ||
46 | + | func getDuckOwnerKey (duck) = (("duck_" + duck) + "_owner") | |
47 | + | ||
48 | + | ||
49 | + | func getDuckStatusKey (duck) = (("duck_" + duck) + "_status") | |
50 | + | ||
51 | + | ||
52 | + | func getDuckRentedByKey (duck) = (("duck_" + duck) + "_rentedBy") | |
53 | + | ||
54 | + | ||
55 | + | func getDuckDurationKey (duck) = (("duck_" + duck) + "_duration") | |
56 | + | ||
57 | + | ||
58 | + | func getDuckRentstartKey (duck) = (("duck_" + duck) + "_start_ts") | |
59 | + | ||
60 | + | ||
61 | + | func getDuckPercentageKey (duck) = (("duck_" + duck) + "_percentage") | |
62 | + | ||
63 | + | ||
64 | + | func getDuckLastPaidKey (duck) = (("duck_" + duck) + "_lastPaid") | |
65 | + | ||
66 | + | ||
67 | + | func keySpotsBought (addressStr) = (("address_" + addressStr) + "_spotsBought") | |
68 | + | ||
69 | + | ||
70 | + | func keySpotsBusy (addressStr) = (("address_" + addressStr) + "_spotsBusy") | |
71 | + | ||
72 | + | ||
73 | + | @Callable(i) | |
74 | + | func putForRent (durationInMs,percentage) = { | |
75 | + | let firstPayment = value(i.payments[0]) | |
76 | + | let duckId = toBase58String(value(firstPayment.assetId)) | |
77 | + | if ((firstPayment.amount != 1)) | |
78 | + | then throw("RPFR: NFT is not attached") | |
79 | + | else { | |
80 | + | let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil)) | |
81 | + | if ((children == children)) | |
82 | + | then { | |
83 | + | let boughtSpots = tryGetIntegerExternal(getHuntAddress(), keySpotsBought(toString(i.caller))) | |
84 | + | let busySpots = tryGetIntegerExternal(getHuntAddress(), keySpotsBusy(toString(i.caller))) | |
85 | + | if ((busySpots >= boughtSpots)) | |
86 | + | then throw("RPFR: No free spots!") | |
87 | + | else if (if ((percentage > 80)) | |
88 | + | then true | |
89 | + | else (5 > percentage)) | |
90 | + | then throw("RPFR: please pick a percentage between 5 and 80%") | |
91 | + | else [IntegerEntry(getDuckPercentageKey(duckId), percentage), IntegerEntry(getDuckDurationKey(duckId), durationInMs), StringEntry(getDuckOwnerKey(duckId), toString(i.caller)), StringEntry(getDuckStatusKey(duckId), "IDLE")] | |
92 | + | } | |
93 | + | else throw("Strict value is not equal to itself.") | |
94 | + | } | |
95 | + | } | |
96 | + | ||
97 | + | ||
98 | + | ||
99 | + | @Callable(i) | |
100 | + | func rentDuckFromUser (duckId,game) = { | |
101 | + | let duckStatus = tryGetString(getDuckStatusKey(duckId)) | |
102 | + | if ((duckStatus != "IDLE")) | |
103 | + | then throw(("RRDFU: You can only rent ducks with IDLE status. Current status: " + duckStatus)) | |
104 | + | else { | |
105 | + | let duckOwner = tryGetString(getDuckOwnerKey(duckId)) | |
106 | + | let boughtSpots = tryGetIntegerExternal(getHuntAddress(), keySpotsBought(duckOwner)) | |
107 | + | let busySpots = tryGetIntegerExternal(getHuntAddress(), keySpotsBusy(duckOwner)) | |
108 | + | if ((busySpots >= boughtSpots)) | |
109 | + | then throw("RRDFU: No free spots!") | |
110 | + | else if ((game != "HUNT")) | |
111 | + | then throw("RRDFU: Unsupported game!") | |
112 | + | else { | |
113 | + | let startTs = lastBlock.timestamp | |
114 | + | let sendToHuntData = invoke(getHuntAddress(), "lockDuckRenting", [duckOwner], [AttachedPayment(fromBase58String(duckId), 1)]) | |
115 | + | if ((sendToHuntData == sendToHuntData)) | |
116 | + | then [IntegerEntry(getDuckRentstartKey(duckId), startTs), StringEntry(getDuckStatusKey(duckId), "RENTED"), StringEntry(getDuckRentedByKey(duckId), toString(i.caller))] | |
117 | + | else throw("Strict value is not equal to itself.") | |
118 | + | } | |
119 | + | } | |
120 | + | } | |
121 | + | ||
122 | + | ||
123 | + | ||
124 | + | @Callable(i) | |
125 | + | func topUpRewards (duckIdAndAmountsList,amounts,assetId) = { | |
126 | + | func handleTopUp (acc,duckIdAndAmount) = { | |
127 | + | let splitArray = split(duckIdAndAmount, ":") | |
128 | + | let duckId = splitArray[0] | |
129 | + | let amount = parseIntValue(splitArray[1]) | |
130 | + | let duckOwner = tryGetString(getDuckOwnerKey(duckId)) | |
131 | + | let renter = tryGetString(getDuckRentedByKey(duckId)) | |
132 | + | let feePercentage = tryGetInteger(getDuckPercentageKey(duckId)) | |
133 | + | let forOwnerAmount = fraction(amount, feePercentage, 100) | |
134 | + | let forPlayerAmount = (amount - forOwnerAmount) | |
135 | + | [ScriptTransfer(addressFromStringValue(duckOwner), (forOwnerAmount * 100000), fromBase58String(assetId)), ScriptTransfer(addressFromStringValue(renter), (forPlayerAmount * 100000), fromBase58String(assetId)), IntegerEntry(getDuckLastPaidKey(duckId), lastBlock.timestamp)] | |
136 | + | } | |
137 | + | ||
138 | + | let $l = duckIdAndAmountsList | |
139 | + | let $s = size($l) | |
140 | + | let $acc0 = nil | |
141 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
142 | + | then $a | |
143 | + | else handleTopUp($a, $l[$i]) | |
144 | + | ||
145 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
146 | + | then $a | |
147 | + | else throw("List size exceeds 15") | |
148 | + | ||
149 | + | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15) | |
150 | + | } | |
151 | + | ||
152 | + | ||
153 | + | ||
154 | + | @Callable(i) | |
155 | + | func claimDuckBack (duckId) = { | |
156 | + | let duckOwner = tryGetString(getDuckOwnerKey(duckId)) | |
157 | + | if ((duckOwner != toString(i.caller))) | |
158 | + | then throw("RCDB: Please don't try to steal someone else duck!") | |
159 | + | else { | |
160 | + | let duckStatus = tryGetString(getDuckStatusKey(duckId)) | |
161 | + | if ((duckStatus == "IDLE")) | |
162 | + | then [ScriptTransfer(i.caller, 1, fromBase58String(duckId)), DeleteEntry(getDuckStatusKey(duckId))] | |
163 | + | else { | |
164 | + | let startTs = tryGetInteger(getDuckRentstartKey(duckId)) | |
165 | + | if ((lastBlock.timestamp > (startTs + tryGetInteger(getDuckDurationKey(duckId))))) | |
166 | + | then { | |
167 | + | let player = tryGetString(getDuckRentedByKey(duckId)) | |
168 | + | let removeFromHunt = invoke(getHuntAddress(), "unlockDuckRenting", [duckOwner], [AttachedPayment(fromBase58String(duckId), 1)]) | |
169 | + | if ((removeFromHunt == removeFromHunt)) | |
170 | + | then [ScriptTransfer(addressFromStringValue(player), 100000000, getEggAssetId()), ScriptTransfer(addressFromStringValue(duckOwner), 1, fromBase58String(duckId)), DeleteEntry(getDuckStatusKey(duckId)), DeleteEntry(getDuckRentedByKey(duckId))] | |
171 | + | else throw("Strict value is not equal to itself.") | |
172 | + | } | |
173 | + | else { | |
174 | + | let lastPayment = tryGetInteger(getDuckLastPaidKey(duckId)) | |
175 | + | let threeDaysInMs = (((3 * 24) * 60) * 1000) | |
176 | + | if ((lastBlock.height > (lastPayment + threeDaysInMs))) | |
177 | + | then { | |
178 | + | let unstake = invoke(getHuntAddress(), "unlockDuckRenting", [duckOwner], [AttachedPayment(fromBase58String(duckId), 1)]) | |
179 | + | if ((unstake == unstake)) | |
180 | + | then [ScriptTransfer(addressFromStringValue(duckOwner), 1, fromBase58String(duckId)), DeleteEntry(getDuckStatusKey(duckId)), DeleteEntry(getDuckRentedByKey(duckId))] | |
181 | + | else throw("Strict value is not equal to itself.") | |
182 | + | } | |
183 | + | else throw("RCDB: Renting period is not over and player is active!") | |
184 | + | } | |
185 | + | } | |
186 | + | } | |
187 | + | } | |
188 | + | ||
189 | + | ||
190 | + | ||
191 | + | @Callable(i) | |
192 | + | func sendDuckBack (duckId) = { | |
193 | + | let rentedBy = tryGetString(getDuckRentedByKey(duckId)) | |
194 | + | if ((rentedBy != toString(i.caller))) | |
195 | + | then throw("RSDB: You didn't rent this duck!") | |
196 | + | else { | |
197 | + | let duckOwner = tryGetString(getDuckOwnerKey(duckId)) | |
198 | + | let removeFromHunt = invoke(getHuntAddress(), "unlockDuckRenting", [duckOwner], [AttachedPayment(fromBase58String(duckId), 1)]) | |
199 | + | if ((removeFromHunt == removeFromHunt)) | |
200 | + | then [ScriptTransfer(i.caller, 100000000, getEggAssetId()), StringEntry(getDuckStatusKey(duckId), "IDLE"), DeleteEntry(getDuckStatusKey(duckId)), DeleteEntry(getDuckRentedByKey(duckId))] | |
201 | + | else throw("Strict value is not equal to itself.") | |
202 | + | } | |
203 | + | } | |
204 | + | ||
205 | + | ||
206 | + | ||
207 | + | @Callable(i) | |
208 | + | func configureOracle (oracle) = if ((i.caller != this)) | |
209 | + | then throw("RCO: admin only") | |
210 | + | else [StringEntry("static_oracleAddress", oracle)] | |
211 | + | ||
212 | + |
github/deemru/w8io/3ef1775 26.96 ms ◑