tx · DqEhLXfa2hbuPEHSKvXVwKTa6R44YWTTAymcfmUwjbR5

3P3Gtbq2raMqBkks8tr6sTZH9uHCoVTBfQ8:  -0.01300000 Waves

2024.04.11 15:15 [4124059] smart account 3P3Gtbq2raMqBkks8tr6sTZH9uHCoVTBfQ8 > SELF 0.00000000 Waves

{ "type": 13, "id": "DqEhLXfa2hbuPEHSKvXVwKTa6R44YWTTAymcfmUwjbR5", "fee": 1300000, "feeAssetId": null, "timestamp": 1712837726660, "version": 2, "chainId": 87, "sender": "3P3Gtbq2raMqBkks8tr6sTZH9uHCoVTBfQ8", "senderPublicKey": "CkiAJpjzQxQJbusEaNya9oR4qzmVyLBpnuByUDshzsrP", "proofs": [ "3QiCSbKojJQsKMzAsTeQ5hZ5VvuEtUEsX3EjhZiAgA2YpvZmCbaXa8JXmTj8gpG2kD756gt1WGrTehuFSsrKgWac" ], "script": "base64:BgI8CAISAwoBCBIGCgQICAgIEgMKAQgSABIAEgMKAQgSABIDCgEIEgMKAQgSBAoCCAgSAwoBCBIGCgQIAQQIOAENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAEVa2V5RHVja1BsYXlVbmxvY2tUaW1lAQdhc3NldElkCQCsAgIJAKwCAgIFZHVja18JANgEAQUHYXNzZXRJZAILX3VubG9ja1RpbWUBF2tleUR1Y2tGaW5pc2hVbmxvY2tUaW1lAQdhc3NldElkCQCsAgIJAKwCAgIFZHVja18JANgEAQUHYXNzZXRJZAIRZmluaXNoX3VubG9ja1RpbWUBDGtleUR1Y2tPd25lcgEHYXNzZXRJZAkArAICCQCsAgICBWR1Y2tfCQDYBAEFB2Fzc2V0SWQCBl9vd25lcgEOa2V5U3BvdHNCb3VnaHQBCmFkZHJlc3NTdHIJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIMX3Nwb3RzQm91Z2h0AQxrZXlTcG90c0J1c3kBCmFkZHJlc3NTdHIJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIKX3Nwb3RzQnVzeQETa2V5TG9ja2VkRHVja1N0YXR1cwIKYWRkcmVzc1N0cgphc3NldElkU3RyCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgxfbG9ja2VkRHVja18FCmFzc2V0SWRTdHICB19zdGF0dXMBCWtleUR1Y2tWMgIKYWRkcmVzc1N0cgphc3NldElkU3RyCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgxfbG9ja2VkRHVja18FCmFzc2V0SWRTdHICA192MgEOZ2V0RHVja0RldGFpbHMBB2Fzc2V0SWQECWFzc2V0TmFtZQkBBXZhbHVlAQgJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZARuYW1lBA5hc3NldE5hbWVQYXJ0cwkAtQkCBQlhc3NldE5hbWUCAAQJaXNKYWNrcG90CQAAAgkAkQMCBQ5hc3NldE5hbWVQYXJ0cwkAZQIJAJADAQUOYXNzZXROYW1lUGFydHMAAgIBSgQKYXNzZXRDb2xvcgMFCWlzSmFja3BvdAIBQgkAkQMCBQ5hc3NldE5hbWVQYXJ0cwkAZQIJAJADAQUOYXNzZXROYW1lUGFydHMAAQkAlAoCBQphc3NldENvbG9yBQlpc0phY2twb3QBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDXRyeUdldEJvb2xlYW4BA2tleQQHJG1hdGNoMAkAoAgBBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBDHRyeUdldFN0cmluZwEDa2V5CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQR0aGlzBQNrZXkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBFHN0YXRpY0tleV9lZ2dBc3NldElkAAIRc3RhdGljX2VnZ0Fzc2V0SWQBGnN0YXRpY0tleV9pbmN1YmF0b3JBZGRyZXNzAAIXc3RhdGljX2luY3ViYXRvckFkZHJlc3MBGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwACFXN0YXRpY19icmVlZGVyQWRkcmVzcwEYc3RhdGljS2V5X2Zhcm1pbmdBZGRyZXNzAAIVc3RhdGljX2Zhcm1pbmdBZGRyZXNzARhzdGF0aWNLZXlfcmVudGluZ0FkZHJlc3MAAhVzdGF0aWNfcmVudGluZ0FkZHJlc3MBF3N0YXRpY0tleV9zaG9ydEdhbWVOYW1lAAIUc3RhdGljX3Nob3J0R2FtZU5hbWUBFnN0YXRpY0tleV9sb25nR2FtZU5hbWUAAhNzdGF0aWNfbG9uZ0dhbWVOYW1lARFzdGF0aWNLZXlfbmZ0TmFtZQACDnN0YXRpY19uZnROYW1lARdzdGF0aWNLZXlfYmFja2VuZFB1YktleQACFHN0YXRpY19iYWNrZW5kUHViS2V5ARtzdGF0aWNLZXlfYWNjZXNzSXRlbUFzc2V0SWQAAhhzdGF0aWNfYWNjZXNzSXRlbUFzc2V0SWQBGXN0YXRpY0tleV9hY2Nlc3NJdGVtUHJpY2UAAhZzdGF0aWNfYWNjZXNzSXRlbVByaWNlARlzdGF0aWNLZXlfbWluTG9ja0R1cmF0aW9uAAIWc3RhdGljX21pbkxvY2tEdXJhdGlvbgEYc3RhdGljS2V5X1VubG9ja0R1cmF0aW9uAAIVc3RhdGljX1VubG9ja0R1cmF0aW9uARtzdGF0aWNLZXlfYm9vc3RlckJ1eUFzc2V0SWQAAhhzdGF0aWNfYm9vc3RlckJ1eUFzc2V0SWQBEnN0YXRpY0tleV9leHRyYUZlZQACD3N0YXRpY19leHRyYUZlZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgEbc3RhdGljS2V5X2Jvb3N0ZXJQcmljZUxldmVsAQVsZXZlbAkArAICAhlzdGF0aWNfYm9vc3RlclByaWNlTGV2ZWxfBQVsZXZlbAEVc3RhdGljS2V5X2Jvb3N0ZXJOYW1lAQVsZXZlbAkArAICAhNzdGF0aWNfYm9vc3Rlck5hbWVfBQVsZXZlbAEVc3RhdGljS2V5X2J1cm5BZGRyZXNzAAISc3RhdGljX2J1cm5BZGRyZXNzAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABC2dldEdhbWVOYW1lAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARdzdGF0aWNLZXlfc2hvcnRHYW1lTmFtZQACJDNHR046IFRoZXJlIGlzIG5vIGdhbWUgbmFtZSBkZWZpbmVkIQEPZ2V0TG9uZ0dhbWVOYW1lAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARZzdGF0aWNLZXlfbG9uZ0dhbWVOYW1lAAIqM0dMR046IFRoZXJlIGlzIG5vIGxvbmcgZ2FtZSBuYW1lIGRlZmluZWQhAQpnZXRORlROYW1lAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARFzdGF0aWNLZXlfbmZ0TmFtZQACIzNHTk46IFRoZXJlIGlzIG5vIG5mdCBuYW1lIGRlZmluZWQhARNnZXRJbmN1YmF0b3JBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEac3RhdGljS2V5X2luY3ViYXRvckFkZHJlc3MAARFnZXRCcmVlZGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwABEWdldFJlbnRpbmdBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X3JlbnRpbmdBZGRyZXNzAAERZ2V0RmFybWluZ0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfZmFybWluZ0FkZHJlc3MAAQ1nZXRFZ2dBc3NldElkAAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFHN0YXRpY0tleV9lZ2dBc3NldElkAAEQZ2V0QmFja2VuZFB1YktleQAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfYmFja2VuZFB1YktleQABEGdldEZlZUFnZ3JlZ2F0b3IACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgABDmdldEJ1cm5BZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEVc3RhdGljS2V5X2J1cm5BZGRyZXNzAAEUZ2V0QWNjZXNzSXRlbUFzc2V0SWQACQDZBAEJAQx0cnlHZXRTdHJpbmcBCQEbc3RhdGljS2V5X2FjY2Vzc0l0ZW1Bc3NldElkAAESZ2V0QWNjZXNzSXRlbVByaWNlAAkBDXRyeUdldEludGVnZXIBCQEZc3RhdGljS2V5X2FjY2Vzc0l0ZW1QcmljZQABEmdldE1pbkxvY2tEdXJhdGlvbgAJAQ10cnlHZXRJbnRlZ2VyAQkBGXN0YXRpY0tleV9taW5Mb2NrRHVyYXRpb24AARFnZXRVbmxvY2tEdXJhdGlvbgAJAQ10cnlHZXRJbnRlZ2VyAQkBGHN0YXRpY0tleV9VbmxvY2tEdXJhdGlvbgABE2dldEJvc3RlckJ1eUFzc2V0SWQACQDZBAEJAQx0cnlHZXRTdHJpbmcBCQEbc3RhdGljS2V5X2Jvb3N0ZXJCdXlBc3NldElkAAEWZ2V0Qm9zdGVyUHJpY2VGb3JMZXZlbAEFbGV2ZWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQEbc3RhdGljS2V5X2Jvb3N0ZXJQcmljZUxldmVsAQkApAMBBQVsZXZlbAI5M0dCUEZMOiBUaGVyZSBpcyBubyBwcmljZSB2YWx1ZSBmb3IgdGhpcyBsZXZlbCBvZiBib29zdGVyARVnZXRCb3N0ZXJOYW1lRm9yTGV2ZWwBBWxldmVsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFXN0YXRpY0tleV9ib29zdGVyTmFtZQEJAKQDAQUFbGV2ZWwCIDNHQk5GTDogVGhlcmUgaXMgbm8gc3VjaCBib29zdGVyARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQdwYXltZW50AwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhlSQ0FQOiBQbGVhc2UgYXR0YWNoIHdhdmVzBAlmZWVBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIJAQlnZXRPcmFjbGUACQESc3RhdGljS2V5X2V4dHJhRmVlAAMJAQIhPQIIBQdwYXltZW50BmFtb3VudAUJZmVlQW1vdW50CQACAQkArAICCQCsAgICHFJDQVA6IFBsZWFzZSBhdHRhY2ggZXhhY3RseSAJAKQDAQUJZmVlQW1vdW50AhMgYW1vdW50IG9mIHdhdmVsZXRzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARBnZXRGZWVBZ2dyZWdhdG9yAAUJZmVlQW1vdW50BQR1bml0BQNuaWwBCGFzU3RyaW5nAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAFBnN0cmluZwkAAgECITNBUzogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IFN0cmluZwEQbG9ja0R1Y2tJbnRlcm5hbAMKYWRkcmVzc1N0cg10YWtlU3BvdHNGcm9tA3BtdAQHYXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAthc3NldElzc3VlcggJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAZpc3N1ZXIEDHREdWNrRGV0YWlscwkBDmdldER1Y2tEZXRhaWxzAQUHYXNzZXRJZAQKYXNzZXRDb2xvcggFDHREdWNrRGV0YWlscwJfMQQJaXNKYWNrcG90CAUMdER1Y2tEZXRhaWxzAl8yBAprU3BvdHNCdXN5CQEMa2V5U3BvdHNCdXN5AQUNdGFrZVNwb3RzRnJvbQQJc3BvdHNCdXN5CQENdHJ5R2V0SW50ZWdlcgEFCmtTcG90c0J1c3kEDGtTcG90c0JvdWdodAkBDmtleVNwb3RzQm91Z2h0AQUNdGFrZVNwb3RzRnJvbQQVYWRkcmVzc1Nwb3RzQXZhaWxhYmxlCQBlAgkBDXRyeUdldEludGVnZXIBBQxrU3BvdHNCb3VnaHQFCXNwb3RzQnVzeQMJAQIhPQIIBQNwbXQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkAwMJAQIhPQIFC2Fzc2V0SXNzdWVyCQETZ2V0SW5jdWJhdG9yQWRkcmVzcwAJAQIhPQIFC2Fzc2V0SXNzdWVyCQERZ2V0QnJlZWRlckFkZHJlc3MABwkAAgECE2l2YWxpZCBORlQgYXR0YWNoZWQDCQBnAgAABRVhZGRyZXNzU3BvdHNBdmFpbGFibGUJAAIBCQCsAgICIE5vIHNwb3RzIGF2YWlsYWJsZSBpbiBodW50IGZvcjogBQ10YWtlU3BvdHNGcm9tBBFrUGVyY2hlc0F2YWlsYWJsZQkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18JAKUIAQUEdGhpcwISX3BlcmNoZXNBdmFpbGFibGVfBQphc3NldENvbG9yBBBwZXJjaGVzQXZhaWxhYmxlBAckbWF0Y2gwCQCaCAIJARFnZXRGYXJtaW5nQWRkcmVzcwAFEWtQZXJjaGVzQXZhaWxhYmxlAwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAwkAAAIFEHBlcmNoZXNBdmFpbGFibGUFEHBlcmNoZXNBdmFpbGFibGUECmVnZ0Fzc2V0SWQJAQ1nZXRFZ2dBc3NldElkAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUKa1Nwb3RzQnVzeQkAZAIFCXNwb3RzQnVzeQABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlEdWNrT3duZXIBBQdhc3NldElkBQphZGRyZXNzU3RyCQDMCAIJAQxCb29sZWFuRW50cnkCCQETa2V5TG9ja2VkRHVja1N0YXR1cwIFCmFkZHJlc3NTdHIJANgEAQUHYXNzZXRJZAYJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlEdWNrUGxheVVubG9ja1RpbWUBBQdhc3NldElkCQBkAggFCWxhc3RCbG9jawl0aW1lc3RhbXAJARJnZXRNaW5Mb2NrRHVyYXRpb24ACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5RHVja1YyAgUKYWRkcmVzc1N0cgkA2AQBBQdhc3NldElkBgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ5pbml0VW5sb2NrRHVjawIKYXNzZXRJZFN0cgphZGRyZXNzU3RyBAdhc3NldElkCQDZBAEFCmFzc2V0SWRTdHIEDHREdWNrRGV0YWlscwkBDmdldER1Y2tEZXRhaWxzAQUHYXNzZXRJZAQKYXNzZXRDb2xvcggFDHREdWNrRGV0YWlscwJfMQQJaXNKYWNrcG90CAUMdER1Y2tEZXRhaWxzAl8yBAprU3BvdHNCdXN5CQEMa2V5U3BvdHNCdXN5AQUKYWRkcmVzc1N0cgQKa0R1Y2tPd25lcgkBDGtleUR1Y2tPd25lcgEFB2Fzc2V0SWQEEnJlbWFpbmluZ0ZvclVubG9jawkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkBFWtleUR1Y2tQbGF5VW5sb2NrVGltZQEFB2Fzc2V0SWQIBQlsYXN0QmxvY2sJdGltZXN0YW1wAwkBAiE9AgkBDHRyeUdldFN0cmluZwEFCmtEdWNrT3duZXIFCmFkZHJlc3NTdHIJAAIBAhwzSVVMRDogVGhlIGR1Y2sgaXMgbm90IHlvdXJzAwkAZgIFEnJlbWFpbmluZ0ZvclVubG9jawAACQACAQkArAICCQCsAgICITNJVUw6IFlvdSBuZWVkIHRvIHdhaXQgdG8gdW5sb2NrIAkApAMBCQBpAgUScmVtYWluaW5nRm9yVW5sb2NrAOgHAgggc2Vjb25kcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF2tleUR1Y2tGaW5pc2hVbmxvY2tUaW1lAQUHYXNzZXRJZAkAZAIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQERZ2V0VW5sb2NrRHVyYXRpb24ABQNuaWwBC3Vuc3Rha2VEdWNrAwphc3NldElkU3RyCmFkZHJlc3NTdHIPYWRkU3BvdHNUb3dhcmRzBAdhc3NldElkCQDZBAEFCmFzc2V0SWRTdHIEDHREdWNrRGV0YWlscwkBDmdldER1Y2tEZXRhaWxzAQUHYXNzZXRJZAQKYXNzZXRDb2xvcggFDHREdWNrRGV0YWlscwJfMQQJaXNKYWNrcG90CAUMdER1Y2tEZXRhaWxzAl8yBAprU3BvdHNCdXN5CQEMa2V5U3BvdHNCdXN5AQUPYWRkU3BvdHNUb3dhcmRzBAprRHVja093bmVyCQEMa2V5RHVja093bmVyAQUHYXNzZXRJZAQScmVtYWluaW5nRm9yVW5sb2NrCQBlAgkBDXRyeUdldEludGVnZXIBCQEXa2V5RHVja0ZpbmlzaFVubG9ja1RpbWUBBQdhc3NldElkCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAQIhPQIJAQx0cnlHZXRTdHJpbmcBBQprRHVja093bmVyBQphZGRyZXNzU3RyCQACAQIaM1VEOiBUaGUgZHVjayBpcyBub3QgeW91cnMDCQBmAgUScmVtYWluaW5nRm9yVW5sb2NrAAAJAAIBCQCsAgIJAKwCAgIgM1VEOiBZb3UgbmVlZCB0byB3YWl0IHRvIHVubG9jayAJAKQDAQkAaQIFEnJlbWFpbmluZ0ZvclVubG9jawDoBwIIIHNlY29uZHMEBGlzVjIJAQ10cnlHZXRCb29sZWFuAQkBCWtleUR1Y2tWMgIFCmFkZHJlc3NTdHIFCmFzc2V0SWRTdHIECWRvVW5zdGFrZQMFBGlzVjIFA25pbAQPdW5zdGFrZUZ1bmNOYW1lAwkAAAIFCWlzSmFja3BvdAYCHXVuc3Rha2VKYWNrcG90V2l0aG91dENsYWltRWdnAhZ1bnN0YWtlTkZUV2l0aG91dENsYWltBARpbnYxCQD8BwQJARFnZXRGYXJtaW5nQWRkcmVzcwAFD3Vuc3Rha2VGdW5jTmFtZQkAzAgCBQphc3NldElkU3RyBQNuaWwFA25pbAMJAAACBQRpbnYxBQRpbnYxBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUJZG9VbnN0YWtlBQlkb1Vuc3Rha2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFCmFkZHJlc3NTdHIAAQUHYXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQETa2V5TG9ja2VkRHVja1N0YXR1cwIFCmFkZHJlc3NTdHIFCmFzc2V0SWRTdHIJAMwIAgkBC0RlbGV0ZUVudHJ5AQUKa0R1Y2tPd25lcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUKa1Nwb3RzQnVzeQkAZQIJAQ10cnlHZXRJbnRlZ2VyAQUKa1Nwb3RzQnVzeQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4MAWkBFWJ1eUFjY2Vzc0l0ZW1JbnRlcm5hbAEKYWRkcmVzc1N0cgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECGDNCQUlJOiBpbnRlcm5hbCB1c2Ugb25seQQPaXNzdWVBY2Nlc3NJdGVtCQDCCAUJAKwCAgIHQUNDRVNTLQkBC2dldEdhbWVOYW1lAAkArAICCQCsAgIJAKwCAgIJW0FjY2Vzc10gCQEPZ2V0TG9uZ0dhbWVOYW1lAAIQIGFjY2VzcyBORlQgZm9yIAkBCmdldE5GVE5hbWUAAAEAAAcEEWFjY2Vzc1JhY2VBc3NldElkCQDYBAEJALgIAQUPaXNzdWVBY2Nlc3NJdGVtBAxrU3BvdHNCb3VnaHQJAQ5rZXlTcG90c0JvdWdodAEFCmFkZHJlc3NTdHIJAJQKAgkAzAgCBQ9pc3N1ZUFjY2Vzc0l0ZW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICC2FjY2Vzc0l0ZW1fBRFhY2Nlc3NSYWNlQXNzZXRJZAIGX293bmVyBQphZGRyZXNzU3RyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIHX293bmluZwURYWNjZXNzUmFjZUFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtTcG90c0JvdWdodAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQUMa1Nwb3RzQm91Z2h0AAEFA25pbAURYWNjZXNzUmFjZUFzc2V0SWQBaQEPY29uZmlndXJlT3JhY2xlBAZvcmFjbGUJc2hvcnRuYW1lCGxvbmduYW1lB25mdE5hbWUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg8zQ086IGFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgIUc3RhdGljX29yYWNsZUFkZHJlc3MFBm9yYWNsZQkAzAgCCQELU3RyaW5nRW50cnkCAhRzdGF0aWNfc2hvcnRHYW1lTmFtZQUJc2hvcnRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQICE3N0YXRpY19sb25nR2FtZU5hbWUFCGxvbmduYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQICDnN0YXRpY19uZnROYW1lBQduZnROYW1lBQNuaWwBaQENZGVsZXRlU2V0dGluZwEDa2V5AwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIsM0RTOiBPbmx5IGFkbWluaXN0cmF0b3IgY2FuIGNhbGwgdGhpcyBtZXRob2QJAMwIAgkBC0RlbGV0ZUVudHJ5AQUDa2V5BQNuaWwBaQEYYnV5QWNjZXNzSXRlbUFuZExvY2tEdWNrAAQKZWdnUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAtkdWNrUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAphZGRyZXNzU3RyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgMJAQIhPQIIBQplZ2dQYXltZW50B2Fzc2V0SWQJARRnZXRBY2Nlc3NJdGVtQXNzZXRJZAAJAAIBAhozQkFJOiBXcm9uZyBhc3NldCBhdHRhY2hlZAMJAQIhPQIIBQplZ2dQYXltZW50BmFtb3VudAkBEmdldEFjY2Vzc0l0ZW1QcmljZQAJAAIBAiUzQkFJOiBXcm9uZyBhbW91bnQgb2YgYXNzZXRzIGF0dGFjaGVkBA5hY2Nlc3NJdGVtRGF0YQkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhVidXlBY2Nlc3NJdGVtSW50ZXJuYWwJAMwIAgUKYWRkcmVzc1N0cgUDbmlsBQNuaWwDCQAAAgUOYWNjZXNzSXRlbURhdGEFDmFjY2Vzc0l0ZW1EYXRhBAhidXJuQ2FsbAkA/AcECQEOZ2V0QnVybkFkZHJlc3MAAhRidXJuQXR0YWNoZWRQYXltZW50cwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQENZ2V0RWdnQXNzZXRJZAAIBQplZ2dQYXltZW50BmFtb3VudAUDbmlsAwkAAAIFCGJ1cm5DYWxsBQhidXJuQ2FsbAQMdmFsaWRQYXltZW50AwkAAAIIBQFpBmNhbGxlcgkBEWdldFJlbnRpbmdBZGRyZXNzAAUDbmlsCQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAgMJAAACBQx2YWxpZFBheW1lbnQFDHZhbGlkUGF5bWVudAQIbG9ja0RhdGEJAM4IAgkBEGxvY2tEdWNrSW50ZXJuYWwDBQphZGRyZXNzU3RyBQphZGRyZXNzU3RyBQtkdWNrUGF5bWVudAUMdmFsaWRQYXltZW50CQCUCgIFCGxvY2tEYXRhBQ5hY2Nlc3NJdGVtRGF0YQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1idXlBY2Nlc3NJdGVtAAQKYWRkcmVzc1N0cgkApQgBCAUBaQxvcmlnaW5DYWxsZXIECmVnZ1BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAMJAQIhPQIIBQplZ2dQYXltZW50B2Fzc2V0SWQJARRnZXRBY2Nlc3NJdGVtQXNzZXRJZAAJAAIBCQCsAgICGzNCQUk6IFdyb25nIGFzc2V0IGF0dGFjaGVkIAkA2AQBCQEUZ2V0QWNjZXNzSXRlbUFzc2V0SWQAAwkBAiE9AggFCmVnZ1BheW1lbnQGYW1vdW50CQESZ2V0QWNjZXNzSXRlbVByaWNlAAkAAgECJTNCQUk6IFdyb25nIGFtb3VudCBvZiBhc3NldHMgYXR0YWNoZWQEDmFjY2Vzc0l0ZW1EYXRhCQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFWJ1eUFjY2Vzc0l0ZW1JbnRlcm5hbAkAzAgCBQphZGRyZXNzU3RyBQNuaWwFA25pbAMJAAACBQ5hY2Nlc3NJdGVtRGF0YQUOYWNjZXNzSXRlbURhdGEECGJ1cm5DYWxsCQD8BwQJAQ5nZXRCdXJuQWRkcmVzcwACFGJ1cm5BdHRhY2hlZFBheW1lbnRzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ1nZXRFZ2dBc3NldElkAAgFCmVnZ1BheW1lbnQGYW1vdW50BQNuaWwDCQAAAgUIYnVybkNhbGwFCGJ1cm5DYWxsBAx2YWxpZFBheW1lbnQDCQAAAggFAWkGY2FsbGVyCQERZ2V0UmVudGluZ0FkZHJlc3MABQNuaWwJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwABAwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50CQCUCgIFDHZhbGlkUGF5bWVudAUOYWNjZXNzSXRlbURhdGEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESYnV5QWNjZXNzSXRlbU90aGVyAQxhZGRyZXNzT3RoZXIECmVnZ1BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAMJAQIhPQIIBQplZ2dQYXltZW50B2Fzc2V0SWQJARRnZXRBY2Nlc3NJdGVtQXNzZXRJZAAJAAIBAhozQkFJOiBXcm9uZyBhc3NldCBhdHRhY2hlZAMJAQIhPQIIBQplZ2dQYXltZW50BmFtb3VudAkBEmdldEFjY2Vzc0l0ZW1QcmljZQAJAAIBAiUzQkFJOiBXcm9uZyBhbW91bnQgb2YgYXNzZXRzIGF0dGFjaGVkBA5hY2Nlc3NJdGVtRGF0YQkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhVidXlBY2Nlc3NJdGVtSW50ZXJuYWwJAMwIAgUMYWRkcmVzc090aGVyBQNuaWwFA25pbAMJAAACBQ5hY2Nlc3NJdGVtRGF0YQUOYWNjZXNzSXRlbURhdGEECGJ1cm5DYWxsCQD8BwQJAQ5nZXRCdXJuQWRkcmVzcwACFGJ1cm5BdHRhY2hlZFBheW1lbnRzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ1nZXRFZ2dBc3NldElkAAgFCmVnZ1BheW1lbnQGYW1vdW50BQNuaWwDCQAAAgUIYnVybkNhbGwFCGJ1cm5DYWxsCQCUCgIFA25pbAUOYWNjZXNzSXRlbURhdGEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIbG9ja0R1Y2sABAphZGRyZXNzU3RyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQLZHVja1BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAQMJAAACBQx2YWxpZFBheW1lbnQFDHZhbGlkUGF5bWVudAkAzggCCQEQbG9ja0R1Y2tJbnRlcm5hbAMFCmFkZHJlc3NTdHIFCmFkZHJlc3NTdHIFC2R1Y2tQYXltZW50BQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKaW5pdFVubG9jawEKYXNzZXRJZFN0cgQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAADCQAAAgUMdmFsaWRQYXltZW50BQx2YWxpZFBheW1lbnQJAM4IAgkBDmluaXRVbmxvY2tEdWNrAgUKYXNzZXRJZFN0cgUKYWRkcmVzc1N0cgUMdmFsaWRQYXltZW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD2xvY2tEdWNrUmVudGluZwEUYWRkcmVzc1Rha2VTcG90c0Zyb20DCQECIT0CCAUBaQZjYWxsZXIJARFnZXRSZW50aW5nQWRkcmVzcwAJAAIBAhMzVURPOiBSZW50aW5nIG9ubHkhBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQLZHVja1BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAkBEGxvY2tEdWNrSW50ZXJuYWwDBQphZGRyZXNzU3RyBRRhZGRyZXNzVGFrZVNwb3RzRnJvbQULZHVja1BheW1lbnQBaQERdW5sb2NrRHVja1JlbnRpbmcCCmFzc2V0SWRTdHIPYWRkU3BvdHNUb3dhcmRzAwkBAiE9AggFAWkGY2FsbGVyCQERZ2V0UmVudGluZ0FkZHJlc3MACQACAQITM1VETzogUmVudGluZyBvbmx5IQQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIJAQt1bnN0YWtlRHVjawMFCmFzc2V0SWRTdHIFCmFkZHJlc3NTdHIFD2FkZFNwb3RzVG93YXJkcwFpAQ91bmxvY2tEdWNrT3RoZXIBCmFzc2V0SWRTdHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhEzVURPOiBBZG1pbiBvbmx5IQQIb3duZXJLZXkJAQx0cnlHZXRTdHJpbmcBCQEMa2V5RHVja093bmVyAQkA2QQBBQphc3NldElkU3RyCQELdW5zdGFrZUR1Y2sDBQphc3NldElkU3RyBQhvd25lcktleQUIb3duZXJLZXkBaQEKdW5sb2NrRHVjawQKYXNzZXRJZFN0cgJ0cwdhbGxvd2VkCXNpZ25hdHVyZQMJAQIhPQIFB2FsbG93ZWQGCQACAQIkM1VEOiBOb3QgYWxsb3dlZCB0byB1bmxvY2sgdGhlIGR1Y2shBAhNU0lOSE9VUgCA3dsBBAljdXJyZW50VHMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAwkAZgIFCWN1cnJlbnRUcwkAZAIFAnRzBQhNU0lOSE9VUgkAAgECGDNVRDogT3V0ZGF0ZWQgc2lnbmF0dXJlIQQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEBHRleHQJALkJAgkAzAgCBQphc3NldElkU3RyCQDMCAIJAKQDAQUCdHMJAMwIAgkApQMBBQdhbGxvd2VkBQNuaWwCATsDCQEBIQEJAMQTAwkAmwMBBQR0ZXh0CQDZBAEFCXNpZ25hdHVyZQkBEGdldEJhY2tlbmRQdWJLZXkACQACAQkArAICCQCsAgIJAKwCAgIjM1VEOiBJbnZhbGlkIHByb29mIGZyb20gYmFja2VuZCBrZXkJANgEAQkBEGdldEJhY2tlbmRQdWJLZXkAAgEgBQR0ZXh0BAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwAAAwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50CQDOCAIJAQt1bnN0YWtlRHVjawMFCmFzc2V0SWRTdHIFCmFkZHJlc3NTdHIFCmFkZHJlc3NTdHIFDHZhbGlkUGF5bWVudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgDxS5zH", "height": 4124059, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4nMEzDQEWrThxddHpHVTLKSmmBsV3Tim4HXkHXu29SHQ Next: none Diff:
OldNewDifferences
77 case _ =>
88 0
99 }
10-
11-
12-func keyBoughtBoosterLevel (addressStr) = (("address_" + addressStr) + "_boughtBoosterLevel")
1310
1411
1512 func keyDuckPlayUnlockTime (assetId) = (("duck_" + toBase58String(assetId)) + "_unlockTime")
3027 func keyLockedDuckStatus (addressStr,assetIdStr) = (((("address_" + addressStr) + "_lockedDuck_") + assetIdStr) + "_status")
3128
3229
30+func keyDuckV2 (addressStr,assetIdStr) = (((("address_" + addressStr) + "_lockedDuck_") + assetIdStr) + "_v2")
31+
32+
3333 func getDuckDetails (assetId) = {
3434 let assetName = value(value(assetInfo(assetId)).name)
3535 let assetNameParts = split(assetName, "")
4646 a
4747 case _ =>
4848 ""
49+}
50+
51+
52+func tryGetBoolean (key) = match getBoolean(key) {
53+ case b: Boolean =>
54+ b
55+ case _ =>
56+ false
4957 }
5058
5159
109117 func staticKey_boosterName (level) = ("static_boosterName_" + level)
110118
111119
120+func staticKey_burnAddress () = "static_burnAddress"
121+
122+
112123 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
113124
114125
140151
141152
142153 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
154+
155+
156+func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
143157
144158
145159 func getAccessItemAssetId () = fromBase58String(tryGetString(staticKey_accessItemAssetId()))
210224 if ((perchesAvailable == perchesAvailable))
211225 then {
212226 let eggAssetId = getEggAssetId()
213- let inv1 = if ((perchesAvailable > 0))
214- then unit
215- else invoke(getFarmingAddress(), "buyPerch", [assetColor, ""], [AttachedPayment(eggAssetId, 100000000)])
216- if ((inv1 == inv1))
217- then {
218- let inv2 = if ((isJackpot == false))
219- then invoke(getFarmingAddress(), "stakeNFT", nil, [AttachedPayment(assetId, 1)])
220- else invoke(getFarmingAddress(), "stakeJackpot", [assetColor], [AttachedPayment(assetId, 1)])
221- if ((inv2 == inv2))
222- then [IntegerEntry(kSpotsBusy, (spotsBusy + 1)), StringEntry(keyDuckOwner(assetId), addressStr), BooleanEntry(keyLockedDuckStatus(addressStr, toBase58String(assetId)), true), IntegerEntry(keyDuckPlayUnlockTime(assetId), (lastBlock.timestamp + getMinLockDuration()))]
223- else throw("Strict value is not equal to itself.")
224- }
225- else throw("Strict value is not equal to itself.")
227+[IntegerEntry(kSpotsBusy, (spotsBusy + 1)), StringEntry(keyDuckOwner(assetId), addressStr), BooleanEntry(keyLockedDuckStatus(addressStr, toBase58String(assetId)), true), IntegerEntry(keyDuckPlayUnlockTime(assetId), (lastBlock.timestamp + getMinLockDuration())), BooleanEntry(keyDuckV2(addressStr, toBase58String(assetId)), true)]
226228 }
227229 else throw("Strict value is not equal to itself.")
228230 }
258260 else if ((remainingForUnlock > 0))
259261 then throw((("3UD: You need to wait to unlock " + toString((remainingForUnlock / 1000))) + " seconds"))
260262 else {
261- let unstakeFuncName = if ((isJackpot == true))
262- then "unstakeJackpotWithoutClaimEgg"
263- else "unstakeNFTWithoutClaim"
264- let inv1 = invoke(getFarmingAddress(), unstakeFuncName, [assetIdStr], nil)
265- if ((inv1 == inv1))
263+ let isV2 = tryGetBoolean(keyDuckV2(addressStr, assetIdStr))
264+ let doUnstake = if (isV2)
265+ then nil
266+ else {
267+ let unstakeFuncName = if ((isJackpot == true))
268+ then "unstakeJackpotWithoutClaimEgg"
269+ else "unstakeNFTWithoutClaim"
270+ let inv1 = invoke(getFarmingAddress(), unstakeFuncName, [assetIdStr], nil)
271+ if ((inv1 == inv1))
272+ then nil
273+ else throw("Strict value is not equal to itself.")
274+ }
275+ if ((doUnstake == doUnstake))
266276 then [ScriptTransfer(Address(fromBase58String(addressStr)), 1, assetId), DeleteEntry(keyLockedDuckStatus(addressStr, assetIdStr)), DeleteEntry(kDuckOwner), IntegerEntry(kSpotsBusy, (tryGetInteger(kSpotsBusy) - 1))]
267277 else throw("Strict value is not equal to itself.")
268278 }
269279 }
270-
271-
272-func updateSettingInternal (i,key,value) = if ((i.caller != this))
273- then throw("Only administrator can call this method")
274- else match value {
275- case int: Int =>
276-[IntegerEntry(key, int)]
277- case s: String =>
278-[StringEntry(key, s)]
279- case b: Boolean =>
280-[BooleanEntry(key, b)]
281- case bv: ByteVector =>
282-[BinaryEntry(key, bv)]
283- case _ =>
284- throw("Bad value type")
285- }
286-
287-
288-@Callable(i)
289-func updateSettingInt (key,value) = updateSettingInternal(i, key, value)
290-
291-
292-
293-@Callable(i)
294-func updateSettingStr (key,value) = updateSettingInternal(i, key, value)
295-
296-
297-
298-@Callable(i)
299-func updateSettingBoolean (key,value) = updateSettingInternal(i, key, value)
300-
301-
302-
303-@Callable(i)
304-func updateSettingByteVector (key,value) = updateSettingInternal(i, key, value)
305-
306280
307281
308282 @Callable(i)
332306
333307
334308 @Callable(i)
335-func buyBooster () = {
336- let kBoughtLevel = keyBoughtBoosterLevel(toString(i.caller))
337- let boughtBoosterLevel = tryGetInteger(kBoughtLevel)
338- let newLevel = (boughtBoosterLevel + 1)
339- let pmt = value(i.payments[0])
340- let price = getBosterPriceForLevel(newLevel)
341- let expectedAssetId = getBosterBuyAssetId()
342- if ((pmt.amount != price))
343- then throw(("3BB: Bad price, it should be: " + toString(price)))
344- else if ((pmt.assetId != expectedAssetId))
345- then throw(("3BB: Bad payment attached, it should be: " + toBase58String(expectedAssetId)))
346- else {
347- let name = getBosterNameForLevel(newLevel)
348- let boosterItem = Issue(((getGameName() + "-") + name), ((("[Booster] " + getLongGameName()) + " booster for the game, level = ") + toString(newLevel)), 1, 0, false)
349- let boosterItemAssetId = calculateAssetId(boosterItem)
350-[boosterItem, IntegerEntry(kBoughtLevel, newLevel), ScriptTransfer(i.caller, 1, boosterItemAssetId)]
351- }
352- }
353-
354-
355-
356-@Callable(i)
357309 func buyAccessItemAndLockDuck () = {
358310 let eggPayment = value(i.payments[0])
359311 let duckPayment = value(i.payments[1])
366318 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil))
367319 if ((accessItemData == accessItemData))
368320 then {
369- let validPayment = if ((i.caller == getRentingAddress()))
370- then nil
371- else checkAdditionalPayment(i.payments[2])
372- if ((validPayment == validPayment))
321+ let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), eggPayment.amount)])
322+ if ((burnCall == burnCall))
373323 then {
374- let lockData = (lockDuckInternal(addressStr, addressStr, duckPayment) ++ validPayment)
375- $Tuple2(lockData, accessItemData)
324+ let validPayment = if ((i.caller == getRentingAddress()))
325+ then nil
326+ else checkAdditionalPayment(i.payments[2])
327+ if ((validPayment == validPayment))
328+ then {
329+ let lockData = (lockDuckInternal(addressStr, addressStr, duckPayment) ++ validPayment)
330+ $Tuple2(lockData, accessItemData)
331+ }
332+ else throw("Strict value is not equal to itself.")
376333 }
377334 else throw("Strict value is not equal to itself.")
378335 }
387344 let addressStr = toString(i.originCaller)
388345 let eggPayment = value(i.payments[0])
389346 if ((eggPayment.assetId != getAccessItemAssetId()))
390- then throw("3BAI: Wrong asset attached")
347+ then throw(("3BAI: Wrong asset attached " + toBase58String(getAccessItemAssetId())))
391348 else if ((eggPayment.amount != getAccessItemPrice()))
392349 then throw("3BAI: Wrong amount of assets attached")
393350 else {
394351 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil))
395352 if ((accessItemData == accessItemData))
396353 then {
397- let validPayment = if ((i.caller == getRentingAddress()))
398- then nil
399- else checkAdditionalPayment(i.payments[1])
400- if ((validPayment == validPayment))
401- then $Tuple2(validPayment, accessItemData)
354+ let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), eggPayment.amount)])
355+ if ((burnCall == burnCall))
356+ then {
357+ let validPayment = if ((i.caller == getRentingAddress()))
358+ then nil
359+ else checkAdditionalPayment(i.payments[1])
360+ if ((validPayment == validPayment))
361+ then $Tuple2(validPayment, accessItemData)
362+ else throw("Strict value is not equal to itself.")
363+ }
402364 else throw("Strict value is not equal to itself.")
403365 }
404366 else throw("Strict value is not equal to itself.")
417379 else {
418380 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressOther], nil))
419381 if ((accessItemData == accessItemData))
420- then $Tuple2(nil, accessItemData)
382+ then {
383+ let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), eggPayment.amount)])
384+ if ((burnCall == burnCall))
385+ then $Tuple2(nil, accessItemData)
386+ else throw("Strict value is not equal to itself.")
387+ }
421388 else throw("Strict value is not equal to itself.")
422389 }
423390 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetInteger (key) = match getInteger(this, key) {
55 case b: Int =>
66 b
77 case _ =>
88 0
99 }
10-
11-
12-func keyBoughtBoosterLevel (addressStr) = (("address_" + addressStr) + "_boughtBoosterLevel")
1310
1411
1512 func keyDuckPlayUnlockTime (assetId) = (("duck_" + toBase58String(assetId)) + "_unlockTime")
1613
1714
1815 func keyDuckFinishUnlockTime (assetId) = (("duck_" + toBase58String(assetId)) + "finish_unlockTime")
1916
2017
2118 func keyDuckOwner (assetId) = (("duck_" + toBase58String(assetId)) + "_owner")
2219
2320
2421 func keySpotsBought (addressStr) = (("address_" + addressStr) + "_spotsBought")
2522
2623
2724 func keySpotsBusy (addressStr) = (("address_" + addressStr) + "_spotsBusy")
2825
2926
3027 func keyLockedDuckStatus (addressStr,assetIdStr) = (((("address_" + addressStr) + "_lockedDuck_") + assetIdStr) + "_status")
3128
3229
30+func keyDuckV2 (addressStr,assetIdStr) = (((("address_" + addressStr) + "_lockedDuck_") + assetIdStr) + "_v2")
31+
32+
3333 func getDuckDetails (assetId) = {
3434 let assetName = value(value(assetInfo(assetId)).name)
3535 let assetNameParts = split(assetName, "")
3636 let isJackpot = (assetNameParts[(size(assetNameParts) - 2)] == "J")
3737 let assetColor = if (isJackpot)
3838 then "B"
3939 else assetNameParts[(size(assetNameParts) - 1)]
4040 $Tuple2(assetColor, isJackpot)
4141 }
4242
4343
4444 func tryGetStringExternal (address,key) = match getString(address, key) {
4545 case a: String =>
4646 a
4747 case _ =>
4848 ""
49+}
50+
51+
52+func tryGetBoolean (key) = match getBoolean(key) {
53+ case b: Boolean =>
54+ b
55+ case _ =>
56+ false
4957 }
5058
5159
5260 func tryGetString (key) = tryGetStringExternal(this, key)
5361
5462
5563 func staticKey_oracleAddress () = "static_oracleAddress"
5664
5765
5866 func staticKey_eggAssetId () = "static_eggAssetId"
5967
6068
6169 func staticKey_incubatorAddress () = "static_incubatorAddress"
6270
6371
6472 func staticKey_breederAddress () = "static_breederAddress"
6573
6674
6775 func staticKey_farmingAddress () = "static_farmingAddress"
6876
6977
7078 func staticKey_rentingAddress () = "static_rentingAddress"
7179
7280
7381 func staticKey_shortGameName () = "static_shortGameName"
7482
7583
7684 func staticKey_longGameName () = "static_longGameName"
7785
7886
7987 func staticKey_nftName () = "static_nftName"
8088
8189
8290 func staticKey_backendPubKey () = "static_backendPubKey"
8391
8492
8593 func staticKey_accessItemAssetId () = "static_accessItemAssetId"
8694
8795
8896 func staticKey_accessItemPrice () = "static_accessItemPrice"
8997
9098
9199 func staticKey_minLockDuration () = "static_minLockDuration"
92100
93101
94102 func staticKey_UnlockDuration () = "static_UnlockDuration"
95103
96104
97105 func staticKey_boosterBuyAssetId () = "static_boosterBuyAssetId"
98106
99107
100108 func staticKey_extraFee () = "static_extraFee"
101109
102110
103111 func staticKey_feeAggregator () = "static_feeAggregator"
104112
105113
106114 func staticKey_boosterPriceLevel (level) = ("static_boosterPriceLevel_" + level)
107115
108116
109117 func staticKey_boosterName (level) = ("static_boosterName_" + level)
110118
111119
120+func staticKey_burnAddress () = "static_burnAddress"
121+
122+
112123 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
113124
114125
115126 func getGameName () = valueOrErrorMessage(getString(staticKey_shortGameName()), "3GGN: There is no game name defined!")
116127
117128
118129 func getLongGameName () = valueOrErrorMessage(getString(staticKey_longGameName()), "3GLGN: There is no long game name defined!")
119130
120131
121132 func getNFTName () = valueOrErrorMessage(getString(staticKey_nftName()), "3GNN: There is no nft name defined!")
122133
123134
124135 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
125136
126137
127138 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
128139
129140
130141 func getRentingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rentingAddress())))
131142
132143
133144 func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_farmingAddress())))
134145
135146
136147 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
137148
138149
139150 func getBackendPubKey () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_backendPubKey()))
140151
141152
142153 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
154+
155+
156+func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
143157
144158
145159 func getAccessItemAssetId () = fromBase58String(tryGetString(staticKey_accessItemAssetId()))
146160
147161
148162 func getAccessItemPrice () = tryGetInteger(staticKey_accessItemPrice())
149163
150164
151165 func getMinLockDuration () = tryGetInteger(staticKey_minLockDuration())
152166
153167
154168 func getUnlockDuration () = tryGetInteger(staticKey_UnlockDuration())
155169
156170
157171 func getBosterBuyAssetId () = fromBase58String(tryGetString(staticKey_boosterBuyAssetId()))
158172
159173
160174 func getBosterPriceForLevel (level) = valueOrErrorMessage(getInteger(staticKey_boosterPriceLevel(toString(level))), "3GBPFL: There is no price value for this level of booster")
161175
162176
163177 func getBosterNameForLevel (level) = valueOrErrorMessage(getString(staticKey_boosterName(toString(level))), "3GBNFL: There is no such booster")
164178
165179
166180 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
167181 then throw("RCAP: Please attach waves")
168182 else {
169183 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
170184 if ((payment.amount != feeAmount))
171185 then throw((("RCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
172186 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
173187 }
174188
175189
176190 func asString (value) = match value {
177191 case string: String =>
178192 string
179193 case _ =>
180194 throw("3AS: wrong type, expected: String")
181195 }
182196
183197
184198 func lockDuckInternal (addressStr,takeSpotsFrom,pmt) = {
185199 let assetId = value(pmt.assetId)
186200 let assetIssuer = value(assetInfo(assetId)).issuer
187201 let tDuckDetails = getDuckDetails(assetId)
188202 let assetColor = tDuckDetails._1
189203 let isJackpot = tDuckDetails._2
190204 let kSpotsBusy = keySpotsBusy(takeSpotsFrom)
191205 let spotsBusy = tryGetInteger(kSpotsBusy)
192206 let kSpotsBought = keySpotsBought(takeSpotsFrom)
193207 let addressSpotsAvailable = (tryGetInteger(kSpotsBought) - spotsBusy)
194208 if ((pmt.amount != 1))
195209 then throw("NFT is not attached")
196210 else if (if ((assetIssuer != getIncubatorAddress()))
197211 then (assetIssuer != getBreederAddress())
198212 else false)
199213 then throw("ivalid NFT attached")
200214 else if ((0 >= addressSpotsAvailable))
201215 then throw(("No spots available in hunt for: " + takeSpotsFrom))
202216 else {
203217 let kPerchesAvailable = ((("address_" + toString(this)) + "_perchesAvailable_") + assetColor)
204218 let perchesAvailable = match getInteger(getFarmingAddress(), kPerchesAvailable) {
205219 case b: Int =>
206220 b
207221 case _ =>
208222 0
209223 }
210224 if ((perchesAvailable == perchesAvailable))
211225 then {
212226 let eggAssetId = getEggAssetId()
213- let inv1 = if ((perchesAvailable > 0))
214- then unit
215- else invoke(getFarmingAddress(), "buyPerch", [assetColor, ""], [AttachedPayment(eggAssetId, 100000000)])
216- if ((inv1 == inv1))
217- then {
218- let inv2 = if ((isJackpot == false))
219- then invoke(getFarmingAddress(), "stakeNFT", nil, [AttachedPayment(assetId, 1)])
220- else invoke(getFarmingAddress(), "stakeJackpot", [assetColor], [AttachedPayment(assetId, 1)])
221- if ((inv2 == inv2))
222- then [IntegerEntry(kSpotsBusy, (spotsBusy + 1)), StringEntry(keyDuckOwner(assetId), addressStr), BooleanEntry(keyLockedDuckStatus(addressStr, toBase58String(assetId)), true), IntegerEntry(keyDuckPlayUnlockTime(assetId), (lastBlock.timestamp + getMinLockDuration()))]
223- else throw("Strict value is not equal to itself.")
224- }
225- else throw("Strict value is not equal to itself.")
227+[IntegerEntry(kSpotsBusy, (spotsBusy + 1)), StringEntry(keyDuckOwner(assetId), addressStr), BooleanEntry(keyLockedDuckStatus(addressStr, toBase58String(assetId)), true), IntegerEntry(keyDuckPlayUnlockTime(assetId), (lastBlock.timestamp + getMinLockDuration())), BooleanEntry(keyDuckV2(addressStr, toBase58String(assetId)), true)]
226228 }
227229 else throw("Strict value is not equal to itself.")
228230 }
229231 }
230232
231233
232234 func initUnlockDuck (assetIdStr,addressStr) = {
233235 let assetId = fromBase58String(assetIdStr)
234236 let tDuckDetails = getDuckDetails(assetId)
235237 let assetColor = tDuckDetails._1
236238 let isJackpot = tDuckDetails._2
237239 let kSpotsBusy = keySpotsBusy(addressStr)
238240 let kDuckOwner = keyDuckOwner(assetId)
239241 let remainingForUnlock = (tryGetInteger(keyDuckPlayUnlockTime(assetId)) - lastBlock.timestamp)
240242 if ((tryGetString(kDuckOwner) != addressStr))
241243 then throw("3IULD: The duck is not yours")
242244 else if ((remainingForUnlock > 0))
243245 then throw((("3IUL: You need to wait to unlock " + toString((remainingForUnlock / 1000))) + " seconds"))
244246 else [IntegerEntry(keyDuckFinishUnlockTime(assetId), (lastBlock.timestamp + getUnlockDuration()))]
245247 }
246248
247249
248250 func unstakeDuck (assetIdStr,addressStr,addSpotsTowards) = {
249251 let assetId = fromBase58String(assetIdStr)
250252 let tDuckDetails = getDuckDetails(assetId)
251253 let assetColor = tDuckDetails._1
252254 let isJackpot = tDuckDetails._2
253255 let kSpotsBusy = keySpotsBusy(addSpotsTowards)
254256 let kDuckOwner = keyDuckOwner(assetId)
255257 let remainingForUnlock = (tryGetInteger(keyDuckFinishUnlockTime(assetId)) - lastBlock.timestamp)
256258 if ((tryGetString(kDuckOwner) != addressStr))
257259 then throw("3UD: The duck is not yours")
258260 else if ((remainingForUnlock > 0))
259261 then throw((("3UD: You need to wait to unlock " + toString((remainingForUnlock / 1000))) + " seconds"))
260262 else {
261- let unstakeFuncName = if ((isJackpot == true))
262- then "unstakeJackpotWithoutClaimEgg"
263- else "unstakeNFTWithoutClaim"
264- let inv1 = invoke(getFarmingAddress(), unstakeFuncName, [assetIdStr], nil)
265- if ((inv1 == inv1))
263+ let isV2 = tryGetBoolean(keyDuckV2(addressStr, assetIdStr))
264+ let doUnstake = if (isV2)
265+ then nil
266+ else {
267+ let unstakeFuncName = if ((isJackpot == true))
268+ then "unstakeJackpotWithoutClaimEgg"
269+ else "unstakeNFTWithoutClaim"
270+ let inv1 = invoke(getFarmingAddress(), unstakeFuncName, [assetIdStr], nil)
271+ if ((inv1 == inv1))
272+ then nil
273+ else throw("Strict value is not equal to itself.")
274+ }
275+ if ((doUnstake == doUnstake))
266276 then [ScriptTransfer(Address(fromBase58String(addressStr)), 1, assetId), DeleteEntry(keyLockedDuckStatus(addressStr, assetIdStr)), DeleteEntry(kDuckOwner), IntegerEntry(kSpotsBusy, (tryGetInteger(kSpotsBusy) - 1))]
267277 else throw("Strict value is not equal to itself.")
268278 }
269279 }
270-
271-
272-func updateSettingInternal (i,key,value) = if ((i.caller != this))
273- then throw("Only administrator can call this method")
274- else match value {
275- case int: Int =>
276-[IntegerEntry(key, int)]
277- case s: String =>
278-[StringEntry(key, s)]
279- case b: Boolean =>
280-[BooleanEntry(key, b)]
281- case bv: ByteVector =>
282-[BinaryEntry(key, bv)]
283- case _ =>
284- throw("Bad value type")
285- }
286-
287-
288-@Callable(i)
289-func updateSettingInt (key,value) = updateSettingInternal(i, key, value)
290-
291-
292-
293-@Callable(i)
294-func updateSettingStr (key,value) = updateSettingInternal(i, key, value)
295-
296-
297-
298-@Callable(i)
299-func updateSettingBoolean (key,value) = updateSettingInternal(i, key, value)
300-
301-
302-
303-@Callable(i)
304-func updateSettingByteVector (key,value) = updateSettingInternal(i, key, value)
305-
306280
307281
308282 @Callable(i)
309283 func buyAccessItemInternal (addressStr) = if ((i.caller != this))
310284 then throw("3BAII: internal use only")
311285 else {
312286 let issueAccessItem = Issue(("ACCESS-" + getGameName()), ((("[Access] " + getLongGameName()) + " access NFT for ") + getNFTName()), 1, 0, false)
313287 let accessRaceAssetId = toBase58String(calculateAssetId(issueAccessItem))
314288 let kSpotsBought = keySpotsBought(addressStr)
315289 $Tuple2([issueAccessItem, StringEntry((("accessItem_" + accessRaceAssetId) + "_owner"), addressStr), StringEntry((("address_" + addressStr) + "_owning"), accessRaceAssetId), IntegerEntry(kSpotsBought, (tryGetInteger(kSpotsBought) + 1))], accessRaceAssetId)
316290 }
317291
318292
319293
320294 @Callable(i)
321295 func configureOracle (oracle,shortname,longname,nftName) = if ((i.caller != this))
322296 then throw("3CO: admin only")
323297 else [StringEntry("static_oracleAddress", oracle), StringEntry("static_shortGameName", shortname), StringEntry("static_longGameName", longname), StringEntry("static_nftName", nftName)]
324298
325299
326300
327301 @Callable(i)
328302 func deleteSetting (key) = if ((i.caller != this))
329303 then throw("3DS: Only administrator can call this method")
330304 else [DeleteEntry(key)]
331305
332306
333307
334308 @Callable(i)
335-func buyBooster () = {
336- let kBoughtLevel = keyBoughtBoosterLevel(toString(i.caller))
337- let boughtBoosterLevel = tryGetInteger(kBoughtLevel)
338- let newLevel = (boughtBoosterLevel + 1)
339- let pmt = value(i.payments[0])
340- let price = getBosterPriceForLevel(newLevel)
341- let expectedAssetId = getBosterBuyAssetId()
342- if ((pmt.amount != price))
343- then throw(("3BB: Bad price, it should be: " + toString(price)))
344- else if ((pmt.assetId != expectedAssetId))
345- then throw(("3BB: Bad payment attached, it should be: " + toBase58String(expectedAssetId)))
346- else {
347- let name = getBosterNameForLevel(newLevel)
348- let boosterItem = Issue(((getGameName() + "-") + name), ((("[Booster] " + getLongGameName()) + " booster for the game, level = ") + toString(newLevel)), 1, 0, false)
349- let boosterItemAssetId = calculateAssetId(boosterItem)
350-[boosterItem, IntegerEntry(kBoughtLevel, newLevel), ScriptTransfer(i.caller, 1, boosterItemAssetId)]
351- }
352- }
353-
354-
355-
356-@Callable(i)
357309 func buyAccessItemAndLockDuck () = {
358310 let eggPayment = value(i.payments[0])
359311 let duckPayment = value(i.payments[1])
360312 let addressStr = toString(i.originCaller)
361313 if ((eggPayment.assetId != getAccessItemAssetId()))
362314 then throw("3BAI: Wrong asset attached")
363315 else if ((eggPayment.amount != getAccessItemPrice()))
364316 then throw("3BAI: Wrong amount of assets attached")
365317 else {
366318 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil))
367319 if ((accessItemData == accessItemData))
368320 then {
369- let validPayment = if ((i.caller == getRentingAddress()))
370- then nil
371- else checkAdditionalPayment(i.payments[2])
372- if ((validPayment == validPayment))
321+ let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), eggPayment.amount)])
322+ if ((burnCall == burnCall))
373323 then {
374- let lockData = (lockDuckInternal(addressStr, addressStr, duckPayment) ++ validPayment)
375- $Tuple2(lockData, accessItemData)
324+ let validPayment = if ((i.caller == getRentingAddress()))
325+ then nil
326+ else checkAdditionalPayment(i.payments[2])
327+ if ((validPayment == validPayment))
328+ then {
329+ let lockData = (lockDuckInternal(addressStr, addressStr, duckPayment) ++ validPayment)
330+ $Tuple2(lockData, accessItemData)
331+ }
332+ else throw("Strict value is not equal to itself.")
376333 }
377334 else throw("Strict value is not equal to itself.")
378335 }
379336 else throw("Strict value is not equal to itself.")
380337 }
381338 }
382339
383340
384341
385342 @Callable(i)
386343 func buyAccessItem () = {
387344 let addressStr = toString(i.originCaller)
388345 let eggPayment = value(i.payments[0])
389346 if ((eggPayment.assetId != getAccessItemAssetId()))
390- then throw("3BAI: Wrong asset attached")
347+ then throw(("3BAI: Wrong asset attached " + toBase58String(getAccessItemAssetId())))
391348 else if ((eggPayment.amount != getAccessItemPrice()))
392349 then throw("3BAI: Wrong amount of assets attached")
393350 else {
394351 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil))
395352 if ((accessItemData == accessItemData))
396353 then {
397- let validPayment = if ((i.caller == getRentingAddress()))
398- then nil
399- else checkAdditionalPayment(i.payments[1])
400- if ((validPayment == validPayment))
401- then $Tuple2(validPayment, accessItemData)
354+ let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), eggPayment.amount)])
355+ if ((burnCall == burnCall))
356+ then {
357+ let validPayment = if ((i.caller == getRentingAddress()))
358+ then nil
359+ else checkAdditionalPayment(i.payments[1])
360+ if ((validPayment == validPayment))
361+ then $Tuple2(validPayment, accessItemData)
362+ else throw("Strict value is not equal to itself.")
363+ }
402364 else throw("Strict value is not equal to itself.")
403365 }
404366 else throw("Strict value is not equal to itself.")
405367 }
406368 }
407369
408370
409371
410372 @Callable(i)
411373 func buyAccessItemOther (addressOther) = {
412374 let eggPayment = value(i.payments[0])
413375 if ((eggPayment.assetId != getAccessItemAssetId()))
414376 then throw("3BAI: Wrong asset attached")
415377 else if ((eggPayment.amount != getAccessItemPrice()))
416378 then throw("3BAI: Wrong amount of assets attached")
417379 else {
418380 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressOther], nil))
419381 if ((accessItemData == accessItemData))
420- then $Tuple2(nil, accessItemData)
382+ then {
383+ let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), eggPayment.amount)])
384+ if ((burnCall == burnCall))
385+ then $Tuple2(nil, accessItemData)
386+ else throw("Strict value is not equal to itself.")
387+ }
421388 else throw("Strict value is not equal to itself.")
422389 }
423390 }
424391
425392
426393
427394 @Callable(i)
428395 func lockDuck () = {
429396 let addressStr = toString(i.originCaller)
430397 let duckPayment = value(i.payments[0])
431398 let validPayment = checkAdditionalPayment(i.payments[1])
432399 if ((validPayment == validPayment))
433400 then (lockDuckInternal(addressStr, addressStr, duckPayment) ++ validPayment)
434401 else throw("Strict value is not equal to itself.")
435402 }
436403
437404
438405
439406 @Callable(i)
440407 func initUnlock (assetIdStr) = {
441408 let addressStr = toString(i.caller)
442409 let validPayment = checkAdditionalPayment(i.payments[0])
443410 if ((validPayment == validPayment))
444411 then (initUnlockDuck(assetIdStr, addressStr) ++ validPayment)
445412 else throw("Strict value is not equal to itself.")
446413 }
447414
448415
449416
450417 @Callable(i)
451418 func lockDuckRenting (addressTakeSpotsFrom) = if ((i.caller != getRentingAddress()))
452419 then throw("3UDO: Renting only!")
453420 else {
454421 let addressStr = toString(i.caller)
455422 let duckPayment = value(i.payments[0])
456423 lockDuckInternal(addressStr, addressTakeSpotsFrom, duckPayment)
457424 }
458425
459426
460427
461428 @Callable(i)
462429 func unlockDuckRenting (assetIdStr,addSpotsTowards) = if ((i.caller != getRentingAddress()))
463430 then throw("3UDO: Renting only!")
464431 else {
465432 let addressStr = toString(i.caller)
466433 unstakeDuck(assetIdStr, addressStr, addSpotsTowards)
467434 }
468435
469436
470437
471438 @Callable(i)
472439 func unlockDuckOther (assetIdStr) = if ((i.caller != this))
473440 then throw("3UDO: Admin only!")
474441 else {
475442 let ownerKey = tryGetString(keyDuckOwner(fromBase58String(assetIdStr)))
476443 unstakeDuck(assetIdStr, ownerKey, ownerKey)
477444 }
478445
479446
480447
481448 @Callable(i)
482449 func unlockDuck (assetIdStr,ts,allowed,signature) = if ((allowed != true))
483450 then throw("3UD: Not allowed to unlock the duck!")
484451 else {
485452 let MSINHOUR = 3600000
486453 let currentTs = lastBlock.timestamp
487454 if ((currentTs > (ts + MSINHOUR)))
488455 then throw("3UD: Outdated signature!")
489456 else {
490457 let addressStr = toString(i.caller)
491458 let text = makeString([assetIdStr, toString(ts), toString(allowed)], ";")
492459 if (!(sigVerify_8Kb(toBytes(text), fromBase58String(signature), getBackendPubKey())))
493460 then throw(((("3UD: Invalid proof from backend key" + toBase58String(getBackendPubKey())) + " ") + text))
494461 else {
495462 let validPayment = checkAdditionalPayment(i.payments[0])
496463 if ((validPayment == validPayment))
497464 then (unstakeDuck(assetIdStr, addressStr, addressStr) ++ validPayment)
498465 else throw("Strict value is not equal to itself.")
499466 }
500467 }
501468 }
502469
503470

github/deemru/w8io/3ef1775 
69.77 ms