tx · Di9qBqhXJVUqkaeVNExK86MdmUasEKsz68gKuWtJ3ZXD

3MtM8vubkzTqkfypHpQKriE7DqZ6UcaXtQ5:  -0.01900000 Waves

2024.10.04 12:55 [3311961] smart account 3MtM8vubkzTqkfypHpQKriE7DqZ6UcaXtQ5 > SELF 0.00000000 Waves

{ "type": 13, "id": "Di9qBqhXJVUqkaeVNExK86MdmUasEKsz68gKuWtJ3ZXD", "fee": 1900000, "feeAssetId": null, "timestamp": 1728035753632, "version": 2, "chainId": 84, "sender": "3MtM8vubkzTqkfypHpQKriE7DqZ6UcaXtQ5", "senderPublicKey": "4mwky4MzhTC2QS5heqWJ1tyYHUymtXQhQMzaSt3utkeF", "proofs": [ "4h4UY8Ccfx69cn29mNjqQcvGs49ipLkT7vdy7VeptpaFG9p4UVw5sWsX5v5DLRBeXSEtM2ow5HrLXg4S3LBeSm3j" ], "script": "base64:AAIFAAAAAAAAACsIAhIHCgUICAgICBIFCgMICAgSAwoBCBIDCgEIEgMKAQgSAwoBCBIDCgEIAAAAOQEAAAAHdGhyb3dJZgAAAAIAAAAJY29uZGl0aW9uAAAABWVycm9yAwUAAAAJY29uZGl0aW9uCQAAAgAAAAEFAAAABWVycm9yBgEAAAAObm9uRW1wdHlTdHJpbmcAAAACAAAAAXMAAAADa2V5AwkAAGcAAAACAAAAAAAAAAAACQABMQAAAAEFAAAAAXMJAAACAAAAAQkAASwAAAACAgAAAA5lbXB0eSBzdHJpbmc6IAUAAAADa2V5BgEAAAALd3JpdGVTdHJpbmcAAAACAAAAA2tleQAAAAV2YWx1ZQMJAABnAAAAAgAAAAAAAAAAAAkAATEAAAABBQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAICAAAADmVtcHR5IHN0cmluZzogBQAAAANrZXkJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUBAAAACHdyaXRlSW50AAAAAgAAAANrZXkAAAAFdmFsdWUDCQAAZgAAAAIAAAAAAAAAAAAFAAAABXZhbHVlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAF3dyaXRpbmcgbmVnYXRpdmUgdmFsdWUgCQABpAAAAAEFAAAABXZhbHVlAgAAAAkgZm9yIGtleSAFAAAAA2tleQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUBAAAAEHdyaXRlQ29uc3RTdHJpbmcAAAACAAAAA2tleQAAAAV2YWx1ZQMDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQkBAAAADm5vbkVtcHR5U3RyaW5nAAAAAgUAAAAFdmFsdWUFAAAAA2tleQcJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUJAAACAAAAAQkAASwAAAACAgAAABVhbHJlYWR5IGluaXRpYWxpemVkOiAFAAAAA2tleQEAAAANd3JpdGVDb25zdEludAAAAAIAAAADa2V5AAAABXZhbHVlAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAANrZXkFAAAABXZhbHVlCQAAAgAAAAEJAAEsAAAAAgIAAAAQYWxyZWFkeSBleGlzdHM6IAUAAAADa2V5AQAAAAhjaGFuZ2VCeQAAAAIAAAADa2V5AAAABXZhbHVlCQEAAAAId3JpdGVJbnQAAAACBQAAAANrZXkJAABkAAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkAAAAAAAAAAAAFAAAABXZhbHVlAQAAAAVhc0ludAAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAA2ludAUAAAAHJG1hdGNoMAUAAAADaW50CQAAAgAAAAECAAAAGXdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQAAAAAEmNvbmZpZ0FkZHJlc3NTdG9yZQIAAAAGY29uZmlnAAAAAA1jb25maWdBZGRyZXNzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAEmNvbmZpZ0FkZHJlc3NTdG9yZQIAAAAJbm8gY29uZmlnAgAAABZpbnZhbGlkIGNvbmZpZyBhZGRyZXNzAAAAAAZ2b3RpbmcJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAWY29udHJhY3Rfdm90aW5nX3Jlc3VsdAIAAAAZbm8gY29udHJhY3Rfdm90aW5nX3Jlc3VsdAIAAAAeaW52YWxpZCBjb250cmFjdF92b3RpbmdfcmVzdWx0AAAAAAdzdGFraW5nCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAEGNvbnRyYWN0X3N0YWtpbmcCAAAA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dXNlcmRhdGEJAQAAABp1c2VyTGFzdFByb3Bvc2VIZWlnaHRTdG9yZQAAAAEFAAAABHVzZXIA//////////8AAAAAC3RoaXNBZGRyZXNzCQAEJQAAAAEFAAAABHRoaXMAAAAAEHVzZXJQcm9wb3NlRGVsYXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAC3RoaXNBZGRyZXNzAgAAABNfdXNlcl9wcm9wb3NlX2RlbGF5AgAAACJfdXNlcl9wcm9wb3NlX2RlbGF5IGlzIG5vdCBkZWZpbmVkAAAAAAtxdW9ydW1SYXRpbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MJAAEsAAAAAgUAAAALdGhpc0FkZHJlc3MCAAAAFl9wcm9wb3NhbF9xdW9ydW1fcmF0aW8CAAAAJV9wcm9wb3NhbF9xdW9ydW1fcmF0aW8gaXMgbm90IGRlZmluZWQAAAAADXF1b3J1bU1pblVuaXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAC3RoaXNBZGRyZXNzAgAAABRfcHJvcG9zYWxfcXVvcnVtX21pbgIAAAAjX3Byb3Bvc2FsX3F1b3J1bV9taW4gaXMgbm90IGRlZmluZWQBAAAAE3Byb3Bvc2FsUXVvcnVtU3RvcmUAAAABAAAABHR4aWQJAAEsAAAAAgIAAAAWcHJvcG9zYWxfcXVvcnVtX3JhdGlvXwUAAAAEdHhpZAEAAAAWcHJvcG9zYWxRdW9ydW1NaW5TdG9yZQAAAAEAAAAEdHhpZAkAASwAAAACAgAAABRwcm9wb3NhbF9xdW9ydW1fbWluXwUAAAAEdHhpZAAAAAALcGFzc2VkUmF0aW8EAAAABXJhdGlvCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACBQAAAAt0aGlzQWRkcmVzcwIAAAAWX3Byb3Bvc2FsX3Bhc3NlZF9yYXRpbwIAAAAlX3Byb3Bvc2FsX3Bhc3NlZF9yYXRpbyBpcyBub3QgZGVmaW5lZAMJAABnAAAAAgAAAAAAAAAAAAUAAAAFcmF0aW8JAAACAAAAAQIAAAAeaW52YWxpZCBfcHJvcG9zYWxfcGFzc2VkX3JhdGlvBQAAAAVyYXRpbwAAAAATcHJvcG9zYWxNaW5SZXF1aXJlZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MJAAEsAAAAAgUAAAALdGhpc0FkZHJlc3MCAAAAFl9wcm9wb3NhbF9taW5fcmVxdWlyZWQCAAAAJV9wcm9wb3NhbF9taW5fcmVxdWlyZWQgaXMgbm90IGRlZmluZWQAAAAAEXZvdGluZ1N0YXJ0T2Zmc2V0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACBQAAAAt0aGlzQWRkcmVzcwIAAAAcX3Byb3Bvc2FsX3ZvdGluZ3N0YXJ0X29mZnNldAIAAAArX3Byb3Bvc2FsX3ZvdGluZ3N0YXJ0X29mZnNldCBpcyBub3QgZGVmaW5lZAAAAAAPdm90aW5nRW5kT2Zmc2V0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACBQAAAAt0aGlzQWRkcmVzcwIAAAAaX3Byb3Bvc2FsX3ZvdGluZ2VuZF9vZmZzZXQCAAAAKV9wcm9wb3NhbF92b3RpbmdlbmRfb2Zmc2V0IGlzIG5vdCBkZWZpbmVkAQAAAAl1c2VyU3Rha2UAAAABAAAABHVzZXIJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAHc3Rha2luZwIAAAAJdXNlclN0YWtlCQAETAAAAAIFAAAABHVzZXIFAAAAA25pbAUAAAADbmlsAQAAAA5wcm9wb3NhbEV4aXN0cwAAAAEAAAAEdHhJZAQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzCQEAAAALaGVpZ2h0U3RvcmUAAAABBQAAAAR0eElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAABXN0YXJ0BQAAAAckbWF0Y2gwBgcBAAAAEHByb3Bvc2FsT25Wb3Rp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", "height": 3311961, "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 = {
138+ let ratio = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_passed_ratio")), "_proposal_passed_ratio is not defined")
139+ if ((0 >= ratio))
140+ then throw("invalid _proposal_passed_ratio")
141+ else ratio
142+ }
143+
144+let proposalMinRequired = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_min_required")), "_proposal_min_required is not defined")
145+
146+let votingStartOffset = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_votingstart_offset")), "_proposal_votingstart_offset is not defined")
147+
148+let votingEndOffset = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_votingend_offset")), "_proposal_votingend_offset is not defined")
149+
150+func userStake (user) = asInt(invoke(staking, "userStake", [user], nil))
151+
152+
153+func proposalExists (txId) = match getInteger(this, heightStore(txId)) {
154+ case start: Int =>
155+ true
156+ case _ =>
157+ false
158+}
159+
160+
161+func proposalOnVoting (txId) = {
162+ let nonExistErr = "proposal doesn't exist"
163+ if (!(proposalExists(txId)))
164+ then throw(nonExistErr)
165+ else {
166+ let votingStart = valueOrErrorMessage(getInteger(this, votingStartStore(txId)), nonExistErr)
167+ let votingEnd = valueOrErrorMessage(getInteger(this, votingEndStore(txId)), nonExistErr)
168+ if ((votingStart > HEIGHT))
169+ then throw(((("voting not started yet, discussion is in progress, voting will start at block " + toString(votingStart)) + ", now it's ") + toString(HEIGHT)))
170+ else if ((HEIGHT > votingEnd))
171+ then throw(((("voting ended at block " + toString(votingEnd)) + ", now it's ") + toString(HEIGHT)))
172+ else true
173+ }
174+ }
175+
176+
177+func proposalBeforeVoting (txId) = {
178+ let nonExistErr = "proposal doesn't exist"
179+ if (!(proposalExists(txId)))
180+ then throw(nonExistErr)
181+ else {
182+ let votingStart = valueOrErrorMessage(getInteger(this, votingStartStore(txId)), nonExistErr)
183+ if ((HEIGHT >= votingStart))
184+ then throw("voting start is already happened")
185+ else true
186+ }
187+ }
188+
189+
190+func totalStake () = asInt(invoke(staking, "totalStake", nil, nil))
191+
192+
193+func quorum (txId) = valueOrElse(getInteger(proposalQuorumStore(txId)), quorumRatio)
194+
195+
196+func canBroadcast (id,yesInc,noInc) = {
197+ let votesYes = (valueOrElse(getInteger(("proposal_yes_" + id)), 0) + yesInc)
198+ let votesNo = (valueOrElse(getInteger(("proposal_no_" + id)), 0) + noInc)
199+ let total = totalStake()
200+ let totalVotes = (votesYes + votesNo)
201+ let hasQuorum = (((totalVotes * BASE) / total) >= quorum(id))
202+ let hasPassed = (((votesYes * BASE) / totalVotes) >= passedRatio)
203+ let hasQuarumAbs = (totalVotes >= getIntegerValue(proposalQuorumMinStore(id)))
204+ if (if (hasQuorum)
205+ then hasPassed
206+ else false)
207+ then hasQuarumAbs
208+ else false
209+ }
210+
211+
212+func adviseProposalUserVotes (txId,user) = {
213+ let yes = userYes(user, txId)
214+ let no = userNo(user, txId)
215+ let txAddress = valueOrErrorMessage(getString(addressStore(txId)), "proposal address not found")
216+ ((((("height: " + toString(HEIGHT)) + ", vote_yes: ") + toString(yes)) + ", vote_no: ") + toString(no))
217+ }
218+
219+
220+func adviseProposal (txId) = {
221+ let proposalHeight = valueOrErrorMessage(getInteger(heightStore(txId)), "no proposal")
222+ let votingStart = valueOrErrorMessage(getInteger(votingStartStore(txId)), "no proposal")
223+ let votingEnd = valueOrErrorMessage(getInteger(votingEndStore(txId)), "no proposal")
224+ let votesYes = valueOrElse(getInteger(totalYesStore(txId)), 0)
225+ let votesNo = valueOrElse(getInteger(totalNoStore(txId)), 0)
226+ let maxSnap = valueOrElse(getInteger(maxSnapStore(txId)), 0)
227+ let totalVotes = (votesYes + votesNo)
228+ let quorumMin = getIntegerValue(proposalQuorumMinStore(txId))
229+ let hasQuarumAbs = (totalVotes >= quorumMin)
230+ let q = quorum(txId)
231+ let hasQuorum = if ((totalVotes > 0))
232+ then if ((((totalVotes * BASE) / maxSnap) >= q))
233+ then hasQuarumAbs
234+ else false
235+ else false
236+ let hasPassed = if ((totalVotes > 0))
237+ then (((votesYes * BASE) / totalVotes) >= passedRatio)
238+ else false
239+ let inBlockchainHeight = valueOrElse(transactionHeightById(fromBase58String(txId)), 0)
240+ let status = if ((votingStart > HEIGHT))
241+ then "discussion"
242+ else if ((votingEnd >= HEIGHT))
243+ then "voting"
244+ else if (!(hasQuorum))
245+ then "noQuorum"
246+ else if (!(hasPassed))
247+ then "votingFailed"
248+ else if ((inBlockchainHeight > 0))
249+ then "inBlockchain"
250+ else "waitingForTx"
251+ ((((((((((((((((((((((((((((((((("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)))
252+ }
253+
254+
255+func broadcastHeight (txId) = (getIntegerValue(votingEndStore(txId)) + 1)
256+
257+
258+func setResult (txAddress,txId,result) = invoke(voting, "setResult", [txAddress, txId, result, broadcastHeight(txId)], nil)
259+
260+
261+func setMaxSnap (txId) = IntegerEntry(maxSnapStore(txId), totalStake())
262+
263+
264+func lock (user,txId) = {
265+ let votingEnd = getIntegerValue(votingEndStore(txId))
266+ let unlock = (votingEnd + 1)
267+ invoke(staking, "lockFor", [user, unlock], nil)
268+ }
269+
270+
271+@Callable(i)
272+func propose (address,txId,title,description,payload) = {
273+ let checks = opAllowed("governance_propose_tx")
274+ if ((checks == checks))
275+ then {
276+ let user = toString(i.caller)
277+ let gv = userStake(user)
278+ if ((proposalMinRequired > gv))
279+ then throw((((("not enough staked units to make proposal." + " Minimum required = ") + toString(proposalMinRequired)) + ", actual: = ") + toString(gv)))
280+ else {
281+ let last = userLastProposeHeight(user)
282+ if (if ((last > -1))
283+ then ((last + userProposeDelay) > HEIGHT)
284+ else false)
285+ then throw(((("can't propose too often, last proroposal height: " + toString(last)) + ", blocks to wait: ") + toString(((last + userProposeDelay) - HEIGHT))))
286+ else {
287+ let votingEnds = (HEIGHT + votingEndOffset)
288+ let l = invoke(userdata, "write", [userLastProposeHeightStore(user), HEIGHT], nil)
289+ if ((l == l))
290+ 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)]
291+ else throw("Strict value is not equal to itself.")
292+ }
293+ }
294+ }
295+ else throw("Strict value is not equal to itself.")
296+ }
297+
298+
299+
300+@Callable(i)
301+func edit (txId,title,description) = {
302+ let checks = if (opAllowed("governance_edit_attachments"))
303+ then proposalBeforeVoting(txId)
304+ else false
305+ if ((checks == checks))
306+ then {
307+ let user = toString(i.caller)
308+ let by = valueOrErrorMessage(getString(this, byStore(txId)), "proposal doesn't exist")
309+ if ((by != user))
310+ then throw("only owner can edit proposal attachments e.g. title, description")
311+ else [writeString(titleStore(txId), title), writeString(descriptionStore(txId), description)]
312+ }
313+ else throw("Strict value is not equal to itself.")
314+ }
315+
316+
317+
318+@Callable(i)
319+func voteYes (txId) = {
320+ let checks = if (opAllowed("governance_vote_tx"))
321+ then proposalOnVoting(txId)
322+ else false
323+ if ((checks == checks))
324+ then {
325+ let user = toString(i.caller)
326+ if ((userNo(user, txId) > 0))
327+ then throw("already voted against, please retract your vote first")
328+ else {
329+ let yesDelta = (userStake(user) - userYes(user, txId))
330+ let l = lock(user, txId)
331+ if ((l == l))
332+ then {
333+ let txAddress = valueOrErrorMessage(getString(addressStore(txId)), "proposal address not found")
334+ let result = canBroadcast(txId, yesDelta, 0)
335+ let s = setResult(txAddress, txId, result)
336+ if ((s == s))
337+ then {
338+ let y = invoke(userdata, "changeBy", [userYesStore(user, txId), yesDelta], nil)
339+ if ((y == y))
340+ then [setMaxSnap(txId), changeBy(totalYesStore(txId), yesDelta)]
341+ else throw("Strict value is not equal to itself.")
342+ }
343+ else throw("Strict value is not equal to itself.")
344+ }
345+ else throw("Strict value is not equal to itself.")
346+ }
347+ }
348+ else throw("Strict value is not equal to itself.")
349+ }
350+
351+
352+
353+@Callable(i)
354+func voteNo (txId) = {
355+ let checks = if (opAllowed("governance_vote_tx"))
356+ then proposalOnVoting(txId)
357+ else false
358+ if ((checks == checks))
359+ then {
360+ let user = toString(i.caller)
361+ if ((userYes(user, txId) > 0))
362+ then throw("already voted for, please retract your vote first")
363+ else {
364+ let noDelta = (userStake(user) - userNo(user, txId))
365+ let l = lock(user, txId)
366+ if ((l == l))
367+ then {
368+ let txAddress = valueOrErrorMessage(getString(addressStore(txId)), "proposal address not found")
369+ let result = canBroadcast(txId, 0, noDelta)
370+ let s = setResult(txAddress, txId, result)
371+ if ((s == s))
372+ then {
373+ let n = invoke(userdata, "changeBy", [userNoStore(user, txId), noDelta], nil)
374+ if ((n == n))
375+ then [setMaxSnap(txId), changeBy(totalNoStore(txId), noDelta)]
376+ else throw("Strict value is not equal to itself.")
377+ }
378+ else throw("Strict value is not equal to itself.")
379+ }
380+ else throw("Strict value is not equal to itself.")
381+ }
382+ }
383+ else throw("Strict value is not equal to itself.")
384+ }
385+
386+
387+
388+@Callable(i)
389+func retract (txId) = {
390+ let checks = if (opAllowed("governance_retract_vote"))
391+ then proposalOnVoting(txId)
392+ else false
393+ if ((checks == checks))
394+ then {
395+ let user = toString(i.caller)
396+ let yes = userYes(user, txId)
397+ let no = userNo(user, txId)
398+ let txAddress = valueOrErrorMessage(getString(addressStore(txId)), "proposal address not found")
399+ let result = canBroadcast(txId, -(yes), -(no))
400+ let s = setResult(txAddress, txId, result)
401+ if ((s == s))
402+ then {
403+ let y = invoke(userdata, "delete", [userYesStore(user, txId)], nil)
404+ if ((y == y))
405+ then {
406+ let n = invoke(userdata, "delete", [userNoStore(user, txId)], nil)
407+ if ((n == n))
408+ then [changeBy(totalYesStore(txId), -(yes)), changeBy(totalNoStore(txId), -(no))]
409+ else throw("Strict value is not equal to itself.")
410+ }
411+ else throw("Strict value is not equal to itself.")
412+ }
413+ else throw("Strict value is not equal to itself.")
414+ }
415+ else throw("Strict value is not equal to itself.")
416+ }
417+
418+
419+
420+@Callable(i)
421+func retractProposal (txId) = {
422+ let checks = if (opAllowed("governance_retract_proposal_tx"))
423+ then proposalBeforeVoting(txId)
424+ else false
425+ if ((checks == checks))
426+ then {
427+ let by = valueOrErrorMessage(getString(this, byStore(txId)), "proposal doesn't exist")
428+ let user = toString(i.caller)
429+ if ((by != user))
430+ then throw("only owner can retract proposal")
431+ else {
432+ let l = invoke(userdata, "delete", [userLastProposeHeightStore(user)], nil)
433+ if ((l == l))
434+ 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)), DeleteEntry(proposalQuorumStore(txId)), DeleteEntry(proposalQuorumMinStore(txId)), DeleteEntry(descriptionStore(txId))]
435+ else throw("Strict value is not equal to itself.")
436+ }
437+ }
438+ else throw("Strict value is not equal to itself.")
439+ }
440+
441+
442+
443+@Callable(i)
444+func init (config) = [writeConstString(configAddressStore, config)]
445+
446+
447+@Verifier(tx)
448+func verify () = {
449+ let id = toBase58String(tx.id)
450+ (height >= getIntegerValue(this, ((("proposal_allow_broadcast_" + toString(this)) + "_") + id)))
451+ }
452+

github/deemru/w8io/c3f4982 
23.48 ms