tx · G3DxqjJyMHncb1yePgDw9pZgMWQubQoCKaiF7DvrxEAV

3MtV1AQ8fEPk76tjKgvrufuMe5aA3q4TviQ:  -0.10000000 Waves

2020.12.22 18:34 [1320099] smart account 3MtV1AQ8fEPk76tjKgvrufuMe5aA3q4TviQ > SELF 0.00000000 Waves

{ "type": 13, "id": "G3DxqjJyMHncb1yePgDw9pZgMWQubQoCKaiF7DvrxEAV", "fee": 10000000, "feeAssetId": null, "timestamp": 1608651237352, "version": 2, "chainId": 84, "sender": "3MtV1AQ8fEPk76tjKgvrufuMe5aA3q4TviQ", "senderPublicKey": "3Fjao2FW1JXSPd5EkP7C3uerW18HYacYsaMYALFMGA6N", "proofs": [ "5A4uCGBDkt9V9wWnvFtjymfn6yUsJXAjZVhy7HBtYtDUW3PdJu46NWJCJ9nu31oTxMr7yVqvz9P3JcnEmqZUfJS" ], "script": "base64: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VmFsdWUCAAAAB2Rpc2xpa2UHCQAAAgAAAAECAAAAIHlvdSBuZWVkIHRvIHZvdGUgbGlrZSBvciBkaXNsaWtlBAAAAAx2YWx1ZVZvdGVJbnQJAQAAAAxnZXRWb3RlVmFsdWUAAAABBQAAAAl2b3RlVmFsdWUEAAAAB3ZvdGVLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAdfdm90ZWRfCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAMcHJldmlvdXNWb3RlCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEFAAAAB3ZvdGVLZXkDCQEAAAABIQAAAAEJAAAAAAAAAgUAAAAMcHJldmlvdXNWb3RlAAAAAAAAAAAACQAAAgAAAAECAAAAFnlvdSBoYXZlIGFscmVhZHkgdm90ZWQEAAAACXZvdGluZ0tleQkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAA1fdm90aW5nX3N0YXRlBAAAAAt2b3RpbmdTdGF0ZQkBAAAADXRyeUdldEludGVnZXIAAAABBQAAAAl2b3RpbmdLZXkEAAAADnZvdGVzQW1vdW50S2V5CQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAADl92b3RpbmdfYW1vdW50BAAAABB2b3Rlc0Ftb3VudFN0YXRlCQAAZAAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAAJdm90aW5nS2V5AAAAAAAAAAABBAAAAA5uZXdWb3RpbmdTdGF0ZQkAAGQAAAACBQAAAAt2b3RpbmdTdGF0ZQUAAAAMdmFsdWVWb3RlSW50CQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAJdm90aW5nS2V5BQAAAA5uZXdWb3RpbmdTdGF0ZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAHdm90ZUtleQUAAAAMdmFsdWVWb3RlSW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA52b3Rlc0Ftb3VudEtleQUAAAAQdm90ZXNBbW91bnRTdGF0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bnRpZmllcgIAAAAGX3ZvdGVzBAAAAAx0ZWFtU2NvcmVLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAABV9hcHBfBQAAAA50ZWFtSWRlbnRpZmllcgIAAAAGX3Njb3JlBAAAAA90ZWFtVm90ZXNBbW91bnQJAABkAAAAAgAAAAAAAAAAAQkBAAAADXRyeUdldEludGVnZXIAAAABBQAAABJ0ZWFtVm90ZXNBbW91bnRLZXkEAAAADG5ld1RlYW1TY29yZQkAAGQAAAACBQAAAAx2YWx1ZVZvdGVJbnQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAAMdGVhbVNjb3JlS2V5CQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAd2b3RlS2V5BQAAAAx2YWx1ZVZvdGVJbnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADHRlYW1TY29yZUtleQUAAAAMbmV3VGVhbVNjb3JlBQAAAANuaWwAAAABaQEAAAAWZmluaXNoQXBwbGljYW50c1ZvdGluZwAAAAEAAAAGdGFza0lkCgEAAAAWaXNBcHBsaWNhbnRWb3RlZEVub3VnaAAAAAIAAAADYWlkAAAABGFpZDIEAAAAB2xpc3RLZXkJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAALX2FwcGxpY2FudHMEAAAADmFwcGxpY2FudHNMaXN0CQAEtQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAAB2xpc3RLZXkCAAAAATsEAAAADnRlYW1JZGVudGlmaWVyCQABkQAAAAIFAAAADmFwcGxpY2FudHNMaXN0BQAAAANhaWQEAAAAEnRlYW1Wb3Rlc0Ftb3VudEtleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAFX2FwcF8FAAAADnRlYW1JZGVudGlmaWVyAgAAAAZfdm90ZXMEAAAAD3RlYW1Wb3Rlc0Ftb3VudAkBAAAADXRyeUdldEludGVnZXIAAAABBQAAABJ0ZWFtVm90ZXNBbW91bnRLZXkDCQAAZgAAAAIFAAAAD3RlYW1Wb3Rlc0Ftb3VudAAAAAAAAAAAAAAAAAAAAAAAAQkAAAIAAAABCQABLAAAAAICAAAAJW5vdCBlbm91Z2ggdm90ZXMgdG8gbWFrZSBkZWNpc2lvbiBvbiAFAAAADnRlYW1JZGVudGlmaWVyCgEAAAAMaGFzTW9yZVZvdGVzAAAAAgAAAANhaWQAAAAEYWlkMgQAAAAHbGlzdEtleQkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAtfYXBwbGljYW50cwQAAAAOYXBwbGljYW50c0xpc3QJAAS1AAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwUAAAAHbGlzdEtleQIAAAABOwQAAAAOdGVhbUlkZW50aWZpZXIJAAGRAAAAAgUAAAAOYXBwbGljYW50c0xpc3QFAAAAA2FpZAQAAAASdGVhbVZvdGVzQW1vdW50S2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAVfYXBwXwUAAAAOdGVhbUlkZW50aWZpZXICAAAABl92b3RlcwQAAAAPdGVhbVZvdGVzQW1vdW50CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEFAAAAEnRlYW1Wb3Rlc0Ftb3VudEtleQQAAAAPdGVhbTJJZGVudGlmaWVyCQABkQAAAAIFAAAADmFwcGxpY2FudHNMaXN0BQAAAARhaWQyBAAAABN0ZWFtMlZvdGVzQW1vdW50S2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAVfYXBwXwUAAAAPdGVhbTJJZGVudGlmaWVyAgAAAAZfdm90ZXMEAAAAEHRlYW0yVm90ZXNBbW91bnQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAATdGVhbTJWb3Rlc0Ftb3VudEtleQMJAABmAAAAAgUAAAAPdGVhbVZvdGVzQW1vdW50BQAAABB0ZWFtMlZvdGVzQW1vdW50BQAAAANhaWQFAAAABGFpZDIDCQEAAAABIQAAAAEJAQAAAA1pc0dyb3VwTWVtYmVy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", "height": 1320099, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2DjCYjtLkWwqKAr1SLb1wcDWkZxs5CHRXhMSE8iDw1nA Next: BffsLs7DkYdUZ3A3uKoQviWy4Y56ub2fKHQb2uK2qcSu Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let mainContract = addressFromStringValue("3MwRzi2BmqZZXWrCGCwcRQLsnic2Aod6zhS")
5+
46 let QUORUM = 1
57
68 func tryGetInteger (key) = {
2527 }
2628
2729
28-let mainContract = addressFromStringValue("3MwRzi2BmqZZXWrCGCwcRQLsnic2Aod6zhS")
30+func isOwner (address) = (address == this)
31+
2932
3033 func getGroup () = {
3134 let val = match getString(mainContract, "working_group_members") {
8992 else throw("you need to vote with 'like' or 'dislike' value")
9093
9194
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-
9895 @Callable(i)
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))])
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)])
10099
101100
102101
103102 @Callable(i)
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)])
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+ }
109109
110110
111111
112112 @Callable(i)
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")])
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+ }
116136
117137
118138
119139 @Callable(i)
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))
140+func finishTaskProposalVoting (taskId) = if ((QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / getDAOSize())))
144141 then throw((("more than " + toString(QUORUM)) + "% members have to vote before finishing the voting"))
145142 else if (!(isGroupMember(i.caller)))
146143 then throw("grants working group access only")
149146 let votingState = tryGetInteger(votingKey)
150147 if ((votingState > 0))
151148 then {
152- let votingResult = "approved"
149+ let votingResult = "ready_to_apply"
153150 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), votingResult)])
154151 }
155152 else {
161158
162159
163160 @Callable(i)
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")])
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+ }
169172 }
170173
171174
172175
173176 @Callable(i)
174-func rejectTask (taskId) = if (!(isGroupMember(i.caller)))
175- then throw("grants working group access only")
177+func voteForApplicant (taskId,teamIdentifier,voteValue) = if (!(canMemberVote(i)))
178+ then throw("you can't vote")
176179 else {
177- let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
178- WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "rejected")])
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+ }
179193 }
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+ }
180268
181269
182270
186274 else {
187275 let rewardAmount = tryGetInteger((("tasks_" + taskId) + "_reward"))
188276 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
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)]))
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)]))
191279 }
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")])
192287
193288
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let mainContract = addressFromStringValue("3MwRzi2BmqZZXWrCGCwcRQLsnic2Aod6zhS")
5+
46 let QUORUM = 1
57
68 func tryGetInteger (key) = {
79 let val = match getInteger(this, key) {
810 case b: Int =>
911 b
1012 case _ =>
1113 0
1214 }
1315 val
1416 }
1517
1618
1719 func tryGetString (key) = {
1820 let val = match getString(this, key) {
1921 case b: String =>
2022 b
2123 case _ =>
2224 ""
2325 }
2426 val
2527 }
2628
2729
28-let mainContract = addressFromStringValue("3MwRzi2BmqZZXWrCGCwcRQLsnic2Aod6zhS")
30+func isOwner (address) = (address == this)
31+
2932
3033 func getGroup () = {
3134 let val = match getString(mainContract, "working_group_members") {
3235 case b: String =>
3336 b
3437 case _ =>
3538 ""
3639 }
3740 val
3841 }
3942
4043
4144 func getMembers () = {
4245 let val = match getString(mainContract, "dao_members") {
4346 case b: String =>
4447 b
4548 case _ =>
4649 ""
4750 }
4851 val
4952 }
5053
5154
5255 func getDAOSize () = {
5356 let val = match getInteger(mainContract, "dao_size") {
5457 case b: Int =>
5558 b
5659 case _ =>
5760 0
5861 }
5962 val
6063 }
6164
6265
6366 func isGroupMember (a) = {
6467 let val = match getInteger(mainContract, (("working_group_member_" + toString(a)) + "_weight")) {
6568 case b: Int =>
6669 b
6770 case _ =>
6871 0
6972 }
7073 (val > 0)
7174 }
7275
7376
7477 func canMemberVote (i) = {
7578 let val = match getInteger(mainContract, (("dao_member_" + toString(i.caller)) + "_weight")) {
7679 case b: Int =>
7780 b
7881 case _ =>
7982 0
8083 }
8184 (val > 0)
8285 }
8386
8487
8588 func getVoteValue (s) = if ((s == "like"))
8689 then 1
8790 else if ((s == "dislike"))
8891 then -1
8992 else throw("you need to vote with 'like' or 'dislike' value")
9093
9194
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-
9895 @Callable(i)
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))])
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)])
10099
101100
102101
103102 @Callable(i)
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)])
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+ }
109109
110110
111111
112112 @Callable(i)
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")])
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+ }
116136
117137
118138
119139 @Callable(i)
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))
140+func finishTaskProposalVoting (taskId) = if ((QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / getDAOSize())))
144141 then throw((("more than " + toString(QUORUM)) + "% members have to vote before finishing the voting"))
145142 else if (!(isGroupMember(i.caller)))
146143 then throw("grants working group access only")
147144 else {
148145 let votingKey = (("tasks_" + taskId) + "_voting_state")
149146 let votingState = tryGetInteger(votingKey)
150147 if ((votingState > 0))
151148 then {
152- let votingResult = "approved"
149+ let votingResult = "ready_to_apply"
153150 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), votingResult)])
154151 }
155152 else {
156153 let votingResult = "rejected"
157154 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), votingResult)])
158155 }
159156 }
160157
161158
162159
163160 @Callable(i)
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")])
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+ }
169172 }
170173
171174
172175
173176 @Callable(i)
174-func rejectTask (taskId) = if (!(isGroupMember(i.caller)))
175- then throw("grants working group access only")
177+func voteForApplicant (taskId,teamIdentifier,voteValue) = if (!(canMemberVote(i)))
178+ then throw("you can't vote")
176179 else {
177- let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
178- WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "rejected")])
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+ }
179193 }
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+ }
180268
181269
182270
183271 @Callable(i)
184272 func acceptWorkResult (taskId,reportLink) = if (!(isGroupMember(i.caller)))
185273 then throw("grants working group access only")
186274 else {
187275 let rewardAmount = tryGetInteger((("tasks_" + taskId) + "_reward"))
188276 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
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)]))
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)]))
191279 }
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")])
192287
193288

github/deemru/w8io/3ef1775 
54.32 ms