tx · 5emvdrwk2gS89FZviYtx7QeioTCxpz5Ac2wSjfu2awbN

3Mr7Gv3PcrQcQ5yAzQz4Kq2XtgyqyQ9FKDR:  -0.01800000 Waves

2024.10.03 22:28 [3311091] smart account 3Mr7Gv3PcrQcQ5yAzQz4Kq2XtgyqyQ9FKDR > SELF 0.00000000 Waves

{ "type": 13, "id": "5emvdrwk2gS89FZviYtx7QeioTCxpz5Ac2wSjfu2awbN", "fee": 1800000, "feeAssetId": null, "timestamp": 1727983807143, "version": 2, "chainId": 84, "sender": "3Mr7Gv3PcrQcQ5yAzQz4Kq2XtgyqyQ9FKDR", "senderPublicKey": "DffnpNVrSTeeKWkDrVU27a3ZEMmCGTTBFfnD6fjzrJda", "proofs": [ "2H71PVTW5aw2Zx2AhqpH9Hud5YqUByVvpiGQK5MQpFK9R5QcpdWEMsi3JgtkQhhJexPhNHW3VNv1Xoo3kVWtxeXV" ], "script": "base64:AAIFAAAAAAAAACsIAhIHCgUICAgICBIFCgMICAgSAwoBCBIDCgEIEgMKAQgSAwoBCBIDCgEIAAAAOQEAAAAHdGhyb3dJZgAAAAIAAAAJY29uZGl0aW9uAAAABWVycm9yAwUAAAAJY29uZGl0aW9uCQAAAgAAAAEFAAAABWVycm9yBgEAAAAObm9uRW1wdHlTdHJpbmcAAAACAAAAAXMAAAADa2V5AwkAAGcAAAACAAAAAAAAAAAACQABMQAAAAEFAAAAAXMJAAACAAAAAQkAASwAAAACAgAAAA5lbXB0eSBzdHJpbmc6IAUAAAADa2V5BgEAAAALd3JpdGVTdHJpbmcAAAACAAAAA2tleQAAAAV2YWx1ZQMJAABnAAAAAgAAAAAAAAAAAAkAATEAAAABBQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAICAAAADmVtcHR5IHN0cmluZzogBQAAAANrZXkJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUBAAAACHdyaXRlSW50AAAAAgAAAANrZXkAAAAFdmFsdWUDCQAAZgAAAAIAAAAAAAAAAAAFAAAABXZhbHVlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAF3dyaXRpbmcgbmVnYXRpdmUgdmFsdWUgCQABpAAAAAEFAAAABXZhbHVlAgAAAAkgZm9yIGtleSAFAAAAA2tleQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUBAAAAEHdyaXRlQ29uc3RTdHJpbmcAAAACAAAAA2tleQAAAAV2YWx1ZQMDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQkBAAAADm5vbkVtcHR5U3RyaW5nAAAAAgUAAAAFdmFsdWUFAAAAA2tleQcJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUJAAACAAAAAQkAASwAAAACAgAAABVhbHJlYWR5IGluaXRpYWxpemVkOiAFAAAAA2tleQEAAAANd3JpdGVDb25zdEludAAAAAIAAAADa2V5AAAABXZhbHVlAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAANrZXkFAAAABXZhbHVlCQAAAgAAAAEJAAEsAAAAAgIAAAAQYWxyZWFkeSBleGlzdHM6IAUAAAADa2V5AQAAAAhjaGFuZ2VCeQAAAAIAAAADa2V5AAAABXZhbHVlCQEAAAAId3JpdGVJbnQAAAACBQAAAANrZXkJAABkAAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkAAAAAAAAAAAAFAAAABXZhbHVlAQAAAAVhc0ludAAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAA2ludAUAAAAHJG1hdGNoMAUAAAADaW50CQAAAgAAAAECAAAAGXdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQAAAAAEmNvbmZpZ0FkZHJlc3NTdG9yZQIAAAAGY29uZmlnAAAAAA1jb25maWdBZGRyZXNzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAEmNvbmZpZ0FkZHJlc3NTdG9yZQIAAAAJbm8gY29uZmlnAgAAABZpbnZhbGlkIGNvbmZpZyBhZGRyZXNzAAAAAAZ2b3RpbmcJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAWY29udHJhY3Rfdm90aW5nX3Jlc3VsdAIAAAAZbm8gY29udHJhY3Rfdm90aW5nX3Jlc3VsdAIAAAAeaW52YWxpZCBjb250cmFjdF92b3RpbmdfcmVzdWx0AAAAAAdzdGFraW5nCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAEGNvbnRyYWN0X3N0YWtpbmcCAAAA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dXNlcmRhdGEJAQAAABp1c2VyTGFzdFByb3Bvc2VIZWlnaHRTdG9yZQAAAAEFAAAABHVzZXIA//////////8AAAAAC3RoaXNBZGRyZXNzCQAEJQAAAAEFAAAABHRoaXMAAAAAEHVzZXJQcm9wb3NlRGVsYXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAC3RoaXNBZGRyZXNzAgAAABNfdXNlcl9wcm9wb3NlX2RlbGF5AgAAACJfdXNlcl9wcm9wb3NlX2RlbGF5IGlzIG5vdCBkZWZpbmVkAAAAAAtxdW9ydW1SYXRpbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MJAAEsAAAAAgUAAAALdGhpc0FkZHJlc3MCAAAAFl9wcm9wb3NhbF9xdW9ydW1fcmF0aW8CAAAAJV9wcm9wb3NhbF9xdW9ydW1fcmF0aW8gaXMgbm90IGRlZmluZWQAAAAADXF1b3J1bU1pblVuaXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAC3RoaXNBZGRyZXNzAgAAABRfcHJvcG9zYWxfcXVvcnVtX21pbgIAAAAjX3Byb3Bvc2FsX3F1b3J1bV9taW4gaXMgbm90IGRlZmluZWQBAAAAE3Byb3Bvc2FsUXVvcnVtU3RvcmUAAAABAAAABHR4aWQJAAEsAAAAAgIAAAAWcHJvcG9zYWxfcXVvcnVtX3JhdGlvXwUAAAAEdHhpZAEAAAAWcHJvcG9zYWxRdW9ydW1NaW5TdG9yZQAAAAEAAAAEdHhpZAkAASwAAAACAgAAABRwcm9wb3NhbF9xdW9ydW1fbWluXwUAAAAEdHhpZAAAAAALcGFzc2VkUmF0aW8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAC3RoaXNBZGRyZXNzAgAAABZfcHJvcG9zYWxfcGFzc2VkX3JhdGlvAgAAACVfcHJvcG9zYWxfcGFzc2VkX3JhdGlvIGlzIG5vdCBkZWZpbmVkAAAAABNwcm9wb3NhbE1pblJlcXVpcmVkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACBQAAAAt0aGlzQWRkcmVzcwIAAAAWX3Byb3Bvc2FsX21pbl9yZXF1aXJlZAIAAAAlX3Byb3Bvc2FsX21pbl9yZXF1aXJlZCBpcyBub3QgZGVmaW5lZAAAAAARdm90aW5nU3RhcnRPZmZzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAC3RoaXNBZGRyZXNzAgAAABxfcHJvcG9zYWxfdm90aW5nc3RhcnRfb2Zmc2V0AgAAACtfcHJvcG9zYWxfdm90aW5nc3RhcnRfb2Zmc2V0IGlzIG5vdCBkZWZpbmVkAAAAAA92b3RpbmdFbmRPZmZzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAC3RoaXNBZGRyZXNzAgAAABpfcHJvcG9zYWxfdm90aW5nZW5kX29mZnNldAIAAAApX3Byb3Bvc2FsX3ZvdGluZ2VuZF9vZmZzZXQgaXMgbm90IGRlZmluZWQBAAAACXVzZXJTdGFrZQAAAAEAAAAEdXNlcgkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAdzdGFraW5nAgAAAAl1c2VyU3Rha2UJAARMAAAAAgUAAAAEdXNlcgUAAAADbmlsBQAAAANuaWwBAAAADnByb3Bvc2FsRXhpc3RzAAAAAQAAAAR0eElkBAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMJAQAAAAtoZWlnaHRTdG9yZQAAAAEFAAAABHR4SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAAFc3RhcnQFAAAAByRtYXRjaDAGBwEAAAAQcHJvcG9zYWxPblZvdGluZwAAAAEAAAAEdHhJZAQAAAALbm9uRXhpc3RFcnICAAAAFnByb3Bvc2FsIGRvZXNuJ3QgZXhpc3QDCQEAAAABIQAAAAEJAQAAAA5wcm9wb3NhbEV4aXN0cwAA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", "height": 3311091, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+func throwIf (condition,error) = if (condition)
5+ then throw(error)
6+ else true
7+
8+
9+func nonEmptyString (s,key) = if ((0 >= size(s)))
10+ then throw(("empty string: " + key))
11+ else true
12+
13+
14+func writeString (key,value) = if ((0 >= size(value)))
15+ then throw(("empty string: " + key))
16+ else StringEntry(key, value)
17+
18+
19+func writeInt (key,value) = if ((0 > value))
20+ then throw(((("writing negative value " + toString(value)) + " for key ") + key))
21+ else IntegerEntry(key, value)
22+
23+
24+func writeConstString (key,value) = if (if (!(isDefined(getString(this, key))))
25+ then nonEmptyString(value, key)
26+ else false)
27+ then StringEntry(key, value)
28+ else throw(("already initialized: " + key))
29+
30+
31+func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key))))
32+ then IntegerEntry(key, value)
33+ else throw(("already exists: " + key))
34+
35+
36+func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
37+
38+
39+func asInt (value) = match value {
40+ case int: Int =>
41+ int
42+ case _ =>
43+ throw("wrong type, expected: Int")
44+}
45+
46+
47+let configAddressStore = "config"
48+
49+let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "no config")), "invalid config address")
50+
51+let voting = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_result"), "no contract_voting_result")), "invalid contract_voting_result")
52+
53+let staking = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_staking"), "no contract_staking")), "invalid contract_staking")
54+
55+let userdata = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_user_data"), "no contract_user_data")), "invalid contract_user_data")
56+
57+let HEIGHT = height
58+
59+func advise () = ("height: " + toString(HEIGHT))
60+
61+
62+let BASE = 1000
63+
64+func opAllowed (op) = {
65+ let s = invoke(configAddress, "opAllowed", [op], nil)
66+ if ((s == s))
67+ then true
68+ else throw("Strict value is not equal to itself.")
69+ }
70+
71+
72+func addressStore (id) = ("proposal_address_" + id)
73+
74+
75+func heightStore (id) = ("proposal_height_" + id)
76+
77+
78+func votingStartStore (id) = ("proposal_votingstart_" + id)
79+
80+
81+func votingEndStore (id) = ("proposal_votingend_" + id)
82+
83+
84+func byStore (id) = ("proposal_by_" + id)
85+
86+
87+func descriptionStore (id) = ("proposal_description_" + id)
88+
89+
90+func titleStore (id) = ("proposal_title_" + id)
91+
92+
93+func payloadStore (id) = ("proposal_payload_" + id)
94+
95+
96+func maxSnapStore (id) = ("proposal_max_snap_" + id)
97+
98+
99+func totalYesStore (id) = ("proposal_yes_" + id)
100+
101+
102+func totalNoStore (id) = ("proposal_no_" + id)
103+
104+
105+func userYesStore (user,id) = ((("proposal_yes_user_" + id) + "_") + user)
106+
107+
108+func userNoStore (user,id) = ((("proposal_no_user_" + id) + "_") + user)
109+
110+
111+func userLastProposeHeightStore (user) = ("propose_lastheight_" + user)
112+
113+
114+func userYes (user,id) = valueOrElse(getInteger(userdata, userYesStore(user, id)), 0)
115+
116+
117+func userNo (user,id) = valueOrElse(getInteger(userdata, userNoStore(user, id)), 0)
118+
119+
120+func userLastProposeHeight (user) = valueOrElse(getInteger(userdata, userLastProposeHeightStore(user)), -1)
121+
122+
123+let thisAddress = toString(this)
124+
125+let userProposeDelay = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_user_propose_delay")), "_user_propose_delay is not defined")
126+
127+let quorumRatio = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_quorum_ratio")), "_proposal_quorum_ratio is not defined")
128+
129+let quorumMinUnit = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_quorum_min")), "_proposal_quorum_min is not defined")
130+
131+func proposalQuorumStore (txid) = ("proposal_quorum_ratio_" + txid)
132+
133+
134+func proposalQuorumMinStore (txid) = ("proposal_quorum_min_" + txid)
135+
136+
137+let passedRatio = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_passed_ratio")), "_proposal_passed_ratio is not defined")
138+
139+let proposalMinRequired = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_min_required")), "_proposal_min_required is not defined")
140+
141+let votingStartOffset = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_votingstart_offset")), "_proposal_votingstart_offset is not defined")
142+
143+let votingEndOffset = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_votingend_offset")), "_proposal_votingend_offset is not defined")
144+
145+func userStake (user) = asInt(invoke(staking, "userStake", [user], nil))
146+
147+
148+func proposalExists (txId) = match getInteger(this, heightStore(txId)) {
149+ case start: Int =>
150+ true
151+ case _ =>
152+ false
153+}
154+
155+
156+func proposalOnVoting (txId) = {
157+ let nonExistErr = "proposal doesn't exist"
158+ if (!(proposalExists(txId)))
159+ then throw(nonExistErr)
160+ else {
161+ let votingStart = valueOrErrorMessage(getInteger(this, votingStartStore(txId)), nonExistErr)
162+ let votingEnd = valueOrErrorMessage(getInteger(this, votingEndStore(txId)), nonExistErr)
163+ if ((votingStart > HEIGHT))
164+ then throw(((("voting not started yet, discussion is in progress, voting will start at block " + toString(votingStart)) + ", now it's ") + toString(HEIGHT)))
165+ else if ((HEIGHT > votingEnd))
166+ then throw(((("voting ended at block " + toString(votingEnd)) + ", now it's ") + toString(HEIGHT)))
167+ else true
168+ }
169+ }
170+
171+
172+func proposalBeforeVoting (txId) = {
173+ let nonExistErr = "proposal doesn't exist"
174+ if (!(proposalExists(txId)))
175+ then throw(nonExistErr)
176+ else {
177+ let votingStart = valueOrErrorMessage(getInteger(this, votingStartStore(txId)), nonExistErr)
178+ if ((HEIGHT >= votingStart))
179+ then throw("voting start is already happened")
180+ else true
181+ }
182+ }
183+
184+
185+func totalStake () = asInt(invoke(staking, "totalStake", nil, nil))
186+
187+
188+func quorum (txId) = valueOrElse(getInteger(proposalQuorumStore(txId)), quorumRatio)
189+
190+
191+func canBroadcast (id,yesInc,noInc) = {
192+ let votesYes = (valueOrElse(getInteger(("proposal_yes_" + id)), 0) + yesInc)
193+ let votesNo = (valueOrElse(getInteger(("proposal_no_" + id)), 0) + noInc)
194+ let total = totalStake()
195+ let totalVotes = (votesYes + votesNo)
196+ let hasQuorum = (((totalVotes * BASE) / total) >= quorum(id))
197+ let hasPassed = (((votesYes * BASE) / totalVotes) >= passedRatio)
198+ let hasQuarumAbs = (totalVotes >= getIntegerValue(proposalQuorumMinStore(id)))
199+ if (if (hasQuorum)
200+ then hasPassed
201+ else false)
202+ then hasQuarumAbs
203+ else false
204+ }
205+
206+
207+func adviseProposalUserVotes (txId,user) = {
208+ let yes = userYes(user, txId)
209+ let no = userNo(user, txId)
210+ let txAddress = valueOrErrorMessage(getString(addressStore(txId)), "proposal address not found")
211+ ((((("height: " + toString(HEIGHT)) + ", vote_yes: ") + toString(yes)) + ", vote_no: ") + toString(no))
212+ }
213+
214+
215+func adviseProposal (txId) = {
216+ let proposalHeight = valueOrErrorMessage(getInteger(heightStore(txId)), "no proposal")
217+ let votingStart = valueOrErrorMessage(getInteger(votingStartStore(txId)), "no proposal")
218+ let votingEnd = valueOrErrorMessage(getInteger(votingEndStore(txId)), "no proposal")
219+ let votesYes = valueOrElse(getInteger(totalYesStore(txId)), 0)
220+ let votesNo = valueOrElse(getInteger(totalNoStore(txId)), 0)
221+ let maxSnap = valueOrElse(getInteger(maxSnapStore(txId)), 0)
222+ let totalVotes = (votesYes + votesNo)
223+ let quorumMin = getIntegerValue(proposalQuorumMinStore(txId))
224+ let hasQuarumAbs = (totalVotes >= quorumMin)
225+ let q = quorum(txId)
226+ let hasQuorum = if ((totalVotes > 0))
227+ then if ((((totalVotes * BASE) / maxSnap) >= q))
228+ then hasQuarumAbs
229+ else false
230+ else false
231+ let hasPassed = if ((totalVotes > 0))
232+ then (((votesYes * BASE) / totalVotes) >= passedRatio)
233+ else false
234+ let inBlockchainHeight = valueOrElse(transactionHeightById(fromBase58String(txId)), 0)
235+ let status = if ((votingStart > HEIGHT))
236+ then "discussion"
237+ else if ((votingEnd >= HEIGHT))
238+ then "voting"
239+ else if (!(hasQuorum))
240+ then "noQuorum"
241+ else if (!(hasPassed))
242+ then "votingFailed"
243+ else if ((inBlockchainHeight > 0))
244+ then "inBlockchain"
245+ else "waitingForTx"
246+ ((((((((((((((((((((((((((((((((("height: " + toString(HEIGHT)) + ", proposal_id: ") + txId) + ", proposal_title: ") + getStringValue(titleStore(txId))) + ", proposal_address: ") + valueOrErrorMessage(addressStore(txId), "no address")) + ", proposal_status: ") + status) + ", proposal_by: ") + valueOrErrorMessage(getString(this, byStore(txId)), "no proposal")) + ", proposal_height: ") + toString(proposalHeight)) + ", proposal_txheight: ") + toString(inBlockchainHeight)) + ", proposal_votingstart: ") + toString(votingStart)) + ", proposal_votingend: ") + toString(votingEnd)) + ", proposal_max: ") + toString(maxSnap)) + ", vote_yes: ") + toString(votesYes)) + ", vote_no: ") + toString(votesNo)) + ", proposal_quorum: ") + toString(q)) + ", proposal_quorum_min: ") + toString(quorumMin)) + ", proposal_description: ") + getStringValue(descriptionStore(txId))) + ", proposal_payload: ") + getStringValue(payloadStore(txId)))
247+ }
248+
249+
250+func broadcastHeight (txId) = (getIntegerValue(votingEndStore(txId)) + 1)
251+
252+
253+func setResult (txAddress,txId,result) = invoke(voting, "setResult", [txAddress, txId, result, broadcastHeight(txId)], nil)
254+
255+
256+func setMaxSnap (txId) = IntegerEntry(maxSnapStore(txId), totalStake())
257+
258+
259+func lock (user,txId) = {
260+ let votingEnd = getIntegerValue(votingEndStore(txId))
261+ let unlock = (votingEnd + 1)
262+ invoke(staking, "lockFor", [user, unlock], nil)
263+ }
264+
265+
266+@Callable(i)
267+func propose (address,txId,title,description,payload) = {
268+ let checks = opAllowed("governance_propose_tx")
269+ if ((checks == checks))
270+ then {
271+ let user = toString(i.caller)
272+ let gv = userStake(user)
273+ if ((proposalMinRequired > gv))
274+ then throw((((("not enough staked units to make proposal." + " Minimum required = ") + toString(proposalMinRequired)) + ", actual: = ") + toString(gv)))
275+ else {
276+ let last = userLastProposeHeight(user)
277+ if (if ((last > -1))
278+ then ((last + userProposeDelay) > HEIGHT)
279+ else false)
280+ then throw(((("can't propose too often, last proroposal height: " + toString(last)) + ", blocks to wait: ") + toString(((last + userProposeDelay) - HEIGHT))))
281+ else {
282+ let votingEnds = (HEIGHT + votingEndOffset)
283+ let l = invoke(userdata, "write", [userLastProposeHeightStore(user), HEIGHT], nil)
284+ if ((l == l))
285+ then [writeConstInt(heightStore(txId), HEIGHT), setMaxSnap(txId), writeConstInt(votingStartStore(txId), (HEIGHT + votingStartOffset)), writeConstInt(votingEndStore(txId), votingEnds), writeConstString(byStore(txId), toString(i.caller)), writeConstString(addressStore(txId), address), IntegerEntry(proposalQuorumStore(txId), quorumRatio), IntegerEntry(proposalQuorumMinStore(txId), quorumMinUnit), writeString(descriptionStore(txId), description), writeString(payloadStore(txId), payload), writeConstString(titleStore(txId), title)]
286+ else throw("Strict value is not equal to itself.")
287+ }
288+ }
289+ }
290+ else throw("Strict value is not equal to itself.")
291+ }
292+
293+
294+
295+@Callable(i)
296+func edit (txId,title,description) = {
297+ let checks = if (opAllowed("governance_edit_attachments"))
298+ then proposalBeforeVoting(txId)
299+ else false
300+ if ((checks == checks))
301+ then {
302+ let user = toString(i.caller)
303+ let by = valueOrErrorMessage(getString(this, byStore(txId)), "proposal doesn't exist")
304+ if ((by != user))
305+ then throw("only owner can edit proposal attachments e.g. title, description")
306+ else [writeString(titleStore(txId), title), writeString(descriptionStore(txId), description)]
307+ }
308+ else throw("Strict value is not equal to itself.")
309+ }
310+
311+
312+
313+@Callable(i)
314+func voteYes (txId) = {
315+ let checks = if (opAllowed("governance_vote_tx"))
316+ then proposalOnVoting(txId)
317+ else false
318+ if ((checks == checks))
319+ then {
320+ let user = toString(i.caller)
321+ if ((userNo(user, txId) > 0))
322+ then throw("already voted against, please retract your vote first")
323+ else {
324+ let yesDelta = (userStake(user) - userYes(user, txId))
325+ let l = lock(user, txId)
326+ if ((l == l))
327+ then {
328+ let txAddress = valueOrErrorMessage(getString(addressStore(txId)), "proposal address not found")
329+ let result = canBroadcast(txId, yesDelta, 0)
330+ let s = setResult(txAddress, txId, result)
331+ if ((s == s))
332+ then {
333+ let y = invoke(userdata, "changeBy", [userYesStore(user, txId), yesDelta], nil)
334+ if ((y == y))
335+ then [setMaxSnap(txId), changeBy(totalYesStore(txId), yesDelta)]
336+ else throw("Strict value is not equal to itself.")
337+ }
338+ else throw("Strict value is not equal to itself.")
339+ }
340+ else throw("Strict value is not equal to itself.")
341+ }
342+ }
343+ else throw("Strict value is not equal to itself.")
344+ }
345+
346+
347+
348+@Callable(i)
349+func voteNo (txId) = {
350+ let checks = if (opAllowed("governance_vote_tx"))
351+ then proposalOnVoting(txId)
352+ else false
353+ if ((checks == checks))
354+ then {
355+ let user = toString(i.caller)
356+ if ((userYes(user, txId) > 0))
357+ then throw("already voted for, please retract your vote first")
358+ else {
359+ let noDelta = (userStake(user) - userNo(user, txId))
360+ let l = lock(user, txId)
361+ if ((l == l))
362+ then {
363+ let txAddress = valueOrErrorMessage(getString(addressStore(txId)), "proposal address not found")
364+ let result = canBroadcast(txId, 0, noDelta)
365+ let s = setResult(txAddress, txId, result)
366+ if ((s == s))
367+ then {
368+ let n = invoke(userdata, "changeBy", [userNoStore(user, txId), noDelta], nil)
369+ if ((n == n))
370+ then [setMaxSnap(txId), changeBy(totalNoStore(txId), noDelta)]
371+ else throw("Strict value is not equal to itself.")
372+ }
373+ else throw("Strict value is not equal to itself.")
374+ }
375+ else throw("Strict value is not equal to itself.")
376+ }
377+ }
378+ else throw("Strict value is not equal to itself.")
379+ }
380+
381+
382+
383+@Callable(i)
384+func retract (txId) = {
385+ let checks = if (opAllowed("governance_retract_vote"))
386+ then proposalOnVoting(txId)
387+ else false
388+ if ((checks == checks))
389+ then {
390+ let user = toString(i.caller)
391+ let yes = userYes(user, txId)
392+ let no = userNo(user, txId)
393+ let txAddress = valueOrErrorMessage(getString(addressStore(txId)), "proposal address not found")
394+ let result = canBroadcast(txId, -(yes), -(no))
395+ let s = setResult(txAddress, txId, result)
396+ if ((s == s))
397+ then {
398+ let y = invoke(userdata, "delete", [userYesStore(user, txId)], nil)
399+ if ((y == y))
400+ then {
401+ let n = invoke(userdata, "delete", [userNoStore(user, txId)], nil)
402+ if ((n == n))
403+ then [changeBy(totalYesStore(txId), -(yes)), changeBy(totalNoStore(txId), -(no))]
404+ else throw("Strict value is not equal to itself.")
405+ }
406+ else throw("Strict value is not equal to itself.")
407+ }
408+ else throw("Strict value is not equal to itself.")
409+ }
410+ else throw("Strict value is not equal to itself.")
411+ }
412+
413+
414+
415+@Callable(i)
416+func retractProposal (txId) = {
417+ let checks = if (opAllowed("governance_retract_proposal_tx"))
418+ then proposalBeforeVoting(txId)
419+ else false
420+ if ((checks == checks))
421+ then {
422+ let by = valueOrErrorMessage(getString(this, byStore(txId)), "proposal doesn't exist")
423+ let user = toString(i.caller)
424+ if ((by != user))
425+ then throw("only owner can retract proposal")
426+ else {
427+ let l = invoke(userdata, "delete", [userLastProposeHeightStore(user)], nil)
428+ if ((l == l))
429+ then [DeleteEntry(heightStore(txId)), DeleteEntry(votingStartStore(txId)), DeleteEntry(votingEndStore(txId)), DeleteEntry(byStore(txId)), DeleteEntry(maxSnapStore(txId)), DeleteEntry(totalYesStore(txId)), DeleteEntry(totalNoStore(txId)), DeleteEntry(addressStore(txId)), DeleteEntry(titleStore(txId)), DeleteEntry(payloadStore(txId))]
430+ else throw("Strict value is not equal to itself.")
431+ }
432+ }
433+ else throw("Strict value is not equal to itself.")
434+ }
435+
436+
437+
438+@Callable(i)
439+func init (config) = [writeConstString(configAddressStore, config)]
440+
441+

github/deemru/w8io/026f985 
26.36 ms