tx · Crb2Sx4M1dQ6zLiZNsVjeEvBJaCZcCkCSWrLNxpKzwZL

3MsRQhp2cbXJQxHETzdZQdj2QfP4b3Mp6UL:  -0.01000000 Waves

2022.04.25 04:57 [2023389] smart account 3MsRQhp2cbXJQxHETzdZQdj2QfP4b3Mp6UL > SELF 0.00000000 Waves

{ "type": 13, "id": "Crb2Sx4M1dQ6zLiZNsVjeEvBJaCZcCkCSWrLNxpKzwZL", "fee": 1000000, "feeAssetId": null, "timestamp": 1650851891459, "version": 2, "chainId": 84, "sender": "3MsRQhp2cbXJQxHETzdZQdj2QfP4b3Mp6UL", "senderPublicKey": "FuM9F3sAdx6ZQfJfJMCdjC9w4wzTDx6F1KgWCbAM1KRy", "proofs": [ "38aSpd11GXjh12iaSt6sUw1MR54DHBPzNJq8yAGvUgevwmd5qyHk1jLFSu8WQqhjQihoNKjjKFxhvuFaTf2j4pb5" ], "script": "base64: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", "height": 2023389, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6PpWxbCb128BUze9VbxDAvspGNrFnxBhA61bn4v2mWPp Next: 4uY7uNg682mijftWrXTcGkFmEr7crcMbESXSNoywPLUY Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func asInt (value) = match value {
5- case int: Int =>
6- int
4+func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
5+ then StringEntry(key, value)
6+ else throw(("already initialized: " + key))
7+
8+
9+let configStore = "config"
10+
11+let configAddress = addressFromStringValue("3MsRQhp2cbXJQxHETzdZQdj2QfP4b3Mp6UL")
12+
13+let maybeOracleAddress = match getString(configAddress, "oracle_address") {
14+ case s: String =>
15+ addressFromString(s)
716 case _ =>
8- throw("expected: Int")
17+ unit
918 }
1019
20+let HEIGHT = height
1121
12-func getI (key) = getInteger(this, key)
22+let timeframe = 1440
23+
24+func limit (assetId) = 1000000000
1325
1426
15-func writeInt (key,value) = if ((0 > value))
16- then throw(((("writing negative value " + toString(value)) + " for key ") + key))
17- else IntegerEntry(key, value)
27+func userWithdrawnWithinEpochStore (user,assetId) = ((("withdrawn_" + user) + "_") + assetId)
1828
1929
20-let main = addressFromStringValue("3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT")
21-
22-let assetStringUsdc = "6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ"
23-
24-let reserveUsdc = addressFromStringValue("3PGCkrHBxFMi7tz1xqnxgBpeNvn5E4M4g8S")
25-
26-let assetId = fromBase58String(assetStringUsdc)
27-
28-let sender = addressFromStringValue("3MsRQhp2cbXJQxHETzdZQdj2QfP4b3Mp6UL")
29-
3030 @Callable(i)
31-func initbal (bal,key) = if ((i.caller != sender))
32- then throw("1")
33- else $Tuple2([writeInt("MyBal", bal), writeInt(key, 0)], unit)
31+func initialize (ca) = [writeConstString(configStore, ca)]
3432
3533
3634
3735 @Callable(i)
38-func byebye (lowm) = {
39- let available = assetBalance(reserveUsdc, assetId)
40- if ((lowm > available))
41- then throw("1")
42- else {
43- let uc = asInt(invoke(reserveUsdc, "userDepositUSD", [toString(this)], nil))
44- let v = if ((available > uc))
45- then uc
46- else available
47- if ((v == 0))
48- then throw("2")
49- else $Tuple2(nil, asInt(invoke(main, "withdraw", [assetStringUsdc, v], nil)))
50- }
51- }
52-
53-
54-
55-@Callable(i)
56-func goodbye (lowm) = {
57- let available = assetBalance(reserveUsdc, assetId)
58- if ((lowm > available))
59- then throw("1")
60- else {
61- let uc = valueOrElse(getI("MyBal"), 0)
62- let v = if ((available > uc))
63- then uc
64- else available
65- if ((v == 0))
66- then throw("2")
67- else $Tuple2([writeInt("MyBal", (uc - v))], asInt(invoke(main, "withdraw", [assetStringUsdc, v], nil)))
68- }
69- }
70-
71-
72-
73-@Callable(i)
74-func kissmegoodbye (limitd,key) = {
75- let available = assetBalance(reserveUsdc, assetId)
76- if ((limitd > available))
77- then throw("1")
78- else {
79- let flag = valueOrElse(getI(key), 0)
80- if ((flag == 1))
81- then throw("2")
82- else $Tuple2([writeInt(key, 1)], asInt(invoke(main, "withdraw", [assetStringUsdc, limitd], nil)))
83- }
84- }
85-
86-
87-
88-@Callable(i)
89-func testkiss (limitd,key) = {
90- let available = 1000000000
91- if ((limitd > available))
92- then throw("1")
93- else {
94- let flag = valueOrElse(getI(key), 0)
95- if ((flag == 1))
96- then throw("2")
97- else $Tuple2([writeInt(key, 1), writeInt("MyBal", (flag + 1))], limitd)
98- }
99- }
100-
101-
102-
103-@Callable(i)
104-func bb1 (lowm) = {
105- let available = assetBalance(reserveUsdc, assetId)
106- let uc = asInt(invoke(reserveUsdc, "userDepositUSD", [toString(this)], nil))
107- let v = if ((available > uc))
108- then uc
109- else available
110- if ((1 > v))
111- then throw("1")
112- else $Tuple2(nil, asInt(invoke(main, "withdraw", [assetStringUsdc, v], nil)))
113- }
36+func validateWithdrawLimit (assetId,user,amount) = match limit(assetId) {
37+ case lmt: Int =>
38+ let currentEpochStart = ((HEIGHT / timeframe) * timeframe)
39+ let currentEpochEnd = ((1 + (HEIGHT / timeframe)) * timeframe)
40+ let store = userWithdrawnWithinEpochStore(user, assetId)
41+ let tt = match getString(store) {
42+ case s: String =>
43+ let data = split(s, "|")
44+ $Tuple2(parseIntValue(data[0]), parseIntValue(data[1]))
45+ case _ =>
46+ $Tuple2(0, 0)
47+ }
48+ let epoch = tt._1
49+ let withdrawn = tt._2
50+ let userWithdrawnWithinCurrentEpoch = if ((epoch == currentEpochStart))
51+ then withdrawn
52+ else 0
53+ if (((userWithdrawnWithinCurrentEpoch + amount) > lmt))
54+ then throw(((((((((((("breaching withdraw limit per " + toString(lmt)) + " ") + assetId) + " over ") + toString(timeframe)) + " blocks. Available: ") + toString((lmt - userWithdrawnWithinCurrentEpoch))) + " current epoch: ") + toString(currentEpochStart)) + "-") + toString(currentEpochEnd)))
55+ else $Tuple2([StringEntry(store, ((toString(currentEpochStart) + "|") + toString((userWithdrawnWithinCurrentEpoch + amount))))], ((lmt - userWithdrawnWithinCurrentEpoch) - amount))
56+ case _ =>
57+ $Tuple2(nil, -1)
58+}
11459
11560

github/deemru/w8io/026f985 
23.31 ms