tx · GqTuFRKwS6eisxWVadmWbUHmdcLAAWpZW2M3gtmyxF9i

3PRBVq52csUvTx77NYwLTULrt2e9jdsHfRB:  -0.01000000 Waves

2022.05.04 13:10 [3102285] smart account 3PRBVq52csUvTx77NYwLTULrt2e9jdsHfRB > SELF 0.00000000 Waves

{ "type": 13, "id": "GqTuFRKwS6eisxWVadmWbUHmdcLAAWpZW2M3gtmyxF9i", "fee": 1000000, "feeAssetId": null, "timestamp": 1651659008398, "version": 1, "sender": "3PRBVq52csUvTx77NYwLTULrt2e9jdsHfRB", "senderPublicKey": "9XcgkNhoevmBJ1hdDkEQ7joCc8LgpnGx6chYf8uiQZ7t", "proofs": [ "4LeoAXj1A2EysHczyHCR8iEVhP7UeKQJdFy2YcUQsjEDjtrR3PypfmQifga3dukDdMdLWeCwouEpv7kR3mbQEHzg" ], "script": "base64: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", "chainId": 87, "height": 3102285, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8wE21erTjhJYgZx8qjDTLDQhZUk5FFCc7s26cL6rUH6X Next: EKSdCXVUqHAXu5KLrkGqyQbnzAFprNSFFDYD3fYHNNkH Diff:
OldNewDifferences
2222 func userWithdrawnWithinEpochStore (user,assetId) = ((user + "_used_") + assetId)
2323
2424
25-let timeframe = valueOrElse(getInteger(configAddress, "ActionLimitTimeframe"), 1)
25+let timeframe = valueOrElse(getInteger(configAddress, "WithdrawLimitTimeframe"), 1)
2626
2727 let breakpoints = (split(valueOrElse(getString(configAddress, "LimitUtilizationBreakpoints"), "0"), "|") ++ ["0"])
2828
101101 let currentEpochStart = ((HEIGHT / timeframe) * timeframe)
102102 let currentEpochEnd = ((1 + (HEIGHT / timeframe)) * timeframe)
103103 let store = userWithdrawnWithinEpochStore(user, assetId)
104- let $t026952939 = match getString(store) {
104+ let $t026962940 = match getString(store) {
105105 case s: String =>
106106 let data = split(s, "|")
107107 $Tuple2(parseIntValue(data[0]), parseIntValue(data[1]))
108108 case _ =>
109109 $Tuple2(0, 0)
110110 }
111- let epoch = $t026952939._1
112- let withdrawn = $t026952939._2
111+ let epoch = $t026962940._1
112+ let withdrawn = $t026962940._2
113113 let userWithdrawnWithinCurrentEpoch = if ((epoch == currentEpochStart))
114114 then withdrawn
115115 else 0
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 maybeOracleAddress = match getString(configAddress, "oracle_address") {
1414 case s: String =>
1515 addressFromString(s)
1616 case _ =>
1717 unit
1818 }
1919
2020 let HEIGHT = height
2121
2222 func userWithdrawnWithinEpochStore (user,assetId) = ((user + "_used_") + assetId)
2323
2424
25-let timeframe = valueOrElse(getInteger(configAddress, "ActionLimitTimeframe"), 1)
25+let timeframe = valueOrElse(getInteger(configAddress, "WithdrawLimitTimeframe"), 1)
2626
2727 let breakpoints = (split(valueOrElse(getString(configAddress, "LimitUtilizationBreakpoints"), "0"), "|") ++ ["0"])
2828
2929 func actionThreshold (action,assetId) = {
3030 let key = (((assetId + "_") + action) + "_utilization_threshold")
3131 valueOrElse(getInteger(configAddress, key), 1100)
3232 }
3333
3434
3535 func limit (assetId,util) = {
3636 let breakpoint = {
3737 func fold (a,bp) = if ((util >= a))
3838 then a
3939 else parseIntValue(bp)
4040
4141 let $l = breakpoints
4242 let $s = size($l)
4343 let $acc0 = parseIntValue(breakpoints[0])
4444 func $f0_1 ($a,$i) = if (($i >= $s))
4545 then $a
4646 else fold($a, $l[$i])
4747
4848 func $f0_2 ($a,$i) = if (($i >= $s))
4949 then $a
5050 else throw("List size exceeds 10")
5151
5252 $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)
5353 }
5454 getInteger(configAddress, (((assetId + "_") + toString(breakpoint)) + "_acc_limit"))
5555 }
5656
5757
5858 func ensureActionThreshold (action,assetId,util) = {
5959 let at = actionThreshold(action, assetId)
6060 if ((util >= at))
6161 then throw(((((((action + " of ") + assetId) + " paused due to high utilization: ") + toString(util)) + " >= ") + toString(at)))
6262 else true
6363 }
6464
6565
6666 func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
6767 then true
6868 else throw("limiter2: only main can do")
6969
7070
7171 func validAction (action) = if (contains("borrow|withdraw|import|redeem", action))
7272 then true
7373 else throw("limiter2: invalid action")
7474
7575
7676 @Callable(i)
7777 func initialize (ca) = [writeConstString(configStore, ca)]
7878
7979
8080
8181 @Callable(i)
8282 func validateLimit (action,assetId,user,amount,util) = {
8383 let m = if (mainOnly(i))
8484 then validAction(action)
8585 else false
8686 if ((m == m))
8787 then {
8888 let at = ensureActionThreshold(action, assetId, util)
8989 if ((at == at))
9090 then if (if ((action != "borrow"))
9191 then (action != "withdraw")
9292 else false)
9393 then $Tuple2(nil, -1)
9494 else match limit(assetId, util) {
9595 case lmt: Int =>
9696 if ((0 > lmt))
9797 then $Tuple2(nil, -1)
9898 else if ((lmt == 0))
9999 then throw((action + " is denied"))
100100 else {
101101 let currentEpochStart = ((HEIGHT / timeframe) * timeframe)
102102 let currentEpochEnd = ((1 + (HEIGHT / timeframe)) * timeframe)
103103 let store = userWithdrawnWithinEpochStore(user, assetId)
104- let $t026952939 = match getString(store) {
104+ let $t026962940 = match getString(store) {
105105 case s: String =>
106106 let data = split(s, "|")
107107 $Tuple2(parseIntValue(data[0]), parseIntValue(data[1]))
108108 case _ =>
109109 $Tuple2(0, 0)
110110 }
111- let epoch = $t026952939._1
112- let withdrawn = $t026952939._2
111+ let epoch = $t026962940._1
112+ let withdrawn = $t026962940._2
113113 let userWithdrawnWithinCurrentEpoch = if ((epoch == currentEpochStart))
114114 then withdrawn
115115 else 0
116116 if (((userWithdrawnWithinCurrentEpoch + amount) > lmt))
117117 then throw(((((((((((((("breaching " + action) + " limit ") + toString(lmt)) + " ") + assetId) + " over ") + toString(timeframe)) + " blocks. Available: ") + toString((lmt - userWithdrawnWithinCurrentEpoch))) + " current epoch: ") + toString(currentEpochStart)) + "-") + toString(currentEpochEnd)))
118118 else $Tuple2([StringEntry(store, ((toString(currentEpochStart) + "|") + toString((userWithdrawnWithinCurrentEpoch + amount))))], ((lmt - userWithdrawnWithinCurrentEpoch) - amount))
119119 }
120120 case _ =>
121121 $Tuple2(nil, -1)
122122 }
123123 else throw("Strict value is not equal to itself.")
124124 }
125125 else throw("Strict value is not equal to itself.")
126126 }
127127
128128

github/deemru/w8io/3ef1775 
39.27 ms