tx · 4qw8tjoqJaegrwwqaA516zMpnay7MycZwN4ABMFvt6wv 3NBYw8rxLmTvyEdsvaYor8nHG6GJ4NjB2Aw: -0.01000000 Waves 2023.02.06 14:29 [2437695] smart account 3NBYw8rxLmTvyEdsvaYor8nHG6GJ4NjB2Aw > SELF 0.00000000 Waves
{ "type": 13, "id": "4qw8tjoqJaegrwwqaA516zMpnay7MycZwN4ABMFvt6wv", "fee": 1000000, "feeAssetId": null, "timestamp": 1675683088641, "version": 2, "chainId": 84, "sender": "3NBYw8rxLmTvyEdsvaYor8nHG6GJ4NjB2Aw", "senderPublicKey": "4NDsd3dGKXuKLCoSbYvcWCX276K9ShP75cs9HTBMLJEN", "proofs": [ "3EqNur8dCRPVa41raiiWHfT8xoSBwCxKjrHwawmyh3Kkoo3uHne7YkwmmrL3d7PG2pQ1GrRgjdyd7cYyZ13kfEpm" ], "script": "base64:BgIqCAISABIJCgcICAgICAgIEgQKAggIEgMKAQgSBAoCCAgSAwoBCBIDCgEIDwAMbWFpbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBAiMzTjk3aWFjUmFwYktRTXdEeG9iY3dBdk5rOFdTYjNUUHdqeAAGUVVPUlVNAB4BDXRyeUdldEludGVnZXIBA2tleQQDdmFsBAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAUDdmFsAQx0cnlHZXRTdHJpbmcBA2tleQQDdmFsBAckbWF0Y2gwCQCdCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWIFByRtYXRjaDAFAWICAAUDdmFsAQdpc093bmVyAQdhZGRyZXNzCQAAAgUHYWRkcmVzcwUEdGhpcwEIZ2V0R3JvdXAABAN2YWwEByRtYXRjaDAJAJ0IAgUMbWFpbkNvbnRyYWN0AhV3b3JraW5nX2dyb3VwX21lbWJlcnMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFiBQckbWF0Y2gwBQFiAgAFA3ZhbAEKZ2V0TWVtYmVycwAEA3ZhbAQHJG1hdGNoMAkAnQgCBQxtYWluQ29udHJhY3QCC2Rhb19tZW1iZXJzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYgUHJG1hdGNoMAUBYgIABQN2YWwBCmdldERBT1NpemUABAN2YWwEByRtYXRjaDAJAJoIAgUMbWFpbkNvbnRyYWN0AghkYW9fc2l6ZQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAUDdmFsAQ1pc0dyb3VwTWVtYmVyAQFhBAN2YWwEByRtYXRjaDAJAJoIAgUMbWFpbkNvbnRyYWN0CQCsAgIJAKwCAgIVd29ya2luZ19ncm91cF9tZW1iZXJfCQClCAEFAWECB193ZWlnaHQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAAJAGYCBQN2YWwAAAENY2FuTWVtYmVyVm90ZQEHYWRkcmVzcwQDdmFsBAckbWF0Y2gwCQCaCAIFDG1haW5Db250cmFjdAkArAICCQCsAgICC2Rhb19tZW1iZXJfCQClCAEFB2FkZHJlc3MCB193ZWlnaHQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAAJAGYCBQN2YWwAAAEMZ2V0Vm90ZVZhbHVlAQFzAwkAAAIFAXMCBGxpa2UAAQMJAAACBQFzAgdkaXNsaWtlAP///////////wEJAAIBAi95b3UgbmVlZCB0byB2b3RlIHdpdGggJ2xpa2UnIG9yICdkaXNsaWtlJyB2YWx1ZQERYWRkVGFza0NvbmRpdGlvbnMBB2FkZHJlc3MDCQEBIQEJAQ1pc0dyb3VwTWVtYmVyAQUHYWRkcmVzcwkAAgECIGdyYW50cyB3b3JraW5nIGdyb3VwIGFjY2VzcyBvbmx5BgETYWRkUmV3YXJkQ29uZGl0aW9ucwIHYWRkcmVzcwZ0YXNrSWQDCQEBIQEJAQ1pc0dyb3VwTWVtYmVyAQUHYWRkcmVzcwkAAgECIGdyYW50cyB3b3JraW5nIGdyb3VwIGFjY2VzcyBvbmx5AwkBAiE9AgkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICAgZ0YXNrc18FBnRhc2tJZAIHX3N0YXR1cwIACQACAQIPZ3JhbnQgaXNuYHQgbmV3BgEddm90ZUZvclRhc2tQcm9wb3NhbENvbmRpdGlvbnMCB2FkZHJlc3MGdGFza0lkAwkBASEBCQENY2FuTWVtYmVyVm90ZQEFB2FkZHJlc3MJAAIBAg55b3UgY2FuJ3Qgdm90ZQMJAQIhPQIJAQx0cnlHZXRTdHJpbmcBCQCsAgIJAKwCAgIGdGFza3NfBQZ0YXNrSWQCB19zdGF0dXMCCHByb3Bvc2VkCQACAQIfdm90aW5nIGlzIGNsb3NlZCBvciBub3Qgc3RhcnRlZAMJAQIhPQIJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgIGdGFza3NfBQZ0YXNrSWQCB192b3RlZF8JAKUIAQUHYWRkcmVzcwAACQACAQIWeW91IGhhdmUgYWxyZWFkeSB2b3RlZAYBImZpbmlzaFRhc2tQcm9wb3NhbFZvdGluZ0NvbmRpdGlvbnMCB2FkZHJlc3MGdGFza0lkAwkBASEBCQENaXNHcm91cE1lbWJlcgEFB2FkZHJlc3MJAAIBAiBncmFudHMgd29ya2luZyBncm91cCBhY2Nlc3Mgb25seQMJAQIhPQIJAQx0cnlHZXRTdHJpbmcBCQCsAgIJAKwCAgIGdGFza3NfBQZ0YXNrSWQCB19zdGF0dXMCCHByb3Bvc2VkCQACAQIUdm90aW5nIGlzIG5vdCBhY3RpdmUDCQBmAgUGUVVPUlVNCQBpAgkAaAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICBnRhc2tzXwUGdGFza0lkAg5fdm90aW5nX2Ftb3VudABkCQEKZ2V0REFPU2l6ZQAJAAIBCQCsAgIJAKwCAgIKbW9yZSB0aGFuIAkApAMBBQZRVU9SVU0CMiUgbWVtYmVycyBoYXZlIHRvIHZvdGUgYmVmb3JlIGZpbmlzaGluZyB0aGUgdm90aW5nBgcBaQEMaW5pdENvbnRyYWN0AAkAzAgCCQELU3RyaW5nRW50cnkCAh5kYXRhX3Byb3ZpZGVyX2Rlc2NyaXB0aW9uXzxlbj4CFVdhdmVzIEFzc29jaWF0aW9uIERBTwkAzAgCCQELU3RyaW5nRW50cnkCAhNkYXRhX3Byb3ZpZGVyX2VtYWlsAhtncmFudHNAd2F2ZXNhc3NvY2lhdGlvbi5vcmcJAMwIAgkBC1N0cmluZ0VudHJ5AgIXZGF0YV9wcm92aWRlcl9sYW5nX2xpc3QCAmVuCQDMCAIJAQtTdHJpbmdFbnRyeQICEmRhdGFfcHJvdmlkZXJfbGluawIgaHR0cHM6Ly9kYW8ud2F2ZXNhc3NvY2lhdGlvbi5vcmcJAMwIAgkBC1N0cmluZ0VudHJ5AgISZGF0YV9wcm92aWRlcl9uYW1lAhVXYXZlcyBBc3NvY2lhdGlvbiBEQU8JAMwIAgkBDEludGVnZXJFbnRyeQICFWRhdGFfcHJvdmlkZXJfdmVyc2lvbgAACQDMCAIJAQxCb29sZWFuRW50cnkCAgZpbml0ZWQGBQNuaWwBaQELYWRkUHJvcG9zYWwHB3Rva2VuSWQLZGVzY3JpcHRpb24FZW1haWwEbGluawRsb2dvBnRpY2tlcgRoYXNoAwkBEWFkZFRhc2tDb25kaXRpb25zAQgFAWkGY2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAhJkZXNjcmlwdGlvbl88ZW4+XzwFB3Rva2VuSWQCAT4FC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgdlbWFpbF88BQd0b2tlbklkAgE+BQVlbWFpbAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGbG9nb188BQd0b2tlbklkAgE+BQRsb2dvCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgh0aWNrZXJfPAUHdG9rZW5JZAIBPgUGdGlja2VyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZsaW5rXzwFB3Rva2VuSWQCAT4FBGxpbmsJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBnRhc2tzXwUHdG9rZW5JZAIFX2hhc2gFBGhhc2gJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgl2ZXJzaW9uXzwFB3Rva2VuSWQCAT4AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICCHN0YXR1c188BQd0b2tlbklkAgE+AAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBnRhc2tzXwUHdG9rZW5JZAIHX3N0YXR1cwIIcHJvcG9zZWQFA25pbAkAAgECFWNoZWNrcyBhcmUgbm90IHBhc3NlZAFpAQlyZXNldEhhc2gCBnRhc2tJZARoYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZ0YXNrc18FBnRhc2tJZAIFX2hhc2gFBGhhc2gFA25pbAFpAQhoaWRlVGFzawEGdGFza0lkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZ0YXNrc18FBnRhc2tJZAIHX3N0YXR1cwIEaGlkZQUDbmlsAWkBE3ZvdGVGb3JUYXNrUHJvcG9zYWwCBnRhc2tJZAl2b3RlVmFsdWUDCQEddm90ZUZvclRhc2tQcm9wb3NhbENvbmRpdGlvbnMCCAUBaQZjYWxsZXIFBnRhc2tJZAQHdm90ZUtleQkArAICCQCsAgIJAKwCAgIGdGFza3NfBQZ0YXNrSWQCB192b3RlZF8JAKUIAQgFAWkGY2FsbGVyBAx2b3RlVmFsdWVJbnQJAQxnZXRWb3RlVmFsdWUBBQl2b3RlVmFsdWUECXZvdGluZ0tleQkArAICCQCsAgICBnRhc2tzXwUGdGFza0lkAg1fdm90aW5nX3N0YXRlBAt2b3RpbmdTdGF0ZQkBDXRyeUdldEludGVnZXIBBQl2b3RpbmdLZXkEDnZvdGVzQW1vdW50S2V5CQCsAgIJAKwCAgIGdGFza3NfBQZ0YXNrSWQCDl92b3RpbmdfYW1vdW50BBB2b3Rlc0Ftb3VudFN0YXRlCQBkAgkBDXRyeUdldEludGVnZXIBBQ52b3Rlc0Ftb3VudEtleQABBA5uZXdWb3RpbmdTdGF0ZQkAZAIFC3ZvdGluZ1N0YXRlBQx2b3RlVmFsdWVJbnQJAMwIAgkBDEludGVnZXJFbnRyeQIFCXZvdGluZ0tleQUObmV3Vm90aW5nU3RhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFB3ZvdGVLZXkFDHZvdGVWYWx1ZUludAkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdm90ZXNBbW91bnRLZXkFEHZvdGVzQW1vdW50U3RhdGUFA25pbAkAAgECFWNoZWNrcyBhcmUgbm90IHBhc3NlZAFpARhmaW5pc2hUYXNrUHJvcG9zYWxWb3RpbmcBBnRhc2tJZAMJASJmaW5pc2hUYXNrUHJvcG9zYWxWb3RpbmdDb25kaXRpb25zAggFAWkGY2FsbGVyBQZ0YXNrSWQECXZvdGluZ0tleQkArAICCQCsAgICBnRhc2tzXwUGdGFza0lkAg1fdm90aW5nX3N0YXRlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZ0YXNrc18FBnRhc2tJZAIHX3N0YXR1cwMJAGYCCQENdHJ5R2V0SW50ZWdlcgEFCXZvdGluZ0tleQAAAghhcHByb3ZlZAIIcmVqZWN0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAghzdGF0dXNfPAUGdGFza0lkAgE+AwkAZgIJAQ10cnlHZXRJbnRlZ2VyAQUJdm90aW5nS2V5AAAAAgAABQNuaWwJAAIBAhVjaGVja3MgYXJlIG5vdCBwYXNzZWQBaQEKcmVqZWN0VGFzawEGdGFza0lkAwkBDWlzR3JvdXBNZW1iZXIBCAUBaQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBnRhc2tzXwUGdGFza0lkAgdfc3RhdHVzAghyZWplY3RlZAUDbmlsCQACAQIgZ3JhbnRzIHdvcmtpbmcgZ3JvdXAgYWNjZXNzIG9ubHkApaHyWA==", "height": 2437695, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4QQS8K1rJGtzaZbHznVwyV5redYku5y5mLbW722jpScC Next: AoVZ8LDStQZLbxfqXhSRKaEpDWwbvqDZCegR2MTtmd86 Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let mainContract = addressFromStringValue("3N97iacRapbKQMwDxobcwAvNk8WSb3TPwjx") | |
5 | + | ||
6 | + | let QUORUM = 30 | |
7 | + | ||
4 | 8 | func tryGetInteger (key) = { | |
5 | 9 | let val = match getInteger(this, key) { | |
6 | 10 | case b: Int => | |
27 | 31 | ||
28 | 32 | ||
29 | 33 | func getGroup () = { | |
30 | - | let val = match getString( | |
34 | + | let val = match getString(mainContract, "working_group_members") { | |
31 | 35 | case b: String => | |
32 | 36 | b | |
33 | 37 | case _ => | |
38 | 42 | ||
39 | 43 | ||
40 | 44 | func getMembers () = { | |
41 | - | let val = match getString( | |
45 | + | let val = match getString(mainContract, "dao_members") { | |
42 | 46 | case b: String => | |
43 | 47 | b | |
44 | 48 | case _ => | |
48 | 52 | } | |
49 | 53 | ||
50 | 54 | ||
51 | - | func isGroupMember (a) = (tryGetInteger((("working_group_member_" + toString(a)) + "_weight")) > 0) | |
55 | + | func getDAOSize () = { | |
56 | + | let val = match getInteger(mainContract, "dao_size") { | |
57 | + | case b: Int => | |
58 | + | b | |
59 | + | case _ => | |
60 | + | 0 | |
61 | + | } | |
62 | + | val | |
63 | + | } | |
52 | 64 | ||
53 | 65 | ||
54 | - | func canMemberVote (i) = (tryGetInteger((("dao_member_" + toString(i.caller)) + "_weight")) > 0) | |
66 | + | func isGroupMember (a) = { | |
67 | + | let val = match getInteger(mainContract, (("working_group_member_" + toString(a)) + "_weight")) { | |
68 | + | case b: Int => | |
69 | + | b | |
70 | + | case _ => | |
71 | + | 0 | |
72 | + | } | |
73 | + | (val > 0) | |
74 | + | } | |
75 | + | ||
76 | + | ||
77 | + | func canMemberVote (address) = { | |
78 | + | let val = match getInteger(mainContract, (("dao_member_" + toString(address)) + "_weight")) { | |
79 | + | case b: Int => | |
80 | + | b | |
81 | + | case _ => | |
82 | + | 0 | |
83 | + | } | |
84 | + | (val > 0) | |
85 | + | } | |
86 | + | ||
87 | + | ||
88 | + | func getVoteValue (s) = if ((s == "like")) | |
89 | + | then 1 | |
90 | + | else if ((s == "dislike")) | |
91 | + | then -1 | |
92 | + | else throw("you need to vote with 'like' or 'dislike' value") | |
93 | + | ||
94 | + | ||
95 | + | func addTaskConditions (address) = if (!(isGroupMember(address))) | |
96 | + | then throw("grants working group access only") | |
97 | + | else true | |
98 | + | ||
99 | + | ||
100 | + | func addRewardConditions (address,taskId) = if (!(isGroupMember(address))) | |
101 | + | then throw("grants working group access only") | |
102 | + | else if ((tryGetString((("tasks_" + taskId) + "_status")) != "")) | |
103 | + | then throw("grant isn`t new") | |
104 | + | else true | |
105 | + | ||
106 | + | ||
107 | + | func voteForTaskProposalConditions (address,taskId) = if (!(canMemberVote(address))) | |
108 | + | then throw("you can't vote") | |
109 | + | else if ((tryGetString((("tasks_" + taskId) + "_status")) != "proposed")) | |
110 | + | then throw("voting is closed or not started") | |
111 | + | else if ((tryGetInteger(((("tasks_" + taskId) + "_voted_") + toString(address))) != 0)) | |
112 | + | then throw("you have already voted") | |
113 | + | else true | |
114 | + | ||
115 | + | ||
116 | + | func finishTaskProposalVotingConditions (address,taskId) = if (!(isGroupMember(address))) | |
117 | + | then throw("grants working group access only") | |
118 | + | else if ((tryGetString((("tasks_" + taskId) + "_status")) != "proposed")) | |
119 | + | then throw("voting is not active") | |
120 | + | else if ((QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / getDAOSize()))) | |
121 | + | then throw((("more than " + toString(QUORUM)) + "% members have to vote before finishing the voting")) | |
122 | + | else true | |
55 | 123 | ||
56 | 124 | ||
57 | 125 | @Callable(i) | |
58 | - | func addDAOMember (memberAddress) = if (!(isOwner(i.caller))) | |
59 | - | then throw("access only to the DAO owner") | |
60 | - | else if ((tryGetInteger((("dao_member_" + memberAddress) + "_weight")) == 1)) | |
61 | - | then throw("This user already exists") | |
62 | - | else { | |
63 | - | let group = getMembers() | |
64 | - | let newGroup = ((group + ";") + memberAddress) | |
65 | - | let groupSize = tryGetInteger("dao_size") | |
66 | - | let newGroupSize = (groupSize + 1) | |
67 | - | [StringEntry("dao_members", newGroup), IntegerEntry("dao_size", newGroupSize), IntegerEntry((("dao_member_" + memberAddress) + "_weight"), 1)] | |
68 | - | } | |
126 | + | func initContract () = [StringEntry("data_provider_description_<en>", "Waves Association DAO"), StringEntry("data_provider_email", "[email protected]"), StringEntry("data_provider_lang_list", "en"), StringEntry("data_provider_link", "https://dao.wavesassociation.org"), StringEntry("data_provider_name", "Waves Association DAO"), IntegerEntry("data_provider_version", 0), BooleanEntry("inited", true)] | |
69 | 127 | ||
70 | 128 | ||
71 | 129 | ||
72 | 130 | @Callable(i) | |
73 | - | func addGroupMember (memberAddress) = if (!(isOwner(i.caller))) | |
74 | - | then throw("access only to the DAO owner") | |
75 | - | else if ((tryGetInteger((("working_group_member_" + memberAddress) + "_weight")) == 1)) | |
76 | - | then throw("This user already exists") | |
77 | - | else { | |
78 | - | let group = getGroup() | |
79 | - | let newGroup = ((group + ";") + memberAddress) | |
80 | - | let groupSize = tryGetInteger("working_group_size") | |
81 | - | let newGroupSize = (groupSize + 1) | |
82 | - | [StringEntry("working_group_members", newGroup), IntegerEntry("working_group_size", newGroupSize), IntegerEntry((("working_group_member_" + memberAddress) + "_weight"), 1)] | |
83 | - | } | |
131 | + | func addProposal (tokenId,description,email,link,logo,ticker,hash) = if (addTaskConditions(i.caller)) | |
132 | + | then [StringEntry((("description_<en>_<" + tokenId) + ">"), description), StringEntry((("email_<" + tokenId) + ">"), email), StringEntry((("logo_<" + tokenId) + ">"), logo), StringEntry((("ticker_<" + tokenId) + ">"), ticker), StringEntry((("link_<" + tokenId) + ">"), link), StringEntry((("tasks_" + tokenId) + "_hash"), hash), IntegerEntry((("version_<" + tokenId) + ">"), 0), IntegerEntry((("status_<" + tokenId) + ">"), 0), StringEntry((("tasks_" + tokenId) + "_status"), "proposed")] | |
133 | + | else throw("checks are not passed") | |
84 | 134 | ||
85 | 135 | ||
86 | - | @Verifier(tx) | |
87 | - | func standardVerifier () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
136 | + | ||
137 | + | @Callable(i) | |
138 | + | func resetHash (taskId,hash) = [StringEntry((("tasks_" + taskId) + "_hash"), hash)] | |
139 | + | ||
140 | + | ||
141 | + | ||
142 | + | @Callable(i) | |
143 | + | func hideTask (taskId) = [StringEntry((("tasks_" + taskId) + "_status"), "hide")] | |
144 | + | ||
145 | + | ||
146 | + | ||
147 | + | @Callable(i) | |
148 | + | func voteForTaskProposal (taskId,voteValue) = if (voteForTaskProposalConditions(i.caller, taskId)) | |
149 | + | then { | |
150 | + | let voteKey = ((("tasks_" + taskId) + "_voted_") + toString(i.caller)) | |
151 | + | let voteValueInt = getVoteValue(voteValue) | |
152 | + | let votingKey = (("tasks_" + taskId) + "_voting_state") | |
153 | + | let votingState = tryGetInteger(votingKey) | |
154 | + | let votesAmountKey = (("tasks_" + taskId) + "_voting_amount") | |
155 | + | let votesAmountState = (tryGetInteger(votesAmountKey) + 1) | |
156 | + | let newVotingState = (votingState + voteValueInt) | |
157 | + | [IntegerEntry(votingKey, newVotingState), IntegerEntry(voteKey, voteValueInt), IntegerEntry(votesAmountKey, votesAmountState)] | |
158 | + | } | |
159 | + | else throw("checks are not passed") | |
160 | + | ||
161 | + | ||
162 | + | ||
163 | + | @Callable(i) | |
164 | + | func finishTaskProposalVoting (taskId) = if (finishTaskProposalVotingConditions(i.caller, taskId)) | |
165 | + | then { | |
166 | + | let votingKey = (("tasks_" + taskId) + "_voting_state") | |
167 | + | [StringEntry((("tasks_" + taskId) + "_status"), if ((tryGetInteger(votingKey) > 0)) | |
168 | + | then "approved" | |
169 | + | else "rejected"), IntegerEntry((("status_<" + taskId) + ">"), if ((tryGetInteger(votingKey) > 0)) | |
170 | + | then 2 | |
171 | + | else 0)] | |
172 | + | } | |
173 | + | else throw("checks are not passed") | |
174 | + | ||
175 | + | ||
176 | + | ||
177 | + | @Callable(i) | |
178 | + | func rejectTask (taskId) = if (isGroupMember(i.caller)) | |
179 | + | then [StringEntry((("tasks_" + taskId) + "_status"), "rejected")] | |
180 | + | else throw("grants working group access only") | |
181 | + | ||
88 | 182 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let mainContract = addressFromStringValue("3N97iacRapbKQMwDxobcwAvNk8WSb3TPwjx") | |
5 | + | ||
6 | + | let QUORUM = 30 | |
7 | + | ||
4 | 8 | func tryGetInteger (key) = { | |
5 | 9 | let val = match getInteger(this, key) { | |
6 | 10 | case b: Int => | |
7 | 11 | b | |
8 | 12 | case _ => | |
9 | 13 | 0 | |
10 | 14 | } | |
11 | 15 | val | |
12 | 16 | } | |
13 | 17 | ||
14 | 18 | ||
15 | 19 | func tryGetString (key) = { | |
16 | 20 | let val = match getString(this, key) { | |
17 | 21 | case b: String => | |
18 | 22 | b | |
19 | 23 | case _ => | |
20 | 24 | "" | |
21 | 25 | } | |
22 | 26 | val | |
23 | 27 | } | |
24 | 28 | ||
25 | 29 | ||
26 | 30 | func isOwner (address) = (address == this) | |
27 | 31 | ||
28 | 32 | ||
29 | 33 | func getGroup () = { | |
30 | - | let val = match getString( | |
34 | + | let val = match getString(mainContract, "working_group_members") { | |
31 | 35 | case b: String => | |
32 | 36 | b | |
33 | 37 | case _ => | |
34 | 38 | "" | |
35 | 39 | } | |
36 | 40 | val | |
37 | 41 | } | |
38 | 42 | ||
39 | 43 | ||
40 | 44 | func getMembers () = { | |
41 | - | let val = match getString( | |
45 | + | let val = match getString(mainContract, "dao_members") { | |
42 | 46 | case b: String => | |
43 | 47 | b | |
44 | 48 | case _ => | |
45 | 49 | "" | |
46 | 50 | } | |
47 | 51 | val | |
48 | 52 | } | |
49 | 53 | ||
50 | 54 | ||
51 | - | func isGroupMember (a) = (tryGetInteger((("working_group_member_" + toString(a)) + "_weight")) > 0) | |
55 | + | func getDAOSize () = { | |
56 | + | let val = match getInteger(mainContract, "dao_size") { | |
57 | + | case b: Int => | |
58 | + | b | |
59 | + | case _ => | |
60 | + | 0 | |
61 | + | } | |
62 | + | val | |
63 | + | } | |
52 | 64 | ||
53 | 65 | ||
54 | - | func canMemberVote (i) = (tryGetInteger((("dao_member_" + toString(i.caller)) + "_weight")) > 0) | |
66 | + | func isGroupMember (a) = { | |
67 | + | let val = match getInteger(mainContract, (("working_group_member_" + toString(a)) + "_weight")) { | |
68 | + | case b: Int => | |
69 | + | b | |
70 | + | case _ => | |
71 | + | 0 | |
72 | + | } | |
73 | + | (val > 0) | |
74 | + | } | |
75 | + | ||
76 | + | ||
77 | + | func canMemberVote (address) = { | |
78 | + | let val = match getInteger(mainContract, (("dao_member_" + toString(address)) + "_weight")) { | |
79 | + | case b: Int => | |
80 | + | b | |
81 | + | case _ => | |
82 | + | 0 | |
83 | + | } | |
84 | + | (val > 0) | |
85 | + | } | |
86 | + | ||
87 | + | ||
88 | + | func getVoteValue (s) = if ((s == "like")) | |
89 | + | then 1 | |
90 | + | else if ((s == "dislike")) | |
91 | + | then -1 | |
92 | + | else throw("you need to vote with 'like' or 'dislike' value") | |
93 | + | ||
94 | + | ||
95 | + | func addTaskConditions (address) = if (!(isGroupMember(address))) | |
96 | + | then throw("grants working group access only") | |
97 | + | else true | |
98 | + | ||
99 | + | ||
100 | + | func addRewardConditions (address,taskId) = if (!(isGroupMember(address))) | |
101 | + | then throw("grants working group access only") | |
102 | + | else if ((tryGetString((("tasks_" + taskId) + "_status")) != "")) | |
103 | + | then throw("grant isn`t new") | |
104 | + | else true | |
105 | + | ||
106 | + | ||
107 | + | func voteForTaskProposalConditions (address,taskId) = if (!(canMemberVote(address))) | |
108 | + | then throw("you can't vote") | |
109 | + | else if ((tryGetString((("tasks_" + taskId) + "_status")) != "proposed")) | |
110 | + | then throw("voting is closed or not started") | |
111 | + | else if ((tryGetInteger(((("tasks_" + taskId) + "_voted_") + toString(address))) != 0)) | |
112 | + | then throw("you have already voted") | |
113 | + | else true | |
114 | + | ||
115 | + | ||
116 | + | func finishTaskProposalVotingConditions (address,taskId) = if (!(isGroupMember(address))) | |
117 | + | then throw("grants working group access only") | |
118 | + | else if ((tryGetString((("tasks_" + taskId) + "_status")) != "proposed")) | |
119 | + | then throw("voting is not active") | |
120 | + | else if ((QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / getDAOSize()))) | |
121 | + | then throw((("more than " + toString(QUORUM)) + "% members have to vote before finishing the voting")) | |
122 | + | else true | |
55 | 123 | ||
56 | 124 | ||
57 | 125 | @Callable(i) | |
58 | - | func addDAOMember (memberAddress) = if (!(isOwner(i.caller))) | |
59 | - | then throw("access only to the DAO owner") | |
60 | - | else if ((tryGetInteger((("dao_member_" + memberAddress) + "_weight")) == 1)) | |
61 | - | then throw("This user already exists") | |
62 | - | else { | |
63 | - | let group = getMembers() | |
64 | - | let newGroup = ((group + ";") + memberAddress) | |
65 | - | let groupSize = tryGetInteger("dao_size") | |
66 | - | let newGroupSize = (groupSize + 1) | |
67 | - | [StringEntry("dao_members", newGroup), IntegerEntry("dao_size", newGroupSize), IntegerEntry((("dao_member_" + memberAddress) + "_weight"), 1)] | |
68 | - | } | |
126 | + | func initContract () = [StringEntry("data_provider_description_<en>", "Waves Association DAO"), StringEntry("data_provider_email", "[email protected]"), StringEntry("data_provider_lang_list", "en"), StringEntry("data_provider_link", "https://dao.wavesassociation.org"), StringEntry("data_provider_name", "Waves Association DAO"), IntegerEntry("data_provider_version", 0), BooleanEntry("inited", true)] | |
69 | 127 | ||
70 | 128 | ||
71 | 129 | ||
72 | 130 | @Callable(i) | |
73 | - | func addGroupMember (memberAddress) = if (!(isOwner(i.caller))) | |
74 | - | then throw("access only to the DAO owner") | |
75 | - | else if ((tryGetInteger((("working_group_member_" + memberAddress) + "_weight")) == 1)) | |
76 | - | then throw("This user already exists") | |
77 | - | else { | |
78 | - | let group = getGroup() | |
79 | - | let newGroup = ((group + ";") + memberAddress) | |
80 | - | let groupSize = tryGetInteger("working_group_size") | |
81 | - | let newGroupSize = (groupSize + 1) | |
82 | - | [StringEntry("working_group_members", newGroup), IntegerEntry("working_group_size", newGroupSize), IntegerEntry((("working_group_member_" + memberAddress) + "_weight"), 1)] | |
83 | - | } | |
131 | + | func addProposal (tokenId,description,email,link,logo,ticker,hash) = if (addTaskConditions(i.caller)) | |
132 | + | then [StringEntry((("description_<en>_<" + tokenId) + ">"), description), StringEntry((("email_<" + tokenId) + ">"), email), StringEntry((("logo_<" + tokenId) + ">"), logo), StringEntry((("ticker_<" + tokenId) + ">"), ticker), StringEntry((("link_<" + tokenId) + ">"), link), StringEntry((("tasks_" + tokenId) + "_hash"), hash), IntegerEntry((("version_<" + tokenId) + ">"), 0), IntegerEntry((("status_<" + tokenId) + ">"), 0), StringEntry((("tasks_" + tokenId) + "_status"), "proposed")] | |
133 | + | else throw("checks are not passed") | |
84 | 134 | ||
85 | 135 | ||
86 | - | @Verifier(tx) | |
87 | - | func standardVerifier () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
136 | + | ||
137 | + | @Callable(i) | |
138 | + | func resetHash (taskId,hash) = [StringEntry((("tasks_" + taskId) + "_hash"), hash)] | |
139 | + | ||
140 | + | ||
141 | + | ||
142 | + | @Callable(i) | |
143 | + | func hideTask (taskId) = [StringEntry((("tasks_" + taskId) + "_status"), "hide")] | |
144 | + | ||
145 | + | ||
146 | + | ||
147 | + | @Callable(i) | |
148 | + | func voteForTaskProposal (taskId,voteValue) = if (voteForTaskProposalConditions(i.caller, taskId)) | |
149 | + | then { | |
150 | + | let voteKey = ((("tasks_" + taskId) + "_voted_") + toString(i.caller)) | |
151 | + | let voteValueInt = getVoteValue(voteValue) | |
152 | + | let votingKey = (("tasks_" + taskId) + "_voting_state") | |
153 | + | let votingState = tryGetInteger(votingKey) | |
154 | + | let votesAmountKey = (("tasks_" + taskId) + "_voting_amount") | |
155 | + | let votesAmountState = (tryGetInteger(votesAmountKey) + 1) | |
156 | + | let newVotingState = (votingState + voteValueInt) | |
157 | + | [IntegerEntry(votingKey, newVotingState), IntegerEntry(voteKey, voteValueInt), IntegerEntry(votesAmountKey, votesAmountState)] | |
158 | + | } | |
159 | + | else throw("checks are not passed") | |
160 | + | ||
161 | + | ||
162 | + | ||
163 | + | @Callable(i) | |
164 | + | func finishTaskProposalVoting (taskId) = if (finishTaskProposalVotingConditions(i.caller, taskId)) | |
165 | + | then { | |
166 | + | let votingKey = (("tasks_" + taskId) + "_voting_state") | |
167 | + | [StringEntry((("tasks_" + taskId) + "_status"), if ((tryGetInteger(votingKey) > 0)) | |
168 | + | then "approved" | |
169 | + | else "rejected"), IntegerEntry((("status_<" + taskId) + ">"), if ((tryGetInteger(votingKey) > 0)) | |
170 | + | then 2 | |
171 | + | else 0)] | |
172 | + | } | |
173 | + | else throw("checks are not passed") | |
174 | + | ||
175 | + | ||
176 | + | ||
177 | + | @Callable(i) | |
178 | + | func rejectTask (taskId) = if (isGroupMember(i.caller)) | |
179 | + | then [StringEntry((("tasks_" + taskId) + "_status"), "rejected")] | |
180 | + | else throw("grants working group access only") | |
181 | + | ||
88 | 182 |
github/deemru/w8io/169f3d6 42.35 ms ◑