tx · 9A72CE6ypn7Tn33KXBAL9zNEbydDtjGdE8svz76Ps7EE

3N81Dk1WuUv7UKt3inqWVYN81J8VHjoV3MC:  -0.01400000 Waves

2022.02.20 18:45 [1932160] smart account 3N81Dk1WuUv7UKt3inqWVYN81J8VHjoV3MC > SELF 0.00000000 Waves

{ "type": 13, "id": "9A72CE6ypn7Tn33KXBAL9zNEbydDtjGdE8svz76Ps7EE", "fee": 1400000, "feeAssetId": null, "timestamp": 1645371943872, "version": 2, "chainId": 84, "sender": "3N81Dk1WuUv7UKt3inqWVYN81J8VHjoV3MC", "senderPublicKey": "5vXdNgZ1TR8AAzcnLumQTQYzcU3AwHj91bZTtiE3roBE", "proofs": [ "4AGNyhDos1rLouKWmuKipzqyWv3fWTq698WDZ1KfwGPYvYiGD4pbNqmAJTWRaCLG3649hp4KwaVNyDTbAAJe1ixU" ], "script": "base64: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AAACBQAAAARpdGVtBQAAAAR1c2VyAQAAABRnZXRWYWx1ZUNvbW1pdHNDb3VudAAAAAEAAAAEaXRlbQkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAABJnZXRLZXlDb21taXRzQ291bnQAAAABBQAAAARpdGVtAQAAAA5nZXRWYWx1ZVJldmVhbAAAAAIAAAAEaXRlbQAAAAR1c2VyCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAMZ2V0S2V5UmV2ZWFsAAAAAgUAAAAEaXRlbQUAAAAEdXNlcgEAAAASZ2V0VmFsdWVJdGVtU3RhdHVzAAAAAQAAAARpdGVtCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAQZ2V0S2V5SXRlbVN0YXR1cwAAAAEFAAAABGl0ZW0BAAAAEmdldFZhbHVlVm90ZXNDb3VudAAAAAIAAAAEaXRlbQAAAAR2b3RlCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAAEGdldEtleVZvdGVzQ291bnQAAAACBQAAAARpdGVtBQAAAAR2b3RlAQAAABRnZXRWYWx1ZUl0ZW1TdXBwbGllcgAAAAEAAAAHYWNjb3VudAQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAAAdhY2NvdW50AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAABE5PTkUAAAADAAAAAWkBAAAAB2FkZEl0ZW0AAAADAAAABXRpdGxlAAAABXByaWNlAAAABGRhdGEEAAAAD3N1cHBsaWVyQWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAARpdGVtCQEAAAAKZ2V0S2V5SXRlbQAAAAIFAAAAD3N1cHBsaWVyQWRkcmVzcwUAAAAFdGl0bGUDCQAAZwAAAAIAAAAAAAAAAAAFAAAABXByaWNlCQAAAgAAAAECAAAALlB1cmNoYXNlIGFtb3VudCBjYW5ub3QgYmUgbGVzcyB0aGFuIGl0ZW0gcHJpY2UDCQEAAAACIT0AAAACCQEAAAAUZ2V0VmFsdWVJdGVtU3VwcGxpZXIAAAABBQAAAARpdGVtBQAAAAROT05FCQAAAgAAAAECAAAA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", "height": 1932160, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 68ihjaaAahY2XytQLUGTa8A7Ksjhtxhc2JnfGB9qaTsP Next: ADywmGrM3EdT2mbLLaMLxDj1FYppTvizVpmBAdbYBtFJ Diff:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 let NONE = "NONE"
55
6+let VOTERS = 2
7+
8+let QUORUM = 3
9+
10+let FEATURED = "featured"
11+
12+let DELISTED = "delisted"
13+
14+let VOTING = "voting"
15+
16+let REVEAL = "reveal"
17+
618 func getStringByKey (key) = match getString(this, key) {
719 case a: String =>
820 a
921 case _ =>
10- ""
22+ "NONE"
23+}
24+
25+
26+func getIntegerByKey (key) = match getInteger(this, key) {
27+ case a: Int =>
28+ a
29+ case _ =>
30+ 0
1131 }
1232
1333
1434 func getKeyItem (supplier,title) = {
15- let supplierTittle = (supplier + title)
16- ("item_" + toBase58String(sha256(toBytes(supplierTittle))))
35+ let supplierTitle = (supplier + title)
36+ ("item_" + toBase58String(sha256(toBytes(supplierTitle))))
1737 }
1838
1939
2444
2545
2646 func getKeyItemData (item) = (item + "_data")
47+
48+
49+func getKeyCommit (item,user) = (((item + "_") + user) + "_commmit")
50+
51+
52+func getKeyCommitsCount (item) = (item + "_cmtcnt")
53+
54+
55+func getKeyReveal (item,user) = (((item + "_") + user) + "_reveal")
56+
57+
58+func getKeyItemStatus (item) = (item + "_status")
59+
60+
61+func getKeyVotesCount (item,vote) = ((item + "_res:") + vote)
62+
63+
64+func getKeyUserItemCounter (user,item) = (((item + "_") + user) + "_cnt")
65+
66+
67+func getKeyBalanceSupplier (account) = (account + "_balance")
68+
69+
70+func getValueUserItemCounter (user,item) = {
71+ let userItemCounterKey = getKeyUserItemCounter(user, item)
72+ match getInteger(this, userItemCounterKey) {
73+ case a: Int =>
74+ a
75+ case _ =>
76+ 0
77+ }
78+ }
79+
80+
81+func getUserItemPrice (item) = {
82+ let keyItemPrice = getKeyItemPrice(item)
83+ getInteger(this, keyItemPrice)
84+ }
85+
86+
87+func getValueCommit (item,user) = getStringByKey(getKeyCommit(item, user))
88+
89+
90+func getValueCommitsCount (item) = getIntegerByKey(getKeyCommitsCount(item))
91+
92+
93+func getValueReveal (item,user) = getStringByKey(getKeyReveal(item, user))
94+
95+
96+func getValueItemStatus (item) = getStringByKey(getKeyItemStatus(item))
97+
98+
99+func getValueVotesCount (item,vote) = getIntegerByKey(getKeyVotesCount(item, vote))
27100
28101
29102 func getValueItemSupplier (account) = match getString(this, account) {
46119 }
47120
48121
122+
123+@Callable(i)
124+func voteCommit (item,hash) = {
125+ let user = toBase58String(i.caller.bytes)
126+ let commitsCount = getValueCommitsCount(item)
127+ let status = getValueItemStatus(item)
128+ if ((commitsCount >= VOTERS))
129+ then throw("Reached max numer of voters")
130+ else if ((getValueCommit(item, user) != NONE))
131+ then throw("You voted already")
132+ else if ((getKeyItemSupplier(item) == NONE))
133+ then throw("Item does not exist")
134+ else if (if ((status != NONE))
135+ then (status != VOTING)
136+ else false)
137+ then throw("Voting is not active for this item noew")
138+ else {
139+ let newStatus = if ((commitsCount == VOTERS))
140+ then REVEAL
141+ else VOTING
142+ WriteSet([DataEntry(getKeyCommit(item, user), hash), DataEntry(getKeyCommitsCount(item), (commitsCount + 1)), DataEntry(getKeyItemStatus(item), newStatus)])
143+ }
144+ }
145+
146+
147+
148+@Callable(i)
149+func voteReveal (item,vote,salt) = {
150+ let user = toBase58String(i.caller.bytes)
151+ let status = getValueItemStatus(item)
152+ let newVotesCount = (getValueVotesCount(item, vote) + 1)
153+ let saltedVote = ((item + vote) + salt)
154+ if ((toBase58String(sha256(toBytes(saltedVote))) != getValueCommit(item, user)))
155+ then throw("Reveal data is not valid")
156+ else if ((VOTERS > getValueCommitsCount(item)))
157+ then throw("Max number of voters not reached")
158+ else if ((getValueReveal(item, user) != NONE))
159+ then throw("You voted already")
160+ else if (if ((status != VOTING))
161+ then (status != REVEAL)
162+ else false)
163+ then throw("Voting is not active of this item now")
164+ else if (if ((vote != FEATURED))
165+ then (vote != DELISTED)
166+ else false)
167+ then throw("Provided voting option is incorrect")
168+ else {
169+ let newStatus = if ((newVotesCount >= QUORUM))
170+ then vote
171+ else REVEAL
172+ WriteSet([DataEntry(getKeyCommit(item, user), vote), DataEntry(getKeyVotesCount(item, user), newVotesCount), DataEntry(getKeyItemStatus(item), newStatus)])
173+ }
174+ }
175+
176+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let NONE = "NONE"
55
6+let VOTERS = 2
7+
8+let QUORUM = 3
9+
10+let FEATURED = "featured"
11+
12+let DELISTED = "delisted"
13+
14+let VOTING = "voting"
15+
16+let REVEAL = "reveal"
17+
618 func getStringByKey (key) = match getString(this, key) {
719 case a: String =>
820 a
921 case _ =>
10- ""
22+ "NONE"
23+}
24+
25+
26+func getIntegerByKey (key) = match getInteger(this, key) {
27+ case a: Int =>
28+ a
29+ case _ =>
30+ 0
1131 }
1232
1333
1434 func getKeyItem (supplier,title) = {
15- let supplierTittle = (supplier + title)
16- ("item_" + toBase58String(sha256(toBytes(supplierTittle))))
35+ let supplierTitle = (supplier + title)
36+ ("item_" + toBase58String(sha256(toBytes(supplierTitle))))
1737 }
1838
1939
2040 func getKeyItemSupplier (item) = (item + "_owner")
2141
2242
2343 func getKeyItemPrice (item) = (item + "_price")
2444
2545
2646 func getKeyItemData (item) = (item + "_data")
47+
48+
49+func getKeyCommit (item,user) = (((item + "_") + user) + "_commmit")
50+
51+
52+func getKeyCommitsCount (item) = (item + "_cmtcnt")
53+
54+
55+func getKeyReveal (item,user) = (((item + "_") + user) + "_reveal")
56+
57+
58+func getKeyItemStatus (item) = (item + "_status")
59+
60+
61+func getKeyVotesCount (item,vote) = ((item + "_res:") + vote)
62+
63+
64+func getKeyUserItemCounter (user,item) = (((item + "_") + user) + "_cnt")
65+
66+
67+func getKeyBalanceSupplier (account) = (account + "_balance")
68+
69+
70+func getValueUserItemCounter (user,item) = {
71+ let userItemCounterKey = getKeyUserItemCounter(user, item)
72+ match getInteger(this, userItemCounterKey) {
73+ case a: Int =>
74+ a
75+ case _ =>
76+ 0
77+ }
78+ }
79+
80+
81+func getUserItemPrice (item) = {
82+ let keyItemPrice = getKeyItemPrice(item)
83+ getInteger(this, keyItemPrice)
84+ }
85+
86+
87+func getValueCommit (item,user) = getStringByKey(getKeyCommit(item, user))
88+
89+
90+func getValueCommitsCount (item) = getIntegerByKey(getKeyCommitsCount(item))
91+
92+
93+func getValueReveal (item,user) = getStringByKey(getKeyReveal(item, user))
94+
95+
96+func getValueItemStatus (item) = getStringByKey(getKeyItemStatus(item))
97+
98+
99+func getValueVotesCount (item,vote) = getIntegerByKey(getKeyVotesCount(item, vote))
27100
28101
29102 func getValueItemSupplier (account) = match getString(this, account) {
30103 case a: String =>
31104 a
32105 case _ =>
33106 "NONE"
34107 }
35108
36109
37110 @Callable(i)
38111 func addItem (title,price,data) = {
39112 let supplierAddress = toBase58String(i.caller.bytes)
40113 let item = getKeyItem(supplierAddress, title)
41114 if ((0 >= price))
42115 then throw("Purchase amount cannot be less than item price")
43116 else if ((getValueItemSupplier(item) != NONE))
44117 then throw("An item is already exists")
45118 else WriteSet([DataEntry(getKeyItemSupplier(item), supplierAddress), DataEntry(getKeyItemPrice(item), price), DataEntry(getKeyItemData(item), data)])
46119 }
47120
48121
122+
123+@Callable(i)
124+func voteCommit (item,hash) = {
125+ let user = toBase58String(i.caller.bytes)
126+ let commitsCount = getValueCommitsCount(item)
127+ let status = getValueItemStatus(item)
128+ if ((commitsCount >= VOTERS))
129+ then throw("Reached max numer of voters")
130+ else if ((getValueCommit(item, user) != NONE))
131+ then throw("You voted already")
132+ else if ((getKeyItemSupplier(item) == NONE))
133+ then throw("Item does not exist")
134+ else if (if ((status != NONE))
135+ then (status != VOTING)
136+ else false)
137+ then throw("Voting is not active for this item noew")
138+ else {
139+ let newStatus = if ((commitsCount == VOTERS))
140+ then REVEAL
141+ else VOTING
142+ WriteSet([DataEntry(getKeyCommit(item, user), hash), DataEntry(getKeyCommitsCount(item), (commitsCount + 1)), DataEntry(getKeyItemStatus(item), newStatus)])
143+ }
144+ }
145+
146+
147+
148+@Callable(i)
149+func voteReveal (item,vote,salt) = {
150+ let user = toBase58String(i.caller.bytes)
151+ let status = getValueItemStatus(item)
152+ let newVotesCount = (getValueVotesCount(item, vote) + 1)
153+ let saltedVote = ((item + vote) + salt)
154+ if ((toBase58String(sha256(toBytes(saltedVote))) != getValueCommit(item, user)))
155+ then throw("Reveal data is not valid")
156+ else if ((VOTERS > getValueCommitsCount(item)))
157+ then throw("Max number of voters not reached")
158+ else if ((getValueReveal(item, user) != NONE))
159+ then throw("You voted already")
160+ else if (if ((status != VOTING))
161+ then (status != REVEAL)
162+ else false)
163+ then throw("Voting is not active of this item now")
164+ else if (if ((vote != FEATURED))
165+ then (vote != DELISTED)
166+ else false)
167+ then throw("Provided voting option is incorrect")
168+ else {
169+ let newStatus = if ((newVotesCount >= QUORUM))
170+ then vote
171+ else REVEAL
172+ WriteSet([DataEntry(getKeyCommit(item, user), vote), DataEntry(getKeyVotesCount(item, user), newVotesCount), DataEntry(getKeyItemStatus(item), newStatus)])
173+ }
174+ }
175+
176+

github/deemru/w8io/03bedc9 
39.54 ms