tx · EKSdCXVUqHAXu5KLrkGqyQbnzAFprNSFFDYD3fYHNNkH

3PRBVq52csUvTx77NYwLTULrt2e9jdsHfRB:  -0.01000000 Waves

2022.05.07 14:44 [3106715] smart account 3PRBVq52csUvTx77NYwLTULrt2e9jdsHfRB > SELF 0.00000000 Waves

{ "type": 13, "id": "EKSdCXVUqHAXu5KLrkGqyQbnzAFprNSFFDYD3fYHNNkH", "fee": 1000000, "feeAssetId": null, "timestamp": 1651923914988, "version": 1, "sender": "3PRBVq52csUvTx77NYwLTULrt2e9jdsHfRB", "senderPublicKey": "9XcgkNhoevmBJ1hdDkEQ7joCc8LgpnGx6chYf8uiQZ7t", "proofs": [ "2ShqFrc1DDmNg9ZkE5qKWYZC7ixBu1XpMjA6AEDzk17Zqb7Wjp9NhDLCoyCCsphaxGQDtaWe6R6HK4CS2DmT7MMW" ], "script": "base64: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", "chainId": 87, "height": 3106715, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GqTuFRKwS6eisxWVadmWbUHmdcLAAWpZW2M3gtmyxF9i Next: JDZp4E8zVopP3nEg38YCWK5T19LWQ7Zm5TwqxRrsFQam Diff:
OldNewDifferences
99 let configStore = "config"
1010
1111 let configAddress = addressFromStringValue(getStringValue(this, configStore))
12+
13+let aIdS = "assetId"
14+
15+let factorsBase = 1000
1216
1317 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
1418 case s: String =>
2226 func userWithdrawnWithinEpochStore (user,assetId) = ((user + "_used_") + assetId)
2327
2428
25-let timeframe = valueOrElse(getInteger(configAddress, "WithdrawLimitTimeframe"), 1)
29+let timeframe = valueOrElse(getInteger(configAddress, "WithdrawLimitTimeframe"), 1440)
2630
2731 let breakpoints = (split(valueOrElse(getString(configAddress, "LimitUtilizationBreakpoints"), "0"), "|") ++ ["0"])
2832
7983
8084
8185 @Callable(i)
82-func validateLimit (action,assetId,user,amount,util) = {
86+func validateLimit (action,reserve,user,amount) = {
8387 let m = if (mainOnly(i))
8488 then validAction(action)
8589 else false
8690 if ((m == m))
8791 then {
92+ let rsr = addressFromStringValue(reserve)
93+ let assetId = valueOrErrorMessage(getString(rsr, aIdS), "no assetId")
94+ let totalDebt = valueOrErrorMessage(getInteger(rsr, "totalBorrow"), "no totalBorrow")
95+ let totalDeposit = valueOrErrorMessage(getInteger(rsr, "totalDeposit"), "no totalDeposit")
96+ let util = if ((totalDeposit > 0))
97+ then min([factorsBase, fraction(totalDebt, factorsBase, totalDeposit)])
98+ else 0
8899 let at = ensureActionThreshold(action, assetId, util)
89100 if ((at == at))
90101 then if (if ((action != "borrow"))
101112 let currentEpochStart = ((HEIGHT / timeframe) * timeframe)
102113 let currentEpochEnd = ((1 + (HEIGHT / timeframe)) * timeframe)
103114 let store = userWithdrawnWithinEpochStore(user, assetId)
104- let $t026962940 = match getString(store) {
115+ let $t031543386 = match getString(store) {
105116 case s: String =>
106117 let data = split(s, "|")
107118 $Tuple2(parseIntValue(data[0]), parseIntValue(data[1]))
108119 case _ =>
109120 $Tuple2(0, 0)
110121 }
111- let epoch = $t026962940._1
112- let withdrawn = $t026962940._2
113- let userWithdrawnWithinCurrentEpoch = if ((epoch == currentEpochStart))
122+ let epoch = $t031543386._1
123+ let withdrawn = $t031543386._2
124+ let limiterV1Withdrawn = {
125+ let v1Key = ((("withdrawn_" + user) + "_") + assetId)
126+ let v1Address = "3PFoA1JFDoLWQJ3DqzAHNrrWR4riVuBfHks"
127+ match addressFromString(v1Address) {
128+ case a: Address =>
129+ let $t036643942 = match getString(a, v1Key) {
130+ case s: String =>
131+ let data = split(s, "|")
132+ $Tuple2(parseIntValue(data[0]), parseIntValue(data[1]))
133+ case _ =>
134+ $Tuple2(0, 0)
135+ }
136+ let v1epoch = $t036643942._1
137+ let v1withdrawn = $t036643942._2
138+ if ((v1epoch == currentEpochStart))
139+ then v1withdrawn
140+ else 0
141+ case _ =>
142+ 0
143+ }
144+ }
145+ let userWithdrawnWithinCurrentEpoch = (limiterV1Withdrawn + (if ((epoch == currentEpochStart))
114146 then withdrawn
115- else 0
147+ else 0))
116148 if (((userWithdrawnWithinCurrentEpoch + amount) > lmt))
117149 then throw(((((((((((((("breaching " + action) + " limit ") + toString(lmt)) + " ") + assetId) + " over ") + toString(timeframe)) + " blocks. Available: ") + toString((lmt - userWithdrawnWithinCurrentEpoch))) + " current epoch: ") + toString(currentEpochStart)) + "-") + toString(currentEpochEnd)))
118150 else $Tuple2([StringEntry(store, ((toString(currentEpochStart) + "|") + toString((userWithdrawnWithinCurrentEpoch + amount))))], ((lmt - userWithdrawnWithinCurrentEpoch) - amount))
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))
12+
13+let aIdS = "assetId"
14+
15+let factorsBase = 1000
1216
1317 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
1418 case s: String =>
1519 addressFromString(s)
1620 case _ =>
1721 unit
1822 }
1923
2024 let HEIGHT = height
2125
2226 func userWithdrawnWithinEpochStore (user,assetId) = ((user + "_used_") + assetId)
2327
2428
25-let timeframe = valueOrElse(getInteger(configAddress, "WithdrawLimitTimeframe"), 1)
29+let timeframe = valueOrElse(getInteger(configAddress, "WithdrawLimitTimeframe"), 1440)
2630
2731 let breakpoints = (split(valueOrElse(getString(configAddress, "LimitUtilizationBreakpoints"), "0"), "|") ++ ["0"])
2832
2933 func actionThreshold (action,assetId) = {
3034 let key = (((assetId + "_") + action) + "_utilization_threshold")
3135 valueOrElse(getInteger(configAddress, key), 1100)
3236 }
3337
3438
3539 func limit (assetId,util) = {
3640 let breakpoint = {
3741 func fold (a,bp) = if ((util >= a))
3842 then a
3943 else parseIntValue(bp)
4044
4145 let $l = breakpoints
4246 let $s = size($l)
4347 let $acc0 = parseIntValue(breakpoints[0])
4448 func $f0_1 ($a,$i) = if (($i >= $s))
4549 then $a
4650 else fold($a, $l[$i])
4751
4852 func $f0_2 ($a,$i) = if (($i >= $s))
4953 then $a
5054 else throw("List size exceeds 10")
5155
5256 $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)
5357 }
5458 getInteger(configAddress, (((assetId + "_") + toString(breakpoint)) + "_acc_limit"))
5559 }
5660
5761
5862 func ensureActionThreshold (action,assetId,util) = {
5963 let at = actionThreshold(action, assetId)
6064 if ((util >= at))
6165 then throw(((((((action + " of ") + assetId) + " paused due to high utilization: ") + toString(util)) + " >= ") + toString(at)))
6266 else true
6367 }
6468
6569
6670 func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
6771 then true
6872 else throw("limiter2: only main can do")
6973
7074
7175 func validAction (action) = if (contains("borrow|withdraw|import|redeem", action))
7276 then true
7377 else throw("limiter2: invalid action")
7478
7579
7680 @Callable(i)
7781 func initialize (ca) = [writeConstString(configStore, ca)]
7882
7983
8084
8185 @Callable(i)
82-func validateLimit (action,assetId,user,amount,util) = {
86+func validateLimit (action,reserve,user,amount) = {
8387 let m = if (mainOnly(i))
8488 then validAction(action)
8589 else false
8690 if ((m == m))
8791 then {
92+ let rsr = addressFromStringValue(reserve)
93+ let assetId = valueOrErrorMessage(getString(rsr, aIdS), "no assetId")
94+ let totalDebt = valueOrErrorMessage(getInteger(rsr, "totalBorrow"), "no totalBorrow")
95+ let totalDeposit = valueOrErrorMessage(getInteger(rsr, "totalDeposit"), "no totalDeposit")
96+ let util = if ((totalDeposit > 0))
97+ then min([factorsBase, fraction(totalDebt, factorsBase, totalDeposit)])
98+ else 0
8899 let at = ensureActionThreshold(action, assetId, util)
89100 if ((at == at))
90101 then if (if ((action != "borrow"))
91102 then (action != "withdraw")
92103 else false)
93104 then $Tuple2(nil, -1)
94105 else match limit(assetId, util) {
95106 case lmt: Int =>
96107 if ((0 > lmt))
97108 then $Tuple2(nil, -1)
98109 else if ((lmt == 0))
99110 then throw((action + " is denied"))
100111 else {
101112 let currentEpochStart = ((HEIGHT / timeframe) * timeframe)
102113 let currentEpochEnd = ((1 + (HEIGHT / timeframe)) * timeframe)
103114 let store = userWithdrawnWithinEpochStore(user, assetId)
104- let $t026962940 = match getString(store) {
115+ let $t031543386 = match getString(store) {
105116 case s: String =>
106117 let data = split(s, "|")
107118 $Tuple2(parseIntValue(data[0]), parseIntValue(data[1]))
108119 case _ =>
109120 $Tuple2(0, 0)
110121 }
111- let epoch = $t026962940._1
112- let withdrawn = $t026962940._2
113- let userWithdrawnWithinCurrentEpoch = if ((epoch == currentEpochStart))
122+ let epoch = $t031543386._1
123+ let withdrawn = $t031543386._2
124+ let limiterV1Withdrawn = {
125+ let v1Key = ((("withdrawn_" + user) + "_") + assetId)
126+ let v1Address = "3PFoA1JFDoLWQJ3DqzAHNrrWR4riVuBfHks"
127+ match addressFromString(v1Address) {
128+ case a: Address =>
129+ let $t036643942 = match getString(a, v1Key) {
130+ case s: String =>
131+ let data = split(s, "|")
132+ $Tuple2(parseIntValue(data[0]), parseIntValue(data[1]))
133+ case _ =>
134+ $Tuple2(0, 0)
135+ }
136+ let v1epoch = $t036643942._1
137+ let v1withdrawn = $t036643942._2
138+ if ((v1epoch == currentEpochStart))
139+ then v1withdrawn
140+ else 0
141+ case _ =>
142+ 0
143+ }
144+ }
145+ let userWithdrawnWithinCurrentEpoch = (limiterV1Withdrawn + (if ((epoch == currentEpochStart))
114146 then withdrawn
115- else 0
147+ else 0))
116148 if (((userWithdrawnWithinCurrentEpoch + amount) > lmt))
117149 then throw(((((((((((((("breaching " + action) + " limit ") + toString(lmt)) + " ") + assetId) + " over ") + toString(timeframe)) + " blocks. Available: ") + toString((lmt - userWithdrawnWithinCurrentEpoch))) + " current epoch: ") + toString(currentEpochStart)) + "-") + toString(currentEpochEnd)))
118150 else $Tuple2([StringEntry(store, ((toString(currentEpochStart) + "|") + toString((userWithdrawnWithinCurrentEpoch + amount))))], ((lmt - userWithdrawnWithinCurrentEpoch) - amount))
119151 }
120152 case _ =>
121153 $Tuple2(nil, -1)
122154 }
123155 else throw("Strict value is not equal to itself.")
124156 }
125157 else throw("Strict value is not equal to itself.")
126158 }
127159
128160

github/deemru/w8io/3ef1775 
47.97 ms