tx · CSXRdRX1rhq669GKAGiKy8fXTU5sbrXUgJaBQDztCMLT 3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv: -0.01400000 Waves 2021.12.15 17:41 [2900492] smart account 3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv > SELF 0.00000000 Waves
{ "type": 13, "id": "CSXRdRX1rhq669GKAGiKy8fXTU5sbrXUgJaBQDztCMLT", "fee": 1400000, "feeAssetId": null, "timestamp": 1639579337886, "version": 2, "chainId": 87, "sender": "3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv", "senderPublicKey": "EBHsV7TQYm4qS2V7iZXEXwcbUdEYQyCSLEdY2AMvLPns", "proofs": [ "2dvGnrRcfXuAGSY5UpahqSHn1nDrN3ZbMrqY2FampS3mguPhbBDXEPQbJoGtWnw9EtD5e7BpiWgkXBBNJSmz9xrh" ], "script": "base64:AAIFAAAAAAAABO0IAhIDCgEIEgMKAQgSBAoCCAgSBQoDCAgIEgQKAggIGhkKAUESFGhhdGNoaW5nRmluaXNoSGVpZ2h0GgsKAUISBm9mZnNldBoUCgFDEg9yYW5kb21TZWVkQmxvY2saDwoBRBIKcmFuZG9tSGFzaBoSCgFFEg13YXNVbmlxdWVCb3JuGggKAUYSA2dlbhoSCgFHEg1nZXRSYW5kb21OYW1lGhIKAUgSDWphY2twb3RSYW5kb20aDwoBSRIKdHlwZVJhbmRvbRoQCgFKEgtjb2xvclJhbmRvbRoKCgFLEgVjb2xvchoaCgFMEhVjb3VudEVnZ3NOZWVkZWRBbW91bnQaFQoBTRIQdG90YWxEdWNrc0Ftb3VudBoGCgFOEgFuGgYKAU8SAWcaBgoBUBIBdBoKCgFREgVwcmljZRoGCgFSEgFpGhMKAVMSDnJlZmVyZXJBZGRyZXNzGhYKAVQSEWNhbGxlZEJ5QmFieUR1Y2tzGg8KAVUSCmVnZ3NOZWVkZWQaEQoBVhIMZmlyc3RQYXltZW50GgwKAVcSB3Jlc3VsdHMaEgoBWBINcmVmZXJlclJld2FyZBoMCgFZEgdyZWZDYWxsGgwKAVoSB3R4SWRTdHIaEAoBYRILZWdnc0Fzc2V0SWQaFwoCYWESEWhhdGNoaW5nU3RhdHVzS2V5GhUKAmFiEg9maW5pc2hIZWlnaHRLZXkaDwoCYWMSCWR1Y2tJZEtleRoWCgJhZBIQaGF0Y2hpbmdUeFN0YXR1cxoMCgJhZRIGZHVja0lkGhEKAmFmEgskdDA1Mjg4NTM1NBoNCgJhZxIHZHVja0dlbhoNCgJhaBIHZmFybUdlbhoRCgJhaRILZGVzY3JpcHRpb24aCwoCYWoSBWFzc2V0Gg0KAmFrEgdhc3NldElkGgwKAmFsEgZhbW91bnQaEQoCYW0SCyR0MDY1MjQ2NjA5GhEKAmFuEgskdDA4MDYyODExNBoKCgJhbxIEZkdlbhoMCgJhcBIGbGV0dGVyGggKAmFxEgJ0eBoMCgJhchIGdmVyaWZ5GhUKAWISEGRlbGF5Rm9ySGF0Y2hpbmcaGAoBYxITZGlzY291bnRDb2VmZmljaWVudBoQCgFkEgt0eXBlc0Ftb3VudBoXCgFlEhJyZWZDb250cmFjdEFkZHJlc3MaEgoBZhINUmVmZXJl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", "height": 2900492, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6Hds66BLupA7ce6tf8QcMKM4nh8sQaoMUgy9EWLejLNT Next: 4P72PbGEekYMwb3gQwf8vZHNCGmfJw5xYTThvXE6XE41 Diff:
Old | New | Differences | |
---|---|---|---|
5 | 5 | ||
6 | 6 | let delayForHatching = 2 | |
7 | 7 | ||
8 | - | let typesAmount = 9 | |
8 | + | let discountCoefficient = 10 | |
9 | + | ||
10 | + | let typesAmount = 7 | |
9 | 11 | ||
10 | 12 | let refContractAddress = base58'3P8ejTkfRpz9WqCwCuihesNXU5k3zmFFfVe' | |
11 | 13 | ||
16 | 18 | let HatchingFinished = "HATCHING_FINISHED" | |
17 | 19 | ||
18 | 20 | let rebirthAddress = base58'3PCC6fVHNa6289DTDmcUo3RuLaFmteZZsmQ' | |
21 | + | ||
22 | + | let babyDucksAddress = base58'3PKmLiGEfqLWMC1H9xhzqvAZKUXfFm8uoeg' | |
19 | 23 | ||
20 | 24 | func isLocked () = { | |
21 | 25 | let masterAddress = Address(base58'3PEPftf2kWZDmAaWBjs6BUJa9957kiA2PkU') | |
51 | 55 | } | |
52 | 56 | ||
53 | 57 | ||
54 | - | let discountCoefficient = tryGetInteger("discountCoefficient") | |
55 | - | ||
56 | 58 | func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = { | |
57 | 59 | let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1))) | |
58 | 60 | let randomHash = sha256((txId + value(randomSeedBlock.vrf))) | |
65 | 67 | ||
66 | 68 | func getRandomName (txId,hatchingFinishHeight) = { | |
67 | 69 | let jackpotRandom = getRandomNumber(500, txId, hatchingFinishHeight, 0) | |
68 | - | if (if ((jackpotRandom == | |
69 | - | then (wasUniqueBorn("DUCK- | |
70 | + | if (if ((jackpotRandom == 111)) | |
71 | + | then (wasUniqueBorn("DUCK-WWWWWWWM-JU") == 0) | |
70 | 72 | else false) | |
71 | - | then $Tuple2("DUCK-WWWWWWWF-JU", "8W-J") | |
72 | - | else if (if ((jackpotRandom == 128)) | |
73 | - | then (wasUniqueBorn("DUCK-WWWWWSX2-JU") == 0) | |
74 | - | else false) | |
75 | - | then $Tuple2("DUCK-WWWWWSX2-JU", "8W-J") | |
76 | - | else if (if (if (if (if (if (if (if (if (if (if ((jackpotRandom == 154)) | |
77 | - | then true | |
78 | - | else (jackpotRandom == 155)) | |
79 | - | then true | |
80 | - | else (jackpotRandom == 156)) | |
81 | - | then true | |
82 | - | else (jackpotRandom == 157)) | |
83 | - | then true | |
84 | - | else (jackpotRandom == 158)) | |
85 | - | then true | |
86 | - | else (jackpotRandom == 159)) | |
87 | - | then true | |
88 | - | else (jackpotRandom == 160)) | |
89 | - | then true | |
90 | - | else (jackpotRandom == 161)) | |
91 | - | then true | |
92 | - | else (jackpotRandom == 162)) | |
93 | - | then true | |
94 | - | else (jackpotRandom == 163)) | |
95 | - | then (wasUniqueBorn("DUCK-WWWWHELL-JU") == 0) | |
96 | - | else false) | |
97 | - | then $Tuple2("DUCK-WWWWHELL-JU", "8W-J") | |
98 | - | else if (if ((jackpotRandom == 401)) | |
99 | - | then (wasUniqueBorn("DUCK-WWWWWSX4-JU") == 0) | |
100 | - | else false) | |
101 | - | then $Tuple2("DUCK-WWWWWSX4-JU", "8W-J") | |
102 | - | else if (if ((jackpotRandom == 402)) | |
103 | - | then (wasUniqueBorn("DUCK-WWWSQUID-JU") == 0) | |
104 | - | else false) | |
105 | - | then $Tuple2("DUCK-WWWSQUID-JU", "8W-J") | |
106 | - | else { | |
107 | - | let typeRandom = getRandomNumber(4, txId, hatchingFinishHeight, 0) | |
108 | - | let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 1) | |
109 | - | let color = if ((colorRandom == 0)) | |
110 | - | then "Y" | |
111 | - | else if ((colorRandom == 1)) | |
112 | - | then "G" | |
113 | - | else if ((colorRandom == 2)) | |
114 | - | then "B" | |
115 | - | else "R" | |
116 | - | if ((typeRandom == 0)) | |
117 | - | then $Tuple2(("DUCK-FFFFFFFF-G" + color), "8F-G") | |
118 | - | else if ((typeRandom == 1)) | |
119 | - | then $Tuple2(("DUCK-HHHHHHHH-G" + color), "8H-G") | |
120 | - | else if ((typeRandom == 2)) | |
121 | - | then $Tuple2(("DUCK-GGGGGGGG-G" + color), "8G-G") | |
122 | - | else $Tuple2(("DUCK-IIIIIIII-G" + color), "8I-G") | |
123 | - | } | |
73 | + | then $Tuple2("DUCK-WWWWWWWM-JU", "8W-J") | |
74 | + | else { | |
75 | + | let typeRandom = getRandomNumber(4, txId, hatchingFinishHeight, 0) | |
76 | + | let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 1) | |
77 | + | let color = if ((colorRandom == 0)) | |
78 | + | then "Y" | |
79 | + | else if ((colorRandom == 1)) | |
80 | + | then "G" | |
81 | + | else if ((colorRandom == 2)) | |
82 | + | then "B" | |
83 | + | else "R" | |
84 | + | if ((typeRandom == 0)) | |
85 | + | then $Tuple2(("DUCK-FFFFFFFF-G" + color), "8F-G") | |
86 | + | else if ((typeRandom == 1)) | |
87 | + | then $Tuple2(("DUCK-HHHHHHHH-G" + color), "8H-G") | |
88 | + | else if ((typeRandom == 2)) | |
89 | + | then $Tuple2(("DUCK-GGGGGGGG-G" + color), "8G-G") | |
90 | + | else $Tuple2(("DUCK-IIIIIIII-G" + color), "8I-G") | |
91 | + | } | |
124 | 92 | } | |
125 | 93 | ||
126 | 94 | ||
134 | 102 | ||
135 | 103 | ||
136 | 104 | @Callable(i) | |
137 | - | func setDiscount (val) = if ((i.caller != this)) | |
138 | - | then throw("admin_only") | |
139 | - | else [IntegerEntry("discountCoefficient", val)] | |
140 | - | ||
141 | - | ||
142 | - | ||
143 | - | @Callable(i) | |
144 | 105 | func startDuckHatching (refererAddress) = if ((isLocked() > 0)) | |
145 | 106 | then throw("EGG operations are temporarily locked") | |
146 | 107 | else { | |
108 | + | let calledByBabyDucks = if ((i.caller == Address(babyDucksAddress))) | |
109 | + | then true | |
110 | + | else false | |
147 | 111 | let totalDucksAmount = tryGetInteger("ducks_amount") | |
148 | 112 | let eggsNeeded = countEggsNeededAmount(totalDucksAmount) | |
149 | 113 | let firstPayment = value(i.payments[0]) | |
150 | - | if ((firstPayment.assetId != eggsAssetId)) | |
151 | - | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId))) | |
152 | - | else if ((eggsNeeded > firstPayment.amount)) | |
153 | - | then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded))) | |
154 | - | else { | |
155 | - | let refererReward = fraction(eggsNeeded, RefererReward, 100) | |
156 | - | let refCall = invoke(Address(refContractAddress), "refPayment", [refererAddress], [AttachedPayment(eggsAssetId, refererReward)]) | |
157 | - | if ((refCall == refCall)) | |
158 | - | then [StringEntry(getHatchingStatusKey(toString(i.caller), i.transactionId), HatchingStarted), IntegerEntry(getHatchingFinishHeightKey(toString(i.caller), i.transactionId), (height + delayForHatching)), IntegerEntry("ducks_amount", (totalDucksAmount + 1)), IntegerEntry("ducks_last_price", (eggsNeeded / 1000000)), ScriptTransfer(i.caller, (firstPayment.amount - eggsNeeded), eggsAssetId)] | |
159 | - | else throw("Strict value is not equal to itself.") | |
160 | - | } | |
114 | + | let results = [StringEntry(getHatchingStatusKey(toString(i.originCaller), i.transactionId), HatchingStarted), IntegerEntry(getHatchingFinishHeightKey(toString(i.originCaller), i.transactionId), (height + delayForHatching)), IntegerEntry("ducks_amount", (totalDucksAmount + 1)), IntegerEntry("ducks_last_price", (eggsNeeded / 1000000))] | |
115 | + | if (calledByBabyDucks) | |
116 | + | then results | |
117 | + | else if ((firstPayment.assetId != eggsAssetId)) | |
118 | + | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId))) | |
119 | + | else if ((eggsNeeded > firstPayment.amount)) | |
120 | + | then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded))) | |
121 | + | else { | |
122 | + | let refererReward = fraction(eggsNeeded, RefererReward, 100) | |
123 | + | let refCall = invoke(Address(refContractAddress), "refPayment", [refererAddress], [AttachedPayment(eggsAssetId, refererReward)]) | |
124 | + | if ((refCall == refCall)) | |
125 | + | then (results ++ [ScriptTransfer(i.caller, (firstPayment.amount - eggsNeeded), eggsAssetId)]) | |
126 | + | else throw("Strict value is not equal to itself.") | |
127 | + | } | |
161 | 128 | } | |
162 | 129 | ||
163 | 130 | ||
178 | 145 | else if ((hatchingFinishHeight > height)) | |
179 | 146 | then throw((((("Hatching is not finished yet " + toString((hatchingFinishHeight - height))) + " blocks remaining, it will take around ") + toString((hatchingFinishHeight - height))) + " minutes")) | |
180 | 147 | else { | |
181 | - | let $ | |
182 | - | let duckGen = $ | |
183 | - | let farmGen = $ | |
148 | + | let $t052885354 = getRandomName(txId, hatchingFinishHeight) | |
149 | + | let duckGen = $t052885354._1 | |
150 | + | let farmGen = $t052885354._2 | |
184 | 151 | let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}") | |
185 | 152 | let asset = Issue(duckGen, description, 1, 0, false, unit, hatchingFinishHeight) | |
186 | 153 | let assetId = calculateAssetId(asset) | |
193 | 160 | ||
194 | 161 | @Callable(i) | |
195 | 162 | func issueFreeDuck (address,txIdStr) = if ((i.caller != Address(rebirthAddress))) | |
196 | - | then throw("rebirth only") | |
163 | + | then throw("rebirth or baby ducks only") | |
197 | 164 | else { | |
198 | 165 | let txId = fromBase58String(txIdStr) | |
199 | 166 | let hatchingStatusKey = getHatchingStatusKey(address, txId) | |
200 | 167 | let finishHeightKey = getHatchingFinishHeightKey(address, txId) | |
201 | 168 | let totalDucksAmount = tryGetInteger("ducks_amount") | |
202 | 169 | let eggsNeeded = countEggsNeededAmount(totalDucksAmount) | |
203 | - | let $ | |
204 | - | let duckGen = $ | |
205 | - | let farmGen = $ | |
170 | + | let $t065246609 = getRandomName(txId, (value(transactionHeightById(txId)) + 1)) | |
171 | + | let duckGen = $t065246609._1 | |
172 | + | let farmGen = $t065246609._2 | |
206 | 173 | let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}") | |
207 | 174 | let asset = Issue(duckGen, description, 1, 0, false, unit, height) | |
208 | 175 | let assetId = calculateAssetId(asset) | |
224 | 191 | let finishHeightKey = getHatchingFinishHeightKey(address, txId) | |
225 | 192 | let totalDucksAmount = tryGetInteger("ducks_amount") | |
226 | 193 | let eggsNeeded = countEggsNeededAmount(totalDucksAmount) | |
227 | - | let $ | |
228 | - | let duckGen = $ | |
229 | - | let farmGen = $ | |
194 | + | let $t080628114 = $Tuple2((("DUCK-" + gen) + "-JU"), "8W-J") | |
195 | + | let duckGen = $t080628114._1 | |
196 | + | let farmGen = $t080628114._2 | |
230 | 197 | let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}") | |
231 | 198 | let asset = Issue(duckGen, description, 1, 0, false, unit, height) | |
232 | 199 | let assetId = calculateAssetId(asset) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let eggsAssetId = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS' | |
5 | 5 | ||
6 | 6 | let delayForHatching = 2 | |
7 | 7 | ||
8 | - | let typesAmount = 9 | |
8 | + | let discountCoefficient = 10 | |
9 | + | ||
10 | + | let typesAmount = 7 | |
9 | 11 | ||
10 | 12 | let refContractAddress = base58'3P8ejTkfRpz9WqCwCuihesNXU5k3zmFFfVe' | |
11 | 13 | ||
12 | 14 | let RefererReward = 5 | |
13 | 15 | ||
14 | 16 | let HatchingStarted = "HATCHING_STARTED" | |
15 | 17 | ||
16 | 18 | let HatchingFinished = "HATCHING_FINISHED" | |
17 | 19 | ||
18 | 20 | let rebirthAddress = base58'3PCC6fVHNa6289DTDmcUo3RuLaFmteZZsmQ' | |
21 | + | ||
22 | + | let babyDucksAddress = base58'3PKmLiGEfqLWMC1H9xhzqvAZKUXfFm8uoeg' | |
19 | 23 | ||
20 | 24 | func isLocked () = { | |
21 | 25 | let masterAddress = Address(base58'3PEPftf2kWZDmAaWBjs6BUJa9957kiA2PkU') | |
22 | 26 | match getInteger(masterAddress, "egglock") { | |
23 | 27 | case b: Int => | |
24 | 28 | b | |
25 | 29 | case _ => | |
26 | 30 | 0 | |
27 | 31 | } | |
28 | 32 | } | |
29 | 33 | ||
30 | 34 | ||
31 | 35 | func getHatchingStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status") | |
32 | 36 | ||
33 | 37 | ||
34 | 38 | func getHatchingFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh") | |
35 | 39 | ||
36 | 40 | ||
37 | 41 | func getDuckIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di") | |
38 | 42 | ||
39 | 43 | ||
40 | 44 | func getDuckStatsKey (genString) = (("stats_" + genString) + "_amount") | |
41 | 45 | ||
42 | 46 | ||
43 | 47 | func tryGetInteger (key) = { | |
44 | 48 | let val = match getInteger(this, key) { | |
45 | 49 | case b: Int => | |
46 | 50 | b | |
47 | 51 | case _ => | |
48 | 52 | 0 | |
49 | 53 | } | |
50 | 54 | val | |
51 | 55 | } | |
52 | 56 | ||
53 | 57 | ||
54 | - | let discountCoefficient = tryGetInteger("discountCoefficient") | |
55 | - | ||
56 | 58 | func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = { | |
57 | 59 | let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1))) | |
58 | 60 | let randomHash = sha256((txId + value(randomSeedBlock.vrf))) | |
59 | 61 | (toInt(randomHash, (offset * 8)) % variants) | |
60 | 62 | } | |
61 | 63 | ||
62 | 64 | ||
63 | 65 | func wasUniqueBorn (gen) = tryGetInteger(getDuckStatsKey(gen)) | |
64 | 66 | ||
65 | 67 | ||
66 | 68 | func getRandomName (txId,hatchingFinishHeight) = { | |
67 | 69 | let jackpotRandom = getRandomNumber(500, txId, hatchingFinishHeight, 0) | |
68 | - | if (if ((jackpotRandom == | |
69 | - | then (wasUniqueBorn("DUCK- | |
70 | + | if (if ((jackpotRandom == 111)) | |
71 | + | then (wasUniqueBorn("DUCK-WWWWWWWM-JU") == 0) | |
70 | 72 | else false) | |
71 | - | then $Tuple2("DUCK-WWWWWWWF-JU", "8W-J") | |
72 | - | else if (if ((jackpotRandom == 128)) | |
73 | - | then (wasUniqueBorn("DUCK-WWWWWSX2-JU") == 0) | |
74 | - | else false) | |
75 | - | then $Tuple2("DUCK-WWWWWSX2-JU", "8W-J") | |
76 | - | else if (if (if (if (if (if (if (if (if (if (if ((jackpotRandom == 154)) | |
77 | - | then true | |
78 | - | else (jackpotRandom == 155)) | |
79 | - | then true | |
80 | - | else (jackpotRandom == 156)) | |
81 | - | then true | |
82 | - | else (jackpotRandom == 157)) | |
83 | - | then true | |
84 | - | else (jackpotRandom == 158)) | |
85 | - | then true | |
86 | - | else (jackpotRandom == 159)) | |
87 | - | then true | |
88 | - | else (jackpotRandom == 160)) | |
89 | - | then true | |
90 | - | else (jackpotRandom == 161)) | |
91 | - | then true | |
92 | - | else (jackpotRandom == 162)) | |
93 | - | then true | |
94 | - | else (jackpotRandom == 163)) | |
95 | - | then (wasUniqueBorn("DUCK-WWWWHELL-JU") == 0) | |
96 | - | else false) | |
97 | - | then $Tuple2("DUCK-WWWWHELL-JU", "8W-J") | |
98 | - | else if (if ((jackpotRandom == 401)) | |
99 | - | then (wasUniqueBorn("DUCK-WWWWWSX4-JU") == 0) | |
100 | - | else false) | |
101 | - | then $Tuple2("DUCK-WWWWWSX4-JU", "8W-J") | |
102 | - | else if (if ((jackpotRandom == 402)) | |
103 | - | then (wasUniqueBorn("DUCK-WWWSQUID-JU") == 0) | |
104 | - | else false) | |
105 | - | then $Tuple2("DUCK-WWWSQUID-JU", "8W-J") | |
106 | - | else { | |
107 | - | let typeRandom = getRandomNumber(4, txId, hatchingFinishHeight, 0) | |
108 | - | let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 1) | |
109 | - | let color = if ((colorRandom == 0)) | |
110 | - | then "Y" | |
111 | - | else if ((colorRandom == 1)) | |
112 | - | then "G" | |
113 | - | else if ((colorRandom == 2)) | |
114 | - | then "B" | |
115 | - | else "R" | |
116 | - | if ((typeRandom == 0)) | |
117 | - | then $Tuple2(("DUCK-FFFFFFFF-G" + color), "8F-G") | |
118 | - | else if ((typeRandom == 1)) | |
119 | - | then $Tuple2(("DUCK-HHHHHHHH-G" + color), "8H-G") | |
120 | - | else if ((typeRandom == 2)) | |
121 | - | then $Tuple2(("DUCK-GGGGGGGG-G" + color), "8G-G") | |
122 | - | else $Tuple2(("DUCK-IIIIIIII-G" + color), "8I-G") | |
123 | - | } | |
73 | + | then $Tuple2("DUCK-WWWWWWWM-JU", "8W-J") | |
74 | + | else { | |
75 | + | let typeRandom = getRandomNumber(4, txId, hatchingFinishHeight, 0) | |
76 | + | let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 1) | |
77 | + | let color = if ((colorRandom == 0)) | |
78 | + | then "Y" | |
79 | + | else if ((colorRandom == 1)) | |
80 | + | then "G" | |
81 | + | else if ((colorRandom == 2)) | |
82 | + | then "B" | |
83 | + | else "R" | |
84 | + | if ((typeRandom == 0)) | |
85 | + | then $Tuple2(("DUCK-FFFFFFFF-G" + color), "8F-G") | |
86 | + | else if ((typeRandom == 1)) | |
87 | + | then $Tuple2(("DUCK-HHHHHHHH-G" + color), "8H-G") | |
88 | + | else if ((typeRandom == 2)) | |
89 | + | then $Tuple2(("DUCK-GGGGGGGG-G" + color), "8G-G") | |
90 | + | else $Tuple2(("DUCK-IIIIIIII-G" + color), "8I-G") | |
91 | + | } | |
124 | 92 | } | |
125 | 93 | ||
126 | 94 | ||
127 | 95 | func countEggsNeededAmount (totalDucksAmount) = { | |
128 | 96 | let n = totalDucksAmount | |
129 | 97 | let g = discountCoefficient | |
130 | 98 | let t = typesAmount | |
131 | 99 | let price = pow((100 + ((n * g) / (10 * t))), 2, 5, 1, 2, DOWN) | |
132 | 100 | (price * 1000000) | |
133 | 101 | } | |
134 | 102 | ||
135 | 103 | ||
136 | 104 | @Callable(i) | |
137 | - | func setDiscount (val) = if ((i.caller != this)) | |
138 | - | then throw("admin_only") | |
139 | - | else [IntegerEntry("discountCoefficient", val)] | |
140 | - | ||
141 | - | ||
142 | - | ||
143 | - | @Callable(i) | |
144 | 105 | func startDuckHatching (refererAddress) = if ((isLocked() > 0)) | |
145 | 106 | then throw("EGG operations are temporarily locked") | |
146 | 107 | else { | |
108 | + | let calledByBabyDucks = if ((i.caller == Address(babyDucksAddress))) | |
109 | + | then true | |
110 | + | else false | |
147 | 111 | let totalDucksAmount = tryGetInteger("ducks_amount") | |
148 | 112 | let eggsNeeded = countEggsNeededAmount(totalDucksAmount) | |
149 | 113 | let firstPayment = value(i.payments[0]) | |
150 | - | if ((firstPayment.assetId != eggsAssetId)) | |
151 | - | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId))) | |
152 | - | else if ((eggsNeeded > firstPayment.amount)) | |
153 | - | then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded))) | |
154 | - | else { | |
155 | - | let refererReward = fraction(eggsNeeded, RefererReward, 100) | |
156 | - | let refCall = invoke(Address(refContractAddress), "refPayment", [refererAddress], [AttachedPayment(eggsAssetId, refererReward)]) | |
157 | - | if ((refCall == refCall)) | |
158 | - | then [StringEntry(getHatchingStatusKey(toString(i.caller), i.transactionId), HatchingStarted), IntegerEntry(getHatchingFinishHeightKey(toString(i.caller), i.transactionId), (height + delayForHatching)), IntegerEntry("ducks_amount", (totalDucksAmount + 1)), IntegerEntry("ducks_last_price", (eggsNeeded / 1000000)), ScriptTransfer(i.caller, (firstPayment.amount - eggsNeeded), eggsAssetId)] | |
159 | - | else throw("Strict value is not equal to itself.") | |
160 | - | } | |
114 | + | let results = [StringEntry(getHatchingStatusKey(toString(i.originCaller), i.transactionId), HatchingStarted), IntegerEntry(getHatchingFinishHeightKey(toString(i.originCaller), i.transactionId), (height + delayForHatching)), IntegerEntry("ducks_amount", (totalDucksAmount + 1)), IntegerEntry("ducks_last_price", (eggsNeeded / 1000000))] | |
115 | + | if (calledByBabyDucks) | |
116 | + | then results | |
117 | + | else if ((firstPayment.assetId != eggsAssetId)) | |
118 | + | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId))) | |
119 | + | else if ((eggsNeeded > firstPayment.amount)) | |
120 | + | then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded))) | |
121 | + | else { | |
122 | + | let refererReward = fraction(eggsNeeded, RefererReward, 100) | |
123 | + | let refCall = invoke(Address(refContractAddress), "refPayment", [refererAddress], [AttachedPayment(eggsAssetId, refererReward)]) | |
124 | + | if ((refCall == refCall)) | |
125 | + | then (results ++ [ScriptTransfer(i.caller, (firstPayment.amount - eggsNeeded), eggsAssetId)]) | |
126 | + | else throw("Strict value is not equal to itself.") | |
127 | + | } | |
161 | 128 | } | |
162 | 129 | ||
163 | 130 | ||
164 | 131 | ||
165 | 132 | @Callable(i) | |
166 | 133 | func finishDuckHatching (txIdStr) = { | |
167 | 134 | let txId = fromBase58String(txIdStr) | |
168 | 135 | let hatchingStatusKey = getHatchingStatusKey(toString(i.caller), txId) | |
169 | 136 | let finishHeightKey = getHatchingFinishHeightKey(toString(i.caller), txId) | |
170 | 137 | let duckIdKey = getDuckIdKey(toString(i.caller), txId) | |
171 | 138 | let hatchingTxStatus = getStringValue(this, hatchingStatusKey) | |
172 | 139 | let hatchingFinishHeight = getIntegerValue(this, finishHeightKey) | |
173 | 140 | if ((hatchingTxStatus == HatchingFinished)) | |
174 | 141 | then { | |
175 | 142 | let duckId = getStringValue(this, getDuckIdKey(toString(i.caller), txId)) | |
176 | 143 | throw(("The duck was hatched and claimed already, here is the folowing: " + duckId)) | |
177 | 144 | } | |
178 | 145 | else if ((hatchingFinishHeight > height)) | |
179 | 146 | then throw((((("Hatching is not finished yet " + toString((hatchingFinishHeight - height))) + " blocks remaining, it will take around ") + toString((hatchingFinishHeight - height))) + " minutes")) | |
180 | 147 | else { | |
181 | - | let $ | |
182 | - | let duckGen = $ | |
183 | - | let farmGen = $ | |
148 | + | let $t052885354 = getRandomName(txId, hatchingFinishHeight) | |
149 | + | let duckGen = $t052885354._1 | |
150 | + | let farmGen = $t052885354._2 | |
184 | 151 | let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}") | |
185 | 152 | let asset = Issue(duckGen, description, 1, 0, false, unit, hatchingFinishHeight) | |
186 | 153 | let assetId = calculateAssetId(asset) | |
187 | 154 | let amount = (tryGetInteger(getDuckStatsKey(duckGen)) + 1) | |
188 | 155 | [StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), amount), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1)), asset, ScriptTransfer(i.caller, 1, assetId)] | |
189 | 156 | } | |
190 | 157 | } | |
191 | 158 | ||
192 | 159 | ||
193 | 160 | ||
194 | 161 | @Callable(i) | |
195 | 162 | func issueFreeDuck (address,txIdStr) = if ((i.caller != Address(rebirthAddress))) | |
196 | - | then throw("rebirth only") | |
163 | + | then throw("rebirth or baby ducks only") | |
197 | 164 | else { | |
198 | 165 | let txId = fromBase58String(txIdStr) | |
199 | 166 | let hatchingStatusKey = getHatchingStatusKey(address, txId) | |
200 | 167 | let finishHeightKey = getHatchingFinishHeightKey(address, txId) | |
201 | 168 | let totalDucksAmount = tryGetInteger("ducks_amount") | |
202 | 169 | let eggsNeeded = countEggsNeededAmount(totalDucksAmount) | |
203 | - | let $ | |
204 | - | let duckGen = $ | |
205 | - | let farmGen = $ | |
170 | + | let $t065246609 = getRandomName(txId, (value(transactionHeightById(txId)) + 1)) | |
171 | + | let duckGen = $t065246609._1 | |
172 | + | let farmGen = $t065246609._2 | |
206 | 173 | let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}") | |
207 | 174 | let asset = Issue(duckGen, description, 1, 0, false, unit, height) | |
208 | 175 | let assetId = calculateAssetId(asset) | |
209 | 176 | let amount = (tryGetInteger(getDuckStatsKey(duckGen)) + 1) | |
210 | 177 | let duckIdKey = getDuckIdKey(address, txId) | |
211 | 178 | $Tuple2([IntegerEntry(getHatchingFinishHeightKey(address, txId), height), IntegerEntry("ducks_amount", (totalDucksAmount + 1)), IntegerEntry("ducks_last_price", (eggsNeeded / 1000000)), StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), amount), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1)), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId)) | |
212 | 179 | } | |
213 | 180 | ||
214 | 181 | ||
215 | 182 | ||
216 | 183 | @Callable(i) | |
217 | 184 | func issueJackpot (address,txIdStr,gen) = if (if ((i.caller != Address(rebirthAddress))) | |
218 | 185 | then (i.caller != this) | |
219 | 186 | else false) | |
220 | 187 | then throw("admin or rebirth only") | |
221 | 188 | else { | |
222 | 189 | let txId = fromBase58String(txIdStr) | |
223 | 190 | let hatchingStatusKey = getHatchingStatusKey(address, txId) | |
224 | 191 | let finishHeightKey = getHatchingFinishHeightKey(address, txId) | |
225 | 192 | let totalDucksAmount = tryGetInteger("ducks_amount") | |
226 | 193 | let eggsNeeded = countEggsNeededAmount(totalDucksAmount) | |
227 | - | let $ | |
228 | - | let duckGen = $ | |
229 | - | let farmGen = $ | |
194 | + | let $t080628114 = $Tuple2((("DUCK-" + gen) + "-JU"), "8W-J") | |
195 | + | let duckGen = $t080628114._1 | |
196 | + | let farmGen = $t080628114._2 | |
230 | 197 | let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}") | |
231 | 198 | let asset = Issue(duckGen, description, 1, 0, false, unit, height) | |
232 | 199 | let assetId = calculateAssetId(asset) | |
233 | 200 | let duckIdKey = getDuckIdKey(address, txId) | |
234 | 201 | $Tuple2([IntegerEntry(getHatchingFinishHeightKey(address, txId), height), IntegerEntry("ducks_amount", (totalDucksAmount + 1)), IntegerEntry("ducks_last_price", (eggsNeeded / 1000000)), StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), (tryGetInteger(getDuckStatsKey(duckGen)) + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) + 1)), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId)) | |
235 | 202 | } | |
236 | 203 | ||
237 | 204 | ||
238 | 205 | ||
239 | 206 | @Callable(i) | |
240 | 207 | func reduceRarity (assetId,fGen) = { | |
241 | 208 | let asset = fromBase58String(assetId) | |
242 | 209 | if (if ((i.caller != Address(rebirthAddress))) | |
243 | 210 | then (i.caller != this) | |
244 | 211 | else false) | |
245 | 212 | then throw("admin or rebirth only") | |
246 | 213 | else { | |
247 | 214 | let duckGen = value(assetInfo(asset)).name | |
248 | 215 | let letter = takeRight(take(duckGen, 6), 1) | |
249 | 216 | let farmGen = (("8" + letter) + "-G") | |
250 | 217 | [IntegerEntry(getDuckStatsKey(duckGen), (tryGetInteger(getDuckStatsKey(duckGen)) - 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) - 1))] | |
251 | 218 | } | |
252 | 219 | } | |
253 | 220 | ||
254 | 221 | ||
255 | 222 | @Verifier(tx) | |
256 | 223 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
257 | 224 |
github/deemru/w8io/6500d08 50.51 ms ◑