tx · 2Jj5hdk7hUoZMw9uUH1oDwKHZkUm6oHi36GLvco1WF1p

3PKL9tfUmNciXvbSA3zpXr6PnDNnhn936ba:  -0.02200000 Waves

2023.11.28 19:23 [3929347] smart account 3PKL9tfUmNciXvbSA3zpXr6PnDNnhn936ba > SELF 0.00000000 Waves

{ "type": 13, "id": "2Jj5hdk7hUoZMw9uUH1oDwKHZkUm6oHi36GLvco1WF1p", "fee": 2200000, "feeAssetId": null, "timestamp": 1701188597351, "version": 2, "chainId": 87, "sender": "3PKL9tfUmNciXvbSA3zpXr6PnDNnhn936ba", "senderPublicKey": "8yG34okaNeKtYZriaoqUQTinJjpk3pYKFTeGptmiWvTV", "proofs": [ "48ouXmiA2XdpwgntgVSGUCQ5G4wMYYkyVcARii1UHGnJrUaGqTT7bRb5yhAg3fN9qqpS5B7xjXiemf7bKn96cDNA" ], "script": "base64:AAIFAAAAAAAAABYIAhIDCgEIEgMKAQgSAwoBCBIDCgEIAAAAMAEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAAEXRyeUdldEludEV4dGVybmFsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAABtSVEdJRTogU29tZXRoaW5nIHdlbnQgd3JvbmcBAAAACWFzQm9vbGVhbgAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdCb29sZWFuBAAAAAdib29sZWFuBQAAAAckbWF0Y2gwBQAAAAdib29sZWFuCQAAAgAAAAECAAAAIkZBQjogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEJvb2xlYW4BAAAADHRyeUdldFN0cmluZwAAAAEAAAADa2V5CQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACBQAAAAR0aGlzBQAAAANrZXkAAAAAEGRlbGF5Rm9ySGF0Y2hpbmcAAAAAAAAAAAIBAAAAF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAAAAAIAAAAUc3RhdGljX29yYWNsZUFkZHJlc3MBAAAAFHN0YXRpY0tleV9lZ2dBc3NldElkAAAAAAIAAAARc3RhdGljX2VnZ0Fzc2V0SWQBAAAAGnN0YXRpY0tleV9pbmN1YmF0b3JBZGRyZXNzAAAAAAIAAAAXc3RhdGljX2luY3ViYXRvckFkZHJlc3MBAAAAGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwAAAAACAAAAFXN0YXRpY19icmVlZGVyQWRkcmVzcwEAAAAYc3RhdGljS2V5X2Zhcm1pbmdBZGRyZXNzAAAAAAIAAAAVc3RhdGljX2Zhcm1pbmdBZGRyZXNzAQAAABlzdGF0aWNLZXlfYmFieUR1Y2tBZGRyZXNzAAAAAAIAAAAWc3RhdGljX2JhYnlEdWNrQWRkcmVzcwEAAAAZc3RhdGljS2V5X2dhbWVEYXBwQWRkcmVzcwAAAAACAAAAFnN0YXRpY19nYW1lRGFwcEFkZHJlc3MBAAAAFnN0YXRpY0tleV9pdGVtc0FkZHJlc3MAAAAAAgAAABNzdGF0aWNfaXRlbXNBZGRyZXNzAQAAABhzdGF0aWNLZXlfY291cG9uc0FkZHJlc3MAAAAAAgAAABVzdGF0aWNfY291cG9uc0FkZHJlc3MBAAAAFXN0YXRpY0tleV9odW50QWRkcmVzcwAAAAACAAAAEnN0YXRpY19odW50QWRkcmVzcwEAAAAVc3RhdGljS2V5X2J1cm5BZGRyZXNzAAAAAAIAAAASc3RhdGljX2J1cm5BZGRyZXNzAQAAABxzdGF0aWNLZXlfcmVmQ29udHJhY3RBZGRyZXNzAAAAAAIAAAAZc3RhdGljX3JlZkNvbnRyYWN0QWRkcmVzcwEAAAASc3RhdGljS2V5X2V4dHJhRmVlAAAAAAIAAAAPc3RhdGljX2V4dHJhRmVlAQAAABdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgAAAAACAAAAFHN0YXRpY19mZWVBZ2dyZWdhdG9yAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAABdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwAAAAABAAAADWdldEVnZ0Fzc2V0SWQAAAAACQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAAAAAQAAABNnZXRJbmN1YmF0b3JBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAac3RhdGljS2V5X2luY3ViYXRvckFkZHJlc3MAAAAAAQAAABFnZXRCcmVlZGVyQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwAAAAABAAAAEWdldEZhcm1pbmdBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAYc3RhdGljS2V5X2Zhcm1pbmdBZGRyZXNzAAAAAAEAAAASZ2V0QmFieUR1Y2tBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAZc3RhdGljS2V5X2JhYnlEdWNrQWRkcmVzcwAAAAABAAAAEmdldEdhbWVEYXBwQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAGXN0YXRpY0tleV9nYW1lRGFwcEFkZHJlc3MAAAAAAQAAAA9nZXRJdGVtc0FkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAAAAAEAAAARZ2V0Q291cG9uc0FkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABhzdGF0aWNLZXlfY291cG9uc0FkZHJlc3MAAAAAAQAAAA5nZXRIdW50QWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAFXN0YXRpY0tleV9odW50QWRkcmVzcwAAAAABAAAADmdldEJ1cm5BZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAVc3RhdGljS2V5X2J1cm5BZGRyZXNzAAAAAAEAAAAVZ2V0UmVmQ29udHJhY3RBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAcc3RhdGljS2V5X3JlZkNvbnRyYWN0QWRkcmVzcwAAAAABAAAAEGdldEZlZUFnZ3JlZ2F0b3IAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgAAAAABAAAAFmNoZWNrQWRkaXRpb25hbFBheW1lbnQAAAABAAAAB3BheW1lbnQDCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAkAAAIAAAABAgAAABlSQ0FQOiBQbGVhc2UgYXR0YWNoIHdhdmVzBAAAAAlmZWVBbW91bnQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAASc3RhdGljS2V5X2V4dHJhRmVlAAAAAAMJAQAAAAIhPQAAAAIIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAAJZmVlQW1vdW50CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABxSQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQABpAAAAAEFAAAACWZlZUFtb3VudAIAAAATIGFtb3VudCBvZiB3YXZlbGV0cwkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAQZ2V0RmVlQWdncmVnYXRvcgAAAAAFAAAACWZlZUFtb3VudAUAAAAEdW5pdAUAAAADbmlsAAAAABJQSE9FTklYQkFTRU9QVElPTlMAAAAAAAAAA+gB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", "height": 3929347, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4hqD5zzDgQKf1nuN5yUPo6GbjKbN9cd9hhyc5w7bZKVc Next: FPgu5tmwsP2fv5f9XjiMa9sE4jNrvTuzhY6TKAstQJWD Diff:
OldNewDifferences
198198 then "duckling_20"
199199 else if ((260 > n))
200200 then "duckling_40"
201- else if ((600 > n))
201+ else if ((300 > n))
202202 then "incubator"
203203 else if ((320 > n))
204204 then "item!ART-SNAKE"
205205 else if ((330 > n))
206206 then "item!ART-FREEGENE"
207- else if ((900 > n))
208- then "phoenix"
207+ else if ((460 > n))
208+ then "item!ART-KATANA"
209209 else if ((510 > n))
210210 then "item!ART-ROBODUCK"
211211 else if ((540 > n))
259259 func isTestEnv () = getBool("TESTENV")
260260
261261
262+func finishRebirthInternal (initTx,address,payment,double,backupTxId) = {
263+ let finishBlock = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
264+ let assetRarity = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_assetRarity"))
265+ let status = tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status"))
266+ let validPayment = checkAdditionalPayment(payment)
267+ if ((validPayment == validPayment))
268+ then {
269+ let recordAction = invoke(getCouponsAddress(), "recordAction", ["REBIRTH"], nil)
270+ if ((recordAction == recordAction))
271+ then {
272+ func getAccessItemAssetId (address) = fromBase58String(tryGetStringExternal(address, "static_accessItemAssetId"))
273+
274+ func getAccessItemPrice (address) = tryGetIntExternal(address, "static_accessItemPrice")
275+
276+ if ((status != "open"))
277+ then throw("rebirth is finished or not open")
278+ else if ((finishBlock > height))
279+ then throw("you cannot finish rebirth, yet")
280+ else {
281+ let win = getRandomWin(fromBase58String(initTx), finishBlock, assetRarity)
282+ let txId = initTx
283+ let result = if ((indexOf(win, "perch") != unit))
284+ then {
285+ let color = takeRight(win, 1)
286+ let call = if (!(double))
287+ then invoke(getFarmingAddress(), "addFreePerch", [address, color], nil)
288+ else {
289+ let first = invoke(getFarmingAddress(), "addFreePerch", [address, color], nil)
290+ if ((first == first))
291+ then invoke(getFarmingAddress(), "addFreePerch", [address, color], nil)
292+ else throw("Strict value is not equal to itself.")
293+ }
294+ if ((call == call))
295+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
296+ else throw("Strict value is not equal to itself.")
297+ }
298+ else if ((win == "incubator"))
299+ then {
300+ let call = if (!(double))
301+ then invoke(getIncubatorAddress(), "issueFreeDuck", [address, txId], nil)
302+ else {
303+ let first = invoke(getIncubatorAddress(), "issueFreeDuck", [address, txId], nil)
304+ if ((first == first))
305+ then invoke(getIncubatorAddress(), "issueFreeDuck", [address, backupTxId], nil)
306+ else throw("Strict value is not equal to itself.")
307+ }
308+ if ((call == call))
309+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
310+ else throw("Strict value is not equal to itself.")
311+ }
312+ else if ((win == "ar"))
313+ then {
314+ let assetId = getAccessItemAssetId(getHuntAddress())
315+ let price = getAccessItemPrice(getHuntAddress())
316+ let call = invoke(getHuntAddress(), "buyAccessItemOther", [address], [AttachedPayment(assetId, price)])
317+ if ((call == call))
318+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
319+ else throw("Strict value is not equal to itself.")
320+ }
321+ else if ((win == "phoenix"))
322+ then {
323+ let call = invoke(getIncubatorAddress(), "issueJackpot", [address, txId, valueOrElse(getString("JACKPOT_NAME"), "WWWWWWWP")], nil)
324+ if ((call == call))
325+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
326+ else throw("Strict value is not equal to itself.")
327+ }
328+ else if ((indexOf(win, "duckling") != unit))
329+ then {
330+ let level = parseIntValue(split(win, "_")[1])
331+ let levelFinal = if (double)
332+ then (2 * level)
333+ else level
334+ let call = invoke(getBabyDuckAddress(), "issueFreeDuckling", [address, txId, levelFinal], nil)
335+ if ((call == call))
336+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
337+ else throw("Strict value is not equal to itself.")
338+ }
339+ else if ((indexOf(win, "item") != unit))
340+ then {
341+ let itemName = split(win, "!")[1]
342+ let call = if (!(double))
343+ then invoke(getItemsAddress(), "issueArtefact", [itemName, address], nil)
344+ else {
345+ let first = invoke(getItemsAddress(), "issueArtefact", [itemName, address], nil)
346+ if ((first == first))
347+ then invoke(getItemsAddress(), "issueArtefact", [itemName, address], nil)
348+ else throw("Strict value is not equal to itself.")
349+ }
350+ if ((call == call))
351+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
352+ else throw("Strict value is not equal to itself.")
353+ }
354+ else throw("RFB: Some error occured, please contact the admins!")
355+ ((result ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win"), win), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish")]) ++ validPayment)
356+ }
357+ }
358+ else throw("Strict value is not equal to itself.")
359+ }
360+ else throw("Strict value is not equal to itself.")
361+ }
362+
363+
262364 @Callable(i)
263365 func configureOracle (oracle) = if ((i.caller != this))
264366 then throw("RCU: admin only")
308410 else 0
309411 if ((payment == payment))
310412 then {
311- let $t085628611 = getAssetFarmingPower(assetId)
312- let gen = $t085628611._1
313- let rarity = $t085628611._2
413+ let $t01247112520 = getAssetFarmingPower(assetId)
414+ let gen = $t01247112520._1
415+ let rarity = $t01247112520._2
314416 let call = invoke(getOrigin(assetId), "reduceRarity", [toBase58String(assetId), gen], nil)
315417 if ((call == call))
316418 then ([IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"), (height + delayForHatching)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "open"), IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetRarity"), rarity), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetId"), toBase58String(assetId))] ++ validPayment)
327429
328430
329431 @Callable(i)
330-func finishRebirth (initTx) = {
331- let address = toString(i.caller)
332- let finishBlock = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
333- let assetRarity = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_assetRarity"))
334- let status = tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status"))
335- let validPayment = checkAdditionalPayment(i.payments[0])
336- if ((validPayment == validPayment))
337- then {
338- let recordAction = invoke(getCouponsAddress(), "recordAction", ["REBIRTH"], nil)
339- if ((recordAction == recordAction))
340- then {
341- func getAccessItemAssetId (address) = fromBase58String(tryGetStringExternal(address, "static_accessItemAssetId"))
432+func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, toBase58String(i.transactionId))
342433
343- func getAccessItemPrice (address) = tryGetIntExternal(address, "static_accessItemPrice")
344434
345- if ((status != "open"))
346- then throw("rebirth is finished or not open")
347- else if ((finishBlock > height))
348- then throw("you cannot finish rebirth, yet")
349- else {
350- let win = getRandomWin(fromBase58String(initTx), finishBlock, assetRarity)
351- let txId = initTx
352- let result = if ((indexOf(win, "perch") != unit))
353- then {
354- let color = takeRight(win, 1)
355- let call = invoke(getFarmingAddress(), "addFreePerch", [address, color], nil)
356- if ((call == call))
357- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
358- else throw("Strict value is not equal to itself.")
359- }
360- else if ((win == "incubator"))
361- then {
362- let call = invoke(getIncubatorAddress(), "issueFreeDuck", [address, txId], nil)
363- if ((call == call))
364- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
365- else throw("Strict value is not equal to itself.")
366- }
367- else if ((win == "ar"))
368- then {
369- let assetId = getAccessItemAssetId(getHuntAddress())
370- let price = getAccessItemPrice(getHuntAddress())
371- let call = invoke(getHuntAddress(), "buyAccessItemOther", [address], [AttachedPayment(assetId, price)])
372- if ((call == call))
373- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
374- else throw("Strict value is not equal to itself.")
375- }
376- else if ((win == "phoenix"))
377- then {
378- let call = invoke(getIncubatorAddress(), "issueJackpot", [address, txId, valueOrElse(getString("JACKPOT_NAME"), "WWWWWWWP")], nil)
379- if ((call == call))
380- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
381- else throw("Strict value is not equal to itself.")
382- }
383- else if ((indexOf(win, "duckling") != unit))
384- then {
385- let level = parseIntValue(split(win, "_")[1])
386- let call = invoke(getBabyDuckAddress(), "issueFreeDuckling", [address, txId, level], nil)
387- if ((call == call))
388- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
389- else throw("Strict value is not equal to itself.")
390- }
391- else if ((indexOf(win, "item") != unit))
392- then {
393- let itemName = split(win, "!")[1]
394- let call = invoke(getItemsAddress(), "issueArtefact", [itemName, address], nil)
395- if ((call == call))
396- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
397- else throw("Strict value is not equal to itself.")
398- }
399- else throw("RFB: Some error occured, please contact the admins!")
400- ((result ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win"), win), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish")]) ++ validPayment)
401- }
402- }
403- else throw("Strict value is not equal to itself.")
404- }
405- else throw("Strict value is not equal to itself.")
406- }
435+
436+@Callable(i)
437+func finishRebirthDouble (initTx) = if (!(if ((size(i.payments) == 2))
438+ then (i.payments[0].amount == 1)
439+ else false))
440+ then throw("Invalid payment")
441+ else {
442+ let assetId = value(i.payments[0].assetId)
443+ let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
444+ if ((boosterType == boosterType))
445+ then if ((boosterType == "ART-GIFT_DOUBL"))
446+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, toBase58String(i.transactionId)))
447+ else throw("Error! Wrong item attached to double rewards!")
448+ else throw("Strict value is not equal to itself.")
449+ }
407450
408451
409452 @Verifier(tx)
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 tryGetIntExternal (address,key) = match getInteger(address, key) {
1313 case a: Int =>
1414 a
1515 case _ =>
1616 throw("RTGIE: Something went wrong")
1717 }
1818
1919
2020 func asBoolean (value) = match value {
2121 case boolean: Boolean =>
2222 boolean
2323 case _ =>
2424 throw("FAB: wrong type, expected: Boolean")
2525 }
2626
2727
2828 func tryGetString (key) = tryGetStringExternal(this, key)
2929
3030
3131 let delayForHatching = 2
3232
3333 func staticKey_oracleAddress () = "static_oracleAddress"
3434
3535
3636 func staticKey_eggAssetId () = "static_eggAssetId"
3737
3838
3939 func staticKey_incubatorAddress () = "static_incubatorAddress"
4040
4141
4242 func staticKey_breederAddress () = "static_breederAddress"
4343
4444
4545 func staticKey_farmingAddress () = "static_farmingAddress"
4646
4747
4848 func staticKey_babyDuckAddress () = "static_babyDuckAddress"
4949
5050
5151 func staticKey_gameDappAddress () = "static_gameDappAddress"
5252
5353
5454 func staticKey_itemsAddress () = "static_itemsAddress"
5555
5656
5757 func staticKey_couponsAddress () = "static_couponsAddress"
5858
5959
6060 func staticKey_huntAddress () = "static_huntAddress"
6161
6262
6363 func staticKey_burnAddress () = "static_burnAddress"
6464
6565
6666 func staticKey_refContractAddress () = "static_refContractAddress"
6767
6868
6969 func staticKey_extraFee () = "static_extraFee"
7070
7171
7272 func staticKey_feeAggregator () = "static_feeAggregator"
7373
7474
7575 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
7676
7777
7878 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
7979
8080
8181 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
8282
8383
8484 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
8585
8686
8787 func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_farmingAddress())))
8888
8989
9090 func getBabyDuckAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_babyDuckAddress())))
9191
9292
9393 func getGameDappAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_gameDappAddress())))
9494
9595
9696 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
9797
9898
9999 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
100100
101101
102102 func getHuntAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntAddress())))
103103
104104
105105 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
106106
107107
108108 func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
109109
110110
111111 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
112112
113113
114114 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
115115 then throw("RCAP: Please attach waves")
116116 else {
117117 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
118118 if ((payment.amount != feeAmount))
119119 then throw((("RCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
120120 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
121121 }
122122
123123
124124 let PHOENIXBASEOPTIONS = 1000
125125
126126 func tryGetInteger (key) = match getInteger(this, key) {
127127 case b: Int =>
128128 b
129129 case _ =>
130130 0
131131 }
132132
133133
134134 func asString (value) = match value {
135135 case s: String =>
136136 s
137137 case s: Int =>
138138 throw("wrong type, expected: String, got: Int")
139139 case s: Unit =>
140140 throw("wrong type, expected: String, got: Unit")
141141 case _ =>
142142 throw("wrong type, expected: String")
143143 }
144144
145145
146146 let feeAmount = tryGetInteger("currentPrice")
147147
148148 func getAmountOrClear (amount) = if (contains(amount, "0"))
149149 then ""
150150 else amount
151151
152152
153153 func getAssetOrigin (generation) = if ((generation == "G"))
154154 then getIncubatorAddress()
155155 else getBreederAddress()
156156
157157
158158 func getAssetRarity (genotype,generation) = {
159159 let quantity = getIntegerValue(getAssetOrigin(generation), (("stats_" + genotype) + "_quantity"))
160160 let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
161161 if ((power > 0))
162162 then power
163163 else 2
164164 }
165165
166166
167167 func getAssetFarmingPower (assetId) = if (if ((value(assetInfo(assetId)).issuer == getBreederAddress()))
168168 then true
169169 else (value(assetInfo(assetId)).issuer == getIncubatorAddress()))
170170 then {
171171 let assetName = value(assetInfo(assetId)).name
172172 let generation = take(takeRight(assetName, 2), 1)
173173 let farmGen = asString(invoke(getBreederAddress(), "getGenFromName", [assetName], nil))
174174 if ((farmGen == farmGen))
175175 then $Tuple2(farmGen, getAssetRarity(farmGen, generation))
176176 else throw("Strict value is not equal to itself.")
177177 }
178178 else throw("not valid NFT")
179179
180180
181181 func getRandomNumber (options,txId,hatchingFinishHeight,offset) = {
182182 let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
183183 let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
184184 (toInt(randomHash, (offset * 8)) % options)
185185 }
186186
187187
188188 func getRandomWin (tx,finishHeight,assetRarity) = {
189189 let phoenixOptions = (PHOENIXBASEOPTIONS - fraction((PHOENIXBASEOPTIONS / 2), assetRarity, 100))
190190 let jackpotRandom = getRandomNumber(phoenixOptions, tx, finishHeight, 1)
191191 if ((jackpotRandom == 1))
192192 then "phoenix"
193193 else {
194194 let n = getRandomNumber(1000, tx, finishHeight, 0)
195195 if ((170 > n))
196196 then "duckling_10"
197197 else if ((240 > n))
198198 then "duckling_20"
199199 else if ((260 > n))
200200 then "duckling_40"
201- else if ((600 > n))
201+ else if ((300 > n))
202202 then "incubator"
203203 else if ((320 > n))
204204 then "item!ART-SNAKE"
205205 else if ((330 > n))
206206 then "item!ART-FREEGENE"
207- else if ((900 > n))
208- then "phoenix"
207+ else if ((460 > n))
208+ then "item!ART-KATANA"
209209 else if ((510 > n))
210210 then "item!ART-ROBODUCK"
211211 else if ((540 > n))
212212 then "item!ART-CROWN"
213213 else if ((660 > n))
214214 then "item!ART-SCEPTER"
215215 else if ((790 > n))
216216 then "item!ART-BUILTBODY"
217217 else if ((810 > n))
218218 then "item!ART-FEED10"
219219 else if ((820 > n))
220220 then "item!ART-FEED50"
221221 else if ((824 > n))
222222 then "item!ART-FEED100"
223223 else if ((884 > n))
224224 then "item!ART-FIRE_ARMOUR"
225225 else "ar"
226226 }
227227 }
228228
229229
230230 func getOrigin (assetId) = {
231231 let assetName = value(assetInfo(assetId)).name
232232 let generation = take(takeRight(assetName, 2), 1)
233233 if (if ((generation == "G"))
234234 then true
235235 else (generation == "J"))
236236 then getIncubatorAddress()
237237 else getBreederAddress()
238238 }
239239
240240
241241 func asInt (value) = match value {
242242 case int: Int =>
243243 int
244244 case string: String =>
245245 throw(("RAI: wrong type, expected: Int, but got: " + string))
246246 case _ =>
247247 throw("RAI: wrong type, expected: Int")
248248 }
249249
250250
251251 func getBool (key) = match getBoolean(this, key) {
252252 case b: Boolean =>
253253 b
254254 case _ =>
255255 false
256256 }
257257
258258
259259 func isTestEnv () = getBool("TESTENV")
260260
261261
262+func finishRebirthInternal (initTx,address,payment,double,backupTxId) = {
263+ let finishBlock = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
264+ let assetRarity = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_assetRarity"))
265+ let status = tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status"))
266+ let validPayment = checkAdditionalPayment(payment)
267+ if ((validPayment == validPayment))
268+ then {
269+ let recordAction = invoke(getCouponsAddress(), "recordAction", ["REBIRTH"], nil)
270+ if ((recordAction == recordAction))
271+ then {
272+ func getAccessItemAssetId (address) = fromBase58String(tryGetStringExternal(address, "static_accessItemAssetId"))
273+
274+ func getAccessItemPrice (address) = tryGetIntExternal(address, "static_accessItemPrice")
275+
276+ if ((status != "open"))
277+ then throw("rebirth is finished or not open")
278+ else if ((finishBlock > height))
279+ then throw("you cannot finish rebirth, yet")
280+ else {
281+ let win = getRandomWin(fromBase58String(initTx), finishBlock, assetRarity)
282+ let txId = initTx
283+ let result = if ((indexOf(win, "perch") != unit))
284+ then {
285+ let color = takeRight(win, 1)
286+ let call = if (!(double))
287+ then invoke(getFarmingAddress(), "addFreePerch", [address, color], nil)
288+ else {
289+ let first = invoke(getFarmingAddress(), "addFreePerch", [address, color], nil)
290+ if ((first == first))
291+ then invoke(getFarmingAddress(), "addFreePerch", [address, color], nil)
292+ else throw("Strict value is not equal to itself.")
293+ }
294+ if ((call == call))
295+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
296+ else throw("Strict value is not equal to itself.")
297+ }
298+ else if ((win == "incubator"))
299+ then {
300+ let call = if (!(double))
301+ then invoke(getIncubatorAddress(), "issueFreeDuck", [address, txId], nil)
302+ else {
303+ let first = invoke(getIncubatorAddress(), "issueFreeDuck", [address, txId], nil)
304+ if ((first == first))
305+ then invoke(getIncubatorAddress(), "issueFreeDuck", [address, backupTxId], nil)
306+ else throw("Strict value is not equal to itself.")
307+ }
308+ if ((call == call))
309+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
310+ else throw("Strict value is not equal to itself.")
311+ }
312+ else if ((win == "ar"))
313+ then {
314+ let assetId = getAccessItemAssetId(getHuntAddress())
315+ let price = getAccessItemPrice(getHuntAddress())
316+ let call = invoke(getHuntAddress(), "buyAccessItemOther", [address], [AttachedPayment(assetId, price)])
317+ if ((call == call))
318+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
319+ else throw("Strict value is not equal to itself.")
320+ }
321+ else if ((win == "phoenix"))
322+ then {
323+ let call = invoke(getIncubatorAddress(), "issueJackpot", [address, txId, valueOrElse(getString("JACKPOT_NAME"), "WWWWWWWP")], nil)
324+ if ((call == call))
325+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
326+ else throw("Strict value is not equal to itself.")
327+ }
328+ else if ((indexOf(win, "duckling") != unit))
329+ then {
330+ let level = parseIntValue(split(win, "_")[1])
331+ let levelFinal = if (double)
332+ then (2 * level)
333+ else level
334+ let call = invoke(getBabyDuckAddress(), "issueFreeDuckling", [address, txId, levelFinal], nil)
335+ if ((call == call))
336+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
337+ else throw("Strict value is not equal to itself.")
338+ }
339+ else if ((indexOf(win, "item") != unit))
340+ then {
341+ let itemName = split(win, "!")[1]
342+ let call = if (!(double))
343+ then invoke(getItemsAddress(), "issueArtefact", [itemName, address], nil)
344+ else {
345+ let first = invoke(getItemsAddress(), "issueArtefact", [itemName, address], nil)
346+ if ((first == first))
347+ then invoke(getItemsAddress(), "issueArtefact", [itemName, address], nil)
348+ else throw("Strict value is not equal to itself.")
349+ }
350+ if ((call == call))
351+ then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
352+ else throw("Strict value is not equal to itself.")
353+ }
354+ else throw("RFB: Some error occured, please contact the admins!")
355+ ((result ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win"), win), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish")]) ++ validPayment)
356+ }
357+ }
358+ else throw("Strict value is not equal to itself.")
359+ }
360+ else throw("Strict value is not equal to itself.")
361+ }
362+
363+
262364 @Callable(i)
263365 func configureOracle (oracle) = if ((i.caller != this))
264366 then throw("RCU: admin only")
265367 else [StringEntry("static_oracleAddress", oracle)]
266368
267369
268370
269371 @Callable(i)
270372 func initRebirth (refererAddress) = {
271373 let pmt = i.payments[0]
272374 let assetId = value(pmt.assetId)
273375 let initTx = toBase58String(i.transactionId)
274376 let address = toString(i.caller)
275377 if ((pmt.amount != 1))
276378 then throw("NFT is not attached")
277379 else {
278380 let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [feeAmount], nil))
279381 if ((amountPaidByCoupons == amountPaidByCoupons))
280382 then {
281383 let leftToPay = (feeAmount - amountPaidByCoupons)
282384 let validPayment = checkAdditionalPayment(i.payments[1])
283385 if ((validPayment == validPayment))
284386 then {
285387 let payment = if ((leftToPay != 0))
286388 then {
287389 let feePayment = value(i.payments[2])
288390 if ((feePayment.assetId != getEggAssetId()))
289391 then throw("You need to attach EGG tokens as fee")
290392 else if ((leftToPay > feePayment.amount))
291393 then throw(("You need to attach the following amount of EGG tokens as fee: 0." + toString(leftToPay)))
292394 else {
293395 let refererRewardForPerch = fraction(leftToPay, 5, 100)
294396 let refCall = asBoolean(invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]))
295397 if ((refCall == refCall))
296398 then {
297399 let toBurn = if (refCall)
298400 then (leftToPay - refererRewardForPerch)
299401 else leftToPay
300402 let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
301403 if ((burnCall == burnCall))
302404 then leftToPay
303405 else throw("Strict value is not equal to itself.")
304406 }
305407 else throw("Strict value is not equal to itself.")
306408 }
307409 }
308410 else 0
309411 if ((payment == payment))
310412 then {
311- let $t085628611 = getAssetFarmingPower(assetId)
312- let gen = $t085628611._1
313- let rarity = $t085628611._2
413+ let $t01247112520 = getAssetFarmingPower(assetId)
414+ let gen = $t01247112520._1
415+ let rarity = $t01247112520._2
314416 let call = invoke(getOrigin(assetId), "reduceRarity", [toBase58String(assetId), gen], nil)
315417 if ((call == call))
316418 then ([IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"), (height + delayForHatching)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "open"), IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetRarity"), rarity), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetId"), toBase58String(assetId))] ++ validPayment)
317419 else throw("Strict value is not equal to itself.")
318420 }
319421 else throw("Strict value is not equal to itself.")
320422 }
321423 else throw("Strict value is not equal to itself.")
322424 }
323425 else throw("Strict value is not equal to itself.")
324426 }
325427 }
326428
327429
328430
329431 @Callable(i)
330-func finishRebirth (initTx) = {
331- let address = toString(i.caller)
332- let finishBlock = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
333- let assetRarity = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_assetRarity"))
334- let status = tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status"))
335- let validPayment = checkAdditionalPayment(i.payments[0])
336- if ((validPayment == validPayment))
337- then {
338- let recordAction = invoke(getCouponsAddress(), "recordAction", ["REBIRTH"], nil)
339- if ((recordAction == recordAction))
340- then {
341- func getAccessItemAssetId (address) = fromBase58String(tryGetStringExternal(address, "static_accessItemAssetId"))
432+func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, toBase58String(i.transactionId))
342433
343- func getAccessItemPrice (address) = tryGetIntExternal(address, "static_accessItemPrice")
344434
345- if ((status != "open"))
346- then throw("rebirth is finished or not open")
347- else if ((finishBlock > height))
348- then throw("you cannot finish rebirth, yet")
349- else {
350- let win = getRandomWin(fromBase58String(initTx), finishBlock, assetRarity)
351- let txId = initTx
352- let result = if ((indexOf(win, "perch") != unit))
353- then {
354- let color = takeRight(win, 1)
355- let call = invoke(getFarmingAddress(), "addFreePerch", [address, color], nil)
356- if ((call == call))
357- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
358- else throw("Strict value is not equal to itself.")
359- }
360- else if ((win == "incubator"))
361- then {
362- let call = invoke(getIncubatorAddress(), "issueFreeDuck", [address, txId], nil)
363- if ((call == call))
364- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
365- else throw("Strict value is not equal to itself.")
366- }
367- else if ((win == "ar"))
368- then {
369- let assetId = getAccessItemAssetId(getHuntAddress())
370- let price = getAccessItemPrice(getHuntAddress())
371- let call = invoke(getHuntAddress(), "buyAccessItemOther", [address], [AttachedPayment(assetId, price)])
372- if ((call == call))
373- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
374- else throw("Strict value is not equal to itself.")
375- }
376- else if ((win == "phoenix"))
377- then {
378- let call = invoke(getIncubatorAddress(), "issueJackpot", [address, txId, valueOrElse(getString("JACKPOT_NAME"), "WWWWWWWP")], nil)
379- if ((call == call))
380- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
381- else throw("Strict value is not equal to itself.")
382- }
383- else if ((indexOf(win, "duckling") != unit))
384- then {
385- let level = parseIntValue(split(win, "_")[1])
386- let call = invoke(getBabyDuckAddress(), "issueFreeDuckling", [address, txId, level], nil)
387- if ((call == call))
388- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
389- else throw("Strict value is not equal to itself.")
390- }
391- else if ((indexOf(win, "item") != unit))
392- then {
393- let itemName = split(win, "!")[1]
394- let call = invoke(getItemsAddress(), "issueArtefact", [itemName, address], nil)
395- if ((call == call))
396- then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
397- else throw("Strict value is not equal to itself.")
398- }
399- else throw("RFB: Some error occured, please contact the admins!")
400- ((result ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win"), win), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish")]) ++ validPayment)
401- }
402- }
403- else throw("Strict value is not equal to itself.")
404- }
405- else throw("Strict value is not equal to itself.")
406- }
435+
436+@Callable(i)
437+func finishRebirthDouble (initTx) = if (!(if ((size(i.payments) == 2))
438+ then (i.payments[0].amount == 1)
439+ else false))
440+ then throw("Invalid payment")
441+ else {
442+ let assetId = value(i.payments[0].assetId)
443+ let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
444+ if ((boosterType == boosterType))
445+ then if ((boosterType == "ART-GIFT_DOUBL"))
446+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, toBase58String(i.transactionId)))
447+ else throw("Error! Wrong item attached to double rewards!")
448+ else throw("Strict value is not equal to itself.")
449+ }
407450
408451
409452 @Verifier(tx)
410453 func verify () = if (isTestEnv())
411454 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
412455 else {
413456 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
414457 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
415458 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
416459 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
417460 then 1
418461 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
419462 then 1
420463 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
421464 then 1
422465 else 0
423466 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
424467 then 1
425468 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
426469 then 1
427470 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
428471 then 1
429472 else 0
430473 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
431474 then 1
432475 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
433476 then 1
434477 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
435478 then 1
436479 else 0
437480 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
438481 match tx {
439482 case _ =>
440483 (signaturesCount >= 2)
441484 }
442485 }
443486

github/deemru/w8io/6500d08 
58.48 ms