tx · QNEMf2iVCiVpMhoV1W7tA1rEbkYbJ2TZFLeyGdsbgzv

3N6QtvE15KN8rsW1jkBe1kz8xJHdmhNsYnG:  -0.10000000 Waves

2020.12.14 15:04 [1308335] smart account 3N6QtvE15KN8rsW1jkBe1kz8xJHdmhNsYnG > SELF 0.00000000 Waves

{ "type": 13, "id": "QNEMf2iVCiVpMhoV1W7tA1rEbkYbJ2TZFLeyGdsbgzv", "fee": 10000000, "feeAssetId": null, "timestamp": 1607947479862, "version": 2, "chainId": 84, "sender": "3N6QtvE15KN8rsW1jkBe1kz8xJHdmhNsYnG", "senderPublicKey": "58FMGdemwEpJ3ryCQkCqTQ7y2r5KhqvcD2PEGsiNxzx2", "proofs": [ "4kf2QjKLPgvL7Dv5Fx25oQ6EBdK2yKeF2EBoi7WG2iSWZXKxLqQdsC11jcaoZpokA1kuDwKTBRFpazpBukjzuqGr" ], "script": "base64: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", "height": 1308335, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4CjHHF21xHbg5jDpjvB3L9Ve3MhkYrRXhUfnHsuW5yjm Next: 2kJQu4mgPTJTvNrGsBBrDpCrvasoPjhG8zpVeF3sgynW Diff:
OldNewDifferences
7474 }
7575
7676
77-@Callable(i)
78-func addDAOMember (memberAddress) = if (!(isOwner(i.caller)))
79- then throw("access only to the DAO owner")
80- else if ((tryGetInteger((("dao_member_" + memberAddress) + "_weight")) == 1))
81- then throw("This user already exists")
82- else {
83- let group = getMembers()
84- let newGroup = ((group + ";") + memberAddress)
85- let groupSize = tryGetInteger("dao_size")
86- let newGroupSize = (groupSize + 1)
87- WriteSet([DataEntry("dao_members", newGroup), DataEntry("dao_size", newGroupSize), DataEntry((("dao_member_" + memberAddress) + "_weight"), 1)])
88- }
77+func getVoteValue (s) = if ((s == "like"))
78+ then 1
79+ else if ((s == "dislike"))
80+ then -1
81+ else throw("you need to vote with 'like' or 'dislike' value")
8982
9083
84+func isVotingLive (taskId) = (getStringValue(this, (("tasks_" + taskId) + "_status")) != "proposed")
9185
92-@Callable(i)
93-func addGroupMember (memberAddress) = if (!(isOwner(i.caller)))
94- then throw("access only to the DAO owner")
95- else if ((tryGetInteger((("working_group_member_" + memberAddress) + "_weight")) == 1))
96- then throw("This user already exists")
97- else {
98- let group = getGroup()
99- let newGroup = ((group + ";") + memberAddress)
100- let groupSize = tryGetInteger("working_group_size")
101- let newGroupSize = (groupSize + 1)
102- WriteSet([DataEntry("working_group_members", newGroup), DataEntry("working_group_size", newGroupSize), DataEntry((("working_group_member_" + memberAddress) + "_weight"), 1)])
103- }
10486
87+func isQuorumAchieved (taskId) = (QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / tryGetInteger("dao_size")))
10588
10689
10790 @Callable(i)
127110
128111
129112 @Callable(i)
130-func voteForTaskProposal (taskId,voteValue) = if (!(canMemberVote(i)))
113+func voteForTaskProposal (taskId,voteValueString) = if (!(canMemberVote(i)))
131114 then throw("you can't vote")
132- else if ((getStringValue(this, (("tasks_" + taskId) + "_status")) != "proposed"))
115+ else if (isVotingLive(taskId))
133116 then throw("voting is closed or not started")
134- else if (if ((voteValue != -1))
135- then (voteValue != 1)
136- else false)
137- then throw("you need to vote 1 or -1")
138- else {
139- let voteKey = ((("tasks_" + taskId) + "_voted_") + toString(i.caller))
140- let previousVote = tryGetInteger(voteKey)
141- if (!((previousVote == 0)))
142- then throw("you have already voted")
143- else {
144- let votingKey = (("tasks_" + taskId) + "_voting_state")
145- let votingState = tryGetInteger(votingKey)
146- let votesAmountKey = (("tasks_" + taskId) + "_voting_amount")
147- let votesAmountState = (tryGetInteger(votingKey) + 1)
148- let newVotingState = (votingState + voteValue)
149- ScriptResult(WriteSet([DataEntry(votingKey, newVotingState), DataEntry(voteKey, voteValue), DataEntry(votesAmountKey, votesAmountState)]), TransferSet([ScriptTransfer(i.caller, 500000, unit)]))
150- }
151- }
117+ else {
118+ let voteValue = getVoteValue(voteValueString)
119+ let voteKey = ((("tasks_" + taskId) + "_voted_") + toString(i.caller))
120+ let previousVote = tryGetInteger(voteKey)
121+ if (!((previousVote == 0)))
122+ then throw("you have already voted")
123+ else {
124+ let votingKey = (("tasks_" + taskId) + "_voting_state")
125+ let votingState = tryGetInteger(votingKey)
126+ let votesAmountKey = (("tasks_" + taskId) + "_voting_amount")
127+ let votesAmountState = (tryGetInteger(votingKey) + 1)
128+ let newVotingState = (votingState + voteValue)
129+ WriteSet([DataEntry(votingKey, newVotingState), DataEntry(voteKey, voteValue), DataEntry(votesAmountKey, votesAmountState)])
130+ }
131+ }
152132
153133
154134
155135 @Callable(i)
156-func finishTaskProposalVoting (taskId) = if ((QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / tryGetInteger("dao_size"))))
136+func finishTaskProposalVoting (taskId) = if (isQuorumAchieved(taskId))
157137 then throw((("more than " + toString(QUORUM)) + "% members have to vote before finishing the voting"))
158138 else if (!(isGroupMember(i.caller)))
159139 then throw("grants working group access only")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let QUORUM = 1
55
66 func tryGetInteger (key) = {
77 let val = match getInteger(this, key) {
88 case b: Int =>
99 b
1010 case _ =>
1111 0
1212 }
1313 val
1414 }
1515
1616
1717 func tryGetString (key) = {
1818 let val = match getString(this, key) {
1919 case b: String =>
2020 b
2121 case _ =>
2222 ""
2323 }
2424 val
2525 }
2626
2727
2828 let mainContract = this
2929
3030 func isOwner (address) = (address == this)
3131
3232
3333 func getGroup () = {
3434 let val = match getString(mainContract, "working_group_members") {
3535 case b: String =>
3636 b
3737 case _ =>
3838 ""
3939 }
4040 val
4141 }
4242
4343
4444 func getMembers () = {
4545 let val = match getString(mainContract, "dao_members") {
4646 case b: String =>
4747 b
4848 case _ =>
4949 ""
5050 }
5151 val
5252 }
5353
5454
5555 func isGroupMember (a) = {
5656 let val = match getInteger(mainContract, (("working_group_member_" + toString(a)) + "_weight")) {
5757 case b: Int =>
5858 b
5959 case _ =>
6060 0
6161 }
6262 (val > 0)
6363 }
6464
6565
6666 func canMemberVote (i) = {
6767 let val = match getInteger(mainContract, (("dao_member_" + toString(i.caller)) + "_weight")) {
6868 case b: Int =>
6969 b
7070 case _ =>
7171 0
7272 }
7373 (val > 0)
7474 }
7575
7676
77-@Callable(i)
78-func addDAOMember (memberAddress) = if (!(isOwner(i.caller)))
79- then throw("access only to the DAO owner")
80- else if ((tryGetInteger((("dao_member_" + memberAddress) + "_weight")) == 1))
81- then throw("This user already exists")
82- else {
83- let group = getMembers()
84- let newGroup = ((group + ";") + memberAddress)
85- let groupSize = tryGetInteger("dao_size")
86- let newGroupSize = (groupSize + 1)
87- WriteSet([DataEntry("dao_members", newGroup), DataEntry("dao_size", newGroupSize), DataEntry((("dao_member_" + memberAddress) + "_weight"), 1)])
88- }
77+func getVoteValue (s) = if ((s == "like"))
78+ then 1
79+ else if ((s == "dislike"))
80+ then -1
81+ else throw("you need to vote with 'like' or 'dislike' value")
8982
9083
84+func isVotingLive (taskId) = (getStringValue(this, (("tasks_" + taskId) + "_status")) != "proposed")
9185
92-@Callable(i)
93-func addGroupMember (memberAddress) = if (!(isOwner(i.caller)))
94- then throw("access only to the DAO owner")
95- else if ((tryGetInteger((("working_group_member_" + memberAddress) + "_weight")) == 1))
96- then throw("This user already exists")
97- else {
98- let group = getGroup()
99- let newGroup = ((group + ";") + memberAddress)
100- let groupSize = tryGetInteger("working_group_size")
101- let newGroupSize = (groupSize + 1)
102- WriteSet([DataEntry("working_group_members", newGroup), DataEntry("working_group_size", newGroupSize), DataEntry((("working_group_member_" + memberAddress) + "_weight"), 1)])
103- }
10486
87+func isQuorumAchieved (taskId) = (QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / tryGetInteger("dao_size")))
10588
10689
10790 @Callable(i)
10891 func addTask (title,link) = WriteSet([DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_title"), title), DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_link"), link)])
10992
11093
11194
11295 @Callable(i)
11396 func addTaskDetails (taskId,reward) = {
11497 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
11598 if ((toString(i.caller) != getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))))
11699 then throw("team leader only")
117100 else WriteSet([DataEntry((("tasks_" + taskId) + "_requestedreward"), reward)])
118101 }
119102
120103
121104
122105 @Callable(i)
123106 func initTaskVoting (taskId) = if (!(isGroupMember(i.caller)))
124107 then throw("grants working group access only")
125108 else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "voting_started")])
126109
127110
128111
129112 @Callable(i)
130-func voteForTaskProposal (taskId,voteValue) = if (!(canMemberVote(i)))
113+func voteForTaskProposal (taskId,voteValueString) = if (!(canMemberVote(i)))
131114 then throw("you can't vote")
132- else if ((getStringValue(this, (("tasks_" + taskId) + "_status")) != "proposed"))
115+ else if (isVotingLive(taskId))
133116 then throw("voting is closed or not started")
134- else if (if ((voteValue != -1))
135- then (voteValue != 1)
136- else false)
137- then throw("you need to vote 1 or -1")
138- else {
139- let voteKey = ((("tasks_" + taskId) + "_voted_") + toString(i.caller))
140- let previousVote = tryGetInteger(voteKey)
141- if (!((previousVote == 0)))
142- then throw("you have already voted")
143- else {
144- let votingKey = (("tasks_" + taskId) + "_voting_state")
145- let votingState = tryGetInteger(votingKey)
146- let votesAmountKey = (("tasks_" + taskId) + "_voting_amount")
147- let votesAmountState = (tryGetInteger(votingKey) + 1)
148- let newVotingState = (votingState + voteValue)
149- ScriptResult(WriteSet([DataEntry(votingKey, newVotingState), DataEntry(voteKey, voteValue), DataEntry(votesAmountKey, votesAmountState)]), TransferSet([ScriptTransfer(i.caller, 500000, unit)]))
150- }
151- }
117+ else {
118+ let voteValue = getVoteValue(voteValueString)
119+ let voteKey = ((("tasks_" + taskId) + "_voted_") + toString(i.caller))
120+ let previousVote = tryGetInteger(voteKey)
121+ if (!((previousVote == 0)))
122+ then throw("you have already voted")
123+ else {
124+ let votingKey = (("tasks_" + taskId) + "_voting_state")
125+ let votingState = tryGetInteger(votingKey)
126+ let votesAmountKey = (("tasks_" + taskId) + "_voting_amount")
127+ let votesAmountState = (tryGetInteger(votingKey) + 1)
128+ let newVotingState = (votingState + voteValue)
129+ WriteSet([DataEntry(votingKey, newVotingState), DataEntry(voteKey, voteValue), DataEntry(votesAmountKey, votesAmountState)])
130+ }
131+ }
152132
153133
154134
155135 @Callable(i)
156-func finishTaskProposalVoting (taskId) = if ((QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / tryGetInteger("dao_size"))))
136+func finishTaskProposalVoting (taskId) = if (isQuorumAchieved(taskId))
157137 then throw((("more than " + toString(QUORUM)) + "% members have to vote before finishing the voting"))
158138 else if (!(isGroupMember(i.caller)))
159139 then throw("grants working group access only")
160140 else {
161141 let votingKey = (("tasks_" + taskId) + "_voting_state")
162142 let votingState = tryGetInteger(votingKey)
163143 if ((votingState > 0))
164144 then {
165145 let votingResult = "approved"
166146 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), votingResult)])
167147 }
168148 else {
169149 let votingResult = "rejected"
170150 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), votingResult)])
171151 }
172152 }
173153
174154
175155
176156 @Callable(i)
177157 func startWork (taskId) = {
178158 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
179159 if ((toString(i.caller) != getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))))
180160 then throw("team leader only")
181161 else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_started")])
182162 }
183163
184164
185165
186166 @Callable(i)
187167 func rejectTask (taskId) = if (!(isGroupMember(i.caller)))
188168 then throw("grants working group access only")
189169 else {
190170 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
191171 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "rejected"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_process"), "rejected")])
192172 }
193173
194174
195175
196176 @Callable(i)
197177 func acceptWorkResult (taskId,reportLink) = if (!(isGroupMember(i.caller)))
198178 then throw("grants working group access only")
199179 else {
200180 let rewardAmount = tryGetInteger((("tasks_" + taskId) + "_reward"))
201181 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
202182 let teamAddress = getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))
203183 ScriptResult(WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_finished"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_report"), reportLink)]), TransferSet([ScriptTransfer(addressFromStringValue(teamAddress), rewardAmount, unit)]))
204184 }
205185
206186

github/deemru/w8io/3ef1775 
60.84 ms