tx · AfgZTcG7VN4kfTrbFus2J6yms7uP1kaUvPspGSEqu5P4 3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks: -0.01400000 Waves 2021.11.23 14:04 [2868630] smart account 3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks > SELF 0.00000000 Waves
{ "type": 13, "id": "AfgZTcG7VN4kfTrbFus2J6yms7uP1kaUvPspGSEqu5P4", "fee": 1400000, "feeAssetId": null, "timestamp": 1637665532608, "version": 2, "chainId": 87, "sender": "3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks", "senderPublicKey": "XrNmTusDFaLSz3wAjmdfcyC5h6uYyVbpdh18758UpFv", "proofs": [ "5zVdPULcErmCLasXNuXiTeEKMGsFNypES6mT3SRycQ3sZkGMDwyLHSvxKfk7q4c7U52QTfzfvJFVqAqe51oL5ehu" ], "script": "base64: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", "height": 2868630, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Ba3JoG1WYmpTLfNWfX3ZUWu6EV7ND9i2UbEFQWVghNQ8 Next: 99ppYCHxjqRReYPy9kaGcNwCNpiywPTiaY2rySCUcCG6 Diff:
Old | New | Differences | |
---|---|---|---|
5 | 5 | ||
6 | 6 | let eggsNeeded = (2 * 100000000) | |
7 | 7 | ||
8 | - | let artefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-CUSTOMDUCK"] | |
8 | + | let artefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"] | |
9 | 9 | ||
10 | 10 | func tryGetString (key) = match getString(this, key) { | |
11 | 11 | case a: String => | |
23 | 23 | } | |
24 | 24 | ||
25 | 25 | ||
26 | - | func getRandomArtefact (bosId,h) = "ART-LAKE" | |
26 | + | func getRandomNumber (variants,txId,finishHeight,offset) = { | |
27 | + | let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1))) | |
28 | + | let randomHash = sha256((txId + value(randomSeedBlock.vrf))) | |
29 | + | (toInt(randomHash, (offset * 8)) % variants) | |
30 | + | } | |
31 | + | ||
32 | + | ||
33 | + | func getRandomArtefact (boxId,h) = { | |
34 | + | let randomNumber = getRandomNumber(100, boxId, h, 0) | |
35 | + | if ((98 >= randomNumber)) | |
36 | + | then { | |
37 | + | let artefactNum = (randomNumber / 11) | |
38 | + | artefacts[artefactNum] | |
39 | + | } | |
40 | + | else artefacts[99] | |
41 | + | } | |
27 | 42 | ||
28 | 43 | ||
29 | 44 | @Callable(i) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let eggsAssetId = base58'3v7zGkeHS6KrsvmTRzEzvCxm5cdzkCtM7z5cM6efcjCB' | |
5 | 5 | ||
6 | 6 | let eggsNeeded = (2 * 100000000) | |
7 | 7 | ||
8 | - | let artefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-CUSTOMDUCK"] | |
8 | + | let artefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"] | |
9 | 9 | ||
10 | 10 | func tryGetString (key) = match getString(this, key) { | |
11 | 11 | case a: String => | |
12 | 12 | a | |
13 | 13 | case _ => | |
14 | 14 | "" | |
15 | 15 | } | |
16 | 16 | ||
17 | 17 | ||
18 | 18 | func tryGetInteger (key) = match getInteger(this, key) { | |
19 | 19 | case a: Int => | |
20 | 20 | a | |
21 | 21 | case _ => | |
22 | 22 | 0 | |
23 | 23 | } | |
24 | 24 | ||
25 | 25 | ||
26 | - | func getRandomArtefact (bosId,h) = "ART-LAKE" | |
26 | + | func getRandomNumber (variants,txId,finishHeight,offset) = { | |
27 | + | let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1))) | |
28 | + | let randomHash = sha256((txId + value(randomSeedBlock.vrf))) | |
29 | + | (toInt(randomHash, (offset * 8)) % variants) | |
30 | + | } | |
31 | + | ||
32 | + | ||
33 | + | func getRandomArtefact (boxId,h) = { | |
34 | + | let randomNumber = getRandomNumber(100, boxId, h, 0) | |
35 | + | if ((98 >= randomNumber)) | |
36 | + | then { | |
37 | + | let artefactNum = (randomNumber / 11) | |
38 | + | artefacts[artefactNum] | |
39 | + | } | |
40 | + | else artefacts[99] | |
41 | + | } | |
27 | 42 | ||
28 | 43 | ||
29 | 44 | @Callable(i) | |
30 | 45 | func preInit () = [IntegerEntry("static_ART-LAKE_farmingSlots", 200), IntegerEntry("static_ART-LAKE_farmingBoost", 2), IntegerEntry("static_ART-HOUSE_farmingSlots", 4), IntegerEntry("static_ART-HOUSE_farmingBoost", 30), IntegerEntry("static_ART-BIGHOUSE_farmingSlots", 10), IntegerEntry("static_ART-BIGHOUSE_farmingBoost", 15)] | |
31 | 46 | ||
32 | 47 | ||
33 | 48 | ||
34 | 49 | @Callable(i) | |
35 | 50 | func issueArtefact (type,receiver) = { | |
36 | 51 | let txIdStr = toBase58String(i.transactionId) | |
37 | 52 | let address = Address(fromBase58String(receiver)) | |
38 | 53 | let artefact = Issue(type, "NFT artefact of Waves Ducks game. Drop #1.", 1, 0, false, unit, 0) | |
39 | 54 | let artefactId = calculateAssetId(artefact) | |
40 | 55 | [artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)] | |
41 | 56 | } | |
42 | 57 | ||
43 | 58 | ||
44 | 59 | ||
45 | 60 | @Callable(i) | |
46 | 61 | func setLock (n) = if ((i.caller == this)) | |
47 | 62 | then [IntegerEntry("global_locked", n)] | |
48 | 63 | else throw("admin only") | |
49 | 64 | ||
50 | 65 | ||
51 | 66 | ||
52 | 67 | @Callable(i) | |
53 | 68 | func buyArtefact (refererAddress) = if ((tryGetInteger("global_locked") > 0)) | |
54 | 69 | then throw("contract is temporarily locked") | |
55 | 70 | else { | |
56 | 71 | let artefactsAmount = tryGetInteger("artefacts_amount") | |
57 | 72 | let firstPayment = value(i.payments[0]) | |
58 | 73 | if ((firstPayment.assetId != eggsAssetId)) | |
59 | 74 | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId))) | |
60 | 75 | else if ((eggsNeeded > firstPayment.amount)) | |
61 | 76 | then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded))) | |
62 | 77 | else [StringEntry((((toString(i.caller) + "_") + toBase58String(i.transactionId)) + "_status"), "started"), IntegerEntry((((toString(i.caller) + "_") + toBase58String(i.transactionId)) + "_finishHeight"), (height + 2)), IntegerEntry("artefacts_amount", (artefactsAmount + 1))] | |
63 | 78 | } | |
64 | 79 | ||
65 | 80 | ||
66 | 81 | ||
67 | 82 | @Callable(i) | |
68 | 83 | func claimArtefact (boxIdStr) = { | |
69 | 84 | let txId = fromBase58String(boxIdStr) | |
70 | 85 | let statusKey = (((toString(i.caller) + "_") + boxIdStr) + "_status") | |
71 | 86 | let heightKey = (((toString(i.caller) + "_") + boxIdStr) + "_finishHeight") | |
72 | 87 | if ((getStringValue(statusKey) != "started")) | |
73 | 88 | then throw("claimed already") | |
74 | 89 | else if ((getIntegerValue(heightKey) > height)) | |
75 | 90 | then throw("you cannot claim yet") | |
76 | 91 | else { | |
77 | 92 | let artType = getRandomArtefact(txId, getIntegerValue(heightKey)) | |
78 | 93 | let asset = Issue(artType, "Artefact of Waves Ducks metaverse.", 1, 0, false, unit, getIntegerValue(heightKey)) | |
79 | 94 | let assetId = calculateAssetId(asset) | |
80 | 95 | [StringEntry(statusKey, artType), StringEntry((((toString(i.caller) + "_") + boxIdStr) + "_artefactId"), toBase58String(assetId)), asset, ScriptTransfer(i.caller, 1, assetId)] | |
81 | 96 | } | |
82 | 97 | } | |
83 | 98 | ||
84 | 99 | ||
85 | 100 | @Verifier(tx) | |
86 | 101 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
87 | 102 |
github/deemru/w8io/3ef1775 33.20 ms ◑