2022.08.09 10:19 [3242105] smart account 3PAHWHrKToiirbcQpggaf7xX582wEJHH1s4 > SELF 0.00000000 Waves
{ "type": 13, "id": "DsSTSJGa9dEY5dxabq45De74SG7j6A2RkYoFZHNbWVMS", "fee": 1700000, "feeAssetId": null, "timestamp": 1660029659215, "version": 2, "chainId": 87, "sender": "3PAHWHrKToiirbcQpggaf7xX582wEJHH1s4", "senderPublicKey": "GHr1Hnp4adsHHyw4nrZc3zDAeg6Z3sTVdvunPa8PwiEJ", "proofs": [ "5rwFuk5idtZAw9j3SdBmjWqM6pb7mkSYbAu3SvpWKVm8GHhvN9VhWn5M9geTBwM8Xzh9zggzTi3kJVgUbq2JkRpT" ], "script": "base64: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ZGVmaW5lZCEBAAAACmdldE5GVE5hbWUAAAAACQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQiAAAAAQIAAAAOc3RhdGljX25mdE5hbWUCAAAAIzNHTk46IFRoZXJlIGlzIG5vIG5mdCBuYW1lIGRlZmluZWQhAQAAABNnZXRJbmN1YmF0b3JBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABdzdGF0aWNfaW5jdWJhdG9yQWRkcmVzcwEAAAARZ2V0QnJlZWRlckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAFXN0YXRpY19icmVlZGVyQWRkcmVzcwEAAAARZ2V0RmFybWluZ0FkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAFXN0YXRpY19mYXJtaW5nQWRkcmVzcwEAAAANZ2V0RWdnQXNzZXRJZAAAAAAJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAEXN0YXRpY19lZ2dBc3NldElkAQAAABRnZXRBY2Nlc3NJdGVtQXNzZXRJZAAAAAAJAAJZAAAAAQkBAAAADHRyeUdldFN0cmluZwAAAAECAAAAGHN0YXRpY19hY2Nlc3NJdGVtQXNzZXRJZAEAAAASZ2V0QWNjZXNzSXRlbVByaWNlAAAAAAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABZzdGF0aWNfYWNjZXNzSXRlbVByaWNlAQAAABJnZXRNaW5Mb2NrRHVyYXRpb24AAAAACQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAFnN0YXRpY19taW5Mb2NrRHVyYXRpb24BAAAAE2dldEJvc3RlckJ1eUFzc2V0SWQAAAAACQACWQAAAAEJAQAAAAx0cnlHZXRTdHJpbmcAAAABAgAAABhzdGF0aWNfYm9vc3RlckJ1eUFzc2V0SWQBAAAAFmdldEJvc3RlclByaWNlRm9yTGV2ZWwAAAABAAAABWxldmVsCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQfAAAAAQkAASwAAAACAgAAABlzdGF0aWNfYm9vc3RlclByaWNlTGV2ZWxfCQABpAAAAAEFAAAABWxldmVsAgAAADkzR0JQRkw6IFRoZXJlIGlzIG5vIHByaWNlIHZhbHVlIGZvciB0aGlzIGxldmVsIG9mIGJvb3N0ZXIBAAAAFWdldEJvc3Rlck5hbWVGb3JMZXZlbAAAAAEAAAAFbGV2ZWwJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCIAAAABCQABLAAAAAICAAAAE3N0YXRpY19ib29zdGVyTmFtZV8JAAGkAAAAAQUAAAAFbGV2ZWwCAAAAIDNHQk5GTDogVGhlcmUgaXMgbm8gc3VjaCBib29zdGVyAQAAAAhhc1N0cmluZwAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAABnN0cmluZwUAAAAHJG1hdGNoMAUAAAAGc3RyaW5nCQAAAgAAAAECAAAAHHdyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcBAAAAEGxvY2tEdWNrSW50ZXJuYWwAAAACAAAACmFkZHJlc3NTdHIAAAADcG10BAAAAAdhc3NldElkCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAAC2Fzc2V0SXNzdWVyCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAdhc3NldElkAAAABmlzc3VlcgQAAAAMdER1Y2tEZXRhaWxzCQEAAAAOZ2V0RHVja0RldGFpbHMAAAABBQAAAAdhc3NldElkBAAAAAphc3NldENvbG9yCAUAAAAMdER1Y2tEZXRhaWxzAAAAAl8xBAAAAAlpc0phY2twb3QIBQAAAAx0RHVja0RldGFpbHMAAAACXzIEAAAACmtTcG90c0J1c3kJAQAAAAxrZXlTcG90c0J1c3kAAAABBQAAAAphZGRyZXNzU3RyBAAAAAlzcG90c0J1c3kJ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cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQAAAAt1bnN0YWtlRHVjawAAAAIAAAAKYXNzZXRJZFN0cgAAAAphZGRyZXNzU3RyBAAAAAdhc3NldElkCQACWQAAAAEFAAAACmFzc2V0SWRTdHIEAAAADHREdWNrRGV0YWlscwkBAAAADmdldER1Y2tEZXRhaWxzAAAAAQUAAAAHYXNzZXRJZAQAAAAKYXNzZXRDb2xvcggFAAAADHREdWNrRGV0YWlscwAAAAJfMQQAAAAJaXNKYWNrcG90CAUAAAAMdER1Y2tEZXRhaWxzAAAAAl8yBAAAAAprU3BvdHNCdXN5CQEAAAAMa2V5U3BvdHNCdXN5AAAAAQUAAAAKYWRkcmVzc1N0cgQAAAAKa0R1Y2tPd25lcgkBAAAADGtleUR1Y2tPd25lcgAAAAEFAAAAB2Fzc2V0SWQEAAAAEnJlbWFpbmluZ0ZvclVubG9jawkAAGUAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABFrZXlEdWNrVW5sb2NrVGltZQAAAAEFAAAAB2Fzc2V0SWQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wAwkBAAAAAiE9AAAAAgkBAAAADHRyeUdldFN0cmluZwAAAAEFAAAACmtEdWNrT3duZXIFAAAACmFkZHJlc3NTdHIJAAACAAAAAQIAAAAaM1VMOiBUaGUgZHVjayBpcyBub3QgeW91cnMDCQAAZgAAAAIFAAAAEnJlbWFpbmluZ0ZvclVubG9jawAAAAAAAAAAAAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAgM1VMOiBZb3UgbmVlZCB0byB3YWl0IHRvIHVubG9jayAJAAGkAAAAAQkAAGkAAAACBQAAABJyZW1haW5pbmdGb3JVbmxvY2sAAAAAAAAAA+gCAAAACCBzZWNvbmRzBAAAAA91bnN0YWtlRnVuY05hbWUDCQAAAAAAAAIFAAAACWlzSmFja3BvdAYCAAAADnVuc3Rha2VKYWNrcG90AgAAAAp1bnN0YWtlTkZUBAAAAARpbnYxCQAD/AAAAAQJAQAAABFnZXRGYXJtaW5nQWRkcmVzcwAAAAAFAAAAD3Vuc3Rha2VGdW5jTmFtZQkABEwAAAACBQAAAAphc3NldElkU3RyBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAEaW52MQUAAAAEaW52MQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQUAAAAKYWRkcmVzc1N0cgAAAAAAAAAAAQUAAAAHYXNzZXRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAATa2V5TG9ja2VkRHVja1N0YXR1cwAAAAIFAAAACmFkZHJlc3NTdHIFAAAACmFzc2V0SWRTdHIJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAKa0R1Y2tPd25lcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa1Nwb3RzQnVzeQkAAGUAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEFAAAACmtTcG90c0J1c3kAAAAAAAAAAAEFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAALAAAAAWkBAAAAFWJ1eUFjY2Vzc0l0ZW1JbnRlcm5hbAAAAAEAAAAKYWRkcmVzc1N0cgMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAABgzQkFJSTogaW50ZXJuYWwgdXNlIG9ubHkEAAAAD2lzc3VlQWNjZXNzSXRlbQkABEIAAAAFCQABLAAAAAICAAAAB0FDQ0VTUy0JAQAAAAtnZXRHYW1lTmFtZQAAAAAJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACVtBY2Nlc3NdIAkBAAAAD2dldExvbmdHYW1lTmFtZQAAAAACAAAAECBhY2Nlc3MgTkZUIGZvciAJAQAAAApnZXRORlROYW1lAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAcEAAAAEWFjY2Vzc1JhY2VBc3NldElkCQACWAAAAAEJAAQ4AAAAAQUAAAAPaXNzdWVBY2Nlc3NJdGVtBAAAAAxrU3BvdHNCb3VnaHQJAQAAAA5rZXlTcG90c0JvdWdodAAAAAEFAAAACmFkZHJlc3NTdHIJAAUUAAAAAgkABEwAAAACBQAAAA9pc3N1ZUFjY2Vzc0l0ZW0JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAAC2FjY2Vzc0l0ZW1fBQAAABFhY2Nlc3NSYWNlQXNzZXRJZAIAAAAGX293bmVyBQAAAAphZGRyZXNzU3RyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAKYWRkcmVzc1N0cgIAAAAHX293bmluZwUAAAARYWNjZXNzUmFjZUFzc2V0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADGtTcG90c0JvdWdodAkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEFAAAADGtTcG90c0JvdWdodAAAAAAAAAAAAQUAAAADbmlsBQAAABFhY2Nlc3NSYWNlQXNzZXRJZAAAAAFpAQAAAA9jb25maWd1cmVPcmFjbGUAAAAEAAAABm9yYWNsZQAAAAlzaG9ydG5hbWUAAAAIbG9uZ25hbWUAAAAHbmZ0TmFtZQMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAAA8zQ086IGFkbWluIG9ubHkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgIAAAAUc3RhdGljX29yYWNsZUFkZHJlc3MFAAAABm9yYWNsZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACAgAAABRzdGF0aWNfc2hvcnRHYW1lTmFtZQUAAAAJc2hvcnRuYW1lCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAAE3N0YXRpY19sb25nR2FtZU5hbWUFAAAACGxvbmduYW1lCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAADnN0YXRpY19uZnROYW1lBQAAAAduZnROYW1lBQAAAANuaWwAAAABaQEAAAANdXBkYXRlU2V0dGluZwAAAAIAAAADa2V5AAAABXZhbHVlAwkB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Z2dQYXltZW50CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAwkBAAAAAiE9AAAAAggFAAAACmVnZ1BheW1lbnQAAAAHYXNzZXRJZAkBAAAAFGdldEFjY2Vzc0l0ZW1Bc3NldElkAAAAAAkAAAIAAAABAgAAABozQkFJOiBXcm9uZyBhc3NldCBhdHRhY2hlZAMJAQAAAAIhPQAAAAIIBQAAAAplZ2dQYXltZW50AAAABmFtb3VudAkBAAAAEmdldEFjY2Vzc0l0ZW1QcmljZQAAAAAJAAACAAAAAQIAAAAlM0JBSTogV3JvbmcgYW1vdW50IG9mIGFzc2V0cyBhdHRhY2hlZAQAAAAOYWNjZXNzSXRlbURhdGEJAQAAAAhhc1N0cmluZwAAAAEJAAP8AAAABAUAAAAEdGhpcwIAAAAVYnV5QWNjZXNzSXRlbUludGVybmFsCQAETAAAAAIFAAAADGFkZHJlc3NPdGhlcgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAADmFjY2Vzc0l0ZW1EYXRhBQAAAA5hY2Nlc3NJdGVtRGF0YQkABRQAAAACBQAAAANuaWwFAAAADmFjY2Vzc0l0ZW1EYXRhCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAhsb2NrRHVjawAAAAADCQAAAAAAAAIGBgkAAAIAAAABAgAAAFVUQkFJOiBXZSBhcmUgd29ya2luZyB2ZXJ5IGhhcmQgdG8gcmVsZWFzZSB0aGUgbmV3IGh1bnQhIEZvciBub3cgYWxsIGxvY2tzIGFyZSBoYWx0ZWQhBAAAAAphZGRyZXNzU3RyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAALZHVja1BheW1lbnQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAJAQAAABBsb2NrRHVja0ludGVybmFsAAAAAgUAAAAKYWRkcmVzc1N0cgUAAAALZHVja1BheW1lbnQAAAABaQEAAAAPdW5sb2NrRHVja090aGVyAAAAAQAAAAphc3NldElkU3RyAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAETNVRE86IEFkbWluIG9ubHkhBAAAAAhvd25lcktleQkBAAAADGtleUR1Y2tPd25lcgAAAAEJAAJZAAAAAQUAAAAKYXNzZXRJZFN0cgkBAAAAC3Vuc3Rha2VEdWNrAAAAAgUAAAAKYXNzZXRJZFN0cgUAAAAIb3duZXJLZXkAAAABaQEAAAAKdW5sb2NrRHVjawAAAAEAAAAKYXNzZXRJZFN0cgQAAAAKYWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAQAAAAt1bnN0YWtlRHVjawAAAAIFAAAACmFzc2V0SWRTdHIFAAAACmFkZHJlc3NTdHIAAAAA5ziEyA==", "height": 3242105, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 97G8JMHfhRvb2rQXVGxogHQMFK6s8CqfwvVgoa6bb7qw Next: 4VZBHnRZSQLPueho53Ki4W4VveC3TPHQVbBZCCCyvKtY Diff:
Old | New | Differences | |
---|---|---|---|
147 | 147 | } | |
148 | 148 | ||
149 | 149 | ||
150 | + | func unstakeDuck (assetIdStr,addressStr) = { | |
151 | + | let assetId = fromBase58String(assetIdStr) | |
152 | + | let tDuckDetails = getDuckDetails(assetId) | |
153 | + | let assetColor = tDuckDetails._1 | |
154 | + | let isJackpot = tDuckDetails._2 | |
155 | + | let kSpotsBusy = keySpotsBusy(addressStr) | |
156 | + | let kDuckOwner = keyDuckOwner(assetId) | |
157 | + | let remainingForUnlock = (tryGetInteger(keyDuckUnlockTime(assetId)) - lastBlock.timestamp) | |
158 | + | if ((tryGetString(kDuckOwner) != addressStr)) | |
159 | + | then throw("3UL: The duck is not yours") | |
160 | + | else if ((remainingForUnlock > 0)) | |
161 | + | then throw((("3UL: You need to wait to unlock " + toString((remainingForUnlock / 1000))) + " seconds")) | |
162 | + | else { | |
163 | + | let unstakeFuncName = if ((isJackpot == true)) | |
164 | + | then "unstakeJackpot" | |
165 | + | else "unstakeNFT" | |
166 | + | let inv1 = invoke(getFarmingAddress(), unstakeFuncName, [assetIdStr], nil) | |
167 | + | if ((inv1 == inv1)) | |
168 | + | then [ScriptTransfer(Address(fromBase58String(addressStr)), 1, assetId), DeleteEntry(keyLockedDuckStatus(addressStr, assetIdStr)), DeleteEntry(kDuckOwner), IntegerEntry(kSpotsBusy, (tryGetInteger(kSpotsBusy) - 1))] | |
169 | + | else throw("Strict value is not equal to itself.") | |
170 | + | } | |
171 | + | } | |
172 | + | ||
173 | + | ||
150 | 174 | @Callable(i) | |
151 | 175 | func buyAccessItemInternal (addressStr) = if ((i.caller != this)) | |
152 | 176 | then throw("3BAII: internal use only") | |
288 | 312 | ||
289 | 313 | ||
290 | 314 | @Callable(i) | |
315 | + | func unlockDuckOther (assetIdStr) = if ((i.caller != this)) | |
316 | + | then throw("3UDO: Admin only!") | |
317 | + | else { | |
318 | + | let ownerKey = keyDuckOwner(fromBase58String(assetIdStr)) | |
319 | + | unstakeDuck(assetIdStr, ownerKey) | |
320 | + | } | |
321 | + | ||
322 | + | ||
323 | + | ||
324 | + | @Callable(i) | |
291 | 325 | func unlockDuck (assetIdStr) = { | |
292 | 326 | let addressStr = toString(i.caller) | |
293 | - | let assetId = fromBase58String(assetIdStr) | |
294 | - | let tDuckDetails = getDuckDetails(assetId) | |
295 | - | let assetColor = tDuckDetails._1 | |
296 | - | let isJackpot = tDuckDetails._2 | |
297 | - | let kSpotsBusy = keySpotsBusy(addressStr) | |
298 | - | let kDuckOwner = keyDuckOwner(assetId) | |
299 | - | let remainingForUnlock = (tryGetInteger(keyDuckUnlockTime(assetId)) - lastBlock.timestamp) | |
300 | - | if ((tryGetString(kDuckOwner) != addressStr)) | |
301 | - | then throw("3UL: The duck is not yours") | |
302 | - | else if ((remainingForUnlock > 0)) | |
303 | - | then throw((("3UL: You need to wait to unlock " + toString((remainingForUnlock / 1000))) + " seconds")) | |
304 | - | else { | |
305 | - | let unstakeFuncName = if ((isJackpot == true)) | |
306 | - | then "unstakeJackpot" | |
307 | - | else "unstakeNFT" | |
308 | - | let inv1 = invoke(getFarmingAddress(), unstakeFuncName, [assetIdStr], nil) | |
309 | - | if ((inv1 == inv1)) | |
310 | - | then [ScriptTransfer(i.caller, 1, assetId), DeleteEntry(keyLockedDuckStatus(addressStr, assetIdStr)), DeleteEntry(kDuckOwner), IntegerEntry(kSpotsBusy, (tryGetInteger(kSpotsBusy) - 1))] | |
311 | - | else throw("Strict value is not equal to itself.") | |
312 | - | } | |
327 | + | unstakeDuck(assetIdStr, addressStr) | |
313 | 328 | } | |
314 | 329 | ||
315 | 330 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func tryGetInteger (key) = match getInteger(this, key) { | |
5 | 5 | case b: Int => | |
6 | 6 | b | |
7 | 7 | case _ => | |
8 | 8 | 0 | |
9 | 9 | } | |
10 | 10 | ||
11 | 11 | ||
12 | 12 | func keyBoughtBoosterLevel (addressStr) = (("address_" + addressStr) + "_boughtBoosterLevel") | |
13 | 13 | ||
14 | 14 | ||
15 | 15 | func keyDuckUnlockTime (assetId) = (("duck_" + toBase58String(assetId)) + "_unlockTime") | |
16 | 16 | ||
17 | 17 | ||
18 | 18 | func keyDuckOwner (assetId) = (("duck_" + toBase58String(assetId)) + "_owner") | |
19 | 19 | ||
20 | 20 | ||
21 | 21 | func keySpotsBought (addressStr) = (("address_" + addressStr) + "_spotsBought") | |
22 | 22 | ||
23 | 23 | ||
24 | 24 | func keySpotsBusy (addressStr) = (("address_" + addressStr) + "_spotsBusy") | |
25 | 25 | ||
26 | 26 | ||
27 | 27 | func keyLockedDuckStatus (addressStr,assetIdStr) = (((("address_" + addressStr) + "_lockedDuck_") + assetIdStr) + "_status") | |
28 | 28 | ||
29 | 29 | ||
30 | 30 | func getDuckDetails (assetId) = { | |
31 | 31 | let assetName = value(value(assetInfo(assetId)).name) | |
32 | 32 | let assetNameParts = split(assetName, "") | |
33 | 33 | let isJackpot = (assetNameParts[(size(assetNameParts) - 2)] == "J") | |
34 | 34 | let assetColor = if (isJackpot) | |
35 | 35 | then "B" | |
36 | 36 | else assetNameParts[(size(assetNameParts) - 1)] | |
37 | 37 | $Tuple2(assetColor, isJackpot) | |
38 | 38 | } | |
39 | 39 | ||
40 | 40 | ||
41 | 41 | func tryGetStringExternal (address,key) = match getString(address, key) { | |
42 | 42 | case a: String => | |
43 | 43 | a | |
44 | 44 | case _ => | |
45 | 45 | "" | |
46 | 46 | } | |
47 | 47 | ||
48 | 48 | ||
49 | 49 | func tryGetString (key) = tryGetStringExternal(this, key) | |
50 | 50 | ||
51 | 51 | ||
52 | 52 | func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress"))) | |
53 | 53 | ||
54 | 54 | ||
55 | 55 | func getGameName () = valueOrErrorMessage(getString("static_shortGameName"), "3GGN: There is no game name defined!") | |
56 | 56 | ||
57 | 57 | ||
58 | 58 | func getLongGameName () = valueOrErrorMessage(getString("static_longGameName"), "3GLGN: There is no long game name defined!") | |
59 | 59 | ||
60 | 60 | ||
61 | 61 | func getNFTName () = valueOrErrorMessage(getString("static_nftName"), "3GNN: There is no nft name defined!") | |
62 | 62 | ||
63 | 63 | ||
64 | 64 | func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress"))) | |
65 | 65 | ||
66 | 66 | ||
67 | 67 | func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress"))) | |
68 | 68 | ||
69 | 69 | ||
70 | 70 | func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_farmingAddress"))) | |
71 | 71 | ||
72 | 72 | ||
73 | 73 | func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId")) | |
74 | 74 | ||
75 | 75 | ||
76 | 76 | func getAccessItemAssetId () = fromBase58String(tryGetString("static_accessItemAssetId")) | |
77 | 77 | ||
78 | 78 | ||
79 | 79 | func getAccessItemPrice () = tryGetInteger("static_accessItemPrice") | |
80 | 80 | ||
81 | 81 | ||
82 | 82 | func getMinLockDuration () = tryGetInteger("static_minLockDuration") | |
83 | 83 | ||
84 | 84 | ||
85 | 85 | func getBosterBuyAssetId () = fromBase58String(tryGetString("static_boosterBuyAssetId")) | |
86 | 86 | ||
87 | 87 | ||
88 | 88 | func getBosterPriceForLevel (level) = valueOrErrorMessage(getInteger(("static_boosterPriceLevel_" + toString(level))), "3GBPFL: There is no price value for this level of booster") | |
89 | 89 | ||
90 | 90 | ||
91 | 91 | func getBosterNameForLevel (level) = valueOrErrorMessage(getString(("static_boosterName_" + toString(level))), "3GBNFL: There is no such booster") | |
92 | 92 | ||
93 | 93 | ||
94 | 94 | func asString (value) = match value { | |
95 | 95 | case string: String => | |
96 | 96 | string | |
97 | 97 | case _ => | |
98 | 98 | throw("wrong type, expected: String") | |
99 | 99 | } | |
100 | 100 | ||
101 | 101 | ||
102 | 102 | func lockDuckInternal (addressStr,pmt) = { | |
103 | 103 | let assetId = value(pmt.assetId) | |
104 | 104 | let assetIssuer = value(assetInfo(assetId)).issuer | |
105 | 105 | let tDuckDetails = getDuckDetails(assetId) | |
106 | 106 | let assetColor = tDuckDetails._1 | |
107 | 107 | let isJackpot = tDuckDetails._2 | |
108 | 108 | let kSpotsBusy = keySpotsBusy(addressStr) | |
109 | 109 | let spotsBusy = tryGetInteger(kSpotsBusy) | |
110 | 110 | let kSpotsBought = keySpotsBought(addressStr) | |
111 | 111 | let addressSpotsAvailable = (tryGetInteger(kSpotsBought) - spotsBusy) | |
112 | 112 | if ((pmt.amount != 1)) | |
113 | 113 | then throw("NFT is not attached") | |
114 | 114 | else if (if ((assetIssuer != getIncubatorAddress())) | |
115 | 115 | then (assetIssuer != getBreederAddress()) | |
116 | 116 | else false) | |
117 | 117 | then throw("ivalid NFT attached") | |
118 | 118 | else if ((0 >= addressSpotsAvailable)) | |
119 | 119 | then throw("No spots available") | |
120 | 120 | else { | |
121 | 121 | let kPerchesAvailable = ((("address_" + toString(this)) + "_perchesAvailable_") + assetColor) | |
122 | 122 | let perchesAvailable = match getInteger(getFarmingAddress(), kPerchesAvailable) { | |
123 | 123 | case b: Int => | |
124 | 124 | b | |
125 | 125 | case _ => | |
126 | 126 | 0 | |
127 | 127 | } | |
128 | 128 | if ((perchesAvailable == perchesAvailable)) | |
129 | 129 | then { | |
130 | 130 | let eggAssetId = getEggAssetId() | |
131 | 131 | let inv1 = if ((perchesAvailable > 0)) | |
132 | 132 | then unit | |
133 | 133 | else invoke(getFarmingAddress(), "buyPerch", [assetColor, ""], [AttachedPayment(eggAssetId, 100000000)]) | |
134 | 134 | if ((inv1 == inv1)) | |
135 | 135 | then { | |
136 | 136 | let inv2 = if ((isJackpot == false)) | |
137 | 137 | then invoke(getFarmingAddress(), "stakeNFT", nil, [AttachedPayment(assetId, 1)]) | |
138 | 138 | else invoke(getFarmingAddress(), "stakeJackpot", [assetColor], [AttachedPayment(assetId, 1)]) | |
139 | 139 | if ((inv2 == inv2)) | |
140 | 140 | then [IntegerEntry(kSpotsBusy, (spotsBusy + 1)), StringEntry(keyDuckOwner(assetId), addressStr), BooleanEntry(keyLockedDuckStatus(addressStr, toBase58String(assetId)), true), IntegerEntry(keyDuckUnlockTime(assetId), (lastBlock.timestamp + getMinLockDuration()))] | |
141 | 141 | else throw("Strict value is not equal to itself.") | |
142 | 142 | } | |
143 | 143 | else throw("Strict value is not equal to itself.") | |
144 | 144 | } | |
145 | 145 | else throw("Strict value is not equal to itself.") | |
146 | 146 | } | |
147 | 147 | } | |
148 | 148 | ||
149 | 149 | ||
150 | + | func unstakeDuck (assetIdStr,addressStr) = { | |
151 | + | let assetId = fromBase58String(assetIdStr) | |
152 | + | let tDuckDetails = getDuckDetails(assetId) | |
153 | + | let assetColor = tDuckDetails._1 | |
154 | + | let isJackpot = tDuckDetails._2 | |
155 | + | let kSpotsBusy = keySpotsBusy(addressStr) | |
156 | + | let kDuckOwner = keyDuckOwner(assetId) | |
157 | + | let remainingForUnlock = (tryGetInteger(keyDuckUnlockTime(assetId)) - lastBlock.timestamp) | |
158 | + | if ((tryGetString(kDuckOwner) != addressStr)) | |
159 | + | then throw("3UL: The duck is not yours") | |
160 | + | else if ((remainingForUnlock > 0)) | |
161 | + | then throw((("3UL: You need to wait to unlock " + toString((remainingForUnlock / 1000))) + " seconds")) | |
162 | + | else { | |
163 | + | let unstakeFuncName = if ((isJackpot == true)) | |
164 | + | then "unstakeJackpot" | |
165 | + | else "unstakeNFT" | |
166 | + | let inv1 = invoke(getFarmingAddress(), unstakeFuncName, [assetIdStr], nil) | |
167 | + | if ((inv1 == inv1)) | |
168 | + | then [ScriptTransfer(Address(fromBase58String(addressStr)), 1, assetId), DeleteEntry(keyLockedDuckStatus(addressStr, assetIdStr)), DeleteEntry(kDuckOwner), IntegerEntry(kSpotsBusy, (tryGetInteger(kSpotsBusy) - 1))] | |
169 | + | else throw("Strict value is not equal to itself.") | |
170 | + | } | |
171 | + | } | |
172 | + | ||
173 | + | ||
150 | 174 | @Callable(i) | |
151 | 175 | func buyAccessItemInternal (addressStr) = if ((i.caller != this)) | |
152 | 176 | then throw("3BAII: internal use only") | |
153 | 177 | else { | |
154 | 178 | let issueAccessItem = Issue(("ACCESS-" + getGameName()), ((("[Access] " + getLongGameName()) + " access NFT for ") + getNFTName()), 1, 0, false) | |
155 | 179 | let accessRaceAssetId = toBase58String(calculateAssetId(issueAccessItem)) | |
156 | 180 | let kSpotsBought = keySpotsBought(addressStr) | |
157 | 181 | $Tuple2([issueAccessItem, StringEntry((("accessItem_" + accessRaceAssetId) + "_owner"), addressStr), StringEntry((("address_" + addressStr) + "_owning"), accessRaceAssetId), IntegerEntry(kSpotsBought, (tryGetInteger(kSpotsBought) + 1))], accessRaceAssetId) | |
158 | 182 | } | |
159 | 183 | ||
160 | 184 | ||
161 | 185 | ||
162 | 186 | @Callable(i) | |
163 | 187 | func configureOracle (oracle,shortname,longname,nftName) = if ((i.caller != this)) | |
164 | 188 | then throw("3CO: admin only") | |
165 | 189 | else [StringEntry("static_oracleAddress", oracle), StringEntry("static_shortGameName", shortname), StringEntry("static_longGameName", longname), StringEntry("static_nftName", nftName)] | |
166 | 190 | ||
167 | 191 | ||
168 | 192 | ||
169 | 193 | @Callable(i) | |
170 | 194 | func updateSetting (key,value) = if ((i.caller != this)) | |
171 | 195 | then throw("Only administrator can call this method") | |
172 | 196 | else match value { | |
173 | 197 | case int: Int => | |
174 | 198 | [IntegerEntry(key, int)] | |
175 | 199 | case s: String => | |
176 | 200 | [StringEntry(key, s)] | |
177 | 201 | case b: Boolean => | |
178 | 202 | [BooleanEntry(key, b)] | |
179 | 203 | case bv: ByteVector => | |
180 | 204 | [BinaryEntry(key, bv)] | |
181 | 205 | case _ => | |
182 | 206 | throw("Bad value type") | |
183 | 207 | } | |
184 | 208 | ||
185 | 209 | ||
186 | 210 | ||
187 | 211 | @Callable(i) | |
188 | 212 | func deleteSetting (key) = if ((i.caller != this)) | |
189 | 213 | then throw("3DS: Only administrator can call this method") | |
190 | 214 | else [DeleteEntry(key)] | |
191 | 215 | ||
192 | 216 | ||
193 | 217 | ||
194 | 218 | @Callable(i) | |
195 | 219 | func buyBooster () = { | |
196 | 220 | let kBoughtLevel = keyBoughtBoosterLevel(toString(i.caller)) | |
197 | 221 | let boughtBoosterLevel = tryGetInteger(kBoughtLevel) | |
198 | 222 | let newLevel = (boughtBoosterLevel + 1) | |
199 | 223 | let pmt = value(i.payments[0]) | |
200 | 224 | let price = getBosterPriceForLevel(newLevel) | |
201 | 225 | let expectedAssetId = getBosterBuyAssetId() | |
202 | 226 | if ((pmt.amount != price)) | |
203 | 227 | then throw(("3BB: Bad price, it should be: " + toString(price))) | |
204 | 228 | else if ((pmt.assetId != expectedAssetId)) | |
205 | 229 | then throw(("3BB: Bad payment attached, it should be: " + toBase58String(expectedAssetId))) | |
206 | 230 | else { | |
207 | 231 | let name = getBosterNameForLevel(newLevel) | |
208 | 232 | let boosterItem = Issue(((getGameName() + "-") + name), ((("[Booster] " + getLongGameName()) + " booster for the game, level = ") + toString(newLevel)), 1, 0, false) | |
209 | 233 | let boosterItemAssetId = calculateAssetId(boosterItem) | |
210 | 234 | [boosterItem, IntegerEntry(kBoughtLevel, newLevel), ScriptTransfer(i.caller, 1, boosterItemAssetId)] | |
211 | 235 | } | |
212 | 236 | } | |
213 | 237 | ||
214 | 238 | ||
215 | 239 | ||
216 | 240 | @Callable(i) | |
217 | 241 | func buyAccessItemAndLockDuck () = if ((true == true)) | |
218 | 242 | then throw("TBAIALD: We are working very hard to release the new hunt! For now all sales are halted!") | |
219 | 243 | else { | |
220 | 244 | let eggPayment = value(i.payments[0]) | |
221 | 245 | let duckPayment = value(i.payments[1]) | |
222 | 246 | let addressStr = toString(i.caller) | |
223 | 247 | if ((eggPayment.assetId != getAccessItemAssetId())) | |
224 | 248 | then throw("3BAI: Wrong asset attached") | |
225 | 249 | else if ((eggPayment.amount != getAccessItemPrice())) | |
226 | 250 | then throw("3BAI: Wrong amount of assets attached") | |
227 | 251 | else { | |
228 | 252 | let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil)) | |
229 | 253 | if ((accessItemData == accessItemData)) | |
230 | 254 | then { | |
231 | 255 | let lockData = lockDuckInternal(addressStr, duckPayment) | |
232 | 256 | $Tuple2(lockData, accessItemData) | |
233 | 257 | } | |
234 | 258 | else throw("Strict value is not equal to itself.") | |
235 | 259 | } | |
236 | 260 | } | |
237 | 261 | ||
238 | 262 | ||
239 | 263 | ||
240 | 264 | @Callable(i) | |
241 | 265 | func buyAccessItem () = if ((true == true)) | |
242 | 266 | then throw("TBAI: We are working very hard to release the new hunt! For now all sales are halted!") | |
243 | 267 | else { | |
244 | 268 | let addressStr = toString(i.caller) | |
245 | 269 | let eggPayment = value(i.payments[0]) | |
246 | 270 | if ((eggPayment.assetId != getAccessItemAssetId())) | |
247 | 271 | then throw("3BAI: Wrong asset attached") | |
248 | 272 | else if ((eggPayment.amount != getAccessItemPrice())) | |
249 | 273 | then throw("3BAI: Wrong amount of assets attached") | |
250 | 274 | else { | |
251 | 275 | let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil)) | |
252 | 276 | if ((accessItemData == accessItemData)) | |
253 | 277 | then $Tuple2(nil, accessItemData) | |
254 | 278 | else throw("Strict value is not equal to itself.") | |
255 | 279 | } | |
256 | 280 | } | |
257 | 281 | ||
258 | 282 | ||
259 | 283 | ||
260 | 284 | @Callable(i) | |
261 | 285 | func buyAccessItemOther (addressOther) = if ((true == true)) | |
262 | 286 | then throw("TBAI: We are working very hard to release the new hunt! For now all sales are halted!") | |
263 | 287 | else { | |
264 | 288 | let eggPayment = value(i.payments[0]) | |
265 | 289 | if ((eggPayment.assetId != getAccessItemAssetId())) | |
266 | 290 | then throw("3BAI: Wrong asset attached") | |
267 | 291 | else if ((eggPayment.amount != getAccessItemPrice())) | |
268 | 292 | then throw("3BAI: Wrong amount of assets attached") | |
269 | 293 | else { | |
270 | 294 | let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressOther], nil)) | |
271 | 295 | if ((accessItemData == accessItemData)) | |
272 | 296 | then $Tuple2(nil, accessItemData) | |
273 | 297 | else throw("Strict value is not equal to itself.") | |
274 | 298 | } | |
275 | 299 | } | |
276 | 300 | ||
277 | 301 | ||
278 | 302 | ||
279 | 303 | @Callable(i) | |
280 | 304 | func lockDuck () = if ((true == true)) | |
281 | 305 | then throw("TBAI: We are working very hard to release the new hunt! For now all locks are halted!") | |
282 | 306 | else { | |
283 | 307 | let addressStr = toString(i.caller) | |
284 | 308 | let duckPayment = value(i.payments[0]) | |
285 | 309 | lockDuckInternal(addressStr, duckPayment) | |
286 | 310 | } | |
287 | 311 | ||
288 | 312 | ||
289 | 313 | ||
290 | 314 | @Callable(i) | |
315 | + | func unlockDuckOther (assetIdStr) = if ((i.caller != this)) | |
316 | + | then throw("3UDO: Admin only!") | |
317 | + | else { | |
318 | + | let ownerKey = keyDuckOwner(fromBase58String(assetIdStr)) | |
319 | + | unstakeDuck(assetIdStr, ownerKey) | |
320 | + | } | |
321 | + | ||
322 | + | ||
323 | + | ||
324 | + | @Callable(i) | |
291 | 325 | func unlockDuck (assetIdStr) = { | |
292 | 326 | let addressStr = toString(i.caller) | |
293 | - | let assetId = fromBase58String(assetIdStr) | |
294 | - | let tDuckDetails = getDuckDetails(assetId) | |
295 | - | let assetColor = tDuckDetails._1 | |
296 | - | let isJackpot = tDuckDetails._2 | |
297 | - | let kSpotsBusy = keySpotsBusy(addressStr) | |
298 | - | let kDuckOwner = keyDuckOwner(assetId) | |
299 | - | let remainingForUnlock = (tryGetInteger(keyDuckUnlockTime(assetId)) - lastBlock.timestamp) | |
300 | - | if ((tryGetString(kDuckOwner) != addressStr)) | |
301 | - | then throw("3UL: The duck is not yours") | |
302 | - | else if ((remainingForUnlock > 0)) | |
303 | - | then throw((("3UL: You need to wait to unlock " + toString((remainingForUnlock / 1000))) + " seconds")) | |
304 | - | else { | |
305 | - | let unstakeFuncName = if ((isJackpot == true)) | |
306 | - | then "unstakeJackpot" | |
307 | - | else "unstakeNFT" | |
308 | - | let inv1 = invoke(getFarmingAddress(), unstakeFuncName, [assetIdStr], nil) | |
309 | - | if ((inv1 == inv1)) | |
310 | - | then [ScriptTransfer(i.caller, 1, assetId), DeleteEntry(keyLockedDuckStatus(addressStr, assetIdStr)), DeleteEntry(kDuckOwner), IntegerEntry(kSpotsBusy, (tryGetInteger(kSpotsBusy) - 1))] | |
311 | - | else throw("Strict value is not equal to itself.") | |
312 | - | } | |
327 | + | unstakeDuck(assetIdStr, addressStr) | |
313 | 328 | } | |
314 | 329 | ||
315 | 330 |
github/deemru/w8io/786bc32 36.68 ms ◑