tx · ExN2szyY4BJKakhbeCZgHagT5iVSUBo7WyRCKmAKP17

3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX:  -0.01800000 Waves

2022.07.27 11:40 [3223497] smart account 3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX > SELF 0.00000000 Waves

{ "type": 13, "id": "ExN2szyY4BJKakhbeCZgHagT5iVSUBo7WyRCKmAKP17", "fee": 1800000, "feeAssetId": null, "timestamp": 1658911305216, "version": 2, "chainId": 87, "sender": "3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX", "senderPublicKey": "27DK15MykfnsVojpifD1gbr8kRr8rpY5mw6EH4zL8R25", "proofs": [ "2DMmByugo7DF9d6fLjbBBAVBwbuK4N4iGdyeigg4o1Juehox1t38eByj98igtvvDyoCEMVF2af8kae1Dy2mi1wEg" ], "script": "base64:AAIFAAAAAAAAAB8IAhIDCgEIEgASBQoDCAgBEgYKBAgIAQESAwoBCBIAAAAAJgEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAADHRyeUdldFN0cmluZwAAAAEAAAADa2V5CQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACBQAAAAR0aGlzBQAAAANrZXkBAAAACWdldE9yYWNsZQAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQIAAAAUc3RhdGljX29yYWNsZUFkZHJlc3MBAAAADWdldEVnZ0Fzc2V0SWQAAAAACQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABFzdGF0aWNfZWdnQXNzZXRJZAEAAAAPZ2V0U3BpY2VBc3NldElkAAAAAAkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAATc3RhdGljX3NwaWNlQXNzZXRJZAEAAAARZ2V0UmViaXJ0aEFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAFXN0YXRpY19yZWJpcnRoQWRkcmVzcwEAAAATZ2V0SW5jdWJhdG9yQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAAXc3RhdGljX2luY3ViYXRvckFkZHJlc3MBAAAAEWdldENvdXBvbnNBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABVzdGF0aWNfY291cG9uc0FkZHJlc3MBAAAADmdldEJ1cm5BZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABJzdGF0aWNfYnVybkFkZHJlc3MAAAAADWJhY2tlbmRQdWJLZXkBAAAAIJ/u9pS34AlL2xW1JDjPBq7tIL/E6huecGxiSXTybOIcAAAAAA5TVEFSVFRJTUVTVEFNUAAAAAF8FwhqgAAAAAAJTEFQTEVOR1RIAAAAAAABSZcAAAAAAA1EVUNLTElOR1BSSUNFAAAAAAAExLQAAAAAABZwZXJjZW50R3Jvd3RoUHJlY2lzaW9uAAAjhvJvwQAAAAAAABVleGlzdGluZ0R1Y2tQcmVjaXNpb24AAABa8xB6QAAAAAAAFktHbG9iYWxJc3N1ZWRUaW1lc3RhbXACAAAAF2dsb2JhbF9pc3N1ZWRfdGltZXN0YW1wAAAAAAdNU0lOREFZAAAAAAAFJlwAAQAAAAxrZXlUb3RhbEZlZWQAAAABAAAACmR1Y2tsaW5nSWQJAAEsAAAAAgkAASwAAAACAgAAAAlkdWNrbGluZ18FAAAACmR1Y2tsaW5nSWQCAAAABV9mZWVkAQAAABFrZXlEdWNrbGluZ0ZlZExhcAAAAAEAAAAKZHVja2xpbmdJZAkAASwAAAACCQABLAAAAAICAAAACWR1Y2tsaW5nXwUAAAAKZHVja2xpbmdJZAIAAAAHX2ZlZExhcAEAAAAXa2V5RHVja2xpbmdGZWRUaW1lc3RhbXAAAAABAAAACmR1Y2tsaW5nSWQJAAEsAAAAAgkAASwAAAACAgAAAAlkdWNrbGluZ18FAAAACmR1Y2tsaW5nSWQCAAAABl9mZWRUcwEAAAAaa2V5RHVja2xpbmdGZWRMYXBUaW1lc3RhbXAAAAACAAAACmR1Y2tsaW5nSWQAAAADbGFwCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACWR1Y2tsaW5nXwUAAAAKZHVja2xpbmdJZAIAAAAFX2xhcF8JAAGkAAAAAQUAAAADbGFwAgAAAAZfZmVkVHMBAAAAFmtleUFk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AAAACQEAAAAVZ2V0RHVja2xpbmdQZXJjZW50YWdlAAAAAQUAAAAKZHVja2xpbmdJZAkBAAAAFWdldER1Y2tsaW5nUGVyY2VudGFnZQAAAAEFAAAACmR1Y2tsaW5nSWQBAAAADWdldEN1cnJlbnRMYXAAAAAACQAAZAAAAAIJAABpAAAAAgkAAGUAAAACCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAAOU1RBUlRUSU1FU1RBTVAFAAAACUxBUExFTkdUSAAAAAAAAAAAAQEAAAATZ2V0TGFzdEZlZFRpbWVzdGFtcAAAAAEAAAAKZHVja2xpbmdJZAQAAAAQbGFzdEZlZFRpbWVzdGFtcAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAba2V5RHVja2xpbmdGZWRMYXN0VGltZXN0YW1wAAAAAQUAAAAKZHVja2xpbmdJZAMJAABmAAAAAgUAAAAQbGFzdEZlZFRpbWVzdGFtcAAAAAAAAAAAAAUAAAAQbGFzdEZlZFRpbWVzdGFtcAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXABAAAAGWNhbGN1bGF0ZU5ld0R1Y2tsaW5nTGV2ZWwAAAACAAAACmR1Y2tsaW5nSWQAAAANcGF5bWVudEFtb3VudAQAAAAJY3VycmVudFRzCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAQAAAAXbGFzdEZlZFRpbWVzdGFtcENoZWNrZWQJAQAAABNnZXRMYXN0RmVkVGltZXN0YW1wAAAAAQUAAAAKZHVja2xpbmdJZAQAAAAHZmVkRGlmZgkAAGUAAAACBQAAAAljdXJyZW50VHMFAAAAF2xhc3RGZWRUaW1lc3RhbXBDaGVja2VkBAAAAAdwZW5hbHR5CQABNgAAAAEAAAAAAAAAAAAEAAAABmdyb3d0aAkAATwAAAADCQABNgAAAAEFAAAADXBheW1lbnRBbW91bnQJAAE2AAAAAQUAAAAWcGVyY2VudEdyb3d0aFByZWNpc2lvbgkAATYAAAABBQAAAA1EVUNLTElOR1BSSUNFBAAAAAxjdXJyZW50TGV2ZWwJAQAAABVnZXRDdXJyZW50TGV2ZWxCaWdJbnQAAAABBQAAAApkdWNrbGluZ0lkBAAAAAhuZXdMZXZlbAkAATcAAAACCQAB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AAAAAWkAAAAGY2FsbGVyCAUAAAAPZHVja2xpbmdJZENoZWNrAAAAAmlkAAAAAAAAAAABCQAAAgAAAAECAAAAKUJGRDogWW91J3JlIG5vdCB0aGUgb3duZXIgb2YgdGhlIGR1Y2tsaW5nAwkBAAAAAiE9AAAAAggFAAAAD2R1Y2tsaW5nSWRDaGVjawAAAAZpc3N1ZXIFAAAABHRoaXMJAAACAAAAAQIAAAAkQkZEOiBDYW50IGZpbmQgZHVja2xpbmcgd2l0aCBzdWNoIGlkBAAAABBkdWNrbGluZ0lkU3RyaW5nCQACWAAAAAEIBQAAAA9kdWNrbGluZ0lkQ2hlY2sAAAACaWQFAAAAEGR1Y2tsaW5nSWRTdHJpbmcEAAAAEmtEdWNrbGluZ0xhc3RGZWRUcwkBAAAAG2tleUR1Y2tsaW5nRmVkTGFzdFRpbWVzdGFtcAAAAAEFAAAACmR1Y2tsaW5nSWQEAAAACWxhc3RGZWRUcwkBAAAAE2dldExhc3RGZWRUaW1lc3RhbXAAAAABBQAAAA5yZWFsRHVja2xpbmdJZAQAAAAOY3VycmVudFBheW1lbnQICQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAQAAAAJa05ld0xldmVsCQEAAAAQa2V5RHVja2xpbmdMZXZlbAAAAAEFAAAADnJlYWxEdWNrbGluZ0lkBAAAAAprVG90YWxGZWVkCQEAAAAMa2V5VG90YWxGZWVkAAAAAQUAAAAOcmVhbER1Y2tsaW5nSWQEAAAACXRvdGFsRmVlZAkBAAAADXRyeUdldEludGVnZXIAAAABBQAAAAprVG90YWxGZWVkBAAAAAxrRmVlZFR4U3RhdHMJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACWR1Y2tsaW5nXwUAAAAOcmVhbER1Y2tsaW5nSWQCAAAABl9zdGF0XwkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAQAAAAUa0FkZHJlc3NGZWRUaW1lc3RhbXAJAQAAABZrZXlBZGRyZXNzRmVkVGltZXN0YW1wAAAAAwUAAAANYWRkcmVzc1N0cmluZwkBAAAADWdldEN1cnJlbnRMYXAAAAAACAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAQAAAAYa0R1Y2tsaW5nRmVkTGFwVGltZXN0YW1wCQEAAAAaa2V5RHVja2xpbmdGZWRMYXBUaW1lc3RhbXAAAAACBQAAAA5yZWFsRHVja2xpbmdJZAkBAAAADWdldEN1cnJlbnRMYXAAAAAABAAAAA9rRHVja2xpbmdGZWRMYXAJAQAAABFrZXlEdWNrbGluZ0ZlZExhcAAAAAEFAAAADnJlYWxEdWNrbGluZ0lkAwkAAGYAAAACBQAAAA5jdXJyZW50UGF5bWVudAUAAAANbWF4RmVlZEFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAP0JGRDogQ2Fubm90IGZlZWQgZHVja2xpbmcgZm9yIHN1Y2ggYW1vdW50LCBtYXggZmVlZCBhbW91bnQgaXM6IAkAAaQAAAABBQAAAA1tYXhGZWVkQW1vdW50BAAAABBjYWxjdWxhdGVSZXN1bHRzCQEAAAAZY2FsY3VsYXRlTmV3RHVja2xpbmdMZXZlbAAAAAIFAAAADnJlYWxEdWNrbGluZ0lkCQAAaQAAAAIFAAAADmN1cnJlbnRQYXltZW50AAAAAAAAAABkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA1rQWRkcmVzc05vbmNlCQAAZAAAAAIFAAAADGN1cnJlbnROb25jZQAAAAAAAAAAAQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAASa0R1Y2tsaW5nTGFzdEZlZFRzCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa1RvdGFsRmVlZAkAAGQAAAACBQAAAAl0b3RhbEZlZWQFAAAADmN1cnJlbnRQYXltZW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAxrRmVlZFR4U3RhdHMFAAAADmN1cnJlbnRQYXltZW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABRrQWRkcmVzc0ZlZFRpbWVzdGFtcAUAAAAOY3VycmVudFBheW1lbnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGGtEdWNrbGluZ0ZlZExhcFRpbWVz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", "height": 3223497, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Ht9AteFgtmQf5R8R6Vs9GoX3o9GNXdc3mYzeS4sZtDmP Next: DDyw1iWWG3UekbAQDUG1Ca7aPWuuYDnALAnYFdaSxoxF Diff:
OldNewDifferences
1818 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
1919
2020
21+func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_spiceAssetId"))
22+
23+
2124 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
2225
2326
2427 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
28+
29+
30+func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_couponsAddress")))
31+
32+
33+func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_burnAddress")))
2534
2635
2736 let backendPubKey = base58'BmKAXRQy7jZm44fa1YxNQDTcAwNSb74EpQwP5CT7UHdV'
151160 func getBackendProof (maxFeedAmount,userNonce,address) = makeString([toString(maxFeedAmount), toString(userNonce), address], ";")
152161
153162
163+func asInt (value) = match value {
164+ case int: Int =>
165+ int
166+ case _ =>
167+ throw("BAI: wrong type, expected: Int")
168+}
169+
170+
154171 @Callable(i)
155172 func configureOracle (oracle) = if ((i.caller != this))
156- then throw("admin only")
173+ then throw("BCO: admin only")
157174 else [StringEntry("static_oracleAddress", oracle)]
175+
176+
177+
178+@Callable(i)
179+func buyDuckling () = {
180+ let exactPrice = 100000000
181+ let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [exactPrice], nil))
182+ if ((amountPaidByCoupons == amountPaidByCoupons))
183+ then {
184+ let leftToPay = (exactPrice - amountPaidByCoupons)
185+ let payment = if ((leftToPay != 0))
186+ then {
187+ let firstPayment = value(i.payments[0])
188+ if ((firstPayment.assetId != getEggAssetId()))
189+ then throw(("BBD: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
190+ else if ((firstPayment.amount != leftToPay))
191+ then throw(("BBD: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay)))
192+ else {
193+ let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), leftToPay)])
194+ if ((burnCall == burnCall))
195+ then leftToPay
196+ else throw("Strict value is not equal to itself.")
197+ }
198+ }
199+ else 0
200+ if ((payment == payment))
201+ then {
202+ let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId), 0], nil)
203+ if ((ducklingAssetId == ducklingAssetId))
204+ then nil
205+ else throw("Strict value is not equal to itself.")
206+ }
207+ else throw("Strict value is not equal to itself.")
208+ }
209+ else throw("Strict value is not equal to itself.")
210+ }
158211
159212
160213
162215 func issueFreeDuckling (address,txIdStr,percentage) = if (if ((i.caller != this))
163216 then (i.caller != getRebirthAddress())
164217 else false)
165- then throw("You can't issue free duckling")
218+ then throw("BIFD: You can't issue free duckling")
166219 else {
167220 let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height)
168221 let assetId = calculateAssetId(asset)
178231 let kAddressNonce = keyAddressNonce(addressString)
179232 let currentNonce = tryGetInteger(kAddressNonce)
180233 let realDucklingId = if (!(sigVerify_8Kb(toBytes(backendProof), fromBase58String(backendSignature), backendPubKey)))
181- then throw("Invalid proof from backend")
234+ then throw("BFD: Invalid proof from backend")
182235 else if (if ((size(i.payments) != 1))
183236 then true
184- else (value(i.payments[0]).assetId != getEggAssetId()))
185- then throw("Bad payment attached (asset[s] or amount)")
237+ else (value(i.payments[0]).assetId != getSpiceAssetId()))
238+ then throw("BFD: Bad payment attached (asset[s] or amount)")
186239 else if (getBool(keyDucklingGrown(ducklingId)))
187- then throw("Duckling is already grown")
240+ then throw("BFD: Duckling is already grown")
188241 else if ((userNonce != (currentNonce + 1)))
189- then throw(((("User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce)))
242+ then throw(((("BFD: User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce)))
190243 else if ((ducklingId == ""))
191- then {
192- let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId), 0], nil)
193- if ((ducklingAssetId == ducklingAssetId))
194- then {
195- let id = match ducklingAssetId {
196- case v: String =>
197- v
198- case _ =>
199- throw("Can't generate NFT")
200- }
201- id
202- }
203- else throw("Strict value is not equal to itself.")
204- }
244+ then throw("BFD: Please buy a duckling first!")
205245 else {
206246 let ducklingIdCheck = value(assetInfo(fromBase58String(ducklingId)))
207247 if ((assetBalance(i.caller, ducklingIdCheck.id) != 1))
208- then throw("You're not the owner of the duckling")
248+ then throw("BFD: You're not the owner of the duckling")
209249 else if ((ducklingIdCheck.issuer != this))
210- then throw("Cant find duckling with such id")
250+ then throw("BFD: Cant find duckling with such id")
211251 else {
212252 let ducklingIdString = toBase58String(ducklingIdCheck.id)
213253 ducklingIdString
224264 let kDucklingFedLapTimestamp = keyDucklingFedLapTimestamp(realDucklingId, getCurrentLap())
225265 let kDucklingFedLap = keyDucklingFedLap(realDucklingId)
226266 if ((currentPayment > maxFeedAmount))
227- then throw(("Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount)))
267+ then throw(("BFD: Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount)))
228268 else {
229- let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
269+ let calculateResults = calculateNewDucklingLevel(realDucklingId, (currentPayment / 100))
230270 [IntegerEntry(kAddressNonce, (currentNonce + 1)), IntegerEntry(kDucklingLastFedTs, lastBlock.timestamp), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), IntegerEntry(kAddressFedTimestamp, currentPayment), IntegerEntry(kDucklingFedLapTimestamp, currentPayment), IntegerEntry(kDucklingFedLap, getCurrentLap()), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))]
231271 }
232272 }
277317 let address = toString(i.caller)
278318 let txId = toBase58String(i.transactionId)
279319 let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
280- let fiveMinInMs = ((5 * 60) * 1000)
281- let timeDiff = (lastBlock.timestamp - (lastIssuedDucklingTs + fiveMinInMs))
320+ let fiveMinInMs = ((60 * 60) * 1000)
282321 if (if ((lastIssuedDucklingTs > 0))
283- then (0 > timeDiff)
322+ then (fiveMinInMs > (lastBlock.timestamp - lastIssuedDucklingTs))
284323 else false)
285- then throw((("Can issue ducklings only once per 5 minutes, please wait for " + toString(fraction(timeDiff, 1, 1000))) + " sec."))
324+ then throw(("BTD: Can issue ducklings only once per 5 minutes, please wait for " + toString((fiveMinInMs - (lastBlock.timestamp - lastIssuedDucklingTs)))))
286325 else if ((size(i.payments) != 1))
287- then throw("Bad payment attached (asset[s] or amount)")
326+ then throw("BTD: Bad payment attached (asset[s] or amount)")
288327 else {
289328 let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
290329 if ((toBigInt(100) > getCurrentLevelBigInt(toBase58String(pmt.id))))
291- then throw("Duckling is not grown yet...")
330+ then throw("BTD: Duckling is not grown yet...")
292331 else if ((pmt.issuer != this))
293- then throw("Can use only ducklings from this dApp")
332+ then throw("BTD: Can use only ducklings from this dApp")
294333 else {
295334 let call = invoke(getIncubatorAddress(), "startDuckHatching", [""], nil)
296335 if ((call == call))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetStringExternal (address,key) = match getString(address, key) {
55 case a: String =>
66 a
77 case _ =>
88 ""
99 }
1010
1111
1212 func tryGetString (key) = tryGetStringExternal(this, key)
1313
1414
1515 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
1616
1717
1818 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
1919
2020
21+func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_spiceAssetId"))
22+
23+
2124 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
2225
2326
2427 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
28+
29+
30+func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_couponsAddress")))
31+
32+
33+func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_burnAddress")))
2534
2635
2736 let backendPubKey = base58'BmKAXRQy7jZm44fa1YxNQDTcAwNSb74EpQwP5CT7UHdV'
2837
2938 let STARTTIMESTAMP = 1632474000000
3039
3140 let LAPLENGTH = 21600000
3241
3342 let DUCKLINGPRICE = 80000000
3443
3544 let percentGrowthPrecision = 10000000000000000
3645
3746 let existingDuckPrecision = 100000000000000
3847
3948 let KGlobalIssuedTimestamp = "global_issued_timestamp"
4049
4150 let MSINDAY = 86400000
4251
4352 func keyTotalFeed (ducklingId) = (("duckling_" + ducklingId) + "_feed")
4453
4554
4655 func keyDucklingFedLap (ducklingId) = (("duckling_" + ducklingId) + "_fedLap")
4756
4857
4958 func keyDucklingFedTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedTs")
5059
5160
5261 func keyDucklingFedLapTimestamp (ducklingId,lap) = (((("duckling_" + ducklingId) + "_lap_") + toString(lap)) + "_fedTs")
5362
5463
5564 func keyAddressFedTimestamp (address,lap,timestamp) = ((((("address_" + address) + "_lap_") + toString(lap)) + "_fedTs_") + toString(timestamp))
5665
5766
5867 func keyAddressNonce (address) = (("address_" + address) + "_nonce")
5968
6069
6170 func keyDucklingFedLastTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedLastTs")
6271
6372
6473 func keyDucklingLevel (ducklingId) = (("duckling_" + ducklingId) + "_level")
6574
6675
6776 func keyFeedForLap (address,lap) = (((("address_" + address) + "_lap_") + toString(lap)) + "_feed")
6877
6978
7079 func keyDucklingGrown (ducklingId) = (("duckling_" + ducklingId) + "_grown")
7180
7281
7382 func keyStartHatchingId (ducklingId) = (("duckling_" + ducklingId) + "_grown")
7483
7584
7685 func keyStartPercentage (ducklingId) = (("duckling_" + ducklingId) + "_startPercentage")
7786
7887
7988 func tryGetInteger (key) = {
8089 let val = match getInteger(this, key) {
8190 case b: Int =>
8291 b
8392 case _ =>
8493 0
8594 }
8695 val
8796 }
8897
8998
9099 func getBool (key) = match getBoolean(this, key) {
91100 case b: Boolean =>
92101 b
93102 case _ =>
94103 false
95104 }
96105
97106
98107 func getDucklingPercentage (ducklingId) = {
99108 let percentageDuckling = tryGetInteger(keyStartPercentage(ducklingId))
100109 let base = if ((percentageDuckling != 0))
101110 then percentageDuckling
102111 else 20
103112 toBigInt((base * existingDuckPrecision))
104113 }
105114
106115
107116 func getCurrentLevelBigInt (ducklingId) = {
108117 let kDuckLevel = keyDucklingLevel(ducklingId)
109118 match getString(kDuckLevel) {
110119 case s: String =>
111120 parseBigIntValue(s)
112121 case _ =>
113122 match getBoolean((("duckling_" + ducklingId) + "_issuedByFeedCall")) {
114123 case b: Boolean =>
115124 if ((b == true))
116125 then toBigInt(0)
117126 else getDucklingPercentage(ducklingId)
118127 case _ =>
119128 getDucklingPercentage(ducklingId)
120129 }
121130 }
122131 }
123132
124133
125134 func getCurrentLap () = (((lastBlock.timestamp - STARTTIMESTAMP) / LAPLENGTH) + 1)
126135
127136
128137 func getLastFedTimestamp (ducklingId) = {
129138 let lastFedTimestamp = tryGetInteger(keyDucklingFedLastTimestamp(ducklingId))
130139 if ((lastFedTimestamp > 0))
131140 then lastFedTimestamp
132141 else lastBlock.timestamp
133142 }
134143
135144
136145 func calculateNewDucklingLevel (ducklingId,paymentAmount) = {
137146 let currentTs = lastBlock.timestamp
138147 let lastFedTimestampChecked = getLastFedTimestamp(ducklingId)
139148 let fedDiff = (currentTs - lastFedTimestampChecked)
140149 let penalty = toBigInt(0)
141150 let growth = fraction(toBigInt(paymentAmount), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
142151 let currentLevel = getCurrentLevelBigInt(ducklingId)
143152 let newLevel = ((currentLevel - penalty) + growth)
144153 let result = if ((toBigInt(0) > newLevel))
145154 then toString(growth)
146155 else toString(newLevel)
147156 $Tuple2(result, [("currentLevel=" + toString(currentLevel)), ("newLevel=" + toString(newLevel)), ("growth=" + toString(growth)), ("penalty=" + toString(penalty)), ("lastFedTs=" + toString(lastFedTimestampChecked)), ("fedDiff=" + toString(fedDiff))])
148157 }
149158
150159
151160 func getBackendProof (maxFeedAmount,userNonce,address) = makeString([toString(maxFeedAmount), toString(userNonce), address], ";")
152161
153162
163+func asInt (value) = match value {
164+ case int: Int =>
165+ int
166+ case _ =>
167+ throw("BAI: wrong type, expected: Int")
168+}
169+
170+
154171 @Callable(i)
155172 func configureOracle (oracle) = if ((i.caller != this))
156- then throw("admin only")
173+ then throw("BCO: admin only")
157174 else [StringEntry("static_oracleAddress", oracle)]
175+
176+
177+
178+@Callable(i)
179+func buyDuckling () = {
180+ let exactPrice = 100000000
181+ let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [exactPrice], nil))
182+ if ((amountPaidByCoupons == amountPaidByCoupons))
183+ then {
184+ let leftToPay = (exactPrice - amountPaidByCoupons)
185+ let payment = if ((leftToPay != 0))
186+ then {
187+ let firstPayment = value(i.payments[0])
188+ if ((firstPayment.assetId != getEggAssetId()))
189+ then throw(("BBD: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
190+ else if ((firstPayment.amount != leftToPay))
191+ then throw(("BBD: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay)))
192+ else {
193+ let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), leftToPay)])
194+ if ((burnCall == burnCall))
195+ then leftToPay
196+ else throw("Strict value is not equal to itself.")
197+ }
198+ }
199+ else 0
200+ if ((payment == payment))
201+ then {
202+ let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId), 0], nil)
203+ if ((ducklingAssetId == ducklingAssetId))
204+ then nil
205+ else throw("Strict value is not equal to itself.")
206+ }
207+ else throw("Strict value is not equal to itself.")
208+ }
209+ else throw("Strict value is not equal to itself.")
210+ }
158211
159212
160213
161214 @Callable(i)
162215 func issueFreeDuckling (address,txIdStr,percentage) = if (if ((i.caller != this))
163216 then (i.caller != getRebirthAddress())
164217 else false)
165- then throw("You can't issue free duckling")
218+ then throw("BIFD: You can't issue free duckling")
166219 else {
167220 let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height)
168221 let assetId = calculateAssetId(asset)
169222 $Tuple2([StringEntry((((address + "_") + txIdStr) + "_di"), toBase58String(assetId)), IntegerEntry("stats_amount", (tryGetInteger("stats_amount") + 1)), BooleanEntry((("duckling_" + toBase58String(assetId)) + "_issuedByFeedCall"), (i.caller == this)), IntegerEntry(keyStartPercentage(toBase58String(assetId)), percentage), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
170223 }
171224
172225
173226
174227 @Callable(i)
175228 func feedDuckling (ducklingId,backendSignature,maxFeedAmount,userNonce) = {
176229 let addressString = toString(i.caller)
177230 let backendProof = getBackendProof(maxFeedAmount, userNonce, addressString)
178231 let kAddressNonce = keyAddressNonce(addressString)
179232 let currentNonce = tryGetInteger(kAddressNonce)
180233 let realDucklingId = if (!(sigVerify_8Kb(toBytes(backendProof), fromBase58String(backendSignature), backendPubKey)))
181- then throw("Invalid proof from backend")
234+ then throw("BFD: Invalid proof from backend")
182235 else if (if ((size(i.payments) != 1))
183236 then true
184- else (value(i.payments[0]).assetId != getEggAssetId()))
185- then throw("Bad payment attached (asset[s] or amount)")
237+ else (value(i.payments[0]).assetId != getSpiceAssetId()))
238+ then throw("BFD: Bad payment attached (asset[s] or amount)")
186239 else if (getBool(keyDucklingGrown(ducklingId)))
187- then throw("Duckling is already grown")
240+ then throw("BFD: Duckling is already grown")
188241 else if ((userNonce != (currentNonce + 1)))
189- then throw(((("User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce)))
242+ then throw(((("BFD: User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce)))
190243 else if ((ducklingId == ""))
191- then {
192- let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId), 0], nil)
193- if ((ducklingAssetId == ducklingAssetId))
194- then {
195- let id = match ducklingAssetId {
196- case v: String =>
197- v
198- case _ =>
199- throw("Can't generate NFT")
200- }
201- id
202- }
203- else throw("Strict value is not equal to itself.")
204- }
244+ then throw("BFD: Please buy a duckling first!")
205245 else {
206246 let ducklingIdCheck = value(assetInfo(fromBase58String(ducklingId)))
207247 if ((assetBalance(i.caller, ducklingIdCheck.id) != 1))
208- then throw("You're not the owner of the duckling")
248+ then throw("BFD: You're not the owner of the duckling")
209249 else if ((ducklingIdCheck.issuer != this))
210- then throw("Cant find duckling with such id")
250+ then throw("BFD: Cant find duckling with such id")
211251 else {
212252 let ducklingIdString = toBase58String(ducklingIdCheck.id)
213253 ducklingIdString
214254 }
215255 }
216256 let kDucklingLastFedTs = keyDucklingFedLastTimestamp(ducklingId)
217257 let lastFedTs = getLastFedTimestamp(realDucklingId)
218258 let currentPayment = value(i.payments[0]).amount
219259 let kNewLevel = keyDucklingLevel(realDucklingId)
220260 let kTotalFeed = keyTotalFeed(realDucklingId)
221261 let totalFeed = tryGetInteger(kTotalFeed)
222262 let kFeedTxStats = ((("duckling_" + realDucklingId) + "_stat_") + toString(lastBlock.timestamp))
223263 let kAddressFedTimestamp = keyAddressFedTimestamp(addressString, getCurrentLap(), lastBlock.timestamp)
224264 let kDucklingFedLapTimestamp = keyDucklingFedLapTimestamp(realDucklingId, getCurrentLap())
225265 let kDucklingFedLap = keyDucklingFedLap(realDucklingId)
226266 if ((currentPayment > maxFeedAmount))
227- then throw(("Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount)))
267+ then throw(("BFD: Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount)))
228268 else {
229- let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
269+ let calculateResults = calculateNewDucklingLevel(realDucklingId, (currentPayment / 100))
230270 [IntegerEntry(kAddressNonce, (currentNonce + 1)), IntegerEntry(kDucklingLastFedTs, lastBlock.timestamp), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), IntegerEntry(kAddressFedTimestamp, currentPayment), IntegerEntry(kDucklingFedLapTimestamp, currentPayment), IntegerEntry(kDucklingFedLap, getCurrentLap()), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))]
231271 }
232272 }
233273
234274
235275
236276 @Callable(i)
237277 func fixLevels (ducklingIds) = if (if ((i.callerPublicKey != base58'GDxBbsDRmeY39quNrDsTXKJzFWbQVtjxHseF4ikxZ7n9'))
238278 then (i.caller != this)
239279 else false)
240280 then throw("BFL: Not authorized")
241281 else {
242282 let ducklingIdsList = value(split(ducklingIds, ","))
243283 func handleId (acc,id) = {
244284 let kTotalFeed = keyTotalFeed(id)
245285 let totalFeed = tryGetInteger(kTotalFeed)
246286 let kNewLevel = keyDucklingLevel(id)
247287 let startingLevel = match getBoolean((("duckling_" + id) + "_issuedByFeedCall")) {
248288 case b: Boolean =>
249289 if ((b == true))
250290 then toBigInt(0)
251291 else getDucklingPercentage(id)
252292 case _ =>
253293 getDucklingPercentage(id)
254294 }
255295 let growth = fraction(toBigInt(totalFeed), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
256296 (acc ++ [StringEntry(kNewLevel, toString((startingLevel + growth)))])
257297 }
258298
259299 let $l = ducklingIdsList
260300 let $s = size($l)
261301 let $acc0 = nil
262302 func $f0_1 ($a,$i) = if (($i >= $s))
263303 then $a
264304 else handleId($a, $l[$i])
265305
266306 func $f0_2 ($a,$i) = if (($i >= $s))
267307 then $a
268308 else throw("List size exceeds 20")
269309
270310 $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($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), 16), 17), 18), 19), 20)
271311 }
272312
273313
274314
275315 @Callable(i)
276316 func turnDucklingIntoDuck () = {
277317 let address = toString(i.caller)
278318 let txId = toBase58String(i.transactionId)
279319 let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
280- let fiveMinInMs = ((5 * 60) * 1000)
281- let timeDiff = (lastBlock.timestamp - (lastIssuedDucklingTs + fiveMinInMs))
320+ let fiveMinInMs = ((60 * 60) * 1000)
282321 if (if ((lastIssuedDucklingTs > 0))
283- then (0 > timeDiff)
322+ then (fiveMinInMs > (lastBlock.timestamp - lastIssuedDucklingTs))
284323 else false)
285- then throw((("Can issue ducklings only once per 5 minutes, please wait for " + toString(fraction(timeDiff, 1, 1000))) + " sec."))
324+ then throw(("BTD: Can issue ducklings only once per 5 minutes, please wait for " + toString((fiveMinInMs - (lastBlock.timestamp - lastIssuedDucklingTs)))))
286325 else if ((size(i.payments) != 1))
287- then throw("Bad payment attached (asset[s] or amount)")
326+ then throw("BTD: Bad payment attached (asset[s] or amount)")
288327 else {
289328 let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
290329 if ((toBigInt(100) > getCurrentLevelBigInt(toBase58String(pmt.id))))
291- then throw("Duckling is not grown yet...")
330+ then throw("BTD: Duckling is not grown yet...")
292331 else if ((pmt.issuer != this))
293- then throw("Can use only ducklings from this dApp")
332+ then throw("BTD: Can use only ducklings from this dApp")
294333 else {
295334 let call = invoke(getIncubatorAddress(), "startDuckHatching", [""], nil)
296335 if ((call == call))
297336 then {
298337 let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
299338 [BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)]
300339 }
301340 else throw("Strict value is not equal to itself.")
302341 }
303342 }
304343 }
305344
306345
307346 @Verifier(tx)
308347 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
309348

github/deemru/w8io/3ef1775 
72.69 ms