tx · BffsLs7DkYdUZ3A3uKoQviWy4Y56ub2fKHQb2uK2qcSu

3MtV1AQ8fEPk76tjKgvrufuMe5aA3q4TviQ:  -0.10000000 Waves

2020.12.22 18:36 [1320103] smart account 3MtV1AQ8fEPk76tjKgvrufuMe5aA3q4TviQ > SELF 0.00000000 Waves

{ "type": 13, "id": "BffsLs7DkYdUZ3A3uKoQviWy4Y56ub2fKHQb2uK2qcSu", "fee": 10000000, "feeAssetId": null, "timestamp": 1608651375645, "version": 2, "chainId": 84, "sender": "3MtV1AQ8fEPk76tjKgvrufuMe5aA3q4TviQ", "senderPublicKey": "3Fjao2FW1JXSPd5EkP7C3uerW18HYacYsaMYALFMGA6N", "proofs": [ "4G81fBCJuUDnPdj7TrizqzLjg5cLZ16vSXTjwSKq24yW4CxjSdM28MHx771iX5AujJmhyNSS3vSFXiufLyKLYjBM" ], "script": "base64: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b3VudEtleQkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAA5fdm90aW5nX2Ftb3VudAQAAAAQdm90ZXNBbW91bnRTdGF0ZQkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEFAAAACXZvdGluZ0tleQAAAAAAAAAAAQQAAAAObmV3Vm90aW5nU3RhdGUJAABkAAAAAgUAAAALdm90aW5nU3RhdGUFAAAACXZvdGVWYWx1ZQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAJdm90aW5nS2V5BQAAAA5uZXdWb3RpbmdTdGF0ZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAHdm90ZUtleQUAAAAJdm90ZVZhbHVlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA52b3Rlc0Ftb3VudEtleQUAAAAQdm90ZXNBbW91bnRTdGF0ZQUAAAADbmlsAAAAAWkBAAAAGGZpbmlzaFRhc2tQcm9wb3NhbFZvdGluZwAAAAEAAAAGdGFza0lkAwkBAAAAEGlzUXVvcnVtQWNoaWV2ZWQAAAABBQAAAAZ0YXNrSWQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAACm1vcmUgdGhhbiAJAAGkAAAAAQUAAAAGUVVPUlVNAgAAADIlIG1lbWJlcnMgaGF2ZSB0byB2b3RlIGJlZm9yZSBmaW5pc2hpbmcgdGhlIHZvdGluZwMJAQAAAAEhAAAAAQkBAAAADWlzR3JvdXBNZW1iZXIAAAABCAUAAAABaQAAAAZjYWxsZXIJAAACAAAAAQIAAAAgZ3JhbnRzIHdvcmtpbmcgZ3JvdXAgYWNjZXNzIG9ubHkEAAAACXZvdGluZ0tleQkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAA1fdm90aW5nX3N0YXRlBAAAAAt2b3RpbmdTdGF0ZQkBAAAADXRyeUdldEludGVnZXIAAAABBQAAAAl2b3RpbmdLZXkDCQAAZgAAAAIFAAAAC3ZvdGluZ1N0YXRlAAAAAAAAAAAABAAAAAx2b3RpbmdSZXN1bHQCAAAACGFwcHJvdmVkCQEAAAAIV3JpdGVTZXQA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", "height": 1320103, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G3DxqjJyMHncb1yePgDw9pZgMWQubQoCKaiF7DvrxEAV Next: 9cCddCFYEzWZ5wiBUEihBjk4Zh3hbBM4MfpjZdT4EuGX Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let mainContract = addressFromStringValue("3MwRzi2BmqZZXWrCGCwcRQLsnic2Aod6zhS")
5-
64 let QUORUM = 1
75
86 func tryGetInteger (key) = {
2725 }
2826
2927
30-func isOwner (address) = (address == this)
31-
28+let mainContract = addressFromStringValue("3MwRzi2BmqZZXWrCGCwcRQLsnic2Aod6zhS")
3229
3330 func getGroup () = {
3431 let val = match getString(mainContract, "working_group_members") {
9289 else throw("you need to vote with 'like' or 'dislike' value")
9390
9491
92+func isVotingLive (taskId) = (getStringValue(this, (("tasks_" + taskId) + "_status")) == "voting_started")
93+
94+
95+func isQuorumAchieved (taskId) = (QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / getDAOSize()))
96+
97+
9598 @Callable(i)
96-func addTask (title,link) = if (!(isGroupMember(i.caller)))
97- then throw("grants working group access only")
98- else WriteSet([DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_title"), title), DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_link"), link)])
99+func addTask (title,link) = WriteSet([DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_title"), title), DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_link"), link), DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_leader"), toString(i.caller))])
99100
100101
101102
102103 @Callable(i)
103-func addReward (taskId) = if (!(isGroupMember(i.caller)))
104- then throw("grants working group access only")
105- else {
106- let reward = extract(i.payment).amount
107- WriteSet([DataEntry((("tasks_" + taskId) + "_reward"), reward), DataEntry((("tasks_" + taskId) + "_status"), "proposed")])
108- }
104+func addReward (taskId,reward) = if ((tryGetString((("tasks_" + taskId) + "_status")) != ""))
105+ then throw("voting was already started, so the reward amount cannot be changed")
106+ else if ((toString(i.caller) != tryGetString((("tasks_" + taskId) + "_leader"))))
107+ then throw("team leader only")
108+ else WriteSet([DataEntry((("tasks_" + taskId) + "_reward"), reward)])
109109
110110
111111
112112 @Callable(i)
113-func voteForTaskProposal (taskId,voteValue) = if (!(canMemberVote(i)))
114- then throw("you can't vote")
115- else if ((getStringValue(this, (("tasks_" + taskId) + "_status")) != "proposed"))
116- then throw("voting is closed or not started")
117- else if (if ((voteValue != "like"))
118- then (voteValue != "dislike")
119- else false)
120- then throw("you need to vote like or dislike")
121- else {
122- let valueVoteInt = getVoteValue(voteValue)
123- let voteKey = ((("tasks_" + taskId) + "_voted_") + toString(i.caller))
124- let previousVote = tryGetInteger(voteKey)
125- if (!((previousVote == 0)))
126- then throw("you have already voted")
127- else {
128- let votingKey = (("tasks_" + taskId) + "_voting_state")
129- let votingState = tryGetInteger(votingKey)
130- let votesAmountKey = (("tasks_" + taskId) + "_voting_amount")
131- let votesAmountState = (tryGetInteger(votingKey) + 1)
132- let newVotingState = (votingState + valueVoteInt)
133- ScriptResult(WriteSet([DataEntry(votingKey, newVotingState), DataEntry(voteKey, valueVoteInt), DataEntry(votesAmountKey, votesAmountState)]), TransferSet([ScriptTransfer(i.caller, 500000, unit)]))
134- }
135- }
113+func initTaskVoting (taskId) = if (!(isGroupMember(i.caller)))
114+ then throw("grants working group access only")
115+ else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "voting_started")])
136116
137117
138118
139119 @Callable(i)
140-func finishTaskProposalVoting (taskId) = if ((QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / getDAOSize())))
120+func voteForTaskProposal (taskId,voteValueString) = if (!(canMemberVote(i)))
121+ then throw("you can't vote")
122+ else if (isVotingLive(taskId))
123+ then throw("voting is closed or not started")
124+ else {
125+ let voteValue = getVoteValue(voteValueString)
126+ let voteKey = ((("tasks_" + taskId) + "_voted_") + toString(i.caller))
127+ let previousVote = tryGetInteger(voteKey)
128+ if (!((previousVote == 0)))
129+ then throw("you have already voted")
130+ else {
131+ let votingKey = (("tasks_" + taskId) + "_voting_state")
132+ let votingState = tryGetInteger(votingKey)
133+ let votesAmountKey = (("tasks_" + taskId) + "_voting_amount")
134+ let votesAmountState = (tryGetInteger(votingKey) + 1)
135+ let newVotingState = (votingState + voteValue)
136+ WriteSet([DataEntry(votingKey, newVotingState), DataEntry(voteKey, voteValue), DataEntry(votesAmountKey, votesAmountState)])
137+ }
138+ }
139+
140+
141+
142+@Callable(i)
143+func finishTaskProposalVoting (taskId) = if (isQuorumAchieved(taskId))
141144 then throw((("more than " + toString(QUORUM)) + "% members have to vote before finishing the voting"))
142145 else if (!(isGroupMember(i.caller)))
143146 then throw("grants working group access only")
146149 let votingState = tryGetInteger(votingKey)
147150 if ((votingState > 0))
148151 then {
149- let votingResult = "ready_to_apply"
152+ let votingResult = "approved"
150153 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), votingResult)])
151154 }
152155 else {
158161
159162
160163 @Callable(i)
161-func applyForTask (taskId,teamName,link) = {
162- let status = tryGetString((("tasks_" + taskId) + "_status"))
163- if ((status != "ready_to_apply"))
164- then throw("This grant has not yet been approved")
165- else {
166- let listKey = (("tasks_" + taskId) + "_applicants")
167- let currentApplicantsList = tryGetString(listKey)
168- let applicantKey = drop(toString(i.caller), 10)
169- let newApplicantsList = ((currentApplicantsList + ";") + toString(i.caller))
170- WriteSet([DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_name"), teamName), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_link"), link), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_leader"), toString(i.caller)), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_id"), applicantKey), DataEntry(listKey, newApplicantsList)])
171- }
164+func startWork (taskId) = {
165+ let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
166+ if ((toString(i.caller) != getStringValue(this, (("tasks_" + taskId) + "_leader"))))
167+ then throw("team leader only")
168+ else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_started")])
172169 }
173170
174171
175172
176173 @Callable(i)
177-func voteForApplicant (taskId,teamIdentifier,voteValue) = if (!(canMemberVote(i)))
178- then throw("you can't vote")
174+func rejectTask (taskId) = if (!(isGroupMember(i.caller)))
175+ then throw("grants working group access only")
179176 else {
180- let voteHash = (drop(toString(i.caller), 10) + drop(teamIdentifier, 10))
181- let voteKey = ((("tasks_" + taskId) + "_vote_") + voteHash)
182- let vote = tryGetInteger(voteKey)
183- if ((vote != 0))
184- then throw("you have already voted on this team")
185- else {
186- let valueVoteInt = getVoteValue(voteValue)
187- let teamVotesAmountKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_votes")
188- let teamScoreKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_score")
189- let teamVotesAmount = (1 + tryGetInteger(teamVotesAmountKey))
190- let newTeamScore = (valueVoteInt + tryGetInteger(teamScoreKey))
191- WriteSet([DataEntry(voteKey, valueVoteInt), DataEntry(teamScoreKey, newTeamScore)])
192- }
177+ let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
178+ WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "rejected")])
193179 }
194-
195-
196-
197-@Callable(i)
198-func finishApplicantsVoting (taskId) = {
199- func isApplicantVotedEnough (aid,aid2) = {
200- let listKey = (("tasks_" + taskId) + "_applicants")
201- let applicantsList = split(getStringValue(this, listKey), ";")
202- let teamIdentifier = applicantsList[aid]
203- let teamVotesAmountKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_votes")
204- let teamVotesAmount = tryGetInteger(teamVotesAmountKey)
205- if ((teamVotesAmount > 0))
206- then 1
207- else throw(("not enough votes to make decision on " + teamIdentifier))
208- }
209-
210- func hasMoreVotes (aid,aid2) = {
211- let listKey = (("tasks_" + taskId) + "_applicants")
212- let applicantsList = split(getStringValue(this, listKey), ";")
213- let teamIdentifier = applicantsList[aid]
214- let teamVotesAmountKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_votes")
215- let teamVotesAmount = tryGetInteger(teamVotesAmountKey)
216- let team2Identifier = applicantsList[aid2]
217- let team2VotesAmountKey = (((("tasks_" + taskId) + "_app_") + team2Identifier) + "_votes")
218- let team2VotesAmount = tryGetInteger(team2VotesAmountKey)
219- if ((teamVotesAmount > team2VotesAmount))
220- then aid
221- else aid2
222- }
223-
224- if (!(isGroupMember(i.caller)))
225- then throw("grants working group access only")
226- else {
227- let listKeys = tryGetString((("tasks_" + taskId) + "_applicants"))
228- let applicantsList = split(listKeys, ";")
229- if ((size(applicantsList) == 0))
230- then throw("No one has yet responded to the grant")
231- else {
232- let chosenTeamId = {
233- let $list98869917 = [0, 1]
234- let $size98869917 = size($list98869917)
235- let $acc098869917 = 0
236- if (($size98869917 == 0))
237- then $acc098869917
238- else {
239- let $acc198869917 = hasMoreVotes($acc098869917, $list98869917[0])
240- if (($size98869917 == 1))
241- then $acc198869917
242- else {
243- let $acc298869917 = hasMoreVotes($acc198869917, $list98869917[1])
244- if (($size98869917 == 2))
245- then $acc298869917
246- else {
247- let $acc398869917 = hasMoreVotes($acc298869917, $list98869917[2])
248- throw("List size exceed 2")
249- }
250- }
251- }
252- }
253- let teamIdentifier = applicantsList[chosenTeamId]
254- WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "team_chosen"), DataEntry((("tasks_" + taskId) + "_performer"), teamIdentifier), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_process"), "can_begin")])
255- }
256- }
257- }
258-
259-
260-
261-@Callable(i)
262-func startWork (taskId) = {
263- let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
264- if ((toString(i.caller) != getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))))
265- then throw("team leader only")
266- else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_started"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_process"), "work_started")])
267- }
268180
269181
270182
274186 else {
275187 let rewardAmount = tryGetInteger((("tasks_" + taskId) + "_reward"))
276188 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
277- let teamAddress = getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))
278- ScriptResult(WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_finished"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_process"), "work_finished"), DataEntry((("tasks_" + taskId) + "_report"), reportLink)]), TransferSet([ScriptTransfer(addressFromStringValue(teamAddress), rewardAmount, unit)]))
189+ let teamAddress = getStringValue(this, (("tasks_" + taskId) + "_leader"))
190+ ScriptResult(WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_finished"), DataEntry((("tasks_" + taskId) + "_report"), reportLink)]), TransferSet([ScriptTransfer(addressFromStringValue(teamAddress), rewardAmount, unit)]))
279191 }
280-
281-
282-
283-@Callable(i)
284-func rejectTask (taskId) = if (!(isGroupMember(i.caller)))
285- then throw("grants working group access only")
286- else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "rejected")])
287192
288193
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let mainContract = addressFromStringValue("3MwRzi2BmqZZXWrCGCwcRQLsnic2Aod6zhS")
5-
64 let QUORUM = 1
75
86 func tryGetInteger (key) = {
97 let val = match getInteger(this, key) {
108 case b: Int =>
119 b
1210 case _ =>
1311 0
1412 }
1513 val
1614 }
1715
1816
1917 func tryGetString (key) = {
2018 let val = match getString(this, key) {
2119 case b: String =>
2220 b
2321 case _ =>
2422 ""
2523 }
2624 val
2725 }
2826
2927
30-func isOwner (address) = (address == this)
31-
28+let mainContract = addressFromStringValue("3MwRzi2BmqZZXWrCGCwcRQLsnic2Aod6zhS")
3229
3330 func getGroup () = {
3431 let val = match getString(mainContract, "working_group_members") {
3532 case b: String =>
3633 b
3734 case _ =>
3835 ""
3936 }
4037 val
4138 }
4239
4340
4441 func getMembers () = {
4542 let val = match getString(mainContract, "dao_members") {
4643 case b: String =>
4744 b
4845 case _ =>
4946 ""
5047 }
5148 val
5249 }
5350
5451
5552 func getDAOSize () = {
5653 let val = match getInteger(mainContract, "dao_size") {
5754 case b: Int =>
5855 b
5956 case _ =>
6057 0
6158 }
6259 val
6360 }
6461
6562
6663 func isGroupMember (a) = {
6764 let val = match getInteger(mainContract, (("working_group_member_" + toString(a)) + "_weight")) {
6865 case b: Int =>
6966 b
7067 case _ =>
7168 0
7269 }
7370 (val > 0)
7471 }
7572
7673
7774 func canMemberVote (i) = {
7875 let val = match getInteger(mainContract, (("dao_member_" + toString(i.caller)) + "_weight")) {
7976 case b: Int =>
8077 b
8178 case _ =>
8279 0
8380 }
8481 (val > 0)
8582 }
8683
8784
8885 func getVoteValue (s) = if ((s == "like"))
8986 then 1
9087 else if ((s == "dislike"))
9188 then -1
9289 else throw("you need to vote with 'like' or 'dislike' value")
9390
9491
92+func isVotingLive (taskId) = (getStringValue(this, (("tasks_" + taskId) + "_status")) == "voting_started")
93+
94+
95+func isQuorumAchieved (taskId) = (QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / getDAOSize()))
96+
97+
9598 @Callable(i)
96-func addTask (title,link) = if (!(isGroupMember(i.caller)))
97- then throw("grants working group access only")
98- else WriteSet([DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_title"), title), DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_link"), link)])
99+func addTask (title,link) = WriteSet([DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_title"), title), DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_link"), link), DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_leader"), toString(i.caller))])
99100
100101
101102
102103 @Callable(i)
103-func addReward (taskId) = if (!(isGroupMember(i.caller)))
104- then throw("grants working group access only")
105- else {
106- let reward = extract(i.payment).amount
107- WriteSet([DataEntry((("tasks_" + taskId) + "_reward"), reward), DataEntry((("tasks_" + taskId) + "_status"), "proposed")])
108- }
104+func addReward (taskId,reward) = if ((tryGetString((("tasks_" + taskId) + "_status")) != ""))
105+ then throw("voting was already started, so the reward amount cannot be changed")
106+ else if ((toString(i.caller) != tryGetString((("tasks_" + taskId) + "_leader"))))
107+ then throw("team leader only")
108+ else WriteSet([DataEntry((("tasks_" + taskId) + "_reward"), reward)])
109109
110110
111111
112112 @Callable(i)
113-func voteForTaskProposal (taskId,voteValue) = if (!(canMemberVote(i)))
114- then throw("you can't vote")
115- else if ((getStringValue(this, (("tasks_" + taskId) + "_status")) != "proposed"))
116- then throw("voting is closed or not started")
117- else if (if ((voteValue != "like"))
118- then (voteValue != "dislike")
119- else false)
120- then throw("you need to vote like or dislike")
121- else {
122- let valueVoteInt = getVoteValue(voteValue)
123- let voteKey = ((("tasks_" + taskId) + "_voted_") + toString(i.caller))
124- let previousVote = tryGetInteger(voteKey)
125- if (!((previousVote == 0)))
126- then throw("you have already voted")
127- else {
128- let votingKey = (("tasks_" + taskId) + "_voting_state")
129- let votingState = tryGetInteger(votingKey)
130- let votesAmountKey = (("tasks_" + taskId) + "_voting_amount")
131- let votesAmountState = (tryGetInteger(votingKey) + 1)
132- let newVotingState = (votingState + valueVoteInt)
133- ScriptResult(WriteSet([DataEntry(votingKey, newVotingState), DataEntry(voteKey, valueVoteInt), DataEntry(votesAmountKey, votesAmountState)]), TransferSet([ScriptTransfer(i.caller, 500000, unit)]))
134- }
135- }
113+func initTaskVoting (taskId) = if (!(isGroupMember(i.caller)))
114+ then throw("grants working group access only")
115+ else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "voting_started")])
136116
137117
138118
139119 @Callable(i)
140-func finishTaskProposalVoting (taskId) = if ((QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / getDAOSize())))
120+func voteForTaskProposal (taskId,voteValueString) = if (!(canMemberVote(i)))
121+ then throw("you can't vote")
122+ else if (isVotingLive(taskId))
123+ then throw("voting is closed or not started")
124+ else {
125+ let voteValue = getVoteValue(voteValueString)
126+ let voteKey = ((("tasks_" + taskId) + "_voted_") + toString(i.caller))
127+ let previousVote = tryGetInteger(voteKey)
128+ if (!((previousVote == 0)))
129+ then throw("you have already voted")
130+ else {
131+ let votingKey = (("tasks_" + taskId) + "_voting_state")
132+ let votingState = tryGetInteger(votingKey)
133+ let votesAmountKey = (("tasks_" + taskId) + "_voting_amount")
134+ let votesAmountState = (tryGetInteger(votingKey) + 1)
135+ let newVotingState = (votingState + voteValue)
136+ WriteSet([DataEntry(votingKey, newVotingState), DataEntry(voteKey, voteValue), DataEntry(votesAmountKey, votesAmountState)])
137+ }
138+ }
139+
140+
141+
142+@Callable(i)
143+func finishTaskProposalVoting (taskId) = if (isQuorumAchieved(taskId))
141144 then throw((("more than " + toString(QUORUM)) + "% members have to vote before finishing the voting"))
142145 else if (!(isGroupMember(i.caller)))
143146 then throw("grants working group access only")
144147 else {
145148 let votingKey = (("tasks_" + taskId) + "_voting_state")
146149 let votingState = tryGetInteger(votingKey)
147150 if ((votingState > 0))
148151 then {
149- let votingResult = "ready_to_apply"
152+ let votingResult = "approved"
150153 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), votingResult)])
151154 }
152155 else {
153156 let votingResult = "rejected"
154157 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), votingResult)])
155158 }
156159 }
157160
158161
159162
160163 @Callable(i)
161-func applyForTask (taskId,teamName,link) = {
162- let status = tryGetString((("tasks_" + taskId) + "_status"))
163- if ((status != "ready_to_apply"))
164- then throw("This grant has not yet been approved")
165- else {
166- let listKey = (("tasks_" + taskId) + "_applicants")
167- let currentApplicantsList = tryGetString(listKey)
168- let applicantKey = drop(toString(i.caller), 10)
169- let newApplicantsList = ((currentApplicantsList + ";") + toString(i.caller))
170- WriteSet([DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_name"), teamName), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_link"), link), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_leader"), toString(i.caller)), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_id"), applicantKey), DataEntry(listKey, newApplicantsList)])
171- }
164+func startWork (taskId) = {
165+ let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
166+ if ((toString(i.caller) != getStringValue(this, (("tasks_" + taskId) + "_leader"))))
167+ then throw("team leader only")
168+ else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_started")])
172169 }
173170
174171
175172
176173 @Callable(i)
177-func voteForApplicant (taskId,teamIdentifier,voteValue) = if (!(canMemberVote(i)))
178- then throw("you can't vote")
174+func rejectTask (taskId) = if (!(isGroupMember(i.caller)))
175+ then throw("grants working group access only")
179176 else {
180- let voteHash = (drop(toString(i.caller), 10) + drop(teamIdentifier, 10))
181- let voteKey = ((("tasks_" + taskId) + "_vote_") + voteHash)
182- let vote = tryGetInteger(voteKey)
183- if ((vote != 0))
184- then throw("you have already voted on this team")
185- else {
186- let valueVoteInt = getVoteValue(voteValue)
187- let teamVotesAmountKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_votes")
188- let teamScoreKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_score")
189- let teamVotesAmount = (1 + tryGetInteger(teamVotesAmountKey))
190- let newTeamScore = (valueVoteInt + tryGetInteger(teamScoreKey))
191- WriteSet([DataEntry(voteKey, valueVoteInt), DataEntry(teamScoreKey, newTeamScore)])
192- }
177+ let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
178+ WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "rejected")])
193179 }
194-
195-
196-
197-@Callable(i)
198-func finishApplicantsVoting (taskId) = {
199- func isApplicantVotedEnough (aid,aid2) = {
200- let listKey = (("tasks_" + taskId) + "_applicants")
201- let applicantsList = split(getStringValue(this, listKey), ";")
202- let teamIdentifier = applicantsList[aid]
203- let teamVotesAmountKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_votes")
204- let teamVotesAmount = tryGetInteger(teamVotesAmountKey)
205- if ((teamVotesAmount > 0))
206- then 1
207- else throw(("not enough votes to make decision on " + teamIdentifier))
208- }
209-
210- func hasMoreVotes (aid,aid2) = {
211- let listKey = (("tasks_" + taskId) + "_applicants")
212- let applicantsList = split(getStringValue(this, listKey), ";")
213- let teamIdentifier = applicantsList[aid]
214- let teamVotesAmountKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_votes")
215- let teamVotesAmount = tryGetInteger(teamVotesAmountKey)
216- let team2Identifier = applicantsList[aid2]
217- let team2VotesAmountKey = (((("tasks_" + taskId) + "_app_") + team2Identifier) + "_votes")
218- let team2VotesAmount = tryGetInteger(team2VotesAmountKey)
219- if ((teamVotesAmount > team2VotesAmount))
220- then aid
221- else aid2
222- }
223-
224- if (!(isGroupMember(i.caller)))
225- then throw("grants working group access only")
226- else {
227- let listKeys = tryGetString((("tasks_" + taskId) + "_applicants"))
228- let applicantsList = split(listKeys, ";")
229- if ((size(applicantsList) == 0))
230- then throw("No one has yet responded to the grant")
231- else {
232- let chosenTeamId = {
233- let $list98869917 = [0, 1]
234- let $size98869917 = size($list98869917)
235- let $acc098869917 = 0
236- if (($size98869917 == 0))
237- then $acc098869917
238- else {
239- let $acc198869917 = hasMoreVotes($acc098869917, $list98869917[0])
240- if (($size98869917 == 1))
241- then $acc198869917
242- else {
243- let $acc298869917 = hasMoreVotes($acc198869917, $list98869917[1])
244- if (($size98869917 == 2))
245- then $acc298869917
246- else {
247- let $acc398869917 = hasMoreVotes($acc298869917, $list98869917[2])
248- throw("List size exceed 2")
249- }
250- }
251- }
252- }
253- let teamIdentifier = applicantsList[chosenTeamId]
254- WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "team_chosen"), DataEntry((("tasks_" + taskId) + "_performer"), teamIdentifier), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_process"), "can_begin")])
255- }
256- }
257- }
258-
259-
260-
261-@Callable(i)
262-func startWork (taskId) = {
263- let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
264- if ((toString(i.caller) != getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))))
265- then throw("team leader only")
266- else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_started"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_process"), "work_started")])
267- }
268180
269181
270182
271183 @Callable(i)
272184 func acceptWorkResult (taskId,reportLink) = if (!(isGroupMember(i.caller)))
273185 then throw("grants working group access only")
274186 else {
275187 let rewardAmount = tryGetInteger((("tasks_" + taskId) + "_reward"))
276188 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
277- let teamAddress = getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))
278- ScriptResult(WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_finished"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_process"), "work_finished"), DataEntry((("tasks_" + taskId) + "_report"), reportLink)]), TransferSet([ScriptTransfer(addressFromStringValue(teamAddress), rewardAmount, unit)]))
189+ let teamAddress = getStringValue(this, (("tasks_" + taskId) + "_leader"))
190+ ScriptResult(WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_finished"), DataEntry((("tasks_" + taskId) + "_report"), reportLink)]), TransferSet([ScriptTransfer(addressFromStringValue(teamAddress), rewardAmount, unit)]))
279191 }
280-
281-
282-
283-@Callable(i)
284-func rejectTask (taskId) = if (!(isGroupMember(i.caller)))
285- then throw("grants working group access only")
286- else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "rejected")])
287192
288193

github/deemru/w8io/3ef1775 
55.14 ms