tx · Fmkiv7jrqs1VyFfy9Lk6F9J4TYoDx8vicWhwvUxoKukn

3PRBVq52csUvTx77NYwLTULrt2e9jdsHfRB:  -0.01000000 Waves

2023.01.25 14:58 [3485982] smart account 3PRBVq52csUvTx77NYwLTULrt2e9jdsHfRB > SELF 0.00000000 Waves

{ "type": 13, "id": "Fmkiv7jrqs1VyFfy9Lk6F9J4TYoDx8vicWhwvUxoKukn", "fee": 1000000, "feeAssetId": null, "timestamp": 1674647898045, "version": 1, "sender": "3PRBVq52csUvTx77NYwLTULrt2e9jdsHfRB", "senderPublicKey": "9XcgkNhoevmBJ1hdDkEQ7joCc8LgpnGx6chYf8uiQZ7t", "proofs": [ "2tVXgqch6AQZRfUgQu2yi4vhr3CjUbqEyxVn1Rd7CzoMLixp3mQPbALa2PtHNn1Cdg6shz8gGrjW2zgWX7gbWtiH" ], "script": "base64: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dmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAYbGltaXRlcjI6IGludmFsaWQgYWN0aW9uCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAABEJBU0UAAAAAAAAAA+gEAAAAC3F1b3J1bVJhdGlvCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAVcHJvcG9zYWxfcXVvcnVtX3JhdGlvAgAAACJwcm9wb3NhbFF1b3J1bVJhdGlvIGlzIG5vdCBkZWZpbmVkBAAAAAtwYXNzZWRSYXRpbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAFXByb3Bvc2FsX3Bhc3NlZF9yYXRpbwIAAAAlcHJvcG9zYWxUaHJlc2hvbGRSYXRpbyBpcyBub3QgZGVmaW5lZAQAAAAOZ1ZpcmVzQ29udHJhY3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAASZGl2aWRlbmRzX2NvbnRyYWN0AgAAABVubyBkaXZpZGVuZHNfY29udHJhY3QCAAAAGmludmFsaWQgZGl2aWRlbmRzX2NvbnRyYWN0BAAAAA52b3RpbmdDb250cmFjdAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAA1jb25maWdBZGRyZXNzAgAAAA92b3RpbmdfY29udHJhY3QCAAAAEm5vIHZvdGluZ19jb250cmFjdAIAAAAXaW52YWxpZCB2b3RpbmdfY29udHJhY3QEAAAAAmlkCQACWAAAAAEIBQAAAAJ0eAAAAAJpZAQAAAAIdm90ZXNZZXMJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAOdm90aW5nQ29udHJhY3QJAAEsAAAAAgIAAAANcHJvcG9zYWxfeWVzXwUAAAACaWQAAAAAAAAAAAAEAAAAB3ZvdGVzTm8JAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAOdm90aW5nQ29udHJhY3QJAAEsAAAAAgIAAAAMcHJvcG9zYWxfbm9fBQAAAAJpZAAAAAAAAAAAAAQAAAAOcHJvcG9zYWxIZWlnaHQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA52b3RpbmdDb250cmFjdAkAASwAAAACAgAAABBwcm9wb3NhbF9oZWlnaHRfBQAAAAJpZAIAAAAXcHJvcG9zYWwgbm90IHJlZ2lzdGVyZWQEAAAACmFwcGx5U3RhcnQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAOdm90aW5nQ29udHJhY3QJAAEsAAAAAgIAAAAUcHJvcG9zYWxfYXBwbHlzdGFydF8FAAAAAmlkAAAAAAAAAAAABAAAAAhhcHBseUVuZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA52b3RpbmdDb250cmFjdAkAASwAAAACAgAAABJwcm9wb3NhbF9hcHBseWVuZF8FAAAAAmlkAAAAAAAAAAAABAAAAAt0b3RhbEdWaXJlcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA52b3RpbmdDb250cmFjdAkAASwAAAACAgAAABBwcm9wb3NhbF9ndmlyZXNfBQAAAAJpZAAAAAAAAAAAAAQAAAAHZW5hYmxlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAA1jb25maWdBZGRyZXNzAgAAAB1vcF9nb3Zlcm5hbmNlX2FwcGx5X3R4X3BhdXNlZAcEAAAAB3ZvdGVZZXMFAAAACHZvdGVzWWVzBAAAAAZ2b3RlTm8FAAAAB3ZvdGVzTm8EAAAACnRvdGFsVm90ZXMJAABkAAAAAgUAAAAHdm90ZVllcwUAAAAGdm90ZU5vBAAAAAloYXNRdW9ydW0JAABnAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAACnRvdGFsVm90ZXMFAAAABEJBU0UFAAAAC3RvdGFsR1ZpcmVzBQAAAAtxdW9ydW1SYXRpbwQAAAAJaGFzUGFzc2VkCQAAZwAAAAIJAABpAAAAAgkAAGgAAAACBQAAAAd2b3RlWWVzBQAAAARCQVNFBQAAAAp0b3RhbFZvdGVzBQAAAAtwYXNzZWRSYXRpbwQAAAAIdG9vRWFybHkJAABnAAAAAgUAAAAKYXBwbHlTdGFydAUAAAAGSEVJR0hUBAAAAAd0b29MYXRlCQAAZwAAAAIFAAAABkhFSUdIVAUAAAAIYXBwbHlFbmQEAAAACXRpbWVEZWJ1ZwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABFwcm9wb3NhbEhlaWdodCA9IAkAAaQAAAABBQAAAA5wcm9wb3NhbEhlaWdodAIAAAAPLCBhcHBseVN0YXJ0ID0gCQABpAAAAAEFAAAACmFwcGx5U3RhcnQCAAAADSwgYXBwbHlFbmQgPSAJAAGkAAAAAQUAAAAIYXBwbHlFbmQCAAAACywgSEVJR0hUID0gCQABpAAAAAEFAAAABkhFSUdIVAQAAAAIYnlWb3RpbmcDCQEAAAABIQAAAAEFAAAAB2VuYWJsZWQJAAACAAAAAQIAAAArdHggYXBwbGljYXRpb24gdGhyb3cgZ292ZXJuYW5jZSBub3QgZW5hYmxlZAMFAAAACHRvb0Vhcmx5CQAAAgAAAAEJAAEsAAAAAgIAAAAucHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gZWFybHk6IAUAAAAJdGltZURlYnVnAwUAAAAHdG9vTGF0ZQkAAAIAAAABCQABLAAAAAICAAAALHByb3Bvc2FsIGNhbid0IGJlIGV4ZWN1dGVkIGFzIGl0J3MgdG9vIGxhdGU6BQAAAAl0aW1lRGVidWcDCQEAAAABIQAAAAEFAAAACWhhc1F1b3J1bQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAtubyBxdW9ydW06IAIAAAAMdG90YWxWb3RlczogCQABpAAAAAEFAAAACnRvdGFsVm90ZXMCAAAADywgdG90YWxHVmlyZXM6IAkAAaQAAAABBQAAAAt0b3RhbEdWaXJlcwIAAAAPLCBxdW9ydW1SYXRpbzogCQABpAAAAAEFAAAAC3F1b3J1bVJhdGlvAwkBAAAAASEAAAABBQAAAAloYXNQYXNzZWQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAXbm8gdGhyZXNob2xkIGFjaGlldmVkOiACAAAACXZvdGVZZXM6IAkAAaQAAAABBQAAAAd2b3RlWWVzAgAAAAosIHZvdGVObzogCQABpAAAAAEFAAAABnZvdGVObwIAAAAPLCBwYXNzZWRSYXRpbzogCQABpAAAAAEFAAAAC3Bhc3NlZFJhdGlvBgMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5BgUAAAAIYnlWb3RpbmcMSkmW", "chainId": 87, "height": 3485982, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Eq8fuGgacUCLjqBMNrcgtCNm9boN8YaSSmnuyNqysJLu Next: none Diff:
OldNewDifferences
177177 }
178178
179179
180+@Verifier(tx)
181+func verify () = {
182+ let BASE = 1000
183+ let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
184+ let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
185+ let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
186+ let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
187+ let id = toBase58String(tx.id)
188+ let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
189+ let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
190+ let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
191+ let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
192+ let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
193+ let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
194+ let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
195+ let voteYes = votesYes
196+ let voteNo = votesNo
197+ let totalVotes = (voteYes + voteNo)
198+ let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
199+ let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
200+ let tooEarly = (applyStart >= HEIGHT)
201+ let tooLate = (HEIGHT >= applyEnd)
202+ let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
203+ let byVoting = if (!(enabled))
204+ then throw("tx application throw governance not enabled")
205+ else if (tooEarly)
206+ then throw(("proposal can't be executed as it's too early: " + timeDebug))
207+ else if (tooLate)
208+ then throw(("proposal can't be executed as it's too late:" + timeDebug))
209+ else if (!(hasQuorum))
210+ then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
211+ else if (!(hasPassed))
212+ then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
213+ else true
214+ if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
215+ then true
216+ else byVoting
217+ }
218+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
55 then StringEntry(key, value)
66 else throw(("already initialized: " + key))
77
88
99 let configStore = "config"
1010
1111 let configAddress = addressFromStringValue(getStringValue(this, configStore))
1212
1313 let aIdS = "assetId"
1414
1515 let factorsBase = 1000
1616
1717 func asInt2 (value) = match value {
1818 case x: (Int, Int) =>
1919 x
2020 case t =>
2121 throw("wrong type, expected: Int2")
2222 }
2323
2424
2525 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
2626 case s: String =>
2727 addressFromString(s)
2828 case _ =>
2929 unit
3030 }
3131
3232 let HEIGHT = height
3333
3434 let timeframe = valueOrElse(getInteger(configAddress, "WithdrawLimitTimeframe"), 1440)
3535
3636 let currentEpochStart = ((HEIGHT / timeframe) * timeframe)
3737
3838 func userWithdrawnWithinEpochStore (user,assetId) = ((user + "_used_") + assetId)
3939
4040
4141 func globalImportedPerEpochPerReserveStore (reserve) = ((("global_imported_" + reserve) + "_") + toString(currentEpochStart))
4242
4343
4444 let breakpoints = (split(valueOrElse(getString(configAddress, "LimitUtilizationBreakpoints"), "0"), "|") ++ ["0"])
4545
4646 func actionThreshold (action,assetId) = {
4747 let key = (((assetId + "_") + action) + "_utilization_threshold")
4848 valueOrElse(getInteger(configAddress, key), 1100)
4949 }
5050
5151
5252 func limit (assetId,util) = {
5353 let breakpoint = {
5454 func fold (a,bp) = if ((util >= a))
5555 then a
5656 else parseIntValue(bp)
5757
5858 let $l = breakpoints
5959 let $s = size($l)
6060 let $acc0 = parseIntValue(breakpoints[0])
6161 func $f0_1 ($a,$i) = if (($i >= $s))
6262 then $a
6363 else fold($a, $l[$i])
6464
6565 func $f0_2 ($a,$i) = if (($i >= $s))
6666 then $a
6767 else throw("List size exceeds 10")
6868
6969 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
7070 }
7171 getInteger(configAddress, (((assetId + "_") + toString(breakpoint)) + "_acc_limit"))
7272 }
7373
7474
7575 func ensureActionThreshold (action,assetId,util) = {
7676 let at = actionThreshold(action, assetId)
7777 if ((util >= at))
7878 then throw(((((((action + " of ") + assetId) + " paused due to high utilization: ") + toString(util)) + " >= ") + toString(at)))
7979 else true
8080 }
8181
8282
8383 func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
8484 then true
8585 else throw("limiter2: only main can do")
8686
8787
8888 @Callable(i)
8989 func initialize (ca) = [writeConstString(configStore, ca)]
9090
9191
9292
9393 @Callable(i)
9494 func validateLimit (action,reserve,user,amount) = {
9595 let m = mainOnly(i)
9696 if ((m == m))
9797 then {
9898 let rsr = addressFromStringValue(reserve)
9999 let assetId = valueOrErrorMessage(getString(rsr, aIdS), "no assetId")
100100 let $t024842564 = asInt2(invoke(rsr, "storedDepositBorrow", nil, nil))
101101 let totalDeposit = $t024842564._1
102102 let totalDebt = $t024842564._2
103103 let util = if ((totalDeposit > 0))
104104 then min([factorsBase, fraction(totalDebt, factorsBase, totalDeposit)])
105105 else 0
106106 if (if ((action == "borrow"))
107107 then true
108108 else (action == "withdraw"))
109109 then {
110110 let at = ensureActionThreshold(action, assetId, util)
111111 if ((at == at))
112112 then match limit(assetId, util) {
113113 case lmt: Int =>
114114 if ((0 > lmt))
115115 then $Tuple2(nil, -1)
116116 else if ((lmt == 0))
117117 then throw((action + " is denied"))
118118 else {
119119 let store = userWithdrawnWithinEpochStore(user, assetId)
120120 let $t030473279 = match getString(store) {
121121 case s: String =>
122122 let data = split(s, "|")
123123 $Tuple2(parseIntValue(data[0]), parseIntValue(data[1]))
124124 case _ =>
125125 $Tuple2(0, 0)
126126 }
127127 let epoch = $t030473279._1
128128 let withdrawn = $t030473279._2
129129 let userWithdrawnWithinCurrentEpoch = if ((epoch == currentEpochStart))
130130 then withdrawn
131131 else 0
132132 let newTotal = (userWithdrawnWithinCurrentEpoch + amount)
133133 if ((newTotal > lmt))
134134 then {
135135 let currentEpochEnd = ((1 + (HEIGHT / timeframe)) * timeframe)
136136 throw(((((((((((((("breaching " + action) + " limit ") + toString(lmt)) + " ") + assetId) + " over ") + toString(timeframe)) + " blocks. Available: ") + toString((lmt - userWithdrawnWithinCurrentEpoch))) + " current epoch: ") + toString(currentEpochStart)) + "-") + toString(currentEpochEnd)))
137137 }
138138 else {
139139 let data = ((toString(currentEpochStart) + "|") + toString(newTotal))
140140 $Tuple2([StringEntry(store, data)], (lmt - newTotal))
141141 }
142142 }
143143 case _ =>
144144 $Tuple2(nil, -1)
145145 }
146146 else throw("Strict value is not equal to itself.")
147147 }
148148 else if ((action == "import"))
149149 then {
150150 let at = actionThreshold(action, assetId)
151151 let importAllowedReserves = valueOrElse(getString(configAddress, "import_always_allowed_reserves"), "")
152152 let importException = contains(importAllowedReserves, reserve)
153153 if (if (!(importException))
154154 then (util >= at)
155155 else false)
156156 then throw(((((((action + " of ") + assetId) + " paused due to high utilization: ") + toString(util)) + " >= ") + toString(at)))
157157 else {
158158 let globalLimit = valueOrElse(getInteger(configAddress, ("daily_import_limit_" + reserve)), 1000000000000000)
159159 let store = globalImportedPerEpochPerReserveStore(reserve)
160160 let globalImported = valueOrElse(getInteger(this, store), 0)
161161 let newTotal = (globalImported + amount)
162162 if ((newTotal > globalLimit))
163163 then throw("import limit exceeded")
164164 else $Tuple2([IntegerEntry(store, newTotal)], (globalLimit - newTotal))
165165 }
166166 }
167167 else if ((action == "redeem"))
168168 then {
169169 let at = ensureActionThreshold(action, assetId, util)
170170 if ((at == at))
171171 then $Tuple2(nil, -1)
172172 else throw("Strict value is not equal to itself.")
173173 }
174174 else throw("limiter2: invalid action")
175175 }
176176 else throw("Strict value is not equal to itself.")
177177 }
178178
179179
180+@Verifier(tx)
181+func verify () = {
182+ let BASE = 1000
183+ let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
184+ let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
185+ let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
186+ let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
187+ let id = toBase58String(tx.id)
188+ let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
189+ let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
190+ let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
191+ let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
192+ let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
193+ let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
194+ let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
195+ let voteYes = votesYes
196+ let voteNo = votesNo
197+ let totalVotes = (voteYes + voteNo)
198+ let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
199+ let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
200+ let tooEarly = (applyStart >= HEIGHT)
201+ let tooLate = (HEIGHT >= applyEnd)
202+ let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
203+ let byVoting = if (!(enabled))
204+ then throw("tx application throw governance not enabled")
205+ else if (tooEarly)
206+ then throw(("proposal can't be executed as it's too early: " + timeDebug))
207+ else if (tooLate)
208+ then throw(("proposal can't be executed as it's too late:" + timeDebug))
209+ else if (!(hasQuorum))
210+ then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
211+ else if (!(hasPassed))
212+ then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
213+ else true
214+ if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
215+ then true
216+ else byVoting
217+ }
218+

github/deemru/w8io/3ef1775 
87.50 ms