tx · 8zbYk3wntUwswUxMBA7c7287BCRF7Zdevh4WmhRMYPsn

3P8gsxa1xt1xSjDP4HR728y7o9QQginK2eU:  -0.01400000 Waves

2021.05.07 00:18 [2578997] smart account 3P8gsxa1xt1xSjDP4HR728y7o9QQginK2eU > SELF 0.00000000 Waves

{ "type": 13, "id": "8zbYk3wntUwswUxMBA7c7287BCRF7Zdevh4WmhRMYPsn", "fee": 1400000, "feeAssetId": null, "timestamp": 1620335935725, "version": 2, "chainId": 87, "sender": "3P8gsxa1xt1xSjDP4HR728y7o9QQginK2eU", "senderPublicKey": "FQcGKT4w9tnuigudoGoUWmGxV6JqMaac6kwNKWaA61uJ", "proofs": [ "ZmeQgqCY5ZSNY7cQkvBVwZJ6bxizhdnC7bzeid5Mq3WSX4kcG6HmZRN51KW1bn8aiwzr9sED1eUiztpGw82QG71" ], "script": "base64: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", "height": 2578997, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Htt4FNLHCNJ7zSBzYvckhYiQx732uSYZzrEvrmaJz3TM Next: 68qHGDvbafgLBeVBC3LnWUzmgFCQg6j4DaQMERMpxMm7 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let delayForHatching = 0
5+
6+let HatchingStarted = "BREEDING_STARTED"
7+
8+let HatchingFinished = "BREEDING_FINISHED"
9+
410 let incubatorAddress = base58'3PACKMArmh4BAEawStYmpcU62aiNTBJKvNh'
11+
12+let generations = ["G", "H", "I", "K", "L"]
13+
14+func getProcessStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status")
15+
16+
17+func getProcessFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
18+
19+
20+func getDuckParentKey (txId,parentNum) = ((("inittx_" + toBase58String(txId)) + "_parent") + toString(parentNum))
21+
22+
23+func getDuckIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di")
24+
25+
26+func getDuckStatsKey (genString) = (("stats_" + genString) + "_amount")
27+
528
629 func tryGetInteger (key) = {
730 let val = match getInteger(this, key) {
2548 }
2649
2750
28-func getAssetGenotype (assetId) = {
29- let asset = match getString(Address(incubatorAddress), toBase58String(assetId)) {
51+func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = {
52+ let randomSeedBlock = value(blockInfoByHeight(hatchingFinishHeight))
53+ (toInt((txId + value(randomSeedBlock.vrf)), offset) % variants)
54+ }
55+
56+
57+func getRandomGen (gen1,gen2,step,txId,hatchingFinishHeight) = {
58+ let randomNum = getRandomNumber(2, txId, hatchingFinishHeight, step)
59+ let gen = if ((randomNum == 0))
60+ then gen1
61+ else gen2
62+ gen
63+ }
64+
65+
66+func generateDuck (txId,hatchingFinishHeight) = {
67+ let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 30)
68+ let color = if ((colorRandom == 0))
69+ then "Y"
70+ else if ((colorRandom == 1))
71+ then "G"
72+ else if ((colorRandom == 2))
73+ then "B"
74+ else "R"
75+ let parent1Id = fromBase58String(tryGetString(getDuckParentKey(txId, 1)))
76+ let parent2Id = fromBase58String(tryGetString(getDuckParentKey(txId, 2)))
77+ let parent1Gen = split(value(assetInfo(parent1Id)).name, "")
78+ let parent2Gen = split(value(assetInfo(parent2Id)).name, "")
79+ let gen = (((((((((("DUCK-" + getRandomGen(parent1Gen[5], parent2Gen[5], 0, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[6], parent2Gen[6], 1, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[7], parent2Gen[7], 2, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[8], parent2Gen[8], 3, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[9], parent2Gen[9], 4, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[10], parent2Gen[10], 5, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[11], parent2Gen[12], 6, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[12], parent2Gen[12], 7, txId, hatchingFinishHeight)) + "-J") + color)
80+ gen
81+ }
82+
83+
84+func checkAssetInIncubator (assetId) = {
85+ let result = match getString(Address(incubatorAddress), toBase58String(assetId)) {
3086 case b: String =>
31- b
87+ true
3288 case _ =>
33- ""
89+ false
3490 }
35- asset
91+ let result2 = match getString(this, toBase58String(assetId)) {
92+ case c: String =>
93+ true
94+ case _ =>
95+ false
96+ }
97+ if (result)
98+ then true
99+ else result2
36100 }
37101
38102
39103 @Callable(i)
40-func initAuction (startPrice,instantPrice,description) = {
41- let auctionId = toBase58String(i.transactionId)
42- let pmt = value(i.payments[0])
43- let assetId = value(pmt.assetId)
44- let asset = getAssetGenotype(assetId)
45- if ((asset == ""))
46- then throw("You can only sell an NFT-duck created in incubator")
47- else [StringEntry((("auction_" + auctionId) + "_status"), "open"), StringEntry((("auction_" + auctionId) + "_assetGen"), asset), StringEntry((("auction_" + auctionId) + "_assetId"), toBase58String(assetId)), IntegerEntry((("auction_" + auctionId) + "_startedAt"), lastBlock.timestamp), StringEntry((("auction_" + auctionId) + "_owner"), toString(i.caller)), StringEntry((("auction_" + auctionId) + "_description"), description), IntegerEntry((("auction_" + auctionId) + "_startPrice"), startPrice), IntegerEntry((("auction_" + auctionId) + "_instantPrice"), instantPrice), StringEntry((((("address_" + toString(i.caller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))]
104+func startDuckBreeding () = {
105+ let firstAssetId = value(value(i.payments[0]).assetId)
106+ let secondAssetId = value(value(i.payments[1]).assetId)
107+ if (!(if (checkAssetInIncubator(firstAssetId))
108+ then checkAssetInIncubator(secondAssetId)
109+ else false))
110+ then throw("You need to attach 2 NFT-ducks.")
111+ else [StringEntry(getDuckParentKey(i.transactionId, 1), toBase58String(firstAssetId)), StringEntry(getDuckParentKey(i.transactionId, 2), toBase58String(secondAssetId)), StringEntry(getProcessStatusKey(toString(i.caller), i.transactionId), HatchingStarted), IntegerEntry(getProcessFinishHeightKey(toString(i.caller), i.transactionId), (height + delayForHatching))]
48112 }
49113
50114
51115
52116 @Callable(i)
53-func cancelAuction (auctionId) = {
54- let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
55- if ((toString(i.caller) != auctionOwner))
56- then throw("Only allowed to auction owner")
57- else [StringEntry((("auction_" + auctionId) + "_status"), "cancelled"), StringEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT"), ""), ScriptTransfer(i.caller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId"))))]
58- }
59-
60-
61-
62-@Callable(i)
63-func instantBuy (auctionId) = {
64- let pmt = value(i.payments[0])
65- let amount = pmt.amount
66- let auctionStatus = tryGetString((("auction_" + auctionId) + "_status"))
67- if ((pmt.assetId != unit))
68- then throw("Auction does only support WAVES payments.")
69- else if ((auctionStatus != "open"))
70- then throw("Auction is closed. You cannot place a bid.")
117+func finishDuckHatching (txIdStr) = {
118+ let txId = fromBase58String(txIdStr)
119+ let processStatusKey = getProcessStatusKey(toString(i.caller), txId)
120+ let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
121+ let duckIdKey = getDuckIdKey(toString(i.caller), txId)
122+ let processTxStatus = getStringValue(this, processStatusKey)
123+ let processFinishHeight = getIntegerValue(this, finishHeightKey)
124+ if ((processTxStatus == HatchingFinished))
125+ then {
126+ let duckId = getStringValue(this, getDuckIdKey(toString(i.caller), txId))
127+ throw(("The duck was breeded and claimed already, here is the folowing: " + duckId))
128+ }
129+ else if ((processFinishHeight > height))
130+ then throw((((("Breeding is not finished yet " + toString((processFinishHeight - height))) + " blocks remaining, it will take around ") + toString((processFinishHeight - height))) + " minutes"))
71131 else {
72- let instantPrice = tryGetInteger((("auction_" + auctionId) + "_instantPrice"))
73- if ((instantPrice > amount))
74- then throw(("For instant purchase you need to pay at least " + toString(instantPrice)))
75- else {
76- let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
77-[StringEntry((("auction_" + auctionId) + "_status"), "finished"), IntegerEntry((("auction_" + auctionId) + "_finalPrice"), amount), ScriptTransfer(addressFromStringValue(auctionOwner), amount, unit), ScriptTransfer(i.caller, 1, getBinary(this, (("auction_" + auctionId) + "_assetId")))]
78- }
79- }
80- }
81-
82-
83-
84-@Callable(i)
85-func placeBid (auctionId) = {
86- let pmt = value(i.payments[0])
87- let amount = pmt.amount
88- let bidId = toBase58String(i.transactionId)
89- if ((pmt.assetId != unit))
90- then throw("Auction does only support WAVES payments")
91- else [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.caller)), IntegerEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"), amount), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "open")]
92- }
93-
94-
95-
96-@Callable(i)
97-func cancelBid (auctionId,bidId) = {
98- let pmt = value(i.payments[0])
99- let amount = pmt.amount
100- let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
101- let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
102- if ((toString(i.caller) != bidAuthor))
103- then throw("Only allowed to the bid author")
104- else [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "cancelled"), ScriptTransfer(i.caller, bidAmount, unit)]
105- }
106-
107-
108-
109-@Callable(i)
110-func acceptBid (auctionId,bidId) = {
111- let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
112- let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
113- let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
114- let bidStatus = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"))
115- let assetId = tryGetString((("auction_" + auctionId) + "_assetId"))
116- if ((toString(i.caller) != auctionOwner))
117- then throw("Only allowed to auction owner")
118- else if ((bidStatus != "open"))
119- then throw("Bid was cancelled and cannot be accepted")
120- else {
121- let recordPrice = tryGetInteger((assetId + "_recordPrice"))
122- let newRecordPrice = max([recordPrice, bidAmount])
123-[StringEntry((("auction_" + auctionId) + "_status"), "finished"), IntegerEntry((("auction_" + auctionId) + "_finalPrice"), bidAmount), IntegerEntry((assetId + "_recordPrice"), newRecordPrice), StringEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT"), ""), ScriptTransfer(i.caller, bidAmount, unit), ScriptTransfer(addressFromStringValue(bidAuthor), 1, fromBase58String(assetId))]
132+ let duckGen = generateDuck(txId, processFinishHeight)
133+ let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
134+ let asset = Issue(duckGen, description, 1, 0, false, unit, processFinishHeight)
135+ let assetId = calculateAssetId(asset)
136+ let amount = (tryGetInteger(getDuckStatsKey(duckGen)) + 1)
137+ let parent1Id = fromBase58String(tryGetString(getDuckParentKey(txId, 1)))
138+ let parent2Id = fromBase58String(tryGetString(getDuckParentKey(txId, 2)))
139+[StringEntry(processStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), amount), asset, ScriptTransfer(i.caller, 1, assetId), ScriptTransfer(i.caller, 1, parent1Id), ScriptTransfer(i.caller, 1, parent2Id)]
124140 }
125141 }
126142
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let delayForHatching = 0
5+
6+let HatchingStarted = "BREEDING_STARTED"
7+
8+let HatchingFinished = "BREEDING_FINISHED"
9+
410 let incubatorAddress = base58'3PACKMArmh4BAEawStYmpcU62aiNTBJKvNh'
11+
12+let generations = ["G", "H", "I", "K", "L"]
13+
14+func getProcessStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status")
15+
16+
17+func getProcessFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
18+
19+
20+func getDuckParentKey (txId,parentNum) = ((("inittx_" + toBase58String(txId)) + "_parent") + toString(parentNum))
21+
22+
23+func getDuckIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di")
24+
25+
26+func getDuckStatsKey (genString) = (("stats_" + genString) + "_amount")
27+
528
629 func tryGetInteger (key) = {
730 let val = match getInteger(this, key) {
831 case b: Int =>
932 b
1033 case _ =>
1134 0
1235 }
1336 val
1437 }
1538
1639
1740 func tryGetString (key) = {
1841 let val = match getString(this, key) {
1942 case b: String =>
2043 b
2144 case _ =>
2245 ""
2346 }
2447 val
2548 }
2649
2750
28-func getAssetGenotype (assetId) = {
29- let asset = match getString(Address(incubatorAddress), toBase58String(assetId)) {
51+func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = {
52+ let randomSeedBlock = value(blockInfoByHeight(hatchingFinishHeight))
53+ (toInt((txId + value(randomSeedBlock.vrf)), offset) % variants)
54+ }
55+
56+
57+func getRandomGen (gen1,gen2,step,txId,hatchingFinishHeight) = {
58+ let randomNum = getRandomNumber(2, txId, hatchingFinishHeight, step)
59+ let gen = if ((randomNum == 0))
60+ then gen1
61+ else gen2
62+ gen
63+ }
64+
65+
66+func generateDuck (txId,hatchingFinishHeight) = {
67+ let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 30)
68+ let color = if ((colorRandom == 0))
69+ then "Y"
70+ else if ((colorRandom == 1))
71+ then "G"
72+ else if ((colorRandom == 2))
73+ then "B"
74+ else "R"
75+ let parent1Id = fromBase58String(tryGetString(getDuckParentKey(txId, 1)))
76+ let parent2Id = fromBase58String(tryGetString(getDuckParentKey(txId, 2)))
77+ let parent1Gen = split(value(assetInfo(parent1Id)).name, "")
78+ let parent2Gen = split(value(assetInfo(parent2Id)).name, "")
79+ let gen = (((((((((("DUCK-" + getRandomGen(parent1Gen[5], parent2Gen[5], 0, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[6], parent2Gen[6], 1, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[7], parent2Gen[7], 2, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[8], parent2Gen[8], 3, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[9], parent2Gen[9], 4, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[10], parent2Gen[10], 5, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[11], parent2Gen[12], 6, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[12], parent2Gen[12], 7, txId, hatchingFinishHeight)) + "-J") + color)
80+ gen
81+ }
82+
83+
84+func checkAssetInIncubator (assetId) = {
85+ let result = match getString(Address(incubatorAddress), toBase58String(assetId)) {
3086 case b: String =>
31- b
87+ true
3288 case _ =>
33- ""
89+ false
3490 }
35- asset
91+ let result2 = match getString(this, toBase58String(assetId)) {
92+ case c: String =>
93+ true
94+ case _ =>
95+ false
96+ }
97+ if (result)
98+ then true
99+ else result2
36100 }
37101
38102
39103 @Callable(i)
40-func initAuction (startPrice,instantPrice,description) = {
41- let auctionId = toBase58String(i.transactionId)
42- let pmt = value(i.payments[0])
43- let assetId = value(pmt.assetId)
44- let asset = getAssetGenotype(assetId)
45- if ((asset == ""))
46- then throw("You can only sell an NFT-duck created in incubator")
47- else [StringEntry((("auction_" + auctionId) + "_status"), "open"), StringEntry((("auction_" + auctionId) + "_assetGen"), asset), StringEntry((("auction_" + auctionId) + "_assetId"), toBase58String(assetId)), IntegerEntry((("auction_" + auctionId) + "_startedAt"), lastBlock.timestamp), StringEntry((("auction_" + auctionId) + "_owner"), toString(i.caller)), StringEntry((("auction_" + auctionId) + "_description"), description), IntegerEntry((("auction_" + auctionId) + "_startPrice"), startPrice), IntegerEntry((("auction_" + auctionId) + "_instantPrice"), instantPrice), StringEntry((((("address_" + toString(i.caller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))]
104+func startDuckBreeding () = {
105+ let firstAssetId = value(value(i.payments[0]).assetId)
106+ let secondAssetId = value(value(i.payments[1]).assetId)
107+ if (!(if (checkAssetInIncubator(firstAssetId))
108+ then checkAssetInIncubator(secondAssetId)
109+ else false))
110+ then throw("You need to attach 2 NFT-ducks.")
111+ else [StringEntry(getDuckParentKey(i.transactionId, 1), toBase58String(firstAssetId)), StringEntry(getDuckParentKey(i.transactionId, 2), toBase58String(secondAssetId)), StringEntry(getProcessStatusKey(toString(i.caller), i.transactionId), HatchingStarted), IntegerEntry(getProcessFinishHeightKey(toString(i.caller), i.transactionId), (height + delayForHatching))]
48112 }
49113
50114
51115
52116 @Callable(i)
53-func cancelAuction (auctionId) = {
54- let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
55- if ((toString(i.caller) != auctionOwner))
56- then throw("Only allowed to auction owner")
57- else [StringEntry((("auction_" + auctionId) + "_status"), "cancelled"), StringEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT"), ""), ScriptTransfer(i.caller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId"))))]
58- }
59-
60-
61-
62-@Callable(i)
63-func instantBuy (auctionId) = {
64- let pmt = value(i.payments[0])
65- let amount = pmt.amount
66- let auctionStatus = tryGetString((("auction_" + auctionId) + "_status"))
67- if ((pmt.assetId != unit))
68- then throw("Auction does only support WAVES payments.")
69- else if ((auctionStatus != "open"))
70- then throw("Auction is closed. You cannot place a bid.")
117+func finishDuckHatching (txIdStr) = {
118+ let txId = fromBase58String(txIdStr)
119+ let processStatusKey = getProcessStatusKey(toString(i.caller), txId)
120+ let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
121+ let duckIdKey = getDuckIdKey(toString(i.caller), txId)
122+ let processTxStatus = getStringValue(this, processStatusKey)
123+ let processFinishHeight = getIntegerValue(this, finishHeightKey)
124+ if ((processTxStatus == HatchingFinished))
125+ then {
126+ let duckId = getStringValue(this, getDuckIdKey(toString(i.caller), txId))
127+ throw(("The duck was breeded and claimed already, here is the folowing: " + duckId))
128+ }
129+ else if ((processFinishHeight > height))
130+ then throw((((("Breeding is not finished yet " + toString((processFinishHeight - height))) + " blocks remaining, it will take around ") + toString((processFinishHeight - height))) + " minutes"))
71131 else {
72- let instantPrice = tryGetInteger((("auction_" + auctionId) + "_instantPrice"))
73- if ((instantPrice > amount))
74- then throw(("For instant purchase you need to pay at least " + toString(instantPrice)))
75- else {
76- let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
77-[StringEntry((("auction_" + auctionId) + "_status"), "finished"), IntegerEntry((("auction_" + auctionId) + "_finalPrice"), amount), ScriptTransfer(addressFromStringValue(auctionOwner), amount, unit), ScriptTransfer(i.caller, 1, getBinary(this, (("auction_" + auctionId) + "_assetId")))]
78- }
79- }
80- }
81-
82-
83-
84-@Callable(i)
85-func placeBid (auctionId) = {
86- let pmt = value(i.payments[0])
87- let amount = pmt.amount
88- let bidId = toBase58String(i.transactionId)
89- if ((pmt.assetId != unit))
90- then throw("Auction does only support WAVES payments")
91- else [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.caller)), IntegerEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"), amount), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "open")]
92- }
93-
94-
95-
96-@Callable(i)
97-func cancelBid (auctionId,bidId) = {
98- let pmt = value(i.payments[0])
99- let amount = pmt.amount
100- let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
101- let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
102- if ((toString(i.caller) != bidAuthor))
103- then throw("Only allowed to the bid author")
104- else [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "cancelled"), ScriptTransfer(i.caller, bidAmount, unit)]
105- }
106-
107-
108-
109-@Callable(i)
110-func acceptBid (auctionId,bidId) = {
111- let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
112- let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
113- let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
114- let bidStatus = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"))
115- let assetId = tryGetString((("auction_" + auctionId) + "_assetId"))
116- if ((toString(i.caller) != auctionOwner))
117- then throw("Only allowed to auction owner")
118- else if ((bidStatus != "open"))
119- then throw("Bid was cancelled and cannot be accepted")
120- else {
121- let recordPrice = tryGetInteger((assetId + "_recordPrice"))
122- let newRecordPrice = max([recordPrice, bidAmount])
123-[StringEntry((("auction_" + auctionId) + "_status"), "finished"), IntegerEntry((("auction_" + auctionId) + "_finalPrice"), bidAmount), IntegerEntry((assetId + "_recordPrice"), newRecordPrice), StringEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT"), ""), ScriptTransfer(i.caller, bidAmount, unit), ScriptTransfer(addressFromStringValue(bidAuthor), 1, fromBase58String(assetId))]
132+ let duckGen = generateDuck(txId, processFinishHeight)
133+ let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
134+ let asset = Issue(duckGen, description, 1, 0, false, unit, processFinishHeight)
135+ let assetId = calculateAssetId(asset)
136+ let amount = (tryGetInteger(getDuckStatsKey(duckGen)) + 1)
137+ let parent1Id = fromBase58String(tryGetString(getDuckParentKey(txId, 1)))
138+ let parent2Id = fromBase58String(tryGetString(getDuckParentKey(txId, 2)))
139+[StringEntry(processStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), amount), asset, ScriptTransfer(i.caller, 1, assetId), ScriptTransfer(i.caller, 1, parent1Id), ScriptTransfer(i.caller, 1, parent2Id)]
124140 }
125141 }
126142
127143
128144 @Verifier(tx)
129145 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
130146

github/deemru/w8io/3ef1775 
50.67 ms