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:
OldNewDifferences
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