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:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let delayForHatching = 0 | |
5 | + | ||
6 | + | let HatchingStarted = "BREEDING_STARTED" | |
7 | + | ||
8 | + | let HatchingFinished = "BREEDING_FINISHED" | |
9 | + | ||
4 | 10 | 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 | + | ||
5 | 28 | ||
6 | 29 | func tryGetInteger (key) = { | |
7 | 30 | let val = match getInteger(this, key) { | |
25 | 48 | } | |
26 | 49 | ||
27 | 50 | ||
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)) { | |
30 | 86 | case b: String => | |
31 | - | | |
87 | + | true | |
32 | 88 | case _ => | |
33 | - | | |
89 | + | false | |
34 | 90 | } | |
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 | |
36 | 100 | } | |
37 | 101 | ||
38 | 102 | ||
39 | 103 | @Callable(i) | |
40 | - | func | |
41 | - | let | |
42 | - | let | |
43 | - | | |
44 | - | | |
45 | - | | |
46 | - | then throw("You | |
47 | - | else [StringEntry(( | |
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))] | |
48 | 112 | } | |
49 | 113 | ||
50 | 114 | ||
51 | 115 | ||
52 | 116 | @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")) | |
71 | 131 | 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)] | |
124 | 140 | } | |
125 | 141 | } | |
126 | 142 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let delayForHatching = 0 | |
5 | + | ||
6 | + | let HatchingStarted = "BREEDING_STARTED" | |
7 | + | ||
8 | + | let HatchingFinished = "BREEDING_FINISHED" | |
9 | + | ||
4 | 10 | 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 | + | ||
5 | 28 | ||
6 | 29 | func tryGetInteger (key) = { | |
7 | 30 | let val = match getInteger(this, key) { | |
8 | 31 | case b: Int => | |
9 | 32 | b | |
10 | 33 | case _ => | |
11 | 34 | 0 | |
12 | 35 | } | |
13 | 36 | val | |
14 | 37 | } | |
15 | 38 | ||
16 | 39 | ||
17 | 40 | func tryGetString (key) = { | |
18 | 41 | let val = match getString(this, key) { | |
19 | 42 | case b: String => | |
20 | 43 | b | |
21 | 44 | case _ => | |
22 | 45 | "" | |
23 | 46 | } | |
24 | 47 | val | |
25 | 48 | } | |
26 | 49 | ||
27 | 50 | ||
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)) { | |
30 | 86 | case b: String => | |
31 | - | | |
87 | + | true | |
32 | 88 | case _ => | |
33 | - | | |
89 | + | false | |
34 | 90 | } | |
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 | |
36 | 100 | } | |
37 | 101 | ||
38 | 102 | ||
39 | 103 | @Callable(i) | |
40 | - | func | |
41 | - | let | |
42 | - | let | |
43 | - | | |
44 | - | | |
45 | - | | |
46 | - | then throw("You | |
47 | - | else [StringEntry(( | |
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))] | |
48 | 112 | } | |
49 | 113 | ||
50 | 114 | ||
51 | 115 | ||
52 | 116 | @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")) | |
71 | 131 | 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)] | |
124 | 140 | } | |
125 | 141 | } | |
126 | 142 | ||
127 | 143 | ||
128 | 144 | @Verifier(tx) | |
129 | 145 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
130 | 146 |
github/deemru/w8io/3ef1775 50.67 ms ◑