tx · 3oUVa3Pdogy5SqQ7JQ7zFxy6MsYisWk2XzoZQf5MbyrY 3MuwmoHDxZZP9bGwExfL3L8JpMU5r95oBr8: -0.01400000 Waves 2022.01.20 16:34 [1887315] smart account 3MuwmoHDxZZP9bGwExfL3L8JpMU5r95oBr8 > SELF 0.00000000 Waves
{ "type": 13, "id": "3oUVa3Pdogy5SqQ7JQ7zFxy6MsYisWk2XzoZQf5MbyrY", "fee": 1400000, "feeAssetId": null, "timestamp": 1642685717403, "version": 2, "chainId": 84, "sender": "3MuwmoHDxZZP9bGwExfL3L8JpMU5r95oBr8", "senderPublicKey": "B8mXne2bErXPSLJvpntKVoudEBjypi3Ag6RfxqTr5pEg", "proofs": [ "G8jq6X5coNUGVufjsmzMvbbgrp3sgotagSo94o6WAdr6gbPocD72Sy8ua4kPv8hzfwSxJRXTsniW7fyvbpGcJnm" ], "script": "base64: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", "height": 1887315, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 32dbm9fiYv3C1jPFwGeMfTGsWZmCRhTE3nk8bHdKAeEz Next: none Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | func nameKey (nameUrl) = (nameUrl + "_name") | |
4 | + | let artefactsLimit = 750 | |
5 | + | ||
6 | + | let statusDrop = "DROPED" | |
7 | + | ||
8 | + | let timeStart = "Time Start Drop" | |
9 | + | ||
10 | + | let timeEnd = "Time End Drop" | |
11 | + | ||
12 | + | let artefacts = ["SALE-DISCOUNT", "MERCH-TSHIRT", "MERCH-HOODIE", "MERCH-CAP", "VAC-ASTROZOMBIKA", "VAC-ZOMBIKV", "VAC-ZOMBERNA", "ART-RESPIRATORS", "ART-GASMASK", "ART-HAZMATSUIT", "ART-CROWBAR", "ART-MACHETE", "ART-FLAMETHROWER", "ART-SHOTGUN", "ART-PICKLEDBRAIN"] | |
13 | + | ||
14 | + | func tryGetInteger (key) = { | |
15 | + | let val = match getInteger(this, key) { | |
16 | + | case a: Int => | |
17 | + | a | |
18 | + | case _ => | |
19 | + | 0 | |
20 | + | } | |
21 | + | val | |
22 | + | } | |
5 | 23 | ||
6 | 24 | ||
7 | - | func descriptionKey (nameUrl) = (nameUrl + "_description") | |
25 | + | func tryGetString (key) = { | |
26 | + | let val = match getString(key) { | |
27 | + | case t: String => | |
28 | + | t | |
29 | + | case _ => | |
30 | + | "" | |
31 | + | } | |
32 | + | val | |
33 | + | } | |
8 | 34 | ||
9 | 35 | ||
10 | - | func | |
36 | + | func keyStatus (address) = (address + "_status") | |
11 | 37 | ||
12 | 38 | ||
13 | - | func | |
39 | + | func keyFinishHeight (address) = (address + "_finishHeight") | |
14 | 40 | ||
15 | 41 | ||
16 | - | func | |
42 | + | func keyTransaction (address) = (address + "_idTransaction") | |
17 | 43 | ||
18 | 44 | ||
19 | - | func voteKey (nameUrl) = (nameUrl + "_vote") | |
45 | + | func getRandomNumber (variants,txId,finishHeight,offset) = { | |
46 | + | let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1))) | |
47 | + | let randomHash = sha256((txId + value(randomSeedBlock.vrf))) | |
48 | + | (toInt(randomHash, (offset * 8)) % variants) | |
49 | + | } | |
20 | 50 | ||
21 | 51 | ||
22 | - | func checkVote (numberVote,voices) = if ((voices > (numberVote / 2))) | |
23 | - | then "VERIFY" | |
24 | - | else "VOTING" | |
52 | + | func getRandomArtefact (boxId,h) = { | |
53 | + | let randomNumber = getRandomNumber(15, boxId, h, 0) | |
54 | + | artefacts[randomNumber] | |
55 | + | } | |
25 | 56 | ||
26 | 57 | ||
27 | - | @Callable( | |
28 | - | func | |
29 | - | then | |
30 | - | else | |
58 | + | @Callable(i) | |
59 | + | func initTime (start,end) = if ((i.caller == this)) | |
60 | + | then [IntegerEntry(timeStart, start), IntegerEntry(timeEnd, end)] | |
61 | + | else throw("Only Admin") | |
31 | 62 | ||
32 | 63 | ||
33 | 64 | ||
34 | - | @Callable(inv) | |
35 | - | func vote (nameUrl) = { | |
36 | - | let votingMember = split(getStringValue("voting_member"), ",") | |
37 | - | let listVoted = split(getStringValue(voteKey(nameUrl)), ",") | |
38 | - | if (!(containsElement(votingMember, toBase58String(inv.caller.bytes)))) | |
39 | - | then throw("You can't vote") | |
40 | - | else if (containsElement(listVoted, toBase58String(inv.caller.bytes))) | |
41 | - | then throw("You voted already") | |
42 | - | else if ((statusKey(nameUrl) == "VERIFY")) | |
43 | - | then throw("Voting was ended") | |
44 | - | else { | |
45 | - | let list = toBase58String(inv.caller.bytes) :: listVoted | |
46 | - | let voices = size(listVoted) | |
47 | - | [StringEntry(voteKey(nameUrl), makeString(list, ",")), StringEntry(statusKey(nameUrl), checkVote(size(votingMember), voices))] | |
48 | - | } | |
65 | + | @Callable(i) | |
66 | + | func dropLootbox (address) = { | |
67 | + | let userStatusKey = keyStatus(address) | |
68 | + | if ((lastBlock.timestamp > getIntegerValue(timeEnd))) | |
69 | + | then throw("Drop ended...") | |
70 | + | else if ((getIntegerValue(timeStart) > lastBlock.timestamp)) | |
71 | + | then throw("Drop wasn`t start...") | |
72 | + | else if ((i.caller != this)) | |
73 | + | then throw("Only admin") | |
74 | + | else if ((tryGetInteger("count_lootbox") >= artefactsLimit)) | |
75 | + | then throw("Lootboxs were ended") | |
76 | + | else if ((tryGetString(userStatusKey) != "")) | |
77 | + | then throw("Only one lootbox for user") | |
78 | + | else [StringEntry(userStatusKey, statusDrop), StringEntry(keyTransaction(address), toBase58String(i.transactionId)), IntegerEntry(keyFinishHeight(address), (height + 2)), IntegerEntry("count_lootbox", (tryGetInteger("count_lootbox") + 1))] | |
49 | 79 | } | |
50 | 80 | ||
51 | 81 | ||
52 | 82 | ||
53 | - | @Callable(inv) | |
54 | - | func addVoting (address) = { | |
55 | - | let listVoting = split(getStringValue("voting_member"), ",") | |
56 | - | if ((toBase58String(inv.caller.bytes) != toBase58String(this.bytes))) | |
57 | - | then throw("You don't owner") | |
58 | - | else if (containsElement(listVoting, address)) | |
59 | - | then throw("This address was added") | |
60 | - | else { | |
61 | - | let list = address :: listVoting | |
62 | - | [StringEntry("voting_member", makeString(list, ","))] | |
63 | - | } | |
64 | - | } | |
83 | + | @Callable(i) | |
84 | + | func setGlobalArtAmount (newAmount) = if ((i.caller == this)) | |
85 | + | then [IntegerEntry("count_lootbox", newAmount)] | |
86 | + | else throw("Only admin") | |
65 | 87 | ||
66 | 88 | ||
67 | 89 | ||
68 | - | @Callable( | |
69 | - | func | |
70 | - | let | |
71 | - | | |
72 | - | | |
73 | - | | |
74 | - | ||
75 | - | ||
76 | - | | |
77 | - | | |
78 | - | | |
79 | - | | |
80 | - | | |
81 | - | | |
82 | - | let | |
83 | - | [StringEntry( | |
84 | - | } | |
90 | + | @Callable(i) | |
91 | + | func claimLootbox () = { | |
92 | + | let txId = tryGetString(keyTransaction(toString(i.caller))) | |
93 | + | let statusKey = keyStatus(toString(i.caller)) | |
94 | + | let heightKey = keyFinishHeight(toString(i.caller)) | |
95 | + | if ((getIntegerValue(timeEnd) > lastBlock.timestamp)) | |
96 | + | then throw("You cannot claim yet") | |
97 | + | else if ((tryGetString(statusKey) != statusDrop)) | |
98 | + | then throw("You dont have lootbox") | |
99 | + | else if ((getIntegerValue(heightKey) > height)) | |
100 | + | then throw("You cannot claim yet") | |
101 | + | else { | |
102 | + | let artType = getRandomArtefact(fromBase58String(txId), getIntegerValue(heightKey)) | |
103 | + | let asset = Issue(artType, "Waves Punk metaverse", 1, 0, false, unit, getIntegerValue(heightKey)) | |
104 | + | let assetId = calculateAssetId(asset) | |
105 | + | [asset, StringEntry(statusKey, artType), StringEntry((toString(i.caller) + "_assetId"), toBase58String(assetId)), StringEntry((toBase58String(assetId) + "_type"), artType), ScriptTransfer(i.caller, 1, assetId)] | |
106 | + | } | |
85 | 107 | } | |
86 | 108 | ||
87 | 109 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | func nameKey (nameUrl) = (nameUrl + "_name") | |
4 | + | let artefactsLimit = 750 | |
5 | + | ||
6 | + | let statusDrop = "DROPED" | |
7 | + | ||
8 | + | let timeStart = "Time Start Drop" | |
9 | + | ||
10 | + | let timeEnd = "Time End Drop" | |
11 | + | ||
12 | + | let artefacts = ["SALE-DISCOUNT", "MERCH-TSHIRT", "MERCH-HOODIE", "MERCH-CAP", "VAC-ASTROZOMBIKA", "VAC-ZOMBIKV", "VAC-ZOMBERNA", "ART-RESPIRATORS", "ART-GASMASK", "ART-HAZMATSUIT", "ART-CROWBAR", "ART-MACHETE", "ART-FLAMETHROWER", "ART-SHOTGUN", "ART-PICKLEDBRAIN"] | |
13 | + | ||
14 | + | func tryGetInteger (key) = { | |
15 | + | let val = match getInteger(this, key) { | |
16 | + | case a: Int => | |
17 | + | a | |
18 | + | case _ => | |
19 | + | 0 | |
20 | + | } | |
21 | + | val | |
22 | + | } | |
5 | 23 | ||
6 | 24 | ||
7 | - | func descriptionKey (nameUrl) = (nameUrl + "_description") | |
25 | + | func tryGetString (key) = { | |
26 | + | let val = match getString(key) { | |
27 | + | case t: String => | |
28 | + | t | |
29 | + | case _ => | |
30 | + | "" | |
31 | + | } | |
32 | + | val | |
33 | + | } | |
8 | 34 | ||
9 | 35 | ||
10 | - | func | |
36 | + | func keyStatus (address) = (address + "_status") | |
11 | 37 | ||
12 | 38 | ||
13 | - | func | |
39 | + | func keyFinishHeight (address) = (address + "_finishHeight") | |
14 | 40 | ||
15 | 41 | ||
16 | - | func | |
42 | + | func keyTransaction (address) = (address + "_idTransaction") | |
17 | 43 | ||
18 | 44 | ||
19 | - | func voteKey (nameUrl) = (nameUrl + "_vote") | |
45 | + | func getRandomNumber (variants,txId,finishHeight,offset) = { | |
46 | + | let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1))) | |
47 | + | let randomHash = sha256((txId + value(randomSeedBlock.vrf))) | |
48 | + | (toInt(randomHash, (offset * 8)) % variants) | |
49 | + | } | |
20 | 50 | ||
21 | 51 | ||
22 | - | func checkVote (numberVote,voices) = if ((voices > (numberVote / 2))) | |
23 | - | then "VERIFY" | |
24 | - | else "VOTING" | |
52 | + | func getRandomArtefact (boxId,h) = { | |
53 | + | let randomNumber = getRandomNumber(15, boxId, h, 0) | |
54 | + | artefacts[randomNumber] | |
55 | + | } | |
25 | 56 | ||
26 | 57 | ||
27 | - | @Callable( | |
28 | - | func | |
29 | - | then | |
30 | - | else | |
58 | + | @Callable(i) | |
59 | + | func initTime (start,end) = if ((i.caller == this)) | |
60 | + | then [IntegerEntry(timeStart, start), IntegerEntry(timeEnd, end)] | |
61 | + | else throw("Only Admin") | |
31 | 62 | ||
32 | 63 | ||
33 | 64 | ||
34 | - | @Callable(inv) | |
35 | - | func vote (nameUrl) = { | |
36 | - | let votingMember = split(getStringValue("voting_member"), ",") | |
37 | - | let listVoted = split(getStringValue(voteKey(nameUrl)), ",") | |
38 | - | if (!(containsElement(votingMember, toBase58String(inv.caller.bytes)))) | |
39 | - | then throw("You can't vote") | |
40 | - | else if (containsElement(listVoted, toBase58String(inv.caller.bytes))) | |
41 | - | then throw("You voted already") | |
42 | - | else if ((statusKey(nameUrl) == "VERIFY")) | |
43 | - | then throw("Voting was ended") | |
44 | - | else { | |
45 | - | let list = toBase58String(inv.caller.bytes) :: listVoted | |
46 | - | let voices = size(listVoted) | |
47 | - | [StringEntry(voteKey(nameUrl), makeString(list, ",")), StringEntry(statusKey(nameUrl), checkVote(size(votingMember), voices))] | |
48 | - | } | |
65 | + | @Callable(i) | |
66 | + | func dropLootbox (address) = { | |
67 | + | let userStatusKey = keyStatus(address) | |
68 | + | if ((lastBlock.timestamp > getIntegerValue(timeEnd))) | |
69 | + | then throw("Drop ended...") | |
70 | + | else if ((getIntegerValue(timeStart) > lastBlock.timestamp)) | |
71 | + | then throw("Drop wasn`t start...") | |
72 | + | else if ((i.caller != this)) | |
73 | + | then throw("Only admin") | |
74 | + | else if ((tryGetInteger("count_lootbox") >= artefactsLimit)) | |
75 | + | then throw("Lootboxs were ended") | |
76 | + | else if ((tryGetString(userStatusKey) != "")) | |
77 | + | then throw("Only one lootbox for user") | |
78 | + | else [StringEntry(userStatusKey, statusDrop), StringEntry(keyTransaction(address), toBase58String(i.transactionId)), IntegerEntry(keyFinishHeight(address), (height + 2)), IntegerEntry("count_lootbox", (tryGetInteger("count_lootbox") + 1))] | |
49 | 79 | } | |
50 | 80 | ||
51 | 81 | ||
52 | 82 | ||
53 | - | @Callable(inv) | |
54 | - | func addVoting (address) = { | |
55 | - | let listVoting = split(getStringValue("voting_member"), ",") | |
56 | - | if ((toBase58String(inv.caller.bytes) != toBase58String(this.bytes))) | |
57 | - | then throw("You don't owner") | |
58 | - | else if (containsElement(listVoting, address)) | |
59 | - | then throw("This address was added") | |
60 | - | else { | |
61 | - | let list = address :: listVoting | |
62 | - | [StringEntry("voting_member", makeString(list, ","))] | |
63 | - | } | |
64 | - | } | |
83 | + | @Callable(i) | |
84 | + | func setGlobalArtAmount (newAmount) = if ((i.caller == this)) | |
85 | + | then [IntegerEntry("count_lootbox", newAmount)] | |
86 | + | else throw("Only admin") | |
65 | 87 | ||
66 | 88 | ||
67 | 89 | ||
68 | - | @Callable( | |
69 | - | func | |
70 | - | let | |
71 | - | | |
72 | - | | |
73 | - | | |
74 | - | ||
75 | - | ||
76 | - | | |
77 | - | | |
78 | - | | |
79 | - | | |
80 | - | | |
81 | - | | |
82 | - | let | |
83 | - | [StringEntry( | |
84 | - | } | |
90 | + | @Callable(i) | |
91 | + | func claimLootbox () = { | |
92 | + | let txId = tryGetString(keyTransaction(toString(i.caller))) | |
93 | + | let statusKey = keyStatus(toString(i.caller)) | |
94 | + | let heightKey = keyFinishHeight(toString(i.caller)) | |
95 | + | if ((getIntegerValue(timeEnd) > lastBlock.timestamp)) | |
96 | + | then throw("You cannot claim yet") | |
97 | + | else if ((tryGetString(statusKey) != statusDrop)) | |
98 | + | then throw("You dont have lootbox") | |
99 | + | else if ((getIntegerValue(heightKey) > height)) | |
100 | + | then throw("You cannot claim yet") | |
101 | + | else { | |
102 | + | let artType = getRandomArtefact(fromBase58String(txId), getIntegerValue(heightKey)) | |
103 | + | let asset = Issue(artType, "Waves Punk metaverse", 1, 0, false, unit, getIntegerValue(heightKey)) | |
104 | + | let assetId = calculateAssetId(asset) | |
105 | + | [asset, StringEntry(statusKey, artType), StringEntry((toString(i.caller) + "_assetId"), toBase58String(assetId)), StringEntry((toBase58String(assetId) + "_type"), artType), ScriptTransfer(i.caller, 1, assetId)] | |
106 | + | } | |
85 | 107 | } | |
86 | 108 | ||
87 | 109 | ||
88 | 110 | @Verifier(tx) | |
89 | 111 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
90 | 112 |
github/deemru/w8io/169f3d6 39.77 ms ◑![]()