2023.05.04 15:47 [3628638] smart account 3PGWhtvCSz1TRJhe3BJSrvQigrtKuyXsgma > SELF 0.00000000 Waves

{ "type": 13, "id": "6bYJt9BFdt1HXsbV4WuYxD5KKNgQci67ecEUob8xwQf2", "fee": 800000, "feeAssetId": null, "timestamp": 1683204383798, "version": 1, "sender": "3PGWhtvCSz1TRJhe3BJSrvQigrtKuyXsgma", "senderPublicKey": "4MpZMd8gCopeSW5sZNQx6DnKTcckE7ckhX1QArMdUiyT", "proofs": [ "4nUhDyDZLxiwcdPSTSLSnXvNhqfkNNtYKBX3zJCfwJdyWB8c1Rimvmc5hNGJEfiQUMCJT6awHH8rZFVCiLVEdKpi" ], "script": "base64:BgIWCAISAwoBCBIDCgEIEgMKAQgSAwoBCA8BC3dyaXRlU3RyaW5nAgNrZXkFdmFsdWUJAQtTdHJpbmdFbnRyeQIFA2tleQUFdmFsdWUBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQANY29uZmlnQWRkcmVzcwUEdGhpcwANdm90aW5nUmVzdWx0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhZjb250cmFjdF92b3RpbmdfcmVzdWx0AiFjb25maWc6IG5vIGNvbnRyYWN0X3ZvdGluZ19yZXN1bHQCHmludmFsaWQgY29udHJhY3Rfdm90aW5nX3Jlc3VsdAAGSEVJR0hUBQZoZWlnaHQBBmFkdmlzZQAJAKwCAgIIaGVpZ2h0OiAJAKQDAQUGSEVJR0hUAANvcHMJAMwIAgIEbWludAkAzAgCAgVzdGFrZQkAzAgCAghzdGFrZUZvcgkAzAgCAgd1bnN0YWtlCQDMCAICC3Vuc3Rha2VGcm9tCQDMCAICMTNQN1M4S0U1dmI2NW1ydnFUdkoxUmNqeXFGTGNHNFlSemtDX2NsYWltQW5kU3Rha2UJAMwIAgIxM1AzZ3pDdUFrVmo2c3BCY3BQSjg2eXNFVTJvSnhFejhCcG5fY2xhaW1BbmRTdGFrZQkAzAgCAjEzUFF2c3dXZVhlOUVuaXVlNkFNbWNWWGhRWjNycWVyZ2NSOF9jbGFpbUFuZFN0YWtlCQDMCAICDWNsYWltQW5kU3Rha2UJAMwIAgIKcmVzdGFrZUZvcgkAzAgCAhVnb3Zlcm5hbmNlX3Byb3Bvc2VfdHgJAMwIAgISZ292ZXJuYW5jZV92b3RlX3R4CQDMCAICF2dvdmVybmFuY2VfcmV0cmFjdF92b3RlCQDMCAICHmdvdmVybmFuY2VfcmV0cmFjdF9wcm9wb3NhbF90eAkAzAgCAhNnb3Zlcm5hbmNlX2FwcGx5X3R4CQDMCAICG2NoaWxkX2dvdmVybmFuY2VfcHJvcG9zZV90eAkAzAgCAhhjaGlsZF9nb3Zlcm5hbmNlX3ZvdGVfdHgJAMwIAgIdY2hpbGRfZ292ZXJuYW5jZV9yZXRyYWN0X3ZvdGUJAMwIAgIkY2hpbGRfZ292ZXJuYW5jZV9yZXRyYWN0X3Byb3Bvc2FsX3R4CQDMCAICGWNoaWxkX2dvdmVybmFuY2VfYXBwbHlfdHgJAMwIAgIHcHJvamVjdAkAzAgCAgZjb21taXQJAMwIAgIKdW5kb0NvbW1pdAkAzAgCAgpwcm9qZWN0Rm9yCQDMCAICDWluY3JlcmFzZVNraW4JAMwIAgIJY29tbWl0Rm9yCQDMCAICBmludmVzdAkAzAgCAgVzdGFydAkAzAgCAgVzbGFzaAkAzAgCAghjb21wbGV0ZQkAzAgCAgZjYW5jZWwJAMwIAgIKdW5kb0ludmVzdAkAzAgCAg11bmRvQ29tbWl0Rm9yCQDMCAICBXN0YXJ0CQDMCAICBXNsYXNoBQNuaWwAEnN5c3RlbUNvbnRyb2xTdG9yZQIOc3lzdGVtX2FsbG93ZWQBDm9wQWxsb3dlZFN0b3JlAQJvcAMJAQlpc0RlZmluZWQBCQDPCAIFA29wcwUCb3AJAKwCAgkArAICAgNvcF8FAm9wAghfYWxsb3dlZAkAAgEJAKwCAgkArAICAhZJbnZhbGlkIGFyZ3VtZW50OiBvcC4gBQJvcAIcIG9wZXJhdGlvbiBpcyBub3QgcmVnaXN0ZXJlZAEOb3BVbnBhdXNlU3RvcmUBAm9wCQCsAgIJAKwCAgIDb3BfBQJvcAIMX3VucGF1c2VkX2J5AA5zZW50aW5lbHNTdG9yZQIJc2VudGluZWxzAAxzZW50aW5lbHNTdHIJAJ0IAgUEdGhpcwUOc2VudGluZWxzU3RvcmUACXNlbnRpbmVscwMJAQlpc0RlZmluZWQBBQxzZW50aW5lbHNTdHIJALUJAgkBBXZhbHVlAQUMc2VudGluZWxzU3RyAgEsBQNuaWwBDmFzc2VydFNlbnRpbmVsAQFzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUJc2VudGluZWxzCQClCAEFAXMCDnBhdXNlT3AgZGVuaWVkAQZxdW9ydW0ABANhbGwJAJADAQUJc2VudGluZWxzAwkAZgIAAwUDYWxsAAEJAGQCCQBpAgUDYWxsAAIAAQQBaQEJb3BBbGxvd2VkAQJvcAQFc3RvcmUJAQ5vcEFsbG93ZWRTdG9yZQEFAm9wAwkBCGNvbnRhaW5zAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAghzdG9wbGlzdAIACQClCAEIBQFpDG9yaWdpbkNhbGxlcgkAAgECHG9wZXJhdGlvbiBwYXVzZWQgYnkgc3RvcGxpc3QDCQEIY29udGFpbnMCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMCA2V4YwIACQClCAEIBQFpDG9yaWdpbkNhbGxlcgkAlAoCBQNuaWwGBAhlbmFibGVkMAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBRJzeXN0ZW1Db250cm9sU3RvcmUGBAhlbmFibGVkMQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQVzdG9yZQYDCQEBIQEFCGVuYWJsZWQwCQACAQkArAICCQCsAgICFG9wZXJhdGlvbiBwYXVzZWQgYnkgBRJzeXN0ZW1Db250cm9sU3RvcmUCBj1mYWxzZQMJAQEhAQUIZW5hYmxlZDEJAAIBCQCsAgIJAKwCAgIUb3BlcmF0aW9uIHBhdXNlZCBieSAFBXN0b3JlAgY9ZmFsc2UJAJQKAgUDbmlsBgFpAQdwYXVzZU9wAQJvcAQBcwkBDmFzc2VydFNlbnRpbmVsAQgFAWkGY2FsbGVyAwkAAAIFAXMFAXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQ5vcEFsbG93ZWRTdG9yZQEFAm9wBwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXVucGF1c2VPcAECb3AEAXMJAQ5hc3NlcnRTZW50aW5lbAEIBQFpBmNhbGxlcgMJAAACBQFzBQFzBAVzdG9yZQkBDm9wQWxsb3dlZFN0b3JlAQUCb3ADCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFBXN0b3JlBgkAAgECHHVucGF1c2VPcDogaW52YWxpZCBvcGVyYXRpb24ECHNlbnRpbmVsCQClCAEIBQFpBmNhbGxlcgQPdW5wYXVzZWRCeVN0b3JlCQEOb3BVbnBhdXNlU3RvcmUBBQJvcAQNdW5wYXVzZWRCeVN0cgkAnQgCBQR0aGlzBQ91bnBhdXNlZEJ5U3RvcmUEAXEJAQZxdW9ydW0AAwkBCWlzRGVmaW5lZAEFDXVucGF1c2VkQnlTdHIED3VucGF1c2VkQnlWYWx1ZQkBBXZhbHVlAQUNdW5wYXVzZWRCeVN0cgQKdW5wYXVzZWRCeQkAtQkCBQ91bnBhdXNlZEJ5VmFsdWUCASwDCQEJaXNEZWZpbmVkAQkAzwgCBQp1bnBhdXNlZEJ5BQhzZW50aW5lbAkAAgECEWR1cGxpY2F0ZSB1bnBhdXNlAwkAAAIJAGQCCQCQAwEFCnVucGF1c2VkQnkAAQUBcQkAzAgCCQELRGVsZXRlRW50cnkBBQVzdG9yZQkAzAgCCQELRGVsZXRlRW50cnkBBQ91bnBhdXNlZEJ5U3RvcmUFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQ91bnBhdXNlZEJ5U3RvcmUJAKwCAgkArAICBQ91bnBhdXNlZEJ5VmFsdWUCASwFCHNlbnRpbmVsBQNuaWwDCQAAAgUBcQABCQDMCAIJAQtEZWxldGVFbnRyeQEFBXN0b3JlBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUPdW5wYXVzZWRCeVN0b3JlBQhzZW50aW5lbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2FkZFNlbnRpbmVsAQhzZW50aW5lbAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECGm9ubHkgc2VsZiBjYW4gYWRkIHNlbnRpbmVsAwkBASEBCQEJaXNEZWZpbmVkAQUMc2VudGluZWxzU3RyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDnNlbnRpbmVsc1N0b3JlBQhzZW50aW5lbAUDbmlsAwkBCWlzRGVmaW5lZAEJAM8IAgUJc2VudGluZWxzBQhzZW50aW5lbAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFDnNlbnRpbmVsc1N0b3JlCQCsAgIJAKwCAgkBBXZhbHVlAQUMc2VudGluZWxzU3RyAgEsBQhzZW50aW5lbAUDbmlsAQJ0eAEGdmVyaWZ5AAQHZW5hYmxlZAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1jb25maWdBZGRyZXNzCQEOb3BBbGxvd2VkU3RvcmUBAhNnb3Zlcm5hbmNlX2FwcGx5X3R4BgMJAQEhAQUHZW5hYmxlZAkAAgECK3R4IGFwcGxpY2F0aW9uIHRocm93IGdvdmVybmFuY2Ugbm90IGVuYWJsZWQEAmlkCQDYBAEIBQJ0eAJpZAQIYnlWb3RpbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUNdm90aW5nUmVzdWx0cwkArAICCQCsAgIJAKwCAgIZcHJvcG9zYWxfYWxsb3dfYnJvYWRjYXN0XwkApQgBBQR0aGlzAgFfBQJpZAcDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BgUIYnlWb3Rpbme0z8j4", "chainId": 87, "height": 3628638, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2Mmobcc3c3quE33dNi74ymMri657PpJcfnw5N5NCgFrM Next: 5EzNxBr9vB1FFoekrMvEqHps4RjtJkSNpiX2Tys2gJ7u Diff:
OldNewDifferences
1111
1212 let configAddress = this
1313
14+let votingResults = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_result"), "config: no contract_voting_result")), "invalid contract_voting_result")
15+
1416 let HEIGHT = height
1517
1618 func advise () = ("height: " + toString(HEIGHT))
1719
1820
19-let ops = ["governance_apply_tx", "mint", "stake", "stakeFor", "unstake", "unstakeFrom", "3P7S8KE5vb65mrvqTvJ1RcjyqFLcG4YRzkC_claimAndStake", "3P3gzCuAkVj6spBcpPJ86ysEU2oJxEz8Bpn_claimAndStake", "governance_propose_tx", "governance_vote_tx", "governance_retract_vote", "governance_retract_proposal_tx", "project", "commit", "undoCommit", "projectFor", "increraseSkin", "commitFor", "invest", "start", "slash", "complete", "cancel", "undoInvest", "undoCommitFor", "start", "slash"]
21+let ops = ["mint", "stake", "stakeFor", "unstake", "unstakeFrom", "3P7S8KE5vb65mrvqTvJ1RcjyqFLcG4YRzkC_claimAndStake", "3P3gzCuAkVj6spBcpPJ86ysEU2oJxEz8Bpn_claimAndStake", "3PQvswWeXe9Eniue6AMmcVXhQZ3rqergcR8_claimAndStake", "claimAndStake", "restakeFor", "governance_propose_tx", "governance_vote_tx", "governance_retract_vote", "governance_retract_proposal_tx", "governance_apply_tx", "child_governance_propose_tx", "child_governance_vote_tx", "child_governance_retract_vote", "child_governance_retract_proposal_tx", "child_governance_apply_tx", "project", "commit", "undoCommit", "projectFor", "increraseSkin", "commitFor", "invest", "start", "slash", "complete", "cancel", "undoInvest", "undoCommitFor", "start", "slash"]
2022
2123 let systemControlStore = "system_allowed"
2224
122124
123125 @Verifier(tx)
124126 func verify () = {
125- let thisAddress = toString(this)
126- let BASE = 1000
127- let votingAddressStr = valueOrErrorMessage(getString(configAddress, "contract_voting"), "voting address not found")
128- let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting"), "no contract_voting")), "invalid contract_voting")
129- let quorumRatio = valueOrErrorMessage(getInteger(configAddress, (votingAddressStr + "_proposal_quorum_ratio")), "proposalQuorumRatio is not defined")
130- let passedRatio = valueOrErrorMessage(getInteger(configAddress, (votingAddressStr + "_proposal_passed_ratio")), "proposalThresholdRatio is not defined")
131- let id = toBase58String(tx.id)
132- let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
133- let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
134- let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
135- let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
136- let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
137- let totalPower = valueOrElse(getInteger(votingContract, ("proposal_power_" + id)), 0)
138127 let enabled = valueOrElse(getBoolean(configAddress, opAllowedStore("governance_apply_tx")), true)
139- let voteYes = votesYes
140- let voteNo = votesNo
141- let totalVotes = (voteYes + voteNo)
142- let hasQuorum = (((totalVotes * BASE) / totalPower) >= quorumRatio)
143- let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
144- let tooEarly = (applyStart >= HEIGHT)
145- let tooLate = (HEIGHT >= applyEnd)
146- let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
147- let byVoting = if (!(enabled))
128+ if (!(enabled))
148129 then throw("tx application throw governance not enabled")
149- else if (tooEarly)
150- then throw(("proposal can't be executed as it's too early: " + timeDebug))
151- else if (tooLate)
152- then throw(("proposal can't be executed as it's too late:" + timeDebug))
153- else if (!(hasQuorum))
154- then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalPower: ") + toString(totalPower)) + ", quorumRatio: ") + toString(quorumRatio)))
155- else if (!(hasPassed))
156- then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
157- else true
158- if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
159- then true
160- else byVoting
130+ else {
131+ let id = toBase58String(tx.id)
132+ let byVoting = valueOrElse(getBoolean(votingResults, ((("proposal_allow_broadcast_" + toString(this)) + "_") + id)), false)
133+ if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
134+ then true
135+ else byVoting
136+ }
161137 }
162138
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func writeString (key,value) = StringEntry(key, value)
55
66
77 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
88 then StringEntry(key, value)
99 else throw(("already initialized: " + key))
1010
1111
1212 let configAddress = this
1313
14+let votingResults = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_result"), "config: no contract_voting_result")), "invalid contract_voting_result")
15+
1416 let HEIGHT = height
1517
1618 func advise () = ("height: " + toString(HEIGHT))
1719
1820
19-let ops = ["governance_apply_tx", "mint", "stake", "stakeFor", "unstake", "unstakeFrom", "3P7S8KE5vb65mrvqTvJ1RcjyqFLcG4YRzkC_claimAndStake", "3P3gzCuAkVj6spBcpPJ86ysEU2oJxEz8Bpn_claimAndStake", "governance_propose_tx", "governance_vote_tx", "governance_retract_vote", "governance_retract_proposal_tx", "project", "commit", "undoCommit", "projectFor", "increraseSkin", "commitFor", "invest", "start", "slash", "complete", "cancel", "undoInvest", "undoCommitFor", "start", "slash"]
21+let ops = ["mint", "stake", "stakeFor", "unstake", "unstakeFrom", "3P7S8KE5vb65mrvqTvJ1RcjyqFLcG4YRzkC_claimAndStake", "3P3gzCuAkVj6spBcpPJ86ysEU2oJxEz8Bpn_claimAndStake", "3PQvswWeXe9Eniue6AMmcVXhQZ3rqergcR8_claimAndStake", "claimAndStake", "restakeFor", "governance_propose_tx", "governance_vote_tx", "governance_retract_vote", "governance_retract_proposal_tx", "governance_apply_tx", "child_governance_propose_tx", "child_governance_vote_tx", "child_governance_retract_vote", "child_governance_retract_proposal_tx", "child_governance_apply_tx", "project", "commit", "undoCommit", "projectFor", "increraseSkin", "commitFor", "invest", "start", "slash", "complete", "cancel", "undoInvest", "undoCommitFor", "start", "slash"]
2022
2123 let systemControlStore = "system_allowed"
2224
2325 func opAllowedStore (op) = if (isDefined(indexOf(ops, op)))
2426 then (("op_" + op) + "_allowed")
2527 else throw((("Invalid argument: op. " + op) + " operation is not registered"))
2628
2729
2830 func opUnpauseStore (op) = (("op_" + op) + "_unpaused_by")
2931
3032
3133 let sentinelsStore = "sentinels"
3234
3335 let sentinelsStr = getString(this, sentinelsStore)
3436
3537 let sentinels = if (isDefined(sentinelsStr))
3638 then split(value(sentinelsStr), ",")
3739 else nil
3840
3941 func assertSentinel (s) = valueOrErrorMessage(indexOf(sentinels, toString(s)), "pauseOp denied")
4042
4143
4244 func quorum () = {
4345 let all = size(sentinels)
4446 if ((3 > all))
4547 then 1
4648 else ((all / 2) + 1)
4749 }
4850
4951
5052 @Callable(i)
5153 func opAllowed (op) = {
5254 let store = opAllowedStore(op)
5355 if (contains(valueOrElse(getString(this, "stoplist"), ""), toString(i.originCaller)))
5456 then throw("operation paused by stoplist")
5557 else if (contains(valueOrElse(getString(this, "exc"), ""), toString(i.originCaller)))
5658 then $Tuple2(nil, true)
5759 else {
5860 let enabled0 = valueOrElse(getBoolean(this, systemControlStore), true)
5961 let enabled1 = valueOrElse(getBoolean(this, store), true)
6062 if (!(enabled0))
6163 then throw((("operation paused by " + systemControlStore) + "=false"))
6264 else if (!(enabled1))
6365 then throw((("operation paused by " + store) + "=false"))
6466 else $Tuple2(nil, true)
6567 }
6668 }
6769
6870
6971
7072 @Callable(i)
7173 func pauseOp (op) = {
7274 let s = assertSentinel(i.caller)
7375 if ((s == s))
7476 then [BooleanEntry(opAllowedStore(op), false)]
7577 else throw("Strict value is not equal to itself.")
7678 }
7779
7880
7981
8082 @Callable(i)
8183 func unpauseOp (op) = {
8284 let s = assertSentinel(i.caller)
8385 if ((s == s))
8486 then {
8587 let store = opAllowedStore(op)
8688 if (valueOrElse(getBoolean(this, store), true))
8789 then throw("unpauseOp: invalid operation")
8890 else {
8991 let sentinel = toString(i.caller)
9092 let unpausedByStore = opUnpauseStore(op)
9193 let unpausedByStr = getString(this, unpausedByStore)
9294 let q = quorum()
9395 if (isDefined(unpausedByStr))
9496 then {
9597 let unpausedByValue = value(unpausedByStr)
9698 let unpausedBy = split(unpausedByValue, ",")
9799 if (isDefined(indexOf(unpausedBy, sentinel)))
98100 then throw("duplicate unpause")
99101 else if (((size(unpausedBy) + 1) == q))
100102 then [DeleteEntry(store), DeleteEntry(unpausedByStore)]
101103 else [StringEntry(unpausedByStore, ((unpausedByValue + ",") + sentinel))]
102104 }
103105 else if ((q == 1))
104106 then [DeleteEntry(store)]
105107 else [StringEntry(unpausedByStore, sentinel)]
106108 }
107109 }
108110 else throw("Strict value is not equal to itself.")
109111 }
110112
111113
112114
113115 @Callable(i)
114116 func addSentinel (sentinel) = if ((i.caller != this))
115117 then throw("only self can add sentinel")
116118 else if (!(isDefined(sentinelsStr)))
117119 then [StringEntry(sentinelsStore, sentinel)]
118120 else if (isDefined(indexOf(sentinels, sentinel)))
119121 then nil
120122 else [StringEntry(sentinelsStore, ((value(sentinelsStr) + ",") + sentinel))]
121123
122124
123125 @Verifier(tx)
124126 func verify () = {
125- let thisAddress = toString(this)
126- let BASE = 1000
127- let votingAddressStr = valueOrErrorMessage(getString(configAddress, "contract_voting"), "voting address not found")
128- let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting"), "no contract_voting")), "invalid contract_voting")
129- let quorumRatio = valueOrErrorMessage(getInteger(configAddress, (votingAddressStr + "_proposal_quorum_ratio")), "proposalQuorumRatio is not defined")
130- let passedRatio = valueOrErrorMessage(getInteger(configAddress, (votingAddressStr + "_proposal_passed_ratio")), "proposalThresholdRatio is not defined")
131- let id = toBase58String(tx.id)
132- let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
133- let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
134- let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
135- let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
136- let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
137- let totalPower = valueOrElse(getInteger(votingContract, ("proposal_power_" + id)), 0)
138127 let enabled = valueOrElse(getBoolean(configAddress, opAllowedStore("governance_apply_tx")), true)
139- let voteYes = votesYes
140- let voteNo = votesNo
141- let totalVotes = (voteYes + voteNo)
142- let hasQuorum = (((totalVotes * BASE) / totalPower) >= quorumRatio)
143- let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
144- let tooEarly = (applyStart >= HEIGHT)
145- let tooLate = (HEIGHT >= applyEnd)
146- let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
147- let byVoting = if (!(enabled))
128+ if (!(enabled))
148129 then throw("tx application throw governance not enabled")
149- else if (tooEarly)
150- then throw(("proposal can't be executed as it's too early: " + timeDebug))
151- else if (tooLate)
152- then throw(("proposal can't be executed as it's too late:" + timeDebug))
153- else if (!(hasQuorum))
154- then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalPower: ") + toString(totalPower)) + ", quorumRatio: ") + toString(quorumRatio)))
155- else if (!(hasPassed))
156- then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
157- else true
158- if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
159- then true
160- else byVoting
130+ else {
131+ let id = toBase58String(tx.id)
132+ let byVoting = valueOrElse(getBoolean(votingResults, ((("proposal_allow_broadcast_" + toString(this)) + "_") + id)), false)
133+ if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
134+ then true
135+ else byVoting
136+ }
161137 }
162138

github/deemru/w8io/786bc32 
33.96 ms