tx · 6abPacCV6SA8LQ8MYnRuta7yg1yqt373HVgSkWBL9cHE

3N4uWa2T9W2p4WgDwLPo3kWRp8eXRatp4vv:  -0.01100000 Waves

2022.07.23 21:26 [2152781] smart account 3N4uWa2T9W2p4WgDwLPo3kWRp8eXRatp4vv > SELF 0.00000000 Waves

{ "type": 13, "id": "6abPacCV6SA8LQ8MYnRuta7yg1yqt373HVgSkWBL9cHE", "fee": 1100000, "feeAssetId": null, "timestamp": 1658600752825, "version": 2, "chainId": 84, "sender": "3N4uWa2T9W2p4WgDwLPo3kWRp8eXRatp4vv", "senderPublicKey": "6pUz5KTgi8pySNF2EuYHUMBkXbTyxL7R7YWGgb2PkhgU", "proofs": [ "5rm9uPeFPQkexWRkahv3WRu88R8uJXRbeADrtjrbDXzfECCxpD7vJS6dCDag4PejRPE6aR3oeshsbTxfaYUehczA" ], "script": "base64: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ZXN1bHRzCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAAAdBZGRyZXNzAAAAAQUAAAAQY29sbGVjdG9yQWRkcmVzcwkAAGUAAAACCAUAAAAMZmlyc3RQYXltZW50AAAABmFtb3VudAUAAAAKZWdnc05lZWRlZAUAAAALZWdnc0Fzc2V0SWQFAAAAA25pbAAAAAFpAQAAABNmaW5pc2hQYW5kYUFkb3B0aW9uAAAAAQAAAAd0eElkU3RyBAAAAAR0eElkCQACWQAAAAEFAAAAB3R4SWRTdHIEAAAAEUFkb3B0aW9uU3RhdHVzS2V5CQEAAAAUZ2V0QWRvcHRpb25TdGF0dXNLZXkAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAEdHhJZAQAAAAPZmluaXNoSGVpZ2h0S2V5CQEAAAAaZ2V0QWRvcHRpb25GaW5pc2hIZWlnaHRLZXkAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAEdHhJZAQAAAAJZHVja0lkS2V5CQEAAAAMZ2V0RHVja0lkS2V5AAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAABHR4SWQEAAAADGR1Y2tGcm9tQmFieQQAAAAHJG1hdGNoMAkABCAAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAJQWRvcHRpb25fBQAAAAd0eElkU3RyAgAAAAlfYmFieUR1Y2sDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAB0Jvb2xlYW4EAAAAAXQFAAAAByRtYXRjaDAFAAAAAXQHBAAAABBBZG9wdGlvblR4U3RhdHVzCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAABFBZG9wdGlvblN0YXR1c0tleQQAAAAUQWRvcHRpb25GaW5pc2hIZWlnaHQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMFAAAAD2ZpbmlzaEhlaWdodEtleQMJAAAAAAAAAgUAAAAQQWRvcHRpb25UeFN0YXR1cwUAAAAQQWRvcHRpb25GaW5pc2hlZAQAAAAGZHVja0lkCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzCQEAAAAMZ2V0RHVja0lkS2V5AAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAABHR4SWQJAAACAAAAAQkAASwAAAACAgAAAEBUaGUgZHVjayB3YXMgaGF0Y2hlZCBhbmQgY2xhaW1lZCBhbHJlYWR5LCBoZXJlIGlzIHRoZSBmb2xvd2luZzogBQAAAAZkdWNrSWQDCQAAZgAAAAIFAAAAFEFkb3B0aW9uRmluaXNoSGVpZ2h0BQAAAAZoZWlnaHQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB1BZG9wdGlvbiBpcyBub3QgZmluaXNoZWQgeWV0IAkAAaQAAAABCQAAZQAAAAIFAAAAFEFkb3B0aW9uRmluaXNoSGVpZ2h0BQAAAAZoZWlnaHQCAAAAJyBibG9ja3MgcmVtYWluaW5nLCBpdCB3aWxsIHRha2UgYXJvdW5kIAkAAaQAAAABCQAAZQAAAAIFAAAAFEFkb3B0aW9uRmluaXNoSGVpZ2h0BQAAAAZoZWlnaHQCAAAACCBtaW51dGVzBAAAAAhuYW1lRGF0YQkBAAAADWdldFJhbmRvbU5hbWUAAAACBQAAAAR0eElkBQAAABRBZG9wdGlvbkZpbmlzaEhlaWdodAQAAAAHZHVja0dlbggFAAAACG5hbWVEYXRhAAAAAl8xBAAAAAdmYXJtR2VuCAUAAAAIbmFtZURhdGEAAAACXzIEAAAAC2Rlc2NyaXB0aW9uCQABLAAAAAIJAAEsAAAAAgIAAAAOeyJnZW5vdHlwZSI6ICIFAAAAB2R1Y2tHZW4CAAAAGSIsICJjcm9zc2JyZWVkaW5nIjogdHJ1ZX0EAAAABWFzc2V0CQAEQwAAAAcFAAAAB2R1Y2tHZW4FAAAAC2Rlc2NyaXB0aW9uAAAAAAAAAAABAAAAAAAAAAAABwUAAAAEdW5pdAUAAAAUQWRvcHRpb25GaW5pc2hIZWlnaHQEAAAAB2Fzc2V0SWQJAAQ4AAAAAQUAAAAFYXNzZXQEAAAABmFtb3VudAkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAAA9nZXREdWNrU3RhdHNLZXkAAAABBQAAAAdkdWNrR2VuAAAAAAAAAAABCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAEUFkb3B0aW9uU3RhdHVzS2V5BQAAABBBZG9wdGlvbkZpbmlzaGVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACWR1Y2tJZEtleQkAAlgAAAABBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAJYAAAAAQUAAAAHYXNzZXRJZAUAAAAJZHVja0lkS2V5CQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAFZHVja18JAAJYAAAAAQUAAAAHYXNzZXRJZAIAAAAGX2dyb3duBQAAAAxkdWNrRnJvbUJhYnkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA9nZXREdWNrU3RhdHNLZXkAAAABBQAAAAdkdWNrR2VuBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZzdGF0c18FAAAAB2Zhcm1HZW4CAAAACV9xdWFudGl0eQkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAZzdGF0c18FAAAAB2Zhcm1HZW4CAAAACV9xdWFudGl0eQAAAAAAAAAAAQkABEwAAAACBQAAAAVhc3NldAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEFAAAAEGNvbGxlY3RvckFkZHJlc3MAAAAAAAAAAAEFAAAAB2Fzc2V0SWQFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5Sgj6bw==", "height": 2152781, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AeRLF5VgPooFZGhsQVYouBCkrSsCfjPTFyytP7jt7rVj Next: none Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let eggAssetId = base58'2cf6jyVG19oHU79R8iHfqFEesjstr3e7nSYEUhb2WagB'
4+let eggsAssetId = base58'2cf6jyVG19oHU79R8iHfqFEesjstr3e7nSYEUhb2WagB'
55
66 let collectorAddress = base58'3MpADDQFqadaCADNH9JDMQAGw9WEaMcymVU'
77
8-let delay = 1440
8+let delayForAdoption = 2
99
10-let maxExchange = 1000000000
10+let discountCoefficient = 10
1111
12-let exchangeRate = 2
12+let typesAmount = 9
1313
14-let waveDecimals = 8
14+let RefererReward = 5
1515
16-let tokenDecimals = 8
16+let AdoptionStarted = "ADOPTION_STARTED"
17+
18+let AdoptionFinished = "ADOPTION_FINISHED"
19+
20+func getAdoptionStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status")
21+
22+
23+func getAdoptionFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
24+
25+
26+func getDuckIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di")
27+
28+
29+func getDuckStatsKey (genString) = (("stats_" + genString) + "_amount")
30+
1731
1832 func tryGetInteger (key) = {
1933 let val = match getInteger(this, key) {
2640 }
2741
2842
29-func tryGetString (key) = {
30- let val = match getString(this, key) {
31- case b: String =>
32- b
33- case _ =>
34- ""
35- }
36- val
43+func getRandomNumber (variants,txId,AdoptionFinishHeight,offset) = {
44+ let randomSeedBlock = value(blockInfoByHeight((AdoptionFinishHeight - 1)))
45+ let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
46+ (toInt(randomHash, (offset * 8)) % variants)
3747 }
3848
3949
40-func tryGetBoolean (key) = match getBoolean(this, key) {
41- case b: Boolean =>
42- b
43- case _ =>
44- false
45-}
50+func wasUniqueBorn (gen) = tryGetInteger(getDuckStatsKey(gen))
51+
52+
53+func getRandomName (txId,AdoptionFinishHeight) = {
54+ let hatId = toString(getRandomNumber(6, txId, AdoptionFinishHeight, 0))
55+ let eyeglassId = toString(getRandomNumber(5, txId, AdoptionFinishHeight, 0))
56+ let chainId = toString(getRandomNumber(3, txId, AdoptionFinishHeight, 0))
57+ let lefthandId = toString(getRandomNumber(43, txId, AdoptionFinishHeight, 0))
58+ let righthandId = toString(getRandomNumber(34, txId, AdoptionFinishHeight, 0))
59+ let colorRandom = getRandomNumber(4, txId, AdoptionFinishHeight, 1)
60+ let color = if ((colorRandom == 0))
61+ then "R"
62+ else if ((colorRandom == 1))
63+ then "G"
64+ else if ((colorRandom == 2))
65+ then "B"
66+ else "Y"
67+ $Tuple2(((((((("PANDA-" + hatId) + eyeglassId) + chainId) + lefthandId) + righthandId) + "-") + color), "PANDA")
68+ }
69+
70+
71+func countEggsNeededAmount (totalDucksAmount) = {
72+ let n = totalDucksAmount
73+ let g = discountCoefficient
74+ let t = typesAmount
75+ let price = pow((100 + ((n * g) / (10 * t))), 2, 5, 1, 2, DOWN)
76+ (price * 1000000)
77+ }
4678
4779
4880 @Callable(i)
49-func exchangeToken (amount) = {
50- let transactionId = toBase58String(i.transactionId)
51- let totalExchangedAmount = (amount / exchangeRate)
52- let lastTransferedDay = tryGetInteger((("receiver_" + toString(i.originCaller)) + "_lastDay"))
53- let totalAmountInDay = tryGetInteger((("receiver_" + toString(i.originCaller)) + "_totalAmountInDay"))
54- if ((height > (lastTransferedDay + delay)))
55- then if ((totalAmountInDay > maxExchange))
56- then throw("Max exchange limit reached. Please try after 24 hours.")
57- else if (((totalAmountInDay + amount) > maxExchange))
58- then throw("Max exchange crossed. Please try with lower value.")
59- else [IntegerEntry((("receiver_" + toString(i.originCaller)) + "_totalAmountInDay"), (totalAmountInDay + amount)), IntegerEntry((((("receiver_" + toString(i.originCaller)) + "_transactionId_") + transactionId) + "_waveAmount"), amount), IntegerEntry((((("receiver_" + toString(i.originCaller)) + "_transactionId_") + transactionId) + "_tokenAmount"), totalExchangedAmount), ScriptTransfer(Address(collectorAddress), amount, unit), ScriptTransfer(i.originCaller, totalExchangedAmount, eggAssetId)]
60- else [IntegerEntry((("receiver_" + toString(i.originCaller)) + "_lastDay"), height), IntegerEntry((("receiver_" + toString(i.originCaller)) + "_totalAmountInDay"), amount), IntegerEntry((((("receiver_" + toString(i.originCaller)) + "_transactionId_") + transactionId) + "_waveAmount"), amount), IntegerEntry((((("receiver_" + toString(i.originCaller)) + "_transactionId_") + transactionId) + "_tokenAmount"), totalExchangedAmount), ScriptTransfer(Address(collectorAddress), amount, unit), ScriptTransfer(i.originCaller, totalExchangedAmount, eggAssetId)]
81+func startPandaAdoption () = {
82+ let totalDucksAmount = tryGetInteger("ducks_amount")
83+ let eggsNeeded = countEggsNeededAmount(totalDucksAmount)
84+ let firstPayment = value(i.payments[0])
85+ let results = [StringEntry(getAdoptionStatusKey(toString(i.originCaller), i.transactionId), AdoptionStarted), IntegerEntry(getAdoptionFinishHeightKey(toString(i.originCaller), i.transactionId), (height + delayForAdoption)), IntegerEntry("ducks_amount", (totalDucksAmount + 1)), IntegerEntry("ducks_last_price", (eggsNeeded / 1000000))]
86+ if ((firstPayment.assetId != eggsAssetId))
87+ then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
88+ else if ((eggsNeeded > firstPayment.amount))
89+ then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded)))
90+ else (results ++ [ScriptTransfer(Address(collectorAddress), (firstPayment.amount - eggsNeeded), eggsAssetId)])
91+ }
92+
93+
94+
95+@Callable(i)
96+func finishPandaAdoption (txIdStr) = {
97+ let txId = fromBase58String(txIdStr)
98+ let AdoptionStatusKey = getAdoptionStatusKey(toString(i.caller), txId)
99+ let finishHeightKey = getAdoptionFinishHeightKey(toString(i.caller), txId)
100+ let duckIdKey = getDuckIdKey(toString(i.caller), txId)
101+ let duckFromBaby = match getBoolean((("Adoption_" + txIdStr) + "_babyDuck")) {
102+ case t: Boolean =>
103+ t
104+ case _ =>
105+ false
106+ }
107+ let AdoptionTxStatus = getStringValue(this, AdoptionStatusKey)
108+ let AdoptionFinishHeight = getIntegerValue(this, finishHeightKey)
109+ if ((AdoptionTxStatus == AdoptionFinished))
110+ then {
111+ let duckId = getStringValue(this, getDuckIdKey(toString(i.caller), txId))
112+ throw(("The duck was hatched and claimed already, here is the folowing: " + duckId))
113+ }
114+ else if ((AdoptionFinishHeight > height))
115+ then throw((((("Adoption is not finished yet " + toString((AdoptionFinishHeight - height))) + " blocks remaining, it will take around ") + toString((AdoptionFinishHeight - height))) + " minutes"))
116+ else {
117+ let nameData = getRandomName(txId, AdoptionFinishHeight)
118+ let duckGen = nameData._1
119+ let farmGen = nameData._2
120+ let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
121+ let asset = Issue(duckGen, description, 1, 0, false, unit, AdoptionFinishHeight)
122+ let assetId = calculateAssetId(asset)
123+ let amount = (tryGetInteger(getDuckStatsKey(duckGen)) + 1)
124+[StringEntry(AdoptionStatusKey, AdoptionFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), BooleanEntry((("duck_" + toBase58String(assetId)) + "_grown"), duckFromBaby), IntegerEntry(getDuckStatsKey(duckGen), amount), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1)), asset, ScriptTransfer(Address(collectorAddress), 1, assetId)]
125+ }
61126 }
62127
63128
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let eggAssetId = base58'2cf6jyVG19oHU79R8iHfqFEesjstr3e7nSYEUhb2WagB'
4+let eggsAssetId = base58'2cf6jyVG19oHU79R8iHfqFEesjstr3e7nSYEUhb2WagB'
55
66 let collectorAddress = base58'3MpADDQFqadaCADNH9JDMQAGw9WEaMcymVU'
77
8-let delay = 1440
8+let delayForAdoption = 2
99
10-let maxExchange = 1000000000
10+let discountCoefficient = 10
1111
12-let exchangeRate = 2
12+let typesAmount = 9
1313
14-let waveDecimals = 8
14+let RefererReward = 5
1515
16-let tokenDecimals = 8
16+let AdoptionStarted = "ADOPTION_STARTED"
17+
18+let AdoptionFinished = "ADOPTION_FINISHED"
19+
20+func getAdoptionStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status")
21+
22+
23+func getAdoptionFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
24+
25+
26+func getDuckIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di")
27+
28+
29+func getDuckStatsKey (genString) = (("stats_" + genString) + "_amount")
30+
1731
1832 func tryGetInteger (key) = {
1933 let val = match getInteger(this, key) {
2034 case b: Int =>
2135 b
2236 case _ =>
2337 0
2438 }
2539 val
2640 }
2741
2842
29-func tryGetString (key) = {
30- let val = match getString(this, key) {
31- case b: String =>
32- b
33- case _ =>
34- ""
35- }
36- val
43+func getRandomNumber (variants,txId,AdoptionFinishHeight,offset) = {
44+ let randomSeedBlock = value(blockInfoByHeight((AdoptionFinishHeight - 1)))
45+ let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
46+ (toInt(randomHash, (offset * 8)) % variants)
3747 }
3848
3949
40-func tryGetBoolean (key) = match getBoolean(this, key) {
41- case b: Boolean =>
42- b
43- case _ =>
44- false
45-}
50+func wasUniqueBorn (gen) = tryGetInteger(getDuckStatsKey(gen))
51+
52+
53+func getRandomName (txId,AdoptionFinishHeight) = {
54+ let hatId = toString(getRandomNumber(6, txId, AdoptionFinishHeight, 0))
55+ let eyeglassId = toString(getRandomNumber(5, txId, AdoptionFinishHeight, 0))
56+ let chainId = toString(getRandomNumber(3, txId, AdoptionFinishHeight, 0))
57+ let lefthandId = toString(getRandomNumber(43, txId, AdoptionFinishHeight, 0))
58+ let righthandId = toString(getRandomNumber(34, txId, AdoptionFinishHeight, 0))
59+ let colorRandom = getRandomNumber(4, txId, AdoptionFinishHeight, 1)
60+ let color = if ((colorRandom == 0))
61+ then "R"
62+ else if ((colorRandom == 1))
63+ then "G"
64+ else if ((colorRandom == 2))
65+ then "B"
66+ else "Y"
67+ $Tuple2(((((((("PANDA-" + hatId) + eyeglassId) + chainId) + lefthandId) + righthandId) + "-") + color), "PANDA")
68+ }
69+
70+
71+func countEggsNeededAmount (totalDucksAmount) = {
72+ let n = totalDucksAmount
73+ let g = discountCoefficient
74+ let t = typesAmount
75+ let price = pow((100 + ((n * g) / (10 * t))), 2, 5, 1, 2, DOWN)
76+ (price * 1000000)
77+ }
4678
4779
4880 @Callable(i)
49-func exchangeToken (amount) = {
50- let transactionId = toBase58String(i.transactionId)
51- let totalExchangedAmount = (amount / exchangeRate)
52- let lastTransferedDay = tryGetInteger((("receiver_" + toString(i.originCaller)) + "_lastDay"))
53- let totalAmountInDay = tryGetInteger((("receiver_" + toString(i.originCaller)) + "_totalAmountInDay"))
54- if ((height > (lastTransferedDay + delay)))
55- then if ((totalAmountInDay > maxExchange))
56- then throw("Max exchange limit reached. Please try after 24 hours.")
57- else if (((totalAmountInDay + amount) > maxExchange))
58- then throw("Max exchange crossed. Please try with lower value.")
59- else [IntegerEntry((("receiver_" + toString(i.originCaller)) + "_totalAmountInDay"), (totalAmountInDay + amount)), IntegerEntry((((("receiver_" + toString(i.originCaller)) + "_transactionId_") + transactionId) + "_waveAmount"), amount), IntegerEntry((((("receiver_" + toString(i.originCaller)) + "_transactionId_") + transactionId) + "_tokenAmount"), totalExchangedAmount), ScriptTransfer(Address(collectorAddress), amount, unit), ScriptTransfer(i.originCaller, totalExchangedAmount, eggAssetId)]
60- else [IntegerEntry((("receiver_" + toString(i.originCaller)) + "_lastDay"), height), IntegerEntry((("receiver_" + toString(i.originCaller)) + "_totalAmountInDay"), amount), IntegerEntry((((("receiver_" + toString(i.originCaller)) + "_transactionId_") + transactionId) + "_waveAmount"), amount), IntegerEntry((((("receiver_" + toString(i.originCaller)) + "_transactionId_") + transactionId) + "_tokenAmount"), totalExchangedAmount), ScriptTransfer(Address(collectorAddress), amount, unit), ScriptTransfer(i.originCaller, totalExchangedAmount, eggAssetId)]
81+func startPandaAdoption () = {
82+ let totalDucksAmount = tryGetInteger("ducks_amount")
83+ let eggsNeeded = countEggsNeededAmount(totalDucksAmount)
84+ let firstPayment = value(i.payments[0])
85+ let results = [StringEntry(getAdoptionStatusKey(toString(i.originCaller), i.transactionId), AdoptionStarted), IntegerEntry(getAdoptionFinishHeightKey(toString(i.originCaller), i.transactionId), (height + delayForAdoption)), IntegerEntry("ducks_amount", (totalDucksAmount + 1)), IntegerEntry("ducks_last_price", (eggsNeeded / 1000000))]
86+ if ((firstPayment.assetId != eggsAssetId))
87+ then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
88+ else if ((eggsNeeded > firstPayment.amount))
89+ then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded)))
90+ else (results ++ [ScriptTransfer(Address(collectorAddress), (firstPayment.amount - eggsNeeded), eggsAssetId)])
91+ }
92+
93+
94+
95+@Callable(i)
96+func finishPandaAdoption (txIdStr) = {
97+ let txId = fromBase58String(txIdStr)
98+ let AdoptionStatusKey = getAdoptionStatusKey(toString(i.caller), txId)
99+ let finishHeightKey = getAdoptionFinishHeightKey(toString(i.caller), txId)
100+ let duckIdKey = getDuckIdKey(toString(i.caller), txId)
101+ let duckFromBaby = match getBoolean((("Adoption_" + txIdStr) + "_babyDuck")) {
102+ case t: Boolean =>
103+ t
104+ case _ =>
105+ false
106+ }
107+ let AdoptionTxStatus = getStringValue(this, AdoptionStatusKey)
108+ let AdoptionFinishHeight = getIntegerValue(this, finishHeightKey)
109+ if ((AdoptionTxStatus == AdoptionFinished))
110+ then {
111+ let duckId = getStringValue(this, getDuckIdKey(toString(i.caller), txId))
112+ throw(("The duck was hatched and claimed already, here is the folowing: " + duckId))
113+ }
114+ else if ((AdoptionFinishHeight > height))
115+ then throw((((("Adoption is not finished yet " + toString((AdoptionFinishHeight - height))) + " blocks remaining, it will take around ") + toString((AdoptionFinishHeight - height))) + " minutes"))
116+ else {
117+ let nameData = getRandomName(txId, AdoptionFinishHeight)
118+ let duckGen = nameData._1
119+ let farmGen = nameData._2
120+ let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
121+ let asset = Issue(duckGen, description, 1, 0, false, unit, AdoptionFinishHeight)
122+ let assetId = calculateAssetId(asset)
123+ let amount = (tryGetInteger(getDuckStatsKey(duckGen)) + 1)
124+[StringEntry(AdoptionStatusKey, AdoptionFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), BooleanEntry((("duck_" + toBase58String(assetId)) + "_grown"), duckFromBaby), IntegerEntry(getDuckStatsKey(duckGen), amount), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1)), asset, ScriptTransfer(Address(collectorAddress), 1, assetId)]
125+ }
61126 }
62127
63128
64129 @Verifier(tx)
65130 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
66131

github/deemru/w8io/873ac7e 
51.07 ms