tx · 5XrLTkAhuDGUpvGwUcsc3ShcQcKoCa8mgR92vbAgQhfM

3P9REuLBnYBafDqtEu6hfzs2Rv2haSU158y:  -0.01400000 Waves

2022.05.08 22:35 [3108613] smart account 3P9REuLBnYBafDqtEu6hfzs2Rv2haSU158y > SELF 0.00000000 Waves

{ "type": 13, "id": "5XrLTkAhuDGUpvGwUcsc3ShcQcKoCa8mgR92vbAgQhfM", "fee": 1400000, "feeAssetId": null, "timestamp": 1652038548761, "version": 2, "chainId": 87, "sender": "3P9REuLBnYBafDqtEu6hfzs2Rv2haSU158y", "senderPublicKey": "4o7Wphn2swW4DxuPY7UcT6YpsZniEMnDH818h1pC3BeX", "proofs": [ "2UnMeUt14BCJPFrqRZZymerSP4bo61bTxvjttCT7QH1avX9JnHowMK2ogBxn5CZFkQeBS8rofUxkL9tGWdbPzzLi" ], "script": "base64:AAIFAAAAAAAAADUIAhIDCgEIEggKBgIBAQEIARIDCgEIEgMKAQgSBQoDAggBEgASBAoCCAgSAwoBCBIECgIICAAAACcAAAAAEGRlbGF5Rm9ySGF0Y2hpbmcAAAAAAAAAAAIAAAAAD0hhdGNoaW5nU3RhcnRlZAIAAAAQQlJFRURJTkdfU1RBUlRFRAAAAAAQSGF0Y2hpbmdGaW5pc2hlZAIAAAARQlJFRURJTkdfRklOSVNIRUQBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAAAx0cnlHZXRTdHJpbmcAAAABAAAAA2tleQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgUAAAAEdGhpcwUAAAADa2V5AQAAAAlnZXRPcmFjbGUAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAADHRyeUdldFN0cmluZwAAAAECAAAAFHN0YXRpY19vcmFjbGVBZGRyZXNzAQAAABNnZXRJbmN1YmF0b3JBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABdzdGF0aWNfaW5jdWJhdG9yQWRkcmVzcwEAAAARZ2V0UmViaXJ0aEFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAFXN0YXRpY19yZWJpcnRoQWRkcmVzcwEAAAAPZ2V0SXRlbXNBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABNzdGF0aWNfaXRlbXNBZGRyZXNzAAAAAA1NYXhHZW5lcmF0aW9uAAAAAAAAAAAH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AAAAAQUAAAAHZHVja0dlbgkAAGQAAAACBQAAAAZhbW91bnQAAAAAAAAAAAEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZzdGF0c18FAAAAB2Zhcm1HZW4CAAAACV9xdWFudGl0eQkAAGQAAAACBQAAAAhxdWFudGl0eQAAAAAAAAAAAQkABEwAAAACBQAAAAVhc3NldAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEAAAAPZmluaXNoRHVja0hhdGNoAAAAAwAAAAd0eElkU3RyAAAABW93bmVyAAAAD2R1Y2tHZW5lc1N0cmluZwQAAAAEdHhJZAkAAlkAAAABBQAAAAd0eElkU3RyBAAAABBwcm9jZXNzU3RhdHVzS2V5CQEAAAATZ2V0UHJvY2Vzc1N0YXR1c0tleQAAAAIFAAAABW93bmVyBQAAAAR0eElkBAAAAAlkdWNrSWRLZXkJAQAAAAxnZXREdWNrSWRLZXkAAAACBQAAAAVvd25lcgUAAAAEdHhJZAQAAAAPcHJvY2Vzc1R4U3RhdHVzCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAABBwcm9jZXNzU3RhdHVzS2V5BAAAAA9maW5pc2hIZWlnaHRLZXkJAQAAABlnZXRQcm9jZXNzRmluaXNoSGVpZ2h0S2V5AAAAAgUAAAAFb3duZXIFAAAABHR4SWQEAAAAE3Byb2Nlc3NGaW5pc2hIZWlnaHQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMFAAAAD2ZpbmlzaEhlaWdodEtleQMJAAAAAAAAAgUAAAAPcHJvY2Vzc1R4U3RhdHVzBQAAABBIYXRjaGluZ0ZpbmlzaGVkBAAAAAZkdWNrSWQJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMJAQAAAAxnZXREdWNrSWRLZXkAAAACBQAAAAVvd25lcgUAAAAEdHhJZAkAAAIAAAABCQABLAAAAAICAAAAQFRoZSBkdWNrIHdhcyBicmVlZGVkIGFuZCBjbGFpbWVkIGFscmVhZHksIGhlcmUgaXMgdGhlIGZvbG93aW5n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AAAAAAAAAAAFAAAABHR4SWQFAAAAFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQAAAA5nZW5lRnJvbVBhcmVudAUAAAALZ2VuZVBvc3Rpb24FAAAADnNwZWNpZmlxdWVHZW5lBQAAABZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEAAAAMZ2V0UmFuZG9tR2VuAAAACQkAAZEAAAACBQAAAApwYXJlbnQxR2VuAAAAAAAAAAAGCQABkQAAAAIFAAAACnBhcmVudDJHZW4AAAAAAAAAAAYAAAAAAAAAAAEFAAAABHR4SWQFAAAAFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQAAAA5nZW5lRnJvbVBhcmVudAUAAAALZ2VuZVBvc3Rpb24FAAAADnNwZWNpZmlxdWVHZW5lBQAAABZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEAAAAMZ2V0UmFuZG9tR2VuAAAACQkAAZEAAAACBQAAAApwYXJlbnQxR2VuAAAAAAAAAAAHCQABkQAAAAIFAAAACnBhcmVudDJHZW4AAAAAAAAAAAcAAAAAAAAAAAIFAAAABHR4SWQFAAAAFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQAAAA5nZW5lRnJvbVBhcmVudAUAAAALZ2VuZVBvc3Rpb24FAAAADnNwZWNpZmlxdWVHZW5lBQAAABZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEAAAAMZ2V0UmFuZG9tR2VuAAAACQkAAZEAAAACBQAAAApwYXJlbnQxR2VuAAAAAAAAAAAICQABkQAAAAIFAAAACnBhcmVudDJHZW4AAAAAAAAAAAgAAAAAAAAAAAMFAAAABHR4SWQFAAAAFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQAAAA5nZW5lRnJvbVBhcmVudAUAAAALZ2VuZVBvc3Rpb24FAAAADnNwZWNpZmlxdWVHZW5lBQAAABZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEAAAAMZ2V0UmFuZG9tR2VuAAAACQkAAZEAAAACBQAAAApwYXJlbnQxR2VuAAAAAAAAAAAJCQABkQAAAAIFAAAACnBhcmVudDJHZW4AAAAAAAAAAAkAAAAAAAAAAAQFAAAABHR4SWQFAAAAFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQAAAA5nZW5lRnJvbVBhcmVudAUAAAALZ2VuZVBvc3Rpb24FAAAADnNwZWNpZmlxdWVHZW5lBQAAABZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEAAAAMZ2V0UmFuZG9tR2VuAAAACQkAAZEAAAACBQAAAApwYXJlbnQxR2VuAAAAAAAAAAAKCQABkQAAAAIFAAAACnBhcmVudDJHZW4AAAAAAAAAAAoAAAAAAAAAAAUFAAAABHR4SWQFAAAAFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQAAAA5nZW5lRnJvbVBhcmVudAUAAAALZ2VuZVBvc3Rpb24FAAAADnNwZWNpZmlxdWVHZW5lBQAAABZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEAAAAMZ2V0UmFuZG9tR2VuAAAACQkAAZEAAAACBQAAAApwYXJlbnQxR2VuAAAAAAAAAAALCQABkQAAAAIFAAAACnBhcmVudDJHZW4AAAAAAAAAAAsAAAAAAAAAAAYFAAAABHR4SWQFAAAAFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQAAAA5nZW5lRnJvbVBhcmVudAUAAAALZ2VuZVBvc3Rpb24FAAAADnNwZWNpZmlxdWVHZW5lBQAAABZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEAAAAMZ2V0UmFuZG9tR2VuAAAACQkAAZEAAAACBQAAAApwYXJlbnQxR2VuAAAAAAAAAAAMCQABkQAAAAIFAAAACnBhcmVudDJHZW4AAAAAAAAAAAwAAAAAAAAAAAcFAAAABHR4SWQFAAAAFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQAAAA5nZW5lRnJvbVBhcmVudAUAAAALZ2VuZVBvc3Rpb24FAAAADnNwZWNpZmlxdWVHZW5lBQAAABZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uAgAAAAEtCQEAAAATZGV0ZXJtaW5lR2VuZXJhdGlvbgAAAAIJAAGRAAAAAgUAAAAKcGFyZW50MUdlbgAAAAAAAAAADgkAAZEAAAACBQAAAApwYXJlbnQyR2VuAAAAAAAAAAAOBQAAAAVjb2xvcgkABRQAAAACBQAAAANuaWwFAAAAA2dlbgAAAAFpAQAAAA5nZXRHZW5Gcm9tTmFtZQAAAAEAAAAJYXNzZXROYW1lBAAAAAhnZW5vdHlwZQkABLUAAAACCQEAAAAJZHJvcFJp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", "height": 3108613, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GTFSvQT7sCCa7gqav5vvjjJTgGdzaxeox2Vh6gz4GiZY Next: At2fkSXRgYZjpCjj1KgQTCSk6kWkaMTwLcac4sRnpirT Diff:
OldNewDifferences
77
88 let HatchingFinished = "BREEDING_FINISHED"
99
10-let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
10+func tryGetStringExternal (address,key) = match getString(address, key) {
11+ case a: String =>
12+ a
13+ case _ =>
14+ ""
15+}
1116
12-let GENS = ["A", "B", "C", "D", "E", "F", "G", "H"]
17+
18+func tryGetString (key) = tryGetStringExternal(this, key)
19+
20+
21+func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
22+
23+
24+func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
25+
26+
27+func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
28+
29+
30+func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress")))
31+
1332
1433 let MaxGeneration = 7
1534
1635 let Generations = ["G", "H", "I", "K", "L", "M", "N", "O"]
17-
18-let rebirthAddress = base58'3PCC6fVHNa6289DTDmcUo3RuLaFmteZZsmQ'
1936
2037 func getProcessStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status")
2138
4360 }
4461
4562
46-func tryGetString (key) = {
47- let val = match getString(this, key) {
48- case b: String =>
49- b
50- case _ =>
51- ""
52- }
53- val
54- }
55-
56-
5763 func determineGeneration (g1,g2) = {
5864 let gIndex = max([value(indexOf(Generations, g1)), value(indexOf(Generations, g2))])
5965 Generations[(gIndex + 1)]
6773 }
6874
6975
70-func getRandomGen (gen1,gen2,step,txId,hatchingFinishHeight) = {
71- let randomNum = getRandomNumber(2, txId, hatchingFinishHeight, step)
72- let gen = if ((randomNum == 0))
76+func getRandomGen (gen1,gen2,step,txId,hatchingFinishHeight,geneFromParent,genePostion,specifiqueGene,specifiqueGenePosition) = if (if ((geneFromParent != 0))
77+ then (genePostion == step)
78+ else false)
79+ then if ((geneFromParent == 1))
7380 then gen1
74- else gen2
75- gen
76- }
77-
78-
79-func generateDuck (txId,hatchingFinishHeight) = {
80- let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 11)
81- let color = if ((colorRandom == 0))
82- then "Y"
83- else if ((colorRandom == 1))
84- then "G"
85- else if ((colorRandom == 2))
86- then "B"
87- else "R"
88- let parent1Id = fromBase58String(tryGetString(getDuckParentKey(txId, 1)))
89- let parent2Id = fromBase58String(tryGetString(getDuckParentKey(txId, 2)))
90- let parent1Gen = split(value(assetInfo(parent1Id)).name, "")
91- let parent2Gen = split(value(assetInfo(parent2Id)).name, "")
92- 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[11], 6, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[12], parent2Gen[12], 7, txId, hatchingFinishHeight)) + "-") + determineGeneration(parent1Gen[14], parent2Gen[14])) + color)
93- gen
94- }
81+ else if ((geneFromParent == 2))
82+ then gen2
83+ else throw("Parent either needs to be 1 or 2")
84+ else if (if ((specifiqueGene != ""))
85+ then (specifiqueGenePosition == step)
86+ else false)
87+ then specifiqueGene
88+ else {
89+ let randomNum = getRandomNumber(2, txId, hatchingFinishHeight, step)
90+ let gen = if ((randomNum == 0))
91+ then gen1
92+ else gen2
93+ gen
94+ }
9595
9696
9797 func checkAssetInIncubator (assetId) = {
98- let result = match getString(Address(incubatorAddress), assetId) {
98+ let result = match getString(getIncubatorAddress(), assetId) {
9999 case b: String =>
100100 true
101101 case _ =>
169169 else (accumulated + 0)
170170
171171
172+func isSymbolK (accumulated,sym) = if ((sym == "K"))
173+ then (accumulated + 1)
174+ else (accumulated + 0)
175+
176+
172177 func isSymbolS (accumulated,sym) = if ((sym == "S"))
173178 then (accumulated + 1)
174179 else (accumulated + 0)
182187 func getAmountOrClear (amount) = if (contains(amount, "0"))
183188 then ""
184189 else amount
185-
186-
187-func getItemsAddress () = Address(fromBase58String(tryGetString("static_itemsAddress")))
188190
189191
190192 func asString (value) = match value {
203205 }
204206
205207
208+func composeGenericData (duckGen,duckIdKey,assetId,asset) = {
209+ let farmGen = asString(invoke(this, "getGenFromName", [duckGen], nil))
210+ if ((farmGen == farmGen))
211+ then {
212+ let amount = tryGetInteger(getDuckStatsKey(duckGen))
213+ let quantity = tryGetInteger((("stats_" + farmGen) + "_quantity"))
214+[StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), (amount + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (quantity + 1)), asset]
215+ }
216+ else throw("Strict value is not equal to itself.")
217+ }
218+
219+
220+func finishDuckHatch (txIdStr,owner,duckGenesString) = {
221+ let txId = fromBase58String(txIdStr)
222+ let processStatusKey = getProcessStatusKey(owner, txId)
223+ let duckIdKey = getDuckIdKey(owner, txId)
224+ let processTxStatus = getStringValue(this, processStatusKey)
225+ let finishHeightKey = getProcessFinishHeightKey(owner, txId)
226+ let processFinishHeight = getIntegerValue(this, finishHeightKey)
227+ if ((processTxStatus == HatchingFinished))
228+ then {
229+ let duckId = getStringValue(this, getDuckIdKey(owner, txId))
230+ throw(("The duck was breeded and claimed already, here is the folowing: " + duckId))
231+ }
232+ else if ((processFinishHeight > height))
233+ then throw((((("Breeding is not finished yet " + toString((processFinishHeight - height))) + " blocks remaining, it will take around ") + toString((processFinishHeight - height))) + " minutes"))
234+ else {
235+ let duckGen = if ((duckGenesString == ""))
236+ then asString(invoke(this, "generateDuck", [txId, processFinishHeight, 0, 0, "", 0], nil))
237+ else duckGenesString
238+ if ((duckGen == duckGen))
239+ then {
240+ let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
241+ let asset = Issue(duckGen, description, 1, 0, false, unit, processFinishHeight)
242+ let assetId = calculateAssetId(asset)
243+ let parent1Id = tryGetString(getDuckParentKey(txId, 1))
244+ let parent2Id = tryGetString(getDuckParentKey(txId, 2))
245+ (composeGenericData(duckGen, duckIdKey, assetId, asset) ++ [StringEntry(processStatusKey, HatchingFinished), IntegerEntry((("asset_" + parent1Id) + "_children"), 1), IntegerEntry((("asset_" + parent2Id) + "_children"), 1), ScriptTransfer(addressFromStringValue(owner), 1, assetId), ScriptTransfer(addressFromStringValue(owner), 1, fromBase58String(parent1Id)), ScriptTransfer(addressFromStringValue(owner), 1, fromBase58String(parent2Id))])
246+ }
247+ else throw("Strict value is not equal to itself.")
248+ }
249+ }
250+
251+
252+@Callable(i)
253+func configureOracle (oracle) = if ((i.caller != this))
254+ then throw("admin only")
255+ else [StringEntry("static_oracleAddress", oracle)]
256+
257+
258+
259+@Callable(i)
260+func generateDuck (txId,hatchingFinishHeight,geneFromParent,genePostion,specifiqueGene,specifiqueGenePosition) = {
261+ let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 11)
262+ let color = if ((colorRandom == 0))
263+ then "Y"
264+ else if ((colorRandom == 1))
265+ then "G"
266+ else if ((colorRandom == 2))
267+ then "B"
268+ else "R"
269+ let parent1Id = fromBase58String(tryGetString(getDuckParentKey(txId, 1)))
270+ let parent2Id = fromBase58String(tryGetString(getDuckParentKey(txId, 2)))
271+ let parent1Gen = split(value(assetInfo(parent1Id)).name, "")
272+ let parent2Gen = split(value(assetInfo(parent2Id)).name, "")
273+ let gen = ((((((((((("DUCK-" + getRandomGen(parent1Gen[5], parent2Gen[5], 0, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[6], parent2Gen[6], 1, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[7], parent2Gen[7], 2, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[8], parent2Gen[8], 3, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[9], parent2Gen[9], 4, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[10], parent2Gen[10], 5, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[11], parent2Gen[11], 6, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[12], parent2Gen[12], 7, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + "-") + determineGeneration(parent1Gen[14], parent2Gen[14])) + color)
274+ $Tuple2(nil, gen)
275+ }
276+
277+
278+
206279 @Callable(i)
207280 func getGenFromName (assetName) = {
208281 let genotype = split(dropRight(drop(assetName, 5), 3), "")
209282 let generation = split(assetName, "")[14]
210- let gen = ((((((((((((getAmountOrClear((toString({
283+ let gen = (((((((((((((getAmountOrClear((toString({
211284 let $l = genotype
212285 let $s = size($l)
213286 let $acc0 = 0
330403 let $acc0 = 0
331404 func $f9_1 ($a,$i) = if (($i >= $s))
332405 then $a
333- else isSymbolS($a, $l[$i])
406+ else isSymbolK($a, $l[$i])
334407
335408 func $f9_2 ($a,$i) = if (($i >= $s))
336409 then $a
337410 else throw("List size exceeds 8")
338411
339412 $f9_2($f9_1($f9_1($f9_1($f9_1($f9_1($f9_1($f9_1($f9_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
340- }) + "S"))) + getAmountOrClear((toString({
413+ }) + "K"))) + getAmountOrClear((toString({
341414 let $l = genotype
342415 let $s = size($l)
343416 let $acc0 = 0
344417 func $f10_1 ($a,$i) = if (($i >= $s))
345418 then $a
346- else isSymbolT($a, $l[$i])
419+ else isSymbolS($a, $l[$i])
347420
348421 func $f10_2 ($a,$i) = if (($i >= $s))
349422 then $a
350423 else throw("List size exceeds 8")
351424
352425 $f10_2($f10_1($f10_1($f10_1($f10_1($f10_1($f10_1($f10_1($f10_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
426+ }) + "S"))) + getAmountOrClear((toString({
427+ let $l = genotype
428+ let $s = size($l)
429+ let $acc0 = 0
430+ func $f11_1 ($a,$i) = if (($i >= $s))
431+ then $a
432+ else isSymbolT($a, $l[$i])
433+
434+ func $f11_2 ($a,$i) = if (($i >= $s))
435+ then $a
436+ else throw("List size exceeds 8")
437+
438+ $f11_2($f11_1($f11_1($f11_1($f11_1($f11_1($f11_1($f11_1($f11_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
353439 }) + "T"))) + "-") + generation)
354440 $Tuple2(nil, gen)
355441 }
379465 let duckIdKey = getDuckIdKey(toString(i.caller), txId)
380466 let farmGen = asString(invoke(this, "getGenFromName", [duckGen], nil))
381467 if ((farmGen == farmGen))
382- then {
383- let amount = tryGetInteger(getDuckStatsKey(duckGen))
384- let quantity = tryGetInteger((("stats_" + farmGen) + "_quantity"))
385- let composeGenericData = [StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), (amount + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (quantity + 1)), asset]
386- (composeGenericData ++ [IntegerEntry((("asset_" + toBase58String(assetId)) + "_children"), children), ScriptTransfer(Address(address), 1, assetId)])
387- }
468+ then (composeGenericData(duckGen, duckIdKey, assetId, asset) ++ [IntegerEntry((("asset_" + toBase58String(assetId)) + "_children"), children), ScriptTransfer(Address(address), 1, assetId)])
388469 else throw("Strict value is not equal to itself.")
389470 }
390471
425506
426507
427508 @Callable(i)
509+func finishDuckHatchingItems (txIdStr,duckGenesString) = if (if ((i.caller != getItemsAddress()))
510+ then (duckGenesString != "")
511+ else false)
512+ then throw("Only items can create fixed genes")
513+ else {
514+ let owner = toString(i.originCaller)
515+ finishDuckHatch(txIdStr, owner, duckGenesString)
516+ }
517+
518+
519+
520+@Callable(i)
428521 func finishDuckHatching (txIdStr) = {
429- let txId = fromBase58String(txIdStr)
430- let processStatusKey = getProcessStatusKey(toString(i.caller), txId)
431- let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
432- let duckIdKey = getDuckIdKey(toString(i.caller), txId)
433- let processTxStatus = getStringValue(this, processStatusKey)
434- let processFinishHeight = getIntegerValue(this, finishHeightKey)
435- if ((processTxStatus == HatchingFinished))
436- then {
437- let duckId = getStringValue(this, getDuckIdKey(toString(i.caller), txId))
438- throw(("The duck was breeded and claimed already, here is the folowing: " + duckId))
439- }
440- else if ((processFinishHeight > height))
441- then throw((((("Breeding is not finished yet " + toString((processFinishHeight - height))) + " blocks remaining, it will take around ") + toString((processFinishHeight - height))) + " minutes"))
442- else {
443- let duckGen = generateDuck(txId, processFinishHeight)
444- let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
445- let asset = Issue(duckGen, description, 1, 0, false, unit, processFinishHeight)
446- let assetId = calculateAssetId(asset)
447- let parent1Id = tryGetString(getDuckParentKey(txId, 1))
448- let parent2Id = tryGetString(getDuckParentKey(txId, 2))
449- let farmGen = asString(invoke(this, "getGenFromName", [duckGen], nil))
450- if ((farmGen == farmGen))
451- then {
452- let amount = tryGetInteger(getDuckStatsKey(duckGen))
453- let quantity = tryGetInteger((("stats_" + farmGen) + "_quantity"))
454- let composeGenericData = [StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), (amount + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (quantity + 1)), asset]
455- (composeGenericData ++ [StringEntry(processStatusKey, HatchingFinished), IntegerEntry((("asset_" + parent1Id) + "_children"), 1), IntegerEntry((("asset_" + parent2Id) + "_children"), 1), asset, ScriptTransfer(i.caller, 1, assetId), ScriptTransfer(i.caller, 1, fromBase58String(parent1Id)), ScriptTransfer(i.caller, 1, fromBase58String(parent2Id))])
456- }
457- else throw("Strict value is not equal to itself.")
458- }
522+ let owner = toString(i.caller)
523+ finishDuckHatch(txIdStr, owner, "")
459524 }
460525
461526
464529 func reduceRarity (assetId,farmGen) = {
465530 let asset = fromBase58String(assetId)
466531 if (if (if ((i.caller != getItemsAddress()))
467- then (i.caller != Address(rebirthAddress))
532+ then (i.caller != getRebirthAddress())
468533 else false)
469534 then (i.caller != this)
470535 else false)
476541 }
477542
478543
479-@Verifier(tx)
480-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
481-
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let delayForHatching = 2
55
66 let HatchingStarted = "BREEDING_STARTED"
77
88 let HatchingFinished = "BREEDING_FINISHED"
99
10-let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
10+func tryGetStringExternal (address,key) = match getString(address, key) {
11+ case a: String =>
12+ a
13+ case _ =>
14+ ""
15+}
1116
12-let GENS = ["A", "B", "C", "D", "E", "F", "G", "H"]
17+
18+func tryGetString (key) = tryGetStringExternal(this, key)
19+
20+
21+func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
22+
23+
24+func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
25+
26+
27+func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
28+
29+
30+func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress")))
31+
1332
1433 let MaxGeneration = 7
1534
1635 let Generations = ["G", "H", "I", "K", "L", "M", "N", "O"]
17-
18-let rebirthAddress = base58'3PCC6fVHNa6289DTDmcUo3RuLaFmteZZsmQ'
1936
2037 func getProcessStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status")
2138
2239
2340 func getProcessFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
2441
2542
2643 func getDuckParentKey (txId,parentNum) = ((("inittx_" + toBase58String(txId)) + "_parent") + toString(parentNum))
2744
2845
2946 func getDuckIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di")
3047
3148
3249 func getDuckStatsKey (genString) = (("stats_" + genString) + "_amount")
3350
3451
3552 func tryGetInteger (key) = {
3653 let val = match getInteger(this, key) {
3754 case b: Int =>
3855 b
3956 case _ =>
4057 0
4158 }
4259 val
4360 }
4461
4562
46-func tryGetString (key) = {
47- let val = match getString(this, key) {
48- case b: String =>
49- b
50- case _ =>
51- ""
52- }
53- val
54- }
55-
56-
5763 func determineGeneration (g1,g2) = {
5864 let gIndex = max([value(indexOf(Generations, g1)), value(indexOf(Generations, g2))])
5965 Generations[(gIndex + 1)]
6066 }
6167
6268
6369 func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = {
6470 let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
6571 let randomHash = sha256_16Kb((txId + value(randomSeedBlock.vrf)))
6672 (toInt(randomHash, offset) % variants)
6773 }
6874
6975
70-func getRandomGen (gen1,gen2,step,txId,hatchingFinishHeight) = {
71- let randomNum = getRandomNumber(2, txId, hatchingFinishHeight, step)
72- let gen = if ((randomNum == 0))
76+func getRandomGen (gen1,gen2,step,txId,hatchingFinishHeight,geneFromParent,genePostion,specifiqueGene,specifiqueGenePosition) = if (if ((geneFromParent != 0))
77+ then (genePostion == step)
78+ else false)
79+ then if ((geneFromParent == 1))
7380 then gen1
74- else gen2
75- gen
76- }
77-
78-
79-func generateDuck (txId,hatchingFinishHeight) = {
80- let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 11)
81- let color = if ((colorRandom == 0))
82- then "Y"
83- else if ((colorRandom == 1))
84- then "G"
85- else if ((colorRandom == 2))
86- then "B"
87- else "R"
88- let parent1Id = fromBase58String(tryGetString(getDuckParentKey(txId, 1)))
89- let parent2Id = fromBase58String(tryGetString(getDuckParentKey(txId, 2)))
90- let parent1Gen = split(value(assetInfo(parent1Id)).name, "")
91- let parent2Gen = split(value(assetInfo(parent2Id)).name, "")
92- 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[11], 6, txId, hatchingFinishHeight)) + getRandomGen(parent1Gen[12], parent2Gen[12], 7, txId, hatchingFinishHeight)) + "-") + determineGeneration(parent1Gen[14], parent2Gen[14])) + color)
93- gen
94- }
81+ else if ((geneFromParent == 2))
82+ then gen2
83+ else throw("Parent either needs to be 1 or 2")
84+ else if (if ((specifiqueGene != ""))
85+ then (specifiqueGenePosition == step)
86+ else false)
87+ then specifiqueGene
88+ else {
89+ let randomNum = getRandomNumber(2, txId, hatchingFinishHeight, step)
90+ let gen = if ((randomNum == 0))
91+ then gen1
92+ else gen2
93+ gen
94+ }
9595
9696
9797 func checkAssetInIncubator (assetId) = {
98- let result = match getString(Address(incubatorAddress), assetId) {
98+ let result = match getString(getIncubatorAddress(), assetId) {
9999 case b: String =>
100100 true
101101 case _ =>
102102 false
103103 }
104104 let result2 = match getString(this, assetId) {
105105 case c: String =>
106106 true
107107 case _ =>
108108 false
109109 }
110110 if (result)
111111 then true
112112 else result2
113113 }
114114
115115
116116 func canBeBreeded (asset1Id,asset2Id) = {
117117 let asset1Gen = split(value(assetInfo(asset1Id)).name, "")
118118 let asset2Gen = split(value(assetInfo(asset2Id)).name, "")
119119 if ((value(indexOf(Generations, asset1Gen[14])) >= MaxGeneration))
120120 then (("you can only breed ducks with generation " + Generations[MaxGeneration]) + " and lower")
121121 else if ((value(indexOf(Generations, asset2Gen[14])) >= MaxGeneration))
122122 then (("you can only breed ducks with generation " + Generations[MaxGeneration]) + " and lower")
123123 else "true"
124124 }
125125
126126
127127 func isSymbolA (accumulated,sym) = if ((sym == "A"))
128128 then (accumulated + 1)
129129 else (accumulated + 0)
130130
131131
132132 func isSymbolB (accumulated,sym) = if ((sym == "B"))
133133 then (accumulated + 1)
134134 else (accumulated + 0)
135135
136136
137137 func isSymbolC (accumulated,sym) = if ((sym == "C"))
138138 then (accumulated + 1)
139139 else (accumulated + 0)
140140
141141
142142 func isSymbolD (accumulated,sym) = if ((sym == "D"))
143143 then (accumulated + 1)
144144 else (accumulated + 0)
145145
146146
147147 func isSymbolE (accumulated,sym) = if ((sym == "E"))
148148 then (accumulated + 1)
149149 else (accumulated + 0)
150150
151151
152152 func isSymbolF (accumulated,sym) = if ((sym == "F"))
153153 then (accumulated + 1)
154154 else (accumulated + 0)
155155
156156
157157 func isSymbolG (accumulated,sym) = if ((sym == "G"))
158158 then (accumulated + 1)
159159 else (accumulated + 0)
160160
161161
162162 func isSymbolH (accumulated,sym) = if ((sym == "H"))
163163 then (accumulated + 1)
164164 else (accumulated + 0)
165165
166166
167167 func isSymbolI (accumulated,sym) = if ((sym == "I"))
168168 then (accumulated + 1)
169169 else (accumulated + 0)
170170
171171
172+func isSymbolK (accumulated,sym) = if ((sym == "K"))
173+ then (accumulated + 1)
174+ else (accumulated + 0)
175+
176+
172177 func isSymbolS (accumulated,sym) = if ((sym == "S"))
173178 then (accumulated + 1)
174179 else (accumulated + 0)
175180
176181
177182 func isSymbolT (accumulated,sym) = if ((sym == "T"))
178183 then (accumulated + 1)
179184 else (accumulated + 0)
180185
181186
182187 func getAmountOrClear (amount) = if (contains(amount, "0"))
183188 then ""
184189 else amount
185-
186-
187-func getItemsAddress () = Address(fromBase58String(tryGetString("static_itemsAddress")))
188190
189191
190192 func asString (value) = match value {
191193 case string: String =>
192194 string
193195 case _ =>
194196 throw("wrong type, expected: String")
195197 }
196198
197199
198200 func asInt (value) = match value {
199201 case int: Int =>
200202 int
201203 case _ =>
202204 throw("wrong type, expected: Int")
203205 }
204206
205207
208+func composeGenericData (duckGen,duckIdKey,assetId,asset) = {
209+ let farmGen = asString(invoke(this, "getGenFromName", [duckGen], nil))
210+ if ((farmGen == farmGen))
211+ then {
212+ let amount = tryGetInteger(getDuckStatsKey(duckGen))
213+ let quantity = tryGetInteger((("stats_" + farmGen) + "_quantity"))
214+[StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), (amount + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (quantity + 1)), asset]
215+ }
216+ else throw("Strict value is not equal to itself.")
217+ }
218+
219+
220+func finishDuckHatch (txIdStr,owner,duckGenesString) = {
221+ let txId = fromBase58String(txIdStr)
222+ let processStatusKey = getProcessStatusKey(owner, txId)
223+ let duckIdKey = getDuckIdKey(owner, txId)
224+ let processTxStatus = getStringValue(this, processStatusKey)
225+ let finishHeightKey = getProcessFinishHeightKey(owner, txId)
226+ let processFinishHeight = getIntegerValue(this, finishHeightKey)
227+ if ((processTxStatus == HatchingFinished))
228+ then {
229+ let duckId = getStringValue(this, getDuckIdKey(owner, txId))
230+ throw(("The duck was breeded and claimed already, here is the folowing: " + duckId))
231+ }
232+ else if ((processFinishHeight > height))
233+ then throw((((("Breeding is not finished yet " + toString((processFinishHeight - height))) + " blocks remaining, it will take around ") + toString((processFinishHeight - height))) + " minutes"))
234+ else {
235+ let duckGen = if ((duckGenesString == ""))
236+ then asString(invoke(this, "generateDuck", [txId, processFinishHeight, 0, 0, "", 0], nil))
237+ else duckGenesString
238+ if ((duckGen == duckGen))
239+ then {
240+ let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
241+ let asset = Issue(duckGen, description, 1, 0, false, unit, processFinishHeight)
242+ let assetId = calculateAssetId(asset)
243+ let parent1Id = tryGetString(getDuckParentKey(txId, 1))
244+ let parent2Id = tryGetString(getDuckParentKey(txId, 2))
245+ (composeGenericData(duckGen, duckIdKey, assetId, asset) ++ [StringEntry(processStatusKey, HatchingFinished), IntegerEntry((("asset_" + parent1Id) + "_children"), 1), IntegerEntry((("asset_" + parent2Id) + "_children"), 1), ScriptTransfer(addressFromStringValue(owner), 1, assetId), ScriptTransfer(addressFromStringValue(owner), 1, fromBase58String(parent1Id)), ScriptTransfer(addressFromStringValue(owner), 1, fromBase58String(parent2Id))])
246+ }
247+ else throw("Strict value is not equal to itself.")
248+ }
249+ }
250+
251+
252+@Callable(i)
253+func configureOracle (oracle) = if ((i.caller != this))
254+ then throw("admin only")
255+ else [StringEntry("static_oracleAddress", oracle)]
256+
257+
258+
259+@Callable(i)
260+func generateDuck (txId,hatchingFinishHeight,geneFromParent,genePostion,specifiqueGene,specifiqueGenePosition) = {
261+ let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 11)
262+ let color = if ((colorRandom == 0))
263+ then "Y"
264+ else if ((colorRandom == 1))
265+ then "G"
266+ else if ((colorRandom == 2))
267+ then "B"
268+ else "R"
269+ let parent1Id = fromBase58String(tryGetString(getDuckParentKey(txId, 1)))
270+ let parent2Id = fromBase58String(tryGetString(getDuckParentKey(txId, 2)))
271+ let parent1Gen = split(value(assetInfo(parent1Id)).name, "")
272+ let parent2Gen = split(value(assetInfo(parent2Id)).name, "")
273+ let gen = ((((((((((("DUCK-" + getRandomGen(parent1Gen[5], parent2Gen[5], 0, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[6], parent2Gen[6], 1, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[7], parent2Gen[7], 2, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[8], parent2Gen[8], 3, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[9], parent2Gen[9], 4, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[10], parent2Gen[10], 5, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[11], parent2Gen[11], 6, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[12], parent2Gen[12], 7, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + "-") + determineGeneration(parent1Gen[14], parent2Gen[14])) + color)
274+ $Tuple2(nil, gen)
275+ }
276+
277+
278+
206279 @Callable(i)
207280 func getGenFromName (assetName) = {
208281 let genotype = split(dropRight(drop(assetName, 5), 3), "")
209282 let generation = split(assetName, "")[14]
210- let gen = ((((((((((((getAmountOrClear((toString({
283+ let gen = (((((((((((((getAmountOrClear((toString({
211284 let $l = genotype
212285 let $s = size($l)
213286 let $acc0 = 0
214287 func $f0_1 ($a,$i) = if (($i >= $s))
215288 then $a
216289 else isSymbolA($a, $l[$i])
217290
218291 func $f0_2 ($a,$i) = if (($i >= $s))
219292 then $a
220293 else throw("List size exceeds 8")
221294
222295 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
223296 }) + "A")) + getAmountOrClear((toString({
224297 let $l = genotype
225298 let $s = size($l)
226299 let $acc0 = 0
227300 func $f1_1 ($a,$i) = if (($i >= $s))
228301 then $a
229302 else isSymbolB($a, $l[$i])
230303
231304 func $f1_2 ($a,$i) = if (($i >= $s))
232305 then $a
233306 else throw("List size exceeds 8")
234307
235308 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
236309 }) + "B"))) + getAmountOrClear((toString({
237310 let $l = genotype
238311 let $s = size($l)
239312 let $acc0 = 0
240313 func $f2_1 ($a,$i) = if (($i >= $s))
241314 then $a
242315 else isSymbolC($a, $l[$i])
243316
244317 func $f2_2 ($a,$i) = if (($i >= $s))
245318 then $a
246319 else throw("List size exceeds 8")
247320
248321 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
249322 }) + "C"))) + getAmountOrClear((toString({
250323 let $l = genotype
251324 let $s = size($l)
252325 let $acc0 = 0
253326 func $f3_1 ($a,$i) = if (($i >= $s))
254327 then $a
255328 else isSymbolD($a, $l[$i])
256329
257330 func $f3_2 ($a,$i) = if (($i >= $s))
258331 then $a
259332 else throw("List size exceeds 8")
260333
261334 $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
262335 }) + "D"))) + getAmountOrClear((toString({
263336 let $l = genotype
264337 let $s = size($l)
265338 let $acc0 = 0
266339 func $f4_1 ($a,$i) = if (($i >= $s))
267340 then $a
268341 else isSymbolE($a, $l[$i])
269342
270343 func $f4_2 ($a,$i) = if (($i >= $s))
271344 then $a
272345 else throw("List size exceeds 8")
273346
274347 $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
275348 }) + "E"))) + getAmountOrClear((toString({
276349 let $l = genotype
277350 let $s = size($l)
278351 let $acc0 = 0
279352 func $f5_1 ($a,$i) = if (($i >= $s))
280353 then $a
281354 else isSymbolF($a, $l[$i])
282355
283356 func $f5_2 ($a,$i) = if (($i >= $s))
284357 then $a
285358 else throw("List size exceeds 8")
286359
287360 $f5_2($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
288361 }) + "F"))) + getAmountOrClear((toString({
289362 let $l = genotype
290363 let $s = size($l)
291364 let $acc0 = 0
292365 func $f6_1 ($a,$i) = if (($i >= $s))
293366 then $a
294367 else isSymbolG($a, $l[$i])
295368
296369 func $f6_2 ($a,$i) = if (($i >= $s))
297370 then $a
298371 else throw("List size exceeds 8")
299372
300373 $f6_2($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
301374 }) + "G"))) + getAmountOrClear((toString({
302375 let $l = genotype
303376 let $s = size($l)
304377 let $acc0 = 0
305378 func $f7_1 ($a,$i) = if (($i >= $s))
306379 then $a
307380 else isSymbolH($a, $l[$i])
308381
309382 func $f7_2 ($a,$i) = if (($i >= $s))
310383 then $a
311384 else throw("List size exceeds 8")
312385
313386 $f7_2($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
314387 }) + "H"))) + getAmountOrClear((toString({
315388 let $l = genotype
316389 let $s = size($l)
317390 let $acc0 = 0
318391 func $f8_1 ($a,$i) = if (($i >= $s))
319392 then $a
320393 else isSymbolI($a, $l[$i])
321394
322395 func $f8_2 ($a,$i) = if (($i >= $s))
323396 then $a
324397 else throw("List size exceeds 8")
325398
326399 $f8_2($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
327400 }) + "I"))) + getAmountOrClear((toString({
328401 let $l = genotype
329402 let $s = size($l)
330403 let $acc0 = 0
331404 func $f9_1 ($a,$i) = if (($i >= $s))
332405 then $a
333- else isSymbolS($a, $l[$i])
406+ else isSymbolK($a, $l[$i])
334407
335408 func $f9_2 ($a,$i) = if (($i >= $s))
336409 then $a
337410 else throw("List size exceeds 8")
338411
339412 $f9_2($f9_1($f9_1($f9_1($f9_1($f9_1($f9_1($f9_1($f9_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
340- }) + "S"))) + getAmountOrClear((toString({
413+ }) + "K"))) + getAmountOrClear((toString({
341414 let $l = genotype
342415 let $s = size($l)
343416 let $acc0 = 0
344417 func $f10_1 ($a,$i) = if (($i >= $s))
345418 then $a
346- else isSymbolT($a, $l[$i])
419+ else isSymbolS($a, $l[$i])
347420
348421 func $f10_2 ($a,$i) = if (($i >= $s))
349422 then $a
350423 else throw("List size exceeds 8")
351424
352425 $f10_2($f10_1($f10_1($f10_1($f10_1($f10_1($f10_1($f10_1($f10_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
426+ }) + "S"))) + getAmountOrClear((toString({
427+ let $l = genotype
428+ let $s = size($l)
429+ let $acc0 = 0
430+ func $f11_1 ($a,$i) = if (($i >= $s))
431+ then $a
432+ else isSymbolT($a, $l[$i])
433+
434+ func $f11_2 ($a,$i) = if (($i >= $s))
435+ then $a
436+ else throw("List size exceeds 8")
437+
438+ $f11_2($f11_1($f11_1($f11_1($f11_1($f11_1($f11_1($f11_1($f11_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
353439 }) + "T"))) + "-") + generation)
354440 $Tuple2(nil, gen)
355441 }
356442
357443
358444
359445 @Callable(i)
360446 func validateAndGetChildren (assetId) = if (!(checkAssetInIncubator(assetId)))
361447 then throw((("You need to attach a valid NFT-duck. " + assetId) + " is invalid!"))
362448 else {
363449 let children = tryGetInteger((("asset_" + assetId) + "_children"))
364450 $Tuple2(nil, children)
365451 }
366452
367453
368454
369455 @Callable(i)
370456 func createDuckSpecialGenes (address,duckGen,children) = if (if ((i.caller != getItemsAddress()))
371457 then (i.caller != this)
372458 else false)
373459 then throw("admin or items only")
374460 else {
375461 let txId = i.transactionId
376462 let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
377463 let asset = Issue(duckGen, description, 1, 0, false)
378464 let assetId = calculateAssetId(asset)
379465 let duckIdKey = getDuckIdKey(toString(i.caller), txId)
380466 let farmGen = asString(invoke(this, "getGenFromName", [duckGen], nil))
381467 if ((farmGen == farmGen))
382- then {
383- let amount = tryGetInteger(getDuckStatsKey(duckGen))
384- let quantity = tryGetInteger((("stats_" + farmGen) + "_quantity"))
385- let composeGenericData = [StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), (amount + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (quantity + 1)), asset]
386- (composeGenericData ++ [IntegerEntry((("asset_" + toBase58String(assetId)) + "_children"), children), ScriptTransfer(Address(address), 1, assetId)])
387- }
468+ then (composeGenericData(duckGen, duckIdKey, assetId, asset) ++ [IntegerEntry((("asset_" + toBase58String(assetId)) + "_children"), children), ScriptTransfer(Address(address), 1, assetId)])
388469 else throw("Strict value is not equal to itself.")
389470 }
390471
391472
392473
393474 @Callable(i)
394475 func startDuckBreeding () = {
395476 let firstPayment = value(i.payments[0])
396477 let secondPayment = value(i.payments[1])
397478 let firstAssetId = toBase58String(value(firstPayment.assetId))
398479 let secondAssetId = toBase58String(value(secondPayment.assetId))
399480 if (if ((firstPayment.amount != 1))
400481 then true
401482 else (secondPayment.amount != 1))
402483 then throw("NFT is not attached")
403484 else {
404485 let children1 = asInt(invoke(this, "validateAndGetChildren", [firstAssetId], nil))
405486 if ((children1 == children1))
406487 then {
407488 let children2 = asInt(invoke(this, "validateAndGetChildren", [secondAssetId], nil))
408489 if ((children2 == children2))
409490 then if (if ((children1 > 0))
410491 then true
411492 else (children1 > 0))
412493 then throw("One duck can be used for breeding only once in its lifetime.")
413494 else {
414495 let breededStatus = canBeBreeded(fromBase58String(firstAssetId), fromBase58String(secondAssetId))
415496 if ((breededStatus != "true"))
416497 then throw(("These ducks cannot be breeded: " + breededStatus))
417498 else [StringEntry(getDuckParentKey(i.transactionId, 1), firstAssetId), StringEntry(getDuckParentKey(i.transactionId, 2), secondAssetId), StringEntry(getProcessStatusKey(toString(i.caller), i.transactionId), HatchingStarted), IntegerEntry(getProcessFinishHeightKey(toString(i.caller), i.transactionId), (height + delayForHatching))]
418499 }
419500 else throw("Strict value is not equal to itself.")
420501 }
421502 else throw("Strict value is not equal to itself.")
422503 }
423504 }
424505
425506
426507
427508 @Callable(i)
509+func finishDuckHatchingItems (txIdStr,duckGenesString) = if (if ((i.caller != getItemsAddress()))
510+ then (duckGenesString != "")
511+ else false)
512+ then throw("Only items can create fixed genes")
513+ else {
514+ let owner = toString(i.originCaller)
515+ finishDuckHatch(txIdStr, owner, duckGenesString)
516+ }
517+
518+
519+
520+@Callable(i)
428521 func finishDuckHatching (txIdStr) = {
429- let txId = fromBase58String(txIdStr)
430- let processStatusKey = getProcessStatusKey(toString(i.caller), txId)
431- let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
432- let duckIdKey = getDuckIdKey(toString(i.caller), txId)
433- let processTxStatus = getStringValue(this, processStatusKey)
434- let processFinishHeight = getIntegerValue(this, finishHeightKey)
435- if ((processTxStatus == HatchingFinished))
436- then {
437- let duckId = getStringValue(this, getDuckIdKey(toString(i.caller), txId))
438- throw(("The duck was breeded and claimed already, here is the folowing: " + duckId))
439- }
440- else if ((processFinishHeight > height))
441- then throw((((("Breeding is not finished yet " + toString((processFinishHeight - height))) + " blocks remaining, it will take around ") + toString((processFinishHeight - height))) + " minutes"))
442- else {
443- let duckGen = generateDuck(txId, processFinishHeight)
444- let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
445- let asset = Issue(duckGen, description, 1, 0, false, unit, processFinishHeight)
446- let assetId = calculateAssetId(asset)
447- let parent1Id = tryGetString(getDuckParentKey(txId, 1))
448- let parent2Id = tryGetString(getDuckParentKey(txId, 2))
449- let farmGen = asString(invoke(this, "getGenFromName", [duckGen], nil))
450- if ((farmGen == farmGen))
451- then {
452- let amount = tryGetInteger(getDuckStatsKey(duckGen))
453- let quantity = tryGetInteger((("stats_" + farmGen) + "_quantity"))
454- let composeGenericData = [StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), (amount + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (quantity + 1)), asset]
455- (composeGenericData ++ [StringEntry(processStatusKey, HatchingFinished), IntegerEntry((("asset_" + parent1Id) + "_children"), 1), IntegerEntry((("asset_" + parent2Id) + "_children"), 1), asset, ScriptTransfer(i.caller, 1, assetId), ScriptTransfer(i.caller, 1, fromBase58String(parent1Id)), ScriptTransfer(i.caller, 1, fromBase58String(parent2Id))])
456- }
457- else throw("Strict value is not equal to itself.")
458- }
522+ let owner = toString(i.caller)
523+ finishDuckHatch(txIdStr, owner, "")
459524 }
460525
461526
462527
463528 @Callable(i)
464529 func reduceRarity (assetId,farmGen) = {
465530 let asset = fromBase58String(assetId)
466531 if (if (if ((i.caller != getItemsAddress()))
467- then (i.caller != Address(rebirthAddress))
532+ then (i.caller != getRebirthAddress())
468533 else false)
469534 then (i.caller != this)
470535 else false)
471536 then throw("admin, items or rebirth only")
472537 else {
473538 let duckGen = value(assetInfo(asset)).name
474539 [IntegerEntry(getDuckStatsKey(duckGen), (tryGetInteger(getDuckStatsKey(duckGen)) - 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) - 1))]
475540 }
476541 }
477542
478543
479-@Verifier(tx)
480-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
481-

github/deemru/w8io/3ef1775 
271.00 ms