tx · CXAQE2sUzziUugnuDdd1QgowME2WvwuKftAau73VSrzV

3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv:  -0.01400000 Waves

2021.06.25 00:55 [2649783] smart account 3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv > SELF 0.00000000 Waves

{ "type": 13, "id": "CXAQE2sUzziUugnuDdd1QgowME2WvwuKftAau73VSrzV", "fee": 1400000, "feeAssetId": null, "timestamp": 1624571763903, "version": 2, "chainId": 87, "sender": "3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv", "senderPublicKey": "EBHsV7TQYm4qS2V7iZXEXwcbUdEYQyCSLEdY2AMvLPns", "proofs": [ "4vF6A5VHUN9oNu1YJbyPdbwfAvGnPiCKb3AbaiURSeR8demje8qJh625X5P3dy9WfknrjLnBHTpSmndFJvBqNYQh" ], "script": "base64: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", "height": 2649783, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: C3zKQYe379tkS9HfpPZ8poLF4sV3BuEwagkDF1SLabYG Next: 7zLEybnVi5hJEdxmDb5Yfi3Cic7cxP1GvT7Gv1ynj1sj Diff:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 let eggsAssetId = base58'JCGDtrVy64cCJ1wCKfCaiNQMnyYwii71TbE5QeAHfxgF'
55
6-let perchPrice = 100
6+let delayForHatching = 2
77
8-let scale = 10000
8+let discountCoefficient = 10
99
10-let scale2 = 1000000
10+let typesAmount = 6
1111
12-let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
12+let HatchingStarted = "HATCHING_STARTED"
1313
14-let breederAddress = base58'3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb'
14+let HatchingFinished = "HATCHING_FINISHED"
1515
16-let GENS = ["A", "B", "C", "D", "E", "F", "G"]
17-
18-func getRewardPerBlock () = 684
16+func getHatchingStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status")
1917
2018
21-func tryGetInteger (key) = match getInteger(this, key) {
22- case b: Int =>
23- b
24- case _ =>
25- 0
26-}
19+func getHatchingFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
2720
2821
29-func tryGetString (key) = match getString(this, key) {
30- case a: String =>
31- a
32- case _ =>
33- ""
34-}
22+func getDuckIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di")
3523
3624
37-func isSymbolA (accumulated,sym) = if ((sym == "A"))
38- then (accumulated + 1)
39- else (accumulated + 0)
25+func getDuckStatsKey (genString) = (("stats_" + genString) + "_amount")
4026
4127
42-func isSymbolB (accumulated,sym) = if ((sym == "B"))
43- then (accumulated + 1)
44- else (accumulated + 0)
45-
46-
47-func isSymbolC (accumulated,sym) = if ((sym == "C"))
48- then (accumulated + 1)
49- else (accumulated + 0)
50-
51-
52-func isSymbolD (accumulated,sym) = if ((sym == "D"))
53- then (accumulated + 1)
54- else (accumulated + 0)
55-
56-
57-func isSymbolE (accumulated,sym) = if ((sym == "E"))
58- then (accumulated + 1)
59- else (accumulated + 0)
60-
61-
62-func isSymbolF (accumulated,sym) = if ((sym == "F"))
63- then (accumulated + 1)
64- else (accumulated + 0)
65-
66-
67-func isSymbolG (accumulated,sym) = if ((sym == "G"))
68- then (accumulated + 1)
69- else (accumulated + 0)
70-
71-
72-func isSymbolH (accumulated,sym) = if ((sym == "H"))
73- then (accumulated + 1)
74- else (accumulated + 0)
75-
76-
77-func getAmountOrClear (amount) = if (contains(amount, "0"))
78- then ""
79- else amount
80-
81-
82-func getGen (assetName) = {
83- let genotype = split(dropRight(drop(assetName, 5), 3), "")
84- (((((((getAmountOrClear((toString({
85- let $list18481879 = genotype
86- let $size18481879 = size($list18481879)
87- let $acc018481879 = 0
88- if (($size18481879 == 0))
89- then $acc018481879
90- else {
91- let $acc118481879 = isSymbolA($acc018481879, $list18481879[0])
92- if (($size18481879 == 1))
93- then $acc118481879
94- else {
95- let $acc218481879 = isSymbolA($acc118481879, $list18481879[1])
96- if (($size18481879 == 2))
97- then $acc218481879
98- else {
99- let $acc318481879 = isSymbolA($acc218481879, $list18481879[2])
100- if (($size18481879 == 3))
101- then $acc318481879
102- else {
103- let $acc418481879 = isSymbolA($acc318481879, $list18481879[3])
104- if (($size18481879 == 4))
105- then $acc418481879
106- else {
107- let $acc518481879 = isSymbolA($acc418481879, $list18481879[4])
108- if (($size18481879 == 5))
109- then $acc518481879
110- else {
111- let $acc618481879 = isSymbolA($acc518481879, $list18481879[5])
112- if (($size18481879 == 6))
113- then $acc618481879
114- else {
115- let $acc718481879 = isSymbolA($acc618481879, $list18481879[6])
116- if (($size18481879 == 7))
117- then $acc718481879
118- else {
119- let $acc818481879 = isSymbolA($acc718481879, $list18481879[7])
120- if (($size18481879 == 8))
121- then $acc818481879
122- else {
123- let $acc918481879 = isSymbolA($acc818481879, $list18481879[8])
124- throw("List size exceed 8")
125- }
126- }
127- }
128- }
129- }
130- }
131- }
132- }
133- }
134- }) + "A")) + getAmountOrClear((toString({
135- let $list19161947 = genotype
136- let $size19161947 = size($list19161947)
137- let $acc019161947 = 0
138- if (($size19161947 == 0))
139- then $acc019161947
140- else {
141- let $acc119161947 = isSymbolB($acc019161947, $list19161947[0])
142- if (($size19161947 == 1))
143- then $acc119161947
144- else {
145- let $acc219161947 = isSymbolB($acc119161947, $list19161947[1])
146- if (($size19161947 == 2))
147- then $acc219161947
148- else {
149- let $acc319161947 = isSymbolB($acc219161947, $list19161947[2])
150- if (($size19161947 == 3))
151- then $acc319161947
152- else {
153- let $acc419161947 = isSymbolB($acc319161947, $list19161947[3])
154- if (($size19161947 == 4))
155- then $acc419161947
156- else {
157- let $acc519161947 = isSymbolB($acc419161947, $list19161947[4])
158- if (($size19161947 == 5))
159- then $acc519161947
160- else {
161- let $acc619161947 = isSymbolB($acc519161947, $list19161947[5])
162- if (($size19161947 == 6))
163- then $acc619161947
164- else {
165- let $acc719161947 = isSymbolB($acc619161947, $list19161947[6])
166- if (($size19161947 == 7))
167- then $acc719161947
168- else {
169- let $acc819161947 = isSymbolB($acc719161947, $list19161947[7])
170- if (($size19161947 == 8))
171- then $acc819161947
172- else {
173- let $acc919161947 = isSymbolB($acc819161947, $list19161947[8])
174- throw("List size exceed 8")
175- }
176- }
177- }
178- }
179- }
180- }
181- }
182- }
183- }
184- }) + "B"))) + getAmountOrClear((toString({
185- let $list19842015 = genotype
186- let $size19842015 = size($list19842015)
187- let $acc019842015 = 0
188- if (($size19842015 == 0))
189- then $acc019842015
190- else {
191- let $acc119842015 = isSymbolC($acc019842015, $list19842015[0])
192- if (($size19842015 == 1))
193- then $acc119842015
194- else {
195- let $acc219842015 = isSymbolC($acc119842015, $list19842015[1])
196- if (($size19842015 == 2))
197- then $acc219842015
198- else {
199- let $acc319842015 = isSymbolC($acc219842015, $list19842015[2])
200- if (($size19842015 == 3))
201- then $acc319842015
202- else {
203- let $acc419842015 = isSymbolC($acc319842015, $list19842015[3])
204- if (($size19842015 == 4))
205- then $acc419842015
206- else {
207- let $acc519842015 = isSymbolC($acc419842015, $list19842015[4])
208- if (($size19842015 == 5))
209- then $acc519842015
210- else {
211- let $acc619842015 = isSymbolC($acc519842015, $list19842015[5])
212- if (($size19842015 == 6))
213- then $acc619842015
214- else {
215- let $acc719842015 = isSymbolC($acc619842015, $list19842015[6])
216- if (($size19842015 == 7))
217- then $acc719842015
218- else {
219- let $acc819842015 = isSymbolC($acc719842015, $list19842015[7])
220- if (($size19842015 == 8))
221- then $acc819842015
222- else {
223- let $acc919842015 = isSymbolC($acc819842015, $list19842015[8])
224- throw("List size exceed 8")
225- }
226- }
227- }
228- }
229- }
230- }
231- }
232- }
233- }
234- }) + "C"))) + getAmountOrClear((toString({
235- let $list20542085 = genotype
236- let $size20542085 = size($list20542085)
237- let $acc020542085 = 0
238- if (($size20542085 == 0))
239- then $acc020542085
240- else {
241- let $acc120542085 = isSymbolD($acc020542085, $list20542085[0])
242- if (($size20542085 == 1))
243- then $acc120542085
244- else {
245- let $acc220542085 = isSymbolD($acc120542085, $list20542085[1])
246- if (($size20542085 == 2))
247- then $acc220542085
248- else {
249- let $acc320542085 = isSymbolD($acc220542085, $list20542085[2])
250- if (($size20542085 == 3))
251- then $acc320542085
252- else {
253- let $acc420542085 = isSymbolD($acc320542085, $list20542085[3])
254- if (($size20542085 == 4))
255- then $acc420542085
256- else {
257- let $acc520542085 = isSymbolD($acc420542085, $list20542085[4])
258- if (($size20542085 == 5))
259- then $acc520542085
260- else {
261- let $acc620542085 = isSymbolD($acc520542085, $list20542085[5])
262- if (($size20542085 == 6))
263- then $acc620542085
264- else {
265- let $acc720542085 = isSymbolD($acc620542085, $list20542085[6])
266- if (($size20542085 == 7))
267- then $acc720542085
268- else {
269- let $acc820542085 = isSymbolD($acc720542085, $list20542085[7])
270- if (($size20542085 == 8))
271- then $acc820542085
272- else {
273- let $acc920542085 = isSymbolD($acc820542085, $list20542085[8])
274- throw("List size exceed 8")
275- }
276- }
277- }
278- }
279- }
280- }
281- }
282- }
283- }
284- }) + "D"))) + getAmountOrClear((toString({
285- let $list21222153 = genotype
286- let $size21222153 = size($list21222153)
287- let $acc021222153 = 0
288- if (($size21222153 == 0))
289- then $acc021222153
290- else {
291- let $acc121222153 = isSymbolE($acc021222153, $list21222153[0])
292- if (($size21222153 == 1))
293- then $acc121222153
294- else {
295- let $acc221222153 = isSymbolE($acc121222153, $list21222153[1])
296- if (($size21222153 == 2))
297- then $acc221222153
298- else {
299- let $acc321222153 = isSymbolE($acc221222153, $list21222153[2])
300- if (($size21222153 == 3))
301- then $acc321222153
302- else {
303- let $acc421222153 = isSymbolE($acc321222153, $list21222153[3])
304- if (($size21222153 == 4))
305- then $acc421222153
306- else {
307- let $acc521222153 = isSymbolE($acc421222153, $list21222153[4])
308- if (($size21222153 == 5))
309- then $acc521222153
310- else {
311- let $acc621222153 = isSymbolE($acc521222153, $list21222153[5])
312- if (($size21222153 == 6))
313- then $acc621222153
314- else {
315- let $acc721222153 = isSymbolE($acc621222153, $list21222153[6])
316- if (($size21222153 == 7))
317- then $acc721222153
318- else {
319- let $acc821222153 = isSymbolE($acc721222153, $list21222153[7])
320- if (($size21222153 == 8))
321- then $acc821222153
322- else {
323- let $acc921222153 = isSymbolE($acc821222153, $list21222153[8])
324- throw("List size exceed 8")
325- }
326- }
327- }
328- }
329- }
330- }
331- }
332- }
333- }
334- }) + "E"))) + getAmountOrClear((toString({
335- let $list21902221 = genotype
336- let $size21902221 = size($list21902221)
337- let $acc021902221 = 0
338- if (($size21902221 == 0))
339- then $acc021902221
340- else {
341- let $acc121902221 = isSymbolF($acc021902221, $list21902221[0])
342- if (($size21902221 == 1))
343- then $acc121902221
344- else {
345- let $acc221902221 = isSymbolF($acc121902221, $list21902221[1])
346- if (($size21902221 == 2))
347- then $acc221902221
348- else {
349- let $acc321902221 = isSymbolF($acc221902221, $list21902221[2])
350- if (($size21902221 == 3))
351- then $acc321902221
352- else {
353- let $acc421902221 = isSymbolF($acc321902221, $list21902221[3])
354- if (($size21902221 == 4))
355- then $acc421902221
356- else {
357- let $acc521902221 = isSymbolF($acc421902221, $list21902221[4])
358- if (($size21902221 == 5))
359- then $acc521902221
360- else {
361- let $acc621902221 = isSymbolF($acc521902221, $list21902221[5])
362- if (($size21902221 == 6))
363- then $acc621902221
364- else {
365- let $acc721902221 = isSymbolF($acc621902221, $list21902221[6])
366- if (($size21902221 == 7))
367- then $acc721902221
368- else {
369- let $acc821902221 = isSymbolF($acc721902221, $list21902221[7])
370- if (($size21902221 == 8))
371- then $acc821902221
372- else {
373- let $acc921902221 = isSymbolF($acc821902221, $list21902221[8])
374- throw("List size exceed 8")
375- }
376- }
377- }
378- }
379- }
380- }
381- }
382- }
383- }
384- }) + "F"))) + getAmountOrClear((toString({
385- let $list22602291 = genotype
386- let $size22602291 = size($list22602291)
387- let $acc022602291 = 0
388- if (($size22602291 == 0))
389- then $acc022602291
390- else {
391- let $acc122602291 = isSymbolG($acc022602291, $list22602291[0])
392- if (($size22602291 == 1))
393- then $acc122602291
394- else {
395- let $acc222602291 = isSymbolG($acc122602291, $list22602291[1])
396- if (($size22602291 == 2))
397- then $acc222602291
398- else {
399- let $acc322602291 = isSymbolG($acc222602291, $list22602291[2])
400- if (($size22602291 == 3))
401- then $acc322602291
402- else {
403- let $acc422602291 = isSymbolG($acc322602291, $list22602291[3])
404- if (($size22602291 == 4))
405- then $acc422602291
406- else {
407- let $acc522602291 = isSymbolG($acc422602291, $list22602291[4])
408- if (($size22602291 == 5))
409- then $acc522602291
410- else {
411- let $acc622602291 = isSymbolG($acc522602291, $list22602291[5])
412- if (($size22602291 == 6))
413- then $acc622602291
414- else {
415- let $acc722602291 = isSymbolG($acc622602291, $list22602291[6])
416- if (($size22602291 == 7))
417- then $acc722602291
418- else {
419- let $acc822602291 = isSymbolG($acc722602291, $list22602291[7])
420- if (($size22602291 == 8))
421- then $acc822602291
422- else {
423- let $acc922602291 = isSymbolG($acc822602291, $list22602291[8])
424- throw("List size exceed 8")
425- }
426- }
427- }
428- }
429- }
430- }
431- }
432- }
433- }
434- }) + "G"))) + getAmountOrClear((toString({
435- let $list23282359 = genotype
436- let $size23282359 = size($list23282359)
437- let $acc023282359 = 0
438- if (($size23282359 == 0))
439- then $acc023282359
440- else {
441- let $acc123282359 = isSymbolH($acc023282359, $list23282359[0])
442- if (($size23282359 == 1))
443- then $acc123282359
444- else {
445- let $acc223282359 = isSymbolH($acc123282359, $list23282359[1])
446- if (($size23282359 == 2))
447- then $acc223282359
448- else {
449- let $acc323282359 = isSymbolH($acc223282359, $list23282359[2])
450- if (($size23282359 == 3))
451- then $acc323282359
452- else {
453- let $acc423282359 = isSymbolH($acc323282359, $list23282359[3])
454- if (($size23282359 == 4))
455- then $acc423282359
456- else {
457- let $acc523282359 = isSymbolH($acc423282359, $list23282359[4])
458- if (($size23282359 == 5))
459- then $acc523282359
460- else {
461- let $acc623282359 = isSymbolH($acc523282359, $list23282359[5])
462- if (($size23282359 == 6))
463- then $acc623282359
464- else {
465- let $acc723282359 = isSymbolH($acc623282359, $list23282359[6])
466- if (($size23282359 == 7))
467- then $acc723282359
468- else {
469- let $acc823282359 = isSymbolH($acc723282359, $list23282359[7])
470- if (($size23282359 == 8))
471- then $acc823282359
472- else {
473- let $acc923282359 = isSymbolH($acc823282359, $list23282359[8])
474- throw("List size exceed 8")
475- }
476- }
477- }
478- }
479- }
480- }
481- }
482- }
483- }
484- }) + "H")))
28+func tryGetInteger (key) = {
29+ let val = match getInteger(this, key) {
30+ case b: Int =>
31+ b
32+ case _ =>
33+ 0
34+ }
35+ val
48536 }
48637
48738
488-func getAssetOrigin (generation) = if ((generation == "G"))
489- then incubatorAddress
490- else breederAddress
491-
492-
493-func getAssetRarity (genotype,generation) = {
494- let quantity = getIntegerValue(Address(getAssetOrigin(generation)), (("stats_" + genotype) + "_quantity"))
495- let power = pow((10000 / quantity), 4, 5, 1, 2, HALFDOWN)
496- if ((power > 0))
497- then power
498- else 2
39+func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = {
40+ let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
41+ let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
42+ (toInt(randomHash, (offset * 8)) % variants)
49943 }
50044
50145
502-func getAssetFarmingPower (assetId) = {
503- let assetName = value(assetInfo(assetId)).name
504- let generation = take(takeRight(assetName, 2), 1)
505- let gen = ((getGen(assetName) + "-") + generation)
506- $Tuple2(gen, getAssetRarity(gen, generation))
46+func wasUniqueBorn (gen) = tryGetInteger(getDuckStatsKey(gen))
47+
48+
49+func getRandomName (txId,hatchingFinishHeight) = {
50+ let jackpotRandom = getRandomNumber(500, txId, hatchingFinishHeight, 0)
51+ if (if ((jackpotRandom == 1))
52+ then (wasUniqueBorn("DUCK-WWWWWWWW-JU") == 0)
53+ else false)
54+ then $Tuple2("DUCK-WWWWWWWW-JU", "8W-J")
55+ else {
56+ let typeRandom = getRandomNumber(4, txId, hatchingFinishHeight, 0)
57+ let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 1)
58+ let color = if ((colorRandom == 0))
59+ then "Y"
60+ else if ((colorRandom == 1))
61+ then "G"
62+ else if ((colorRandom == 2))
63+ then "B"
64+ else "R"
65+ if ((typeRandom == 0))
66+ then $Tuple2(("DUCK-FFFFFFFF-G" + color), "8F-G")
67+ else if ((typeRandom == 1))
68+ then $Tuple2(("DUCK-DDDDDDDD-G" + color), "8D-G")
69+ else if ((typeRandom == 2))
70+ then $Tuple2(("DUCK-CCCCCCCC-G" + color), "8C-G")
71+ else $Tuple2(("DUCK-EEEEEEEE-G" + color), "8E-G")
72+ }
50773 }
50874
50975
510-func getLastKnownAssetFarmingPower (address,assetId) = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_farmingPower"))
511-
512-
513-func getAssetsByGen (gen) = {
514- let s = tryGetString(("assets_" + gen))
515- if ((s == ""))
516- then nil
517- else split(s, ",")
518- }
519-
520-
521-func calcInterest (previousInterest,previousInterestHeight,totalFarmingPower) = (previousInterest + (((scale * getRewardPerBlock()) * (height - previousInterestHeight)) / totalFarmingPower))
522-
523-
524-func getCurrentInterest () = if ((tryGetInteger("total_farmingPower") > 0))
525- then {
526- let previousInterest = tryGetInteger("total_lastCheckInterest")
527- let previousInterestHeight = tryGetInteger("total_lastCheckInterestHeight")
528- let totalFarmingPower = tryGetInteger("total_farmingPower")
529- calcInterest(previousInterest, previousInterestHeight, totalFarmingPower)
530- }
531- else if ((tryGetInteger("total_startHeight") != 0))
532- then tryGetInteger("total_lastCheckInterest")
533- else throw("farming is not launched, yet")
534-
535-
536-func calcAssetRewardDelta (address,assetId,assetFarmingPower) = {
537- let lastCheckAssetInterest = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_lastCheckInterest"))
538- let currentInterest = getCurrentInterest()
539- (assetFarmingPower * (currentInterest - lastCheckAssetInterest))
540- }
541-
542-
543-func addAssetIdToGenEntry (assetId,assetGen) = {
544- let currentValue = tryGetString((("assets_" + assetGen) + "_locked"))
545- if ((currentValue == ""))
546- then assetId
547- else ((currentValue + ",") + assetId)
548- }
549-
550-
551-func getStakeResult (address,assetId,assetFarmingPower) = {
552- let asset = toBase58String(assetId)
553-[IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") + assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), assetFarmingPower), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest())]
554- }
555-
556-
557-func getUnstakeResult (address,assetId,rewardDelta,withdrawnAmount,assetFarmingPower) = {
558- let asset = toBase58String(assetId)
559-[IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") - assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), 0), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (withdrawnAmount * scale2))), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")) + rewardDelta))]
76+func countEggsNeededAmount (totalDucksAmount) = {
77+ let n = totalDucksAmount
78+ let g = discountCoefficient
79+ let t = typesAmount
80+ let price = pow((100 + ((n * g) / (10 * t))), 2, 5, 1, 2, DOWN)
81+ price
56082 }
56183
56284
56385 @Callable(i)
564-func init () = if ((i.caller != this))
565- then throw("admin only")
566- else [IntegerEntry("total_startHeight", height)]
567-
568-
569-
570-@Callable(i)
571-func buyPerch (color) = if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
572- then throw("you need to set color properly")
573- else {
574- let firstPayment = value(i.payments[0])
575- if ((firstPayment.assetId != eggsAssetId))
576- then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
577- else if ((firstPayment.amount != perchPrice))
578- then throw(("To buy a perch you currently need the following amount of EGGlets: " + toString(perchPrice)))
579- else {
580- let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)
581- let perchAmount = tryGetInteger(perchAmountKey)
582-[IntegerEntry(perchAmountKey, (perchAmount + 1))]
583- }
584- }
585-
586-
587-
588-@Callable(i)
589-func stakeNFT () = nil
590-
591-
592-
593-@Callable(i)
594-func unstakeNFT (asset) = nil
595-
596-
597-
598-@Callable(i)
599-func stakeJackpot (color) = {
600- let assetId = value(value(i.payments[0]).assetId)
601- let address = toString(i.caller)
602- let availablePerches = tryGetInteger(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color))
603- if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
604- then throw("jackpot only")
605- else if ((0 >= availablePerches))
606- then throw(("no perches available for the color " + color))
607- else {
608- let assetFarmingPower = 100
609- (getStakeResult(address, assetId, assetFarmingPower) ++ [IntegerEntry(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + toString(i.caller)) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)])
610- }
86+func startDuckHatching () = {
87+ let totalDucksAmount = tryGetInteger("ducks_amount")
88+ let eggsNeeded = countEggsNeededAmount(totalDucksAmount)
89+ let firstPayment = value(i.payments[0])
90+ if ((firstPayment.assetId != eggsAssetId))
91+ then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
92+ else if ((eggsNeeded > firstPayment.amount))
93+ then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded)))
94+ else [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), ScriptTransfer(i.caller, (firstPayment.amount - eggsNeeded), eggsAssetId)]
61195 }
61296
61397
61498
61599 @Callable(i)
616-func unstakeJackpot (asset) = {
617- let assetId = fromBase58String(asset)
618- let address = toString(i.caller)
619- let color = tryGetString((((("address_" + address) + "_asset_") + asset) + "_perchColor"))
620- let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset)
621- let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower)
622- let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")))
623- let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"))
624- let reward = ((farmedAmount - withdrawnAmount) / (scale * 100))
625- if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
626- then throw("jackpot only")
627- else if ((assetFarmingPower > 0))
628- then {
629- let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower)
630- (result ++ [IntegerEntry(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)) + 1)), ScriptTransfer(i.caller, reward, eggsAssetId), ScriptTransfer(i.caller, 1, assetId)])
100+func finishDuckHatching (txIdStr) = {
101+ let txId = fromBase58String(txIdStr)
102+ let hatchingStatusKey = getHatchingStatusKey(toString(i.caller), txId)
103+ let finishHeightKey = getHatchingFinishHeightKey(toString(i.caller), txId)
104+ let duckIdKey = getDuckIdKey(toString(i.caller), txId)
105+ let hatchingTxStatus = getStringValue(this, hatchingStatusKey)
106+ let hatchingFinishHeight = getIntegerValue(this, finishHeightKey)
107+ if ((hatchingTxStatus == HatchingFinished))
108+ then {
109+ let duckId = getStringValue(this, getDuckIdKey(toString(i.caller), txId))
110+ throw(("The duck was hatched and claimed already, here is the folowing: " + duckId))
111+ }
112+ else if ((hatchingFinishHeight > height))
113+ then throw((((("Hatching is not finished yet " + toString((hatchingFinishHeight - height))) + " blocks remaining, it will take around ") + toString((hatchingFinishHeight - height))) + " minutes"))
114+ else {
115+ let $t042864352 = getRandomName(txId, hatchingFinishHeight)
116+ let duckGen = $t042864352._1
117+ let farmGen = $t042864352._2
118+ let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
119+ let asset = Issue(duckGen, description, 1, 0, false, unit, hatchingFinishHeight)
120+ let assetId = calculateAssetId(asset)
121+ let amount = (tryGetInteger(getDuckStatsKey(duckGen)) + 1)
122+[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)]
631123 }
632- else throw("")
633124 }
634-
635-
636-
637-@Callable(i)
638-func claimReward (asset) = nil
639125
640126
641127 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let eggsAssetId = base58'JCGDtrVy64cCJ1wCKfCaiNQMnyYwii71TbE5QeAHfxgF'
55
6-let perchPrice = 100
6+let delayForHatching = 2
77
8-let scale = 10000
8+let discountCoefficient = 10
99
10-let scale2 = 1000000
10+let typesAmount = 6
1111
12-let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
12+let HatchingStarted = "HATCHING_STARTED"
1313
14-let breederAddress = base58'3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb'
14+let HatchingFinished = "HATCHING_FINISHED"
1515
16-let GENS = ["A", "B", "C", "D", "E", "F", "G"]
17-
18-func getRewardPerBlock () = 684
16+func getHatchingStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status")
1917
2018
21-func tryGetInteger (key) = match getInteger(this, key) {
22- case b: Int =>
23- b
24- case _ =>
25- 0
26-}
19+func getHatchingFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
2720
2821
29-func tryGetString (key) = match getString(this, key) {
30- case a: String =>
31- a
32- case _ =>
33- ""
34-}
22+func getDuckIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di")
3523
3624
37-func isSymbolA (accumulated,sym) = if ((sym == "A"))
38- then (accumulated + 1)
39- else (accumulated + 0)
25+func getDuckStatsKey (genString) = (("stats_" + genString) + "_amount")
4026
4127
42-func isSymbolB (accumulated,sym) = if ((sym == "B"))
43- then (accumulated + 1)
44- else (accumulated + 0)
45-
46-
47-func isSymbolC (accumulated,sym) = if ((sym == "C"))
48- then (accumulated + 1)
49- else (accumulated + 0)
50-
51-
52-func isSymbolD (accumulated,sym) = if ((sym == "D"))
53- then (accumulated + 1)
54- else (accumulated + 0)
55-
56-
57-func isSymbolE (accumulated,sym) = if ((sym == "E"))
58- then (accumulated + 1)
59- else (accumulated + 0)
60-
61-
62-func isSymbolF (accumulated,sym) = if ((sym == "F"))
63- then (accumulated + 1)
64- else (accumulated + 0)
65-
66-
67-func isSymbolG (accumulated,sym) = if ((sym == "G"))
68- then (accumulated + 1)
69- else (accumulated + 0)
70-
71-
72-func isSymbolH (accumulated,sym) = if ((sym == "H"))
73- then (accumulated + 1)
74- else (accumulated + 0)
75-
76-
77-func getAmountOrClear (amount) = if (contains(amount, "0"))
78- then ""
79- else amount
80-
81-
82-func getGen (assetName) = {
83- let genotype = split(dropRight(drop(assetName, 5), 3), "")
84- (((((((getAmountOrClear((toString({
85- let $list18481879 = genotype
86- let $size18481879 = size($list18481879)
87- let $acc018481879 = 0
88- if (($size18481879 == 0))
89- then $acc018481879
90- else {
91- let $acc118481879 = isSymbolA($acc018481879, $list18481879[0])
92- if (($size18481879 == 1))
93- then $acc118481879
94- else {
95- let $acc218481879 = isSymbolA($acc118481879, $list18481879[1])
96- if (($size18481879 == 2))
97- then $acc218481879
98- else {
99- let $acc318481879 = isSymbolA($acc218481879, $list18481879[2])
100- if (($size18481879 == 3))
101- then $acc318481879
102- else {
103- let $acc418481879 = isSymbolA($acc318481879, $list18481879[3])
104- if (($size18481879 == 4))
105- then $acc418481879
106- else {
107- let $acc518481879 = isSymbolA($acc418481879, $list18481879[4])
108- if (($size18481879 == 5))
109- then $acc518481879
110- else {
111- let $acc618481879 = isSymbolA($acc518481879, $list18481879[5])
112- if (($size18481879 == 6))
113- then $acc618481879
114- else {
115- let $acc718481879 = isSymbolA($acc618481879, $list18481879[6])
116- if (($size18481879 == 7))
117- then $acc718481879
118- else {
119- let $acc818481879 = isSymbolA($acc718481879, $list18481879[7])
120- if (($size18481879 == 8))
121- then $acc818481879
122- else {
123- let $acc918481879 = isSymbolA($acc818481879, $list18481879[8])
124- throw("List size exceed 8")
125- }
126- }
127- }
128- }
129- }
130- }
131- }
132- }
133- }
134- }) + "A")) + getAmountOrClear((toString({
135- let $list19161947 = genotype
136- let $size19161947 = size($list19161947)
137- let $acc019161947 = 0
138- if (($size19161947 == 0))
139- then $acc019161947
140- else {
141- let $acc119161947 = isSymbolB($acc019161947, $list19161947[0])
142- if (($size19161947 == 1))
143- then $acc119161947
144- else {
145- let $acc219161947 = isSymbolB($acc119161947, $list19161947[1])
146- if (($size19161947 == 2))
147- then $acc219161947
148- else {
149- let $acc319161947 = isSymbolB($acc219161947, $list19161947[2])
150- if (($size19161947 == 3))
151- then $acc319161947
152- else {
153- let $acc419161947 = isSymbolB($acc319161947, $list19161947[3])
154- if (($size19161947 == 4))
155- then $acc419161947
156- else {
157- let $acc519161947 = isSymbolB($acc419161947, $list19161947[4])
158- if (($size19161947 == 5))
159- then $acc519161947
160- else {
161- let $acc619161947 = isSymbolB($acc519161947, $list19161947[5])
162- if (($size19161947 == 6))
163- then $acc619161947
164- else {
165- let $acc719161947 = isSymbolB($acc619161947, $list19161947[6])
166- if (($size19161947 == 7))
167- then $acc719161947
168- else {
169- let $acc819161947 = isSymbolB($acc719161947, $list19161947[7])
170- if (($size19161947 == 8))
171- then $acc819161947
172- else {
173- let $acc919161947 = isSymbolB($acc819161947, $list19161947[8])
174- throw("List size exceed 8")
175- }
176- }
177- }
178- }
179- }
180- }
181- }
182- }
183- }
184- }) + "B"))) + getAmountOrClear((toString({
185- let $list19842015 = genotype
186- let $size19842015 = size($list19842015)
187- let $acc019842015 = 0
188- if (($size19842015 == 0))
189- then $acc019842015
190- else {
191- let $acc119842015 = isSymbolC($acc019842015, $list19842015[0])
192- if (($size19842015 == 1))
193- then $acc119842015
194- else {
195- let $acc219842015 = isSymbolC($acc119842015, $list19842015[1])
196- if (($size19842015 == 2))
197- then $acc219842015
198- else {
199- let $acc319842015 = isSymbolC($acc219842015, $list19842015[2])
200- if (($size19842015 == 3))
201- then $acc319842015
202- else {
203- let $acc419842015 = isSymbolC($acc319842015, $list19842015[3])
204- if (($size19842015 == 4))
205- then $acc419842015
206- else {
207- let $acc519842015 = isSymbolC($acc419842015, $list19842015[4])
208- if (($size19842015 == 5))
209- then $acc519842015
210- else {
211- let $acc619842015 = isSymbolC($acc519842015, $list19842015[5])
212- if (($size19842015 == 6))
213- then $acc619842015
214- else {
215- let $acc719842015 = isSymbolC($acc619842015, $list19842015[6])
216- if (($size19842015 == 7))
217- then $acc719842015
218- else {
219- let $acc819842015 = isSymbolC($acc719842015, $list19842015[7])
220- if (($size19842015 == 8))
221- then $acc819842015
222- else {
223- let $acc919842015 = isSymbolC($acc819842015, $list19842015[8])
224- throw("List size exceed 8")
225- }
226- }
227- }
228- }
229- }
230- }
231- }
232- }
233- }
234- }) + "C"))) + getAmountOrClear((toString({
235- let $list20542085 = genotype
236- let $size20542085 = size($list20542085)
237- let $acc020542085 = 0
238- if (($size20542085 == 0))
239- then $acc020542085
240- else {
241- let $acc120542085 = isSymbolD($acc020542085, $list20542085[0])
242- if (($size20542085 == 1))
243- then $acc120542085
244- else {
245- let $acc220542085 = isSymbolD($acc120542085, $list20542085[1])
246- if (($size20542085 == 2))
247- then $acc220542085
248- else {
249- let $acc320542085 = isSymbolD($acc220542085, $list20542085[2])
250- if (($size20542085 == 3))
251- then $acc320542085
252- else {
253- let $acc420542085 = isSymbolD($acc320542085, $list20542085[3])
254- if (($size20542085 == 4))
255- then $acc420542085
256- else {
257- let $acc520542085 = isSymbolD($acc420542085, $list20542085[4])
258- if (($size20542085 == 5))
259- then $acc520542085
260- else {
261- let $acc620542085 = isSymbolD($acc520542085, $list20542085[5])
262- if (($size20542085 == 6))
263- then $acc620542085
264- else {
265- let $acc720542085 = isSymbolD($acc620542085, $list20542085[6])
266- if (($size20542085 == 7))
267- then $acc720542085
268- else {
269- let $acc820542085 = isSymbolD($acc720542085, $list20542085[7])
270- if (($size20542085 == 8))
271- then $acc820542085
272- else {
273- let $acc920542085 = isSymbolD($acc820542085, $list20542085[8])
274- throw("List size exceed 8")
275- }
276- }
277- }
278- }
279- }
280- }
281- }
282- }
283- }
284- }) + "D"))) + getAmountOrClear((toString({
285- let $list21222153 = genotype
286- let $size21222153 = size($list21222153)
287- let $acc021222153 = 0
288- if (($size21222153 == 0))
289- then $acc021222153
290- else {
291- let $acc121222153 = isSymbolE($acc021222153, $list21222153[0])
292- if (($size21222153 == 1))
293- then $acc121222153
294- else {
295- let $acc221222153 = isSymbolE($acc121222153, $list21222153[1])
296- if (($size21222153 == 2))
297- then $acc221222153
298- else {
299- let $acc321222153 = isSymbolE($acc221222153, $list21222153[2])
300- if (($size21222153 == 3))
301- then $acc321222153
302- else {
303- let $acc421222153 = isSymbolE($acc321222153, $list21222153[3])
304- if (($size21222153 == 4))
305- then $acc421222153
306- else {
307- let $acc521222153 = isSymbolE($acc421222153, $list21222153[4])
308- if (($size21222153 == 5))
309- then $acc521222153
310- else {
311- let $acc621222153 = isSymbolE($acc521222153, $list21222153[5])
312- if (($size21222153 == 6))
313- then $acc621222153
314- else {
315- let $acc721222153 = isSymbolE($acc621222153, $list21222153[6])
316- if (($size21222153 == 7))
317- then $acc721222153
318- else {
319- let $acc821222153 = isSymbolE($acc721222153, $list21222153[7])
320- if (($size21222153 == 8))
321- then $acc821222153
322- else {
323- let $acc921222153 = isSymbolE($acc821222153, $list21222153[8])
324- throw("List size exceed 8")
325- }
326- }
327- }
328- }
329- }
330- }
331- }
332- }
333- }
334- }) + "E"))) + getAmountOrClear((toString({
335- let $list21902221 = genotype
336- let $size21902221 = size($list21902221)
337- let $acc021902221 = 0
338- if (($size21902221 == 0))
339- then $acc021902221
340- else {
341- let $acc121902221 = isSymbolF($acc021902221, $list21902221[0])
342- if (($size21902221 == 1))
343- then $acc121902221
344- else {
345- let $acc221902221 = isSymbolF($acc121902221, $list21902221[1])
346- if (($size21902221 == 2))
347- then $acc221902221
348- else {
349- let $acc321902221 = isSymbolF($acc221902221, $list21902221[2])
350- if (($size21902221 == 3))
351- then $acc321902221
352- else {
353- let $acc421902221 = isSymbolF($acc321902221, $list21902221[3])
354- if (($size21902221 == 4))
355- then $acc421902221
356- else {
357- let $acc521902221 = isSymbolF($acc421902221, $list21902221[4])
358- if (($size21902221 == 5))
359- then $acc521902221
360- else {
361- let $acc621902221 = isSymbolF($acc521902221, $list21902221[5])
362- if (($size21902221 == 6))
363- then $acc621902221
364- else {
365- let $acc721902221 = isSymbolF($acc621902221, $list21902221[6])
366- if (($size21902221 == 7))
367- then $acc721902221
368- else {
369- let $acc821902221 = isSymbolF($acc721902221, $list21902221[7])
370- if (($size21902221 == 8))
371- then $acc821902221
372- else {
373- let $acc921902221 = isSymbolF($acc821902221, $list21902221[8])
374- throw("List size exceed 8")
375- }
376- }
377- }
378- }
379- }
380- }
381- }
382- }
383- }
384- }) + "F"))) + getAmountOrClear((toString({
385- let $list22602291 = genotype
386- let $size22602291 = size($list22602291)
387- let $acc022602291 = 0
388- if (($size22602291 == 0))
389- then $acc022602291
390- else {
391- let $acc122602291 = isSymbolG($acc022602291, $list22602291[0])
392- if (($size22602291 == 1))
393- then $acc122602291
394- else {
395- let $acc222602291 = isSymbolG($acc122602291, $list22602291[1])
396- if (($size22602291 == 2))
397- then $acc222602291
398- else {
399- let $acc322602291 = isSymbolG($acc222602291, $list22602291[2])
400- if (($size22602291 == 3))
401- then $acc322602291
402- else {
403- let $acc422602291 = isSymbolG($acc322602291, $list22602291[3])
404- if (($size22602291 == 4))
405- then $acc422602291
406- else {
407- let $acc522602291 = isSymbolG($acc422602291, $list22602291[4])
408- if (($size22602291 == 5))
409- then $acc522602291
410- else {
411- let $acc622602291 = isSymbolG($acc522602291, $list22602291[5])
412- if (($size22602291 == 6))
413- then $acc622602291
414- else {
415- let $acc722602291 = isSymbolG($acc622602291, $list22602291[6])
416- if (($size22602291 == 7))
417- then $acc722602291
418- else {
419- let $acc822602291 = isSymbolG($acc722602291, $list22602291[7])
420- if (($size22602291 == 8))
421- then $acc822602291
422- else {
423- let $acc922602291 = isSymbolG($acc822602291, $list22602291[8])
424- throw("List size exceed 8")
425- }
426- }
427- }
428- }
429- }
430- }
431- }
432- }
433- }
434- }) + "G"))) + getAmountOrClear((toString({
435- let $list23282359 = genotype
436- let $size23282359 = size($list23282359)
437- let $acc023282359 = 0
438- if (($size23282359 == 0))
439- then $acc023282359
440- else {
441- let $acc123282359 = isSymbolH($acc023282359, $list23282359[0])
442- if (($size23282359 == 1))
443- then $acc123282359
444- else {
445- let $acc223282359 = isSymbolH($acc123282359, $list23282359[1])
446- if (($size23282359 == 2))
447- then $acc223282359
448- else {
449- let $acc323282359 = isSymbolH($acc223282359, $list23282359[2])
450- if (($size23282359 == 3))
451- then $acc323282359
452- else {
453- let $acc423282359 = isSymbolH($acc323282359, $list23282359[3])
454- if (($size23282359 == 4))
455- then $acc423282359
456- else {
457- let $acc523282359 = isSymbolH($acc423282359, $list23282359[4])
458- if (($size23282359 == 5))
459- then $acc523282359
460- else {
461- let $acc623282359 = isSymbolH($acc523282359, $list23282359[5])
462- if (($size23282359 == 6))
463- then $acc623282359
464- else {
465- let $acc723282359 = isSymbolH($acc623282359, $list23282359[6])
466- if (($size23282359 == 7))
467- then $acc723282359
468- else {
469- let $acc823282359 = isSymbolH($acc723282359, $list23282359[7])
470- if (($size23282359 == 8))
471- then $acc823282359
472- else {
473- let $acc923282359 = isSymbolH($acc823282359, $list23282359[8])
474- throw("List size exceed 8")
475- }
476- }
477- }
478- }
479- }
480- }
481- }
482- }
483- }
484- }) + "H")))
28+func tryGetInteger (key) = {
29+ let val = match getInteger(this, key) {
30+ case b: Int =>
31+ b
32+ case _ =>
33+ 0
34+ }
35+ val
48536 }
48637
48738
488-func getAssetOrigin (generation) = if ((generation == "G"))
489- then incubatorAddress
490- else breederAddress
491-
492-
493-func getAssetRarity (genotype,generation) = {
494- let quantity = getIntegerValue(Address(getAssetOrigin(generation)), (("stats_" + genotype) + "_quantity"))
495- let power = pow((10000 / quantity), 4, 5, 1, 2, HALFDOWN)
496- if ((power > 0))
497- then power
498- else 2
39+func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = {
40+ let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
41+ let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
42+ (toInt(randomHash, (offset * 8)) % variants)
49943 }
50044
50145
502-func getAssetFarmingPower (assetId) = {
503- let assetName = value(assetInfo(assetId)).name
504- let generation = take(takeRight(assetName, 2), 1)
505- let gen = ((getGen(assetName) + "-") + generation)
506- $Tuple2(gen, getAssetRarity(gen, generation))
46+func wasUniqueBorn (gen) = tryGetInteger(getDuckStatsKey(gen))
47+
48+
49+func getRandomName (txId,hatchingFinishHeight) = {
50+ let jackpotRandom = getRandomNumber(500, txId, hatchingFinishHeight, 0)
51+ if (if ((jackpotRandom == 1))
52+ then (wasUniqueBorn("DUCK-WWWWWWWW-JU") == 0)
53+ else false)
54+ then $Tuple2("DUCK-WWWWWWWW-JU", "8W-J")
55+ else {
56+ let typeRandom = getRandomNumber(4, txId, hatchingFinishHeight, 0)
57+ let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 1)
58+ let color = if ((colorRandom == 0))
59+ then "Y"
60+ else if ((colorRandom == 1))
61+ then "G"
62+ else if ((colorRandom == 2))
63+ then "B"
64+ else "R"
65+ if ((typeRandom == 0))
66+ then $Tuple2(("DUCK-FFFFFFFF-G" + color), "8F-G")
67+ else if ((typeRandom == 1))
68+ then $Tuple2(("DUCK-DDDDDDDD-G" + color), "8D-G")
69+ else if ((typeRandom == 2))
70+ then $Tuple2(("DUCK-CCCCCCCC-G" + color), "8C-G")
71+ else $Tuple2(("DUCK-EEEEEEEE-G" + color), "8E-G")
72+ }
50773 }
50874
50975
510-func getLastKnownAssetFarmingPower (address,assetId) = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_farmingPower"))
511-
512-
513-func getAssetsByGen (gen) = {
514- let s = tryGetString(("assets_" + gen))
515- if ((s == ""))
516- then nil
517- else split(s, ",")
518- }
519-
520-
521-func calcInterest (previousInterest,previousInterestHeight,totalFarmingPower) = (previousInterest + (((scale * getRewardPerBlock()) * (height - previousInterestHeight)) / totalFarmingPower))
522-
523-
524-func getCurrentInterest () = if ((tryGetInteger("total_farmingPower") > 0))
525- then {
526- let previousInterest = tryGetInteger("total_lastCheckInterest")
527- let previousInterestHeight = tryGetInteger("total_lastCheckInterestHeight")
528- let totalFarmingPower = tryGetInteger("total_farmingPower")
529- calcInterest(previousInterest, previousInterestHeight, totalFarmingPower)
530- }
531- else if ((tryGetInteger("total_startHeight") != 0))
532- then tryGetInteger("total_lastCheckInterest")
533- else throw("farming is not launched, yet")
534-
535-
536-func calcAssetRewardDelta (address,assetId,assetFarmingPower) = {
537- let lastCheckAssetInterest = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_lastCheckInterest"))
538- let currentInterest = getCurrentInterest()
539- (assetFarmingPower * (currentInterest - lastCheckAssetInterest))
540- }
541-
542-
543-func addAssetIdToGenEntry (assetId,assetGen) = {
544- let currentValue = tryGetString((("assets_" + assetGen) + "_locked"))
545- if ((currentValue == ""))
546- then assetId
547- else ((currentValue + ",") + assetId)
548- }
549-
550-
551-func getStakeResult (address,assetId,assetFarmingPower) = {
552- let asset = toBase58String(assetId)
553-[IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") + assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), assetFarmingPower), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest())]
554- }
555-
556-
557-func getUnstakeResult (address,assetId,rewardDelta,withdrawnAmount,assetFarmingPower) = {
558- let asset = toBase58String(assetId)
559-[IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") - assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), 0), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (withdrawnAmount * scale2))), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")) + rewardDelta))]
76+func countEggsNeededAmount (totalDucksAmount) = {
77+ let n = totalDucksAmount
78+ let g = discountCoefficient
79+ let t = typesAmount
80+ let price = pow((100 + ((n * g) / (10 * t))), 2, 5, 1, 2, DOWN)
81+ price
56082 }
56183
56284
56385 @Callable(i)
564-func init () = if ((i.caller != this))
565- then throw("admin only")
566- else [IntegerEntry("total_startHeight", height)]
567-
568-
569-
570-@Callable(i)
571-func buyPerch (color) = if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
572- then throw("you need to set color properly")
573- else {
574- let firstPayment = value(i.payments[0])
575- if ((firstPayment.assetId != eggsAssetId))
576- then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
577- else if ((firstPayment.amount != perchPrice))
578- then throw(("To buy a perch you currently need the following amount of EGGlets: " + toString(perchPrice)))
579- else {
580- let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)
581- let perchAmount = tryGetInteger(perchAmountKey)
582-[IntegerEntry(perchAmountKey, (perchAmount + 1))]
583- }
584- }
585-
586-
587-
588-@Callable(i)
589-func stakeNFT () = nil
590-
591-
592-
593-@Callable(i)
594-func unstakeNFT (asset) = nil
595-
596-
597-
598-@Callable(i)
599-func stakeJackpot (color) = {
600- let assetId = value(value(i.payments[0]).assetId)
601- let address = toString(i.caller)
602- let availablePerches = tryGetInteger(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color))
603- if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
604- then throw("jackpot only")
605- else if ((0 >= availablePerches))
606- then throw(("no perches available for the color " + color))
607- else {
608- let assetFarmingPower = 100
609- (getStakeResult(address, assetId, assetFarmingPower) ++ [IntegerEntry(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + toString(i.caller)) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)])
610- }
86+func startDuckHatching () = {
87+ let totalDucksAmount = tryGetInteger("ducks_amount")
88+ let eggsNeeded = countEggsNeededAmount(totalDucksAmount)
89+ let firstPayment = value(i.payments[0])
90+ if ((firstPayment.assetId != eggsAssetId))
91+ then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
92+ else if ((eggsNeeded > firstPayment.amount))
93+ then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded)))
94+ else [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), ScriptTransfer(i.caller, (firstPayment.amount - eggsNeeded), eggsAssetId)]
61195 }
61296
61397
61498
61599 @Callable(i)
616-func unstakeJackpot (asset) = {
617- let assetId = fromBase58String(asset)
618- let address = toString(i.caller)
619- let color = tryGetString((((("address_" + address) + "_asset_") + asset) + "_perchColor"))
620- let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset)
621- let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower)
622- let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")))
623- let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"))
624- let reward = ((farmedAmount - withdrawnAmount) / (scale * 100))
625- if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
626- then throw("jackpot only")
627- else if ((assetFarmingPower > 0))
628- then {
629- let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower)
630- (result ++ [IntegerEntry(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)) + 1)), ScriptTransfer(i.caller, reward, eggsAssetId), ScriptTransfer(i.caller, 1, assetId)])
100+func finishDuckHatching (txIdStr) = {
101+ let txId = fromBase58String(txIdStr)
102+ let hatchingStatusKey = getHatchingStatusKey(toString(i.caller), txId)
103+ let finishHeightKey = getHatchingFinishHeightKey(toString(i.caller), txId)
104+ let duckIdKey = getDuckIdKey(toString(i.caller), txId)
105+ let hatchingTxStatus = getStringValue(this, hatchingStatusKey)
106+ let hatchingFinishHeight = getIntegerValue(this, finishHeightKey)
107+ if ((hatchingTxStatus == HatchingFinished))
108+ then {
109+ let duckId = getStringValue(this, getDuckIdKey(toString(i.caller), txId))
110+ throw(("The duck was hatched and claimed already, here is the folowing: " + duckId))
111+ }
112+ else if ((hatchingFinishHeight > height))
113+ then throw((((("Hatching is not finished yet " + toString((hatchingFinishHeight - height))) + " blocks remaining, it will take around ") + toString((hatchingFinishHeight - height))) + " minutes"))
114+ else {
115+ let $t042864352 = getRandomName(txId, hatchingFinishHeight)
116+ let duckGen = $t042864352._1
117+ let farmGen = $t042864352._2
118+ let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
119+ let asset = Issue(duckGen, description, 1, 0, false, unit, hatchingFinishHeight)
120+ let assetId = calculateAssetId(asset)
121+ let amount = (tryGetInteger(getDuckStatsKey(duckGen)) + 1)
122+[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)]
631123 }
632- else throw("")
633124 }
634-
635-
636-
637-@Callable(i)
638-func claimReward (asset) = nil
639125
640126
641127 @Verifier(tx)
642128 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
643129

github/deemru/w8io/6500d08 
90.53 ms