tx · 2ssJZx7bgsr5Wg6rt4pmbtPUSr1neP3ewfBQJpaR5Vnk 3PACKMArmh4BAEawStYmpcU62aiNTBJKvNh: -0.01400000 Waves 2021.05.06 16:59 [2578552] smart account 3PACKMArmh4BAEawStYmpcU62aiNTBJKvNh > SELF 0.00000000 Waves
{ "type": 13, "id": "2ssJZx7bgsr5Wg6rt4pmbtPUSr1neP3ewfBQJpaR5Vnk", "fee": 1400000, "feeAssetId": null, "timestamp": 1620309592306, "version": 2, "chainId": 87, "sender": "3PACKMArmh4BAEawStYmpcU62aiNTBJKvNh", "senderPublicKey": "2y6AczxE1vbz7NGP9N4eeTMDqhDgXT8Tc3xhM792K3GP", "proofs": [ "2upEbtvydotGoAG9Xo4QjVHzWCFQNzj9boeqFTWdqDXEH1bqCyVcT6RNVAB1k9ja2Hz4J8AozN94fyG8Eirf82gu" ], "script": "base64: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AAAGYW1vdW50BQAAABBlZ2dzTmVlZGVkQW1vdW50CQAAAgAAAAECAAAAKllvdSBjYW4gYXR0YWNoIG9ubHkgRVhBQ1RMWSAxMCBFR0cgdG9rZW5zIAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAUZ2V0SGF0Y2hpbmdTdGF0dXNLZXkAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcggFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAAPSGF0Y2hpbmdTdGFydGVkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAaZ2V0SGF0Y2hpbmdGaW5pc2hIZWlnaHRLZXkAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcggFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAkAAGQAAAACBQAAAAZoZWlnaHQFAAAAEGRlbGF5Rm9ySGF0Y2hpbmcFAAAAA25pbAAAAAFpAQAAABJmaW5pc2hEdWNrSGF0Y2hpbmcAAAABAAAAB3R4SWRTdHIEAAAABHR4SWQJAAJZAAAAAQUAAAAHdHhJZFN0cgQAAAARaGF0Y2hpbmdTdGF0dXNLZXkJAQAAABRnZXRIYXRjaGluZ1N0YXR1c0tleQAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAAR0eElkBAAAAA9maW5pc2hIZWlnaHRLZXkJAQAAABpnZXRIYXRjaGluZ0ZpbmlzaEhlaWdodEtleQAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAAR0eElkBAAAAAlkdWNrSWRLZXkJAQAAAAxnZXREdWNrSWRLZXkAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAEdHhJZAQAAAAQaGF0Y2hpbmdUeFN0YXR1cwkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwUAAAARaGF0Y2hpbmdTdGF0dXNLZXkEAAAAFGhhdGNoaW5nRmluaXNoSGVpZ2h0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzBQAAAA9maW5pc2hIZWlnaHRLZXkDCQAAAAAAAAIFAAAAEGhhdGNoaW5nVHhTdGF0dXMFAAAAEEhhdGNoaW5nRmluaXNoZWQEAAAABmR1Y2tJZAkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwkBAAAADGdldER1Y2tJZEtleQAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAAR0eElkCQAAAgAAAAEJAAEsAAAAAgIAAABAVGhlIGR1Y2sgd2FzIGhhdGNoZWQgYW5kIGNsYWltZWQgYWxyZWFkeSwgaGVyZSBpcyB0aGUgZm9sb3dpbmc6IAUAAAAGZHVja0lkAwkAAGYAAAACBQAAABRoYXRjaGluZ0ZpbmlzaEhlaWdodAUAAAAGaGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAdSGF0Y2hpbmcgaXMgbm90IGZpbmlzaGVkIHlldCAJAAGkAAAAAQkAAGUAAAACBQAAABRoYXRjaGluZ0ZpbmlzaEhlaWdodAUAAAAGaGVpZ2h0AgAAACcgYmxvY2tzIHJlbWFpbmluZywgaXQgd2lsbCB0YWtlIGFyb3VuZCAJAAGkAAAAAQkAAGUAAAACBQAAABRoYXRjaGluZ0ZpbmlzaEhlaWdodAUAAAAGaGVpZ2h0AgAAAAggbWludXRlcwQAAAAHZHVja0dlbgkBAAAADWdldFJhbmRvbU5hbWUAAAACBQAAAAR0eElkBQAAABRoYXRjaGluZ0ZpbmlzaEhlaWdodAQAAAALZGVzY3JpcHRpb24JAAEsAAAAAgkAASwAAAACAgAAAA57Imdlbm90eXBlIjogIgUAAAAHZHVja0dlbgIAAAAZIiwgImNyb3NzYnJlZWRpbmciOiB0cnVlfQQAAAAFYXNzZXQJAARDAAAABwUAAAAHZHVja0dlbgUAAAALZGVzY3JpcHRpb24AAAAAAAAAAAEAAAAAAAAAAAAHBQAAAAR1bml0BQAAABRoYXRjaGluZ0ZpbmlzaEhlaWdodAQAAAAHYXNzZXRJZAkABDgAAAABBQAAAAVhc3NldAQAAAAGYW1vdW50CQAAZAAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAD2dldER1Y2tTdGF0c0tleQAAAAEFAAAAB2R1Y2tHZW4AAAAAAAAAAAEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAARaGF0Y2hpbmdTdGF0dXNLZXkFAAAAEEhhdGNoaW5nRmluaXNoZWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJZHVja0lkS2V5CQACWAAAAAEFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAAlgAAAABBQAAAAdhc3NldElkBQAAAAlkdWNrSWRLZXkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA9nZXREdWNrU3RhdHNLZXkAAAABBQAAAAdkdWNrR2VuBQAAAAZhbW91bnQJAARMAAAAAgUAAAAFYXNzZXQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyAAAAAAAAAAABBQAAAAdhc3NldElkBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAACQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tlecLOju8=", "height": 2578552, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FMJQ54gtHRGRePuU7zQCnWxV1dor1Ddwmeak86v4zQAw Next: 9ktVFdEhws4CY9TDH3gDB31CTxPDV2Zs9Kg3HeDZ8YYb Diff:
Old | New | Differences | |
---|---|---|---|
5 | 5 | ||
6 | 6 | let eggsNeededAmount = 1000 | |
7 | 7 | ||
8 | - | let delayForHatching = | |
8 | + | let delayForHatching = 2 | |
9 | 9 | ||
10 | 10 | let HatchingStarted = "HATCHING_STARTED" | |
11 | 11 | ||
18 | 18 | ||
19 | 19 | ||
20 | 20 | func getDuckIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di") | |
21 | + | ||
22 | + | ||
23 | + | func getDuckStatsKey (genString) = (("stats_" + genString) + "_amount") | |
24 | + | ||
25 | + | ||
26 | + | func tryGetInteger (key) = { | |
27 | + | let val = match getInteger(this, key) { | |
28 | + | case b: Int => | |
29 | + | b | |
30 | + | case _ => | |
31 | + | 0 | |
32 | + | } | |
33 | + | val | |
34 | + | } | |
21 | 35 | ||
22 | 36 | ||
23 | 37 | func getRandomNumber (variants,txId,hatchingFinishHeight) = { | |
70 | 84 | else if ((hatchingFinishHeight > height)) | |
71 | 85 | then throw((((("Hatching is not finished yet " + toString((hatchingFinishHeight - height))) + " blocks remaining, it will take around ") + toString((hatchingFinishHeight - height))) + " minutes")) | |
72 | 86 | else { | |
73 | - | let | |
74 | - | let description = (("{\"genotype\": \"" + | |
75 | - | let asset = Issue( | |
87 | + | let duckGen = getRandomName(txId, hatchingFinishHeight) | |
88 | + | let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}") | |
89 | + | let asset = Issue(duckGen, description, 1, 0, false, unit, hatchingFinishHeight) | |
76 | 90 | let assetId = calculateAssetId(asset) | |
77 | - | [StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), asset, ScriptTransfer(i.caller, 1, assetId)] | |
91 | + | let amount = (tryGetInteger(getDuckStatsKey(duckGen)) + 1) | |
92 | + | [StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), amount), asset, ScriptTransfer(i.caller, 1, assetId)] | |
78 | 93 | } | |
79 | 94 | } | |
80 | 95 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let eggsAssetId = base58'53bLXGQhnMxAoiWnza2SJQRp7hNQZVHnyrRziLmwdVjb' | |
5 | 5 | ||
6 | 6 | let eggsNeededAmount = 1000 | |
7 | 7 | ||
8 | - | let delayForHatching = | |
8 | + | let delayForHatching = 2 | |
9 | 9 | ||
10 | 10 | let HatchingStarted = "HATCHING_STARTED" | |
11 | 11 | ||
12 | 12 | let HatchingFinished = "HATCHING_FINISHED" | |
13 | 13 | ||
14 | 14 | func getHatchingStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status") | |
15 | 15 | ||
16 | 16 | ||
17 | 17 | func getHatchingFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh") | |
18 | 18 | ||
19 | 19 | ||
20 | 20 | func getDuckIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di") | |
21 | + | ||
22 | + | ||
23 | + | func getDuckStatsKey (genString) = (("stats_" + genString) + "_amount") | |
24 | + | ||
25 | + | ||
26 | + | func tryGetInteger (key) = { | |
27 | + | let val = match getInteger(this, key) { | |
28 | + | case b: Int => | |
29 | + | b | |
30 | + | case _ => | |
31 | + | 0 | |
32 | + | } | |
33 | + | val | |
34 | + | } | |
21 | 35 | ||
22 | 36 | ||
23 | 37 | func getRandomNumber (variants,txId,hatchingFinishHeight) = { | |
24 | 38 | let randomSeedBlock = value(blockInfoByHeight(hatchingFinishHeight)) | |
25 | 39 | (toInt((value(randomSeedBlock.vrf) + txId), 10) % variants) | |
26 | 40 | } | |
27 | 41 | ||
28 | 42 | ||
29 | 43 | func getRandomName (txId,hatchingFinishHeight) = { | |
30 | 44 | let typeRandom = getRandomNumber(2, txId, hatchingFinishHeight) | |
31 | 45 | let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight) | |
32 | 46 | let color = if ((colorRandom == 0)) | |
33 | 47 | then "Y" | |
34 | 48 | else if ((colorRandom == 1)) | |
35 | 49 | then "G" | |
36 | 50 | else if ((colorRandom == 2)) | |
37 | 51 | then "B" | |
38 | 52 | else "R" | |
39 | 53 | if ((typeRandom == 0)) | |
40 | 54 | then ("DUCK-AAAAAAAA-G" + color) | |
41 | 55 | else ("DUCK-BBBBBBBB-G" + color) | |
42 | 56 | } | |
43 | 57 | ||
44 | 58 | ||
45 | 59 | @Callable(i) | |
46 | 60 | func startDuckHatching () = { | |
47 | 61 | let firstPayment = value(i.payments[0]) | |
48 | 62 | if ((firstPayment.assetId != eggsAssetId)) | |
49 | 63 | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId))) | |
50 | 64 | else if ((firstPayment.amount != eggsNeededAmount)) | |
51 | 65 | then throw("You can attach only EXACTLY 10 EGG tokens ") | |
52 | 66 | else [StringEntry(getHatchingStatusKey(toString(i.caller), i.transactionId), HatchingStarted), IntegerEntry(getHatchingFinishHeightKey(toString(i.caller), i.transactionId), (height + delayForHatching))] | |
53 | 67 | } | |
54 | 68 | ||
55 | 69 | ||
56 | 70 | ||
57 | 71 | @Callable(i) | |
58 | 72 | func finishDuckHatching (txIdStr) = { | |
59 | 73 | let txId = fromBase58String(txIdStr) | |
60 | 74 | let hatchingStatusKey = getHatchingStatusKey(toString(i.caller), txId) | |
61 | 75 | let finishHeightKey = getHatchingFinishHeightKey(toString(i.caller), txId) | |
62 | 76 | let duckIdKey = getDuckIdKey(toString(i.caller), txId) | |
63 | 77 | let hatchingTxStatus = getStringValue(this, hatchingStatusKey) | |
64 | 78 | let hatchingFinishHeight = getIntegerValue(this, finishHeightKey) | |
65 | 79 | if ((hatchingTxStatus == HatchingFinished)) | |
66 | 80 | then { | |
67 | 81 | let duckId = getStringValue(this, getDuckIdKey(toString(i.caller), txId)) | |
68 | 82 | throw(("The duck was hatched and claimed already, here is the folowing: " + duckId)) | |
69 | 83 | } | |
70 | 84 | else if ((hatchingFinishHeight > height)) | |
71 | 85 | then throw((((("Hatching is not finished yet " + toString((hatchingFinishHeight - height))) + " blocks remaining, it will take around ") + toString((hatchingFinishHeight - height))) + " minutes")) | |
72 | 86 | else { | |
73 | - | let | |
74 | - | let description = (("{\"genotype\": \"" + | |
75 | - | let asset = Issue( | |
87 | + | let duckGen = getRandomName(txId, hatchingFinishHeight) | |
88 | + | let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}") | |
89 | + | let asset = Issue(duckGen, description, 1, 0, false, unit, hatchingFinishHeight) | |
76 | 90 | let assetId = calculateAssetId(asset) | |
77 | - | [StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), asset, ScriptTransfer(i.caller, 1, assetId)] | |
91 | + | let amount = (tryGetInteger(getDuckStatsKey(duckGen)) + 1) | |
92 | + | [StringEntry(hatchingStatusKey, HatchingFinished), StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), amount), asset, ScriptTransfer(i.caller, 1, assetId)] | |
78 | 93 | } | |
79 | 94 | } | |
80 | 95 | ||
81 | 96 | ||
82 | 97 | @Verifier(tx) | |
83 | 98 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
84 | 99 |
github/deemru/w8io/3ef1775 163.94 ms ◑