tx · FzidwHtWi5zc35JvbRdjVK1kwXbEejDAEge9yV5B1Xr5 3PFoA1JFDoLWQJ3DqzAHNrrWR4riVuBfHks: -0.01000000 Waves 2022.04.16 16:16 [3076471] smart account 3PFoA1JFDoLWQJ3DqzAHNrrWR4riVuBfHks > SELF 0.00000000 Waves
{ "type": 13, "id": "FzidwHtWi5zc35JvbRdjVK1kwXbEejDAEge9yV5B1Xr5", "fee": 1000000, "feeAssetId": null, "timestamp": 1650114992934, "version": 1, "sender": "3PFoA1JFDoLWQJ3DqzAHNrrWR4riVuBfHks", "senderPublicKey": "5wDXuHuaDELQu1VzL96PvhJeSpJGXHu9W9v3booheS1R", "proofs": [ "3iszW4PyBcEyzGqYowtuBkaSrqsqkNQTRZMrLn9WcNLnG9CaeARuFJrDht6NSFQAHgjx6TXu1UrFqS2pXhryNzmd" ], "script": "base64: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", "chainId": 87, "height": 3076471, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 4Xn2yWJ11jtwZGd8bcVyt3yWpasLQ28iRcPNK4MCJsFj Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 5 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
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(getStringValue(this, configStore)) | |
12 | + | ||
13 | + | let maybeOracleAddress = match getString(configAddress, "oracle_address") { | |
14 | + | case s: String => | |
15 | + | addressFromString(s) | |
16 | + | case _ => | |
17 | + | unit | |
18 | + | } | |
19 | + | ||
20 | + | let HEIGHT = height | |
21 | + | ||
22 | + | let timeframe = valueOrElse(getInteger(configAddress, "WithdrawLimitTimeframe"), 1) | |
23 | + | ||
24 | + | func limit (assetId) = getInteger(configAddress, (assetId + "_WithdrawLimitAcc")) | |
25 | + | ||
26 | + | ||
27 | + | func userWithdrawnWithinEpochStore (start,user,assetId) = ((((("withdrawn_" + user) + "_") + assetId) + "_") + toString(start)) | |
28 | + | ||
29 | + | ||
30 | + | @Callable(i) | |
31 | + | func initialize (ca) = [writeConstString(configStore, ca)] | |
32 | + | ||
33 | + | ||
34 | + | ||
35 | + | @Callable(i) | |
36 | + | func validateWithdrawLimit (assetId,user,amount) = match limit(assetId) { | |
37 | + | case l: Int => | |
38 | + | let currentEpochStart = ((HEIGHT / timeframe) * timeframe) | |
39 | + | let currentEpochEnd = ((1 + (HEIGHT / timeframe)) * timeframe) | |
40 | + | let store = userWithdrawnWithinEpochStore(currentEpochStart, user, assetId) | |
41 | + | let userWithdrawnWithinTheEpoch = valueOrElse(getInteger(store), 0) | |
42 | + | if (((userWithdrawnWithinTheEpoch + amount) > l)) | |
43 | + | then throw(((((((("breaching withdraw limit per " + toString(l)) + " ") + assetId) + " over ") + toString(timeframe)) + " blocks. Available: ") + toString((l - userWithdrawnWithinTheEpoch)))) | |
44 | + | else $Tuple2([IntegerEntry(store, (userWithdrawnWithinTheEpoch + amount))], (l - userWithdrawnWithinTheEpoch)) | |
45 | + | case _ => | |
46 | + | $Tuple2(nil, -1) | |
47 | + | } | |
48 | + | ||
49 | + |
github/deemru/w8io/3ef1775 23.86 ms ◑