tx · 6Hkb225UMZQsff6CD3qLFZzQGbFFbBwRNwCzciybq34w 3PCs3SYkQwSqXwv5FN42b8DXM6WEA8JNDkx: -0.01000000 Waves 2022.06.16 10:27 [3164248] smart account 3PCs3SYkQwSqXwv5FN42b8DXM6WEA8JNDkx > SELF 0.00000000 Waves
{ "type": 13, "id": "6Hkb225UMZQsff6CD3qLFZzQGbFFbBwRNwCzciybq34w", "fee": 1000000, "feeAssetId": null, "timestamp": 1655364485578, "version": 2, "chainId": 87, "sender": "3PCs3SYkQwSqXwv5FN42b8DXM6WEA8JNDkx", "senderPublicKey": "4613XFozFm1Nc8jhYYFisKKAzjau7tRhD4TyVKaE6srm", "proofs": [ "33BN2h8cmVLanPyLSALStvv8GSx8FgbfC1Z8oEDnmMCMmXoZgqxoeDxN1y6t3JHv3nEgYkavazCp8BTDYhg6iRxR" ], "script": "base64:AAIFAAAAAAAAAAwIAhIAEgASBAoCCAgAAAALAAAAAAx2aXJlc0FkZHJlc3MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAECAAAAIzNQQVp2OXRnSzFQWDdkS1I3YjRrY2hxNXFkcFVTM0c1c1lUAAAAAA9hc3NldFN0cmluZ1VTRFQCAAAALDM0TjlZY0VFVExXbjkzcVlRNjRFc1AxeDg5dFNydUpVNDRSckVNU1hYRVBKAAAAAAtyZXNlcnZlVVNEVAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQIAAAAjM1BFaUQxekpXVE1aTldTQ3l6aHZCdzlweHhBV2VFd2FnaFIAAAAAD2Fzc2V0U3RyaW5nVVNEQwIAAAAsNlh0SGpwWGJzOVJSSlAyU3I5R1V5VnF6QUNjYnk5VGtUaEhYbmpWQzVDREoAAAAAC3Jlc2VydmVVU0RDCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABAgAAACMzUEdDa3JIQnhGTWk3dHoxeHFueGdCcGVOdm41RTRNNGc4UwAAAAAHbGltaXRlcgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQIAAAAjM1BSQlZxNTJjc1V2VHg3N05Zd0xUVUxydDJlOWpkc0hmUkIBAAAAEWFzVXNlckJhbGFuY2VEYXRhAAAAAQAAAAFhBAAAAAckbWF0Y2gwBQAAAAFhAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAACIoSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEJvb2xlYW4pBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAIndyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQ1JkJvb2xlYW4BAAAAE2dldERlcG9zaXRlZEJhbGFuY2UAAAABAAAAB3Jlc2VydmUEAAAAD3VzZXJiYWxhbmNlZGF0YQkBAAAAEWFzVXNlckJhbGFuY2VEYXRhAAAAAQkAA/wAAAAEBQAAAAdyZXNlcnZlAgAAAAt1c2VyQmFsYW5jZQkABEwAAAACCQAEJQAAAAEFAAAABHRoaXMFAAAAA25pbAUAAAADbmlsCAUAAAAPdXNlcmJhbGFuY2VkYXRhAAAAAl8yAQAAAA9nZXRUb3RhbERlcG9zaXQAAAABAAAAB3Jlc2VydmUJ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", "height": 3164248, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9EQG2GBATVW5hNu1FWexsAngR1ciURvXF2xuwKmJQa74 Next: 5f85g5SZbKZPz13N3NTsGYw3bLJWMkrNjsXdg96HaFcU Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let | |
4 | + | let viresAddress = addressFromStringValue("3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT") | |
5 | 5 | ||
6 | 6 | let assetStringUSDT = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" | |
7 | 7 | ||
11 | 11 | ||
12 | 12 | let reserveUSDC = addressFromStringValue("3PGCkrHBxFMi7tz1xqnxgBpeNvn5E4M4g8S") | |
13 | 13 | ||
14 | + | let limiter = addressFromStringValue("3PRBVq52csUvTx77NYwLTULrt2e9jdsHfRB") | |
15 | + | ||
16 | + | func asUserBalanceData (a) = match a { | |
17 | + | case a: (Int, Int, Int, Int, Int, Boolean) => | |
18 | + | a | |
19 | + | case _ => | |
20 | + | throw("wrong type, expected: Int5&Boolean") | |
21 | + | } | |
22 | + | ||
23 | + | ||
24 | + | func getDepositedBalance (reserve) = { | |
25 | + | let userbalancedata = asUserBalanceData(invoke(reserve, "userBalance", [toString(this)], nil)) | |
26 | + | userbalancedata._2 | |
27 | + | } | |
28 | + | ||
29 | + | ||
30 | + | func getTotalDeposit (reserve) = getIntegerValue(reserve, "totalDeposit") | |
31 | + | ||
32 | + | ||
33 | + | func getWithdrawn (assetString) = { | |
34 | + | let currentEpochStart = (height - (height % 1440)) | |
35 | + | let storeKey = ((toString(this) + "_used_") + assetString) | |
36 | + | let storeValue = getString(limiter, storeKey) | |
37 | + | let parsedValues = match storeValue { | |
38 | + | case s: String => | |
39 | + | let data = split(s, "|") | |
40 | + | $Tuple2(parseIntValue(data[0]), parseIntValue(data[1])) | |
41 | + | case _ => | |
42 | + | $Tuple2(0, 0) | |
43 | + | } | |
44 | + | let epoch = parsedValues._1 | |
45 | + | let withdrawn = parsedValues._2 | |
46 | + | if ((epoch == currentEpochStart)) | |
47 | + | then withdrawn | |
48 | + | else 0 | |
49 | + | } | |
50 | + | ||
51 | + | ||
52 | + | func withdraw (assetString,reserve) = { | |
53 | + | let assetId = fromBase58String(assetString) | |
54 | + | let reserveBalance = assetBalance(reserve, assetId) | |
55 | + | if ((0 >= reserveBalance)) | |
56 | + | then throw("reserve balance too low") | |
57 | + | else { | |
58 | + | let deposited = getDepositedBalance(reserve) | |
59 | + | if ((0 >= deposited)) | |
60 | + | then throw("nothing to withdraw") | |
61 | + | else { | |
62 | + | let totalDeposit = getTotalDeposit(reserve) | |
63 | + | let factorsBase = 1000000 | |
64 | + | let util = (factorsBase - fraction(reserveBalance, factorsBase, totalDeposit, DOWN)) | |
65 | + | let dayLimit = if ((util >= 950000)) | |
66 | + | then 1000000000 | |
67 | + | else if ((util >= 900000)) | |
68 | + | then 10000000000 | |
69 | + | else if ((util >= 850000)) | |
70 | + | then 100000000000 | |
71 | + | else if ((util >= 800000)) | |
72 | + | then 1000000000000 | |
73 | + | else -1 | |
74 | + | if ((dayLimit == -1)) | |
75 | + | then { | |
76 | + | let r = { | |
77 | + | let @ = invoke(viresAddress, "withdraw", [assetString, -1], nil) | |
78 | + | if ($isInstanceOf(@, "Int")) | |
79 | + | then @ | |
80 | + | else throw("Couldn't cast Any to Int") | |
81 | + | } | |
82 | + | if ((r == r)) | |
83 | + | then nil | |
84 | + | else throw("Strict value is not equal to itself.") | |
85 | + | } | |
86 | + | else { | |
87 | + | let withdrawn = getWithdrawn(assetString) | |
88 | + | let limitRemain = (dayLimit - withdrawn) | |
89 | + | if ((0 >= limitRemain)) | |
90 | + | then throw("withdrawn all limit for the day") | |
91 | + | else { | |
92 | + | let amount = min([reserveBalance, deposited, limitRemain]) | |
93 | + | let r = { | |
94 | + | let @ = invoke(viresAddress, "withdraw", [assetString, amount], nil) | |
95 | + | if ($isInstanceOf(@, "Int")) | |
96 | + | then @ | |
97 | + | else throw("Couldn't cast Any to Int") | |
98 | + | } | |
99 | + | if ((r == r)) | |
100 | + | then nil | |
101 | + | else throw("Strict value is not equal to itself.") | |
102 | + | } | |
103 | + | } | |
104 | + | } | |
105 | + | } | |
106 | + | } | |
107 | + | ||
108 | + | ||
14 | 109 | @Callable(i) | |
15 | - | func withdrawUSDC (minAmount,maxAmount) = { | |
16 | - | let reserveBalance = assetBalance(reserveUSDC, fromBase58String(assetStringUSDC)) | |
17 | - | if ((reserveBalance >= minAmount)) | |
18 | - | then { | |
19 | - | let withdrawAmount = if ((reserveBalance > maxAmount)) | |
20 | - | then maxAmount | |
21 | - | else reserveBalance | |
22 | - | let withdrawnAmount = { | |
23 | - | let @ = invoke(main, "withdraw", [assetStringUSDC, withdrawAmount], nil) | |
24 | - | if ($isInstanceOf(@, "Int")) | |
25 | - | then @ | |
26 | - | else throw("Couldn't cast Any to Int") | |
27 | - | } | |
28 | - | if ((withdrawnAmount == withdrawnAmount)) | |
29 | - | then nil | |
30 | - | else throw("Strict value is not equal to itself.") | |
31 | - | } | |
32 | - | else throw("Reserve balance too low") | |
33 | - | } | |
110 | + | func withdrawUSDT () = withdraw(assetStringUSDT, reserveUSDT) | |
34 | 111 | ||
35 | 112 | ||
36 | 113 | ||
37 | 114 | @Callable(i) | |
38 | - | func withdrawUSDT (minAmount,maxAmount) = { | |
39 | - | let reserveBalance = assetBalance(reserveUSDT, fromBase58String(assetStringUSDT)) | |
40 | - | if ((reserveBalance >= minAmount)) | |
41 | - | then { | |
42 | - | let withdrawAmount = if ((reserveBalance > maxAmount)) | |
43 | - | then maxAmount | |
44 | - | else reserveBalance | |
45 | - | let withdrawnAmount = { | |
46 | - | let @ = invoke(main, "withdraw", [assetStringUSDT, withdrawAmount], nil) | |
47 | - | if ($isInstanceOf(@, "Int")) | |
48 | - | then @ | |
49 | - | else throw("Couldn't cast Any to Int") | |
50 | - | } | |
51 | - | if ((withdrawnAmount == withdrawnAmount)) | |
52 | - | then nil | |
115 | + | func withdrawUSDC () = withdraw(assetStringUSDC, reserveUSDC) | |
116 | + | ||
117 | + | ||
118 | + | ||
119 | + | @Callable(i) | |
120 | + | func transferSupply (toAddressString,reserveString) = { | |
121 | + | let toAddress = addressFromStringValue(toAddressString) | |
122 | + | if ((toAddress == this)) | |
123 | + | then throw("toAddress == this") | |
124 | + | else { | |
125 | + | let payment = i.payments[0] | |
126 | + | let assetId = value(payment.assetId) | |
127 | + | let assetString = toBase58String(assetId) | |
128 | + | let amount = payment.amount | |
129 | + | let invokeDeposit = invoke(toAddress, "deposit", [reserveString], [payment]) | |
130 | + | if ((invokeDeposit == invokeDeposit)) | |
131 | + | then { | |
132 | + | let invokeWithdraw = invoke(viresAddress, "withdraw", [assetString, amount], nil) | |
133 | + | if ((invokeWithdraw == invokeWithdraw)) | |
134 | + | then nil | |
135 | + | else throw("Strict value is not equal to itself.") | |
136 | + | } | |
53 | 137 | else throw("Strict value is not equal to itself.") | |
54 | 138 | } | |
55 | - | else throw("Reserve balance too low") | |
56 | 139 | } | |
57 | 140 | ||
58 | 141 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let | |
4 | + | let viresAddress = addressFromStringValue("3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT") | |
5 | 5 | ||
6 | 6 | let assetStringUSDT = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" | |
7 | 7 | ||
8 | 8 | let reserveUSDT = addressFromStringValue("3PEiD1zJWTMZNWSCyzhvBw9pxxAWeEwaghR") | |
9 | 9 | ||
10 | 10 | let assetStringUSDC = "6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" | |
11 | 11 | ||
12 | 12 | let reserveUSDC = addressFromStringValue("3PGCkrHBxFMi7tz1xqnxgBpeNvn5E4M4g8S") | |
13 | 13 | ||
14 | + | let limiter = addressFromStringValue("3PRBVq52csUvTx77NYwLTULrt2e9jdsHfRB") | |
15 | + | ||
16 | + | func asUserBalanceData (a) = match a { | |
17 | + | case a: (Int, Int, Int, Int, Int, Boolean) => | |
18 | + | a | |
19 | + | case _ => | |
20 | + | throw("wrong type, expected: Int5&Boolean") | |
21 | + | } | |
22 | + | ||
23 | + | ||
24 | + | func getDepositedBalance (reserve) = { | |
25 | + | let userbalancedata = asUserBalanceData(invoke(reserve, "userBalance", [toString(this)], nil)) | |
26 | + | userbalancedata._2 | |
27 | + | } | |
28 | + | ||
29 | + | ||
30 | + | func getTotalDeposit (reserve) = getIntegerValue(reserve, "totalDeposit") | |
31 | + | ||
32 | + | ||
33 | + | func getWithdrawn (assetString) = { | |
34 | + | let currentEpochStart = (height - (height % 1440)) | |
35 | + | let storeKey = ((toString(this) + "_used_") + assetString) | |
36 | + | let storeValue = getString(limiter, storeKey) | |
37 | + | let parsedValues = match storeValue { | |
38 | + | case s: String => | |
39 | + | let data = split(s, "|") | |
40 | + | $Tuple2(parseIntValue(data[0]), parseIntValue(data[1])) | |
41 | + | case _ => | |
42 | + | $Tuple2(0, 0) | |
43 | + | } | |
44 | + | let epoch = parsedValues._1 | |
45 | + | let withdrawn = parsedValues._2 | |
46 | + | if ((epoch == currentEpochStart)) | |
47 | + | then withdrawn | |
48 | + | else 0 | |
49 | + | } | |
50 | + | ||
51 | + | ||
52 | + | func withdraw (assetString,reserve) = { | |
53 | + | let assetId = fromBase58String(assetString) | |
54 | + | let reserveBalance = assetBalance(reserve, assetId) | |
55 | + | if ((0 >= reserveBalance)) | |
56 | + | then throw("reserve balance too low") | |
57 | + | else { | |
58 | + | let deposited = getDepositedBalance(reserve) | |
59 | + | if ((0 >= deposited)) | |
60 | + | then throw("nothing to withdraw") | |
61 | + | else { | |
62 | + | let totalDeposit = getTotalDeposit(reserve) | |
63 | + | let factorsBase = 1000000 | |
64 | + | let util = (factorsBase - fraction(reserveBalance, factorsBase, totalDeposit, DOWN)) | |
65 | + | let dayLimit = if ((util >= 950000)) | |
66 | + | then 1000000000 | |
67 | + | else if ((util >= 900000)) | |
68 | + | then 10000000000 | |
69 | + | else if ((util >= 850000)) | |
70 | + | then 100000000000 | |
71 | + | else if ((util >= 800000)) | |
72 | + | then 1000000000000 | |
73 | + | else -1 | |
74 | + | if ((dayLimit == -1)) | |
75 | + | then { | |
76 | + | let r = { | |
77 | + | let @ = invoke(viresAddress, "withdraw", [assetString, -1], nil) | |
78 | + | if ($isInstanceOf(@, "Int")) | |
79 | + | then @ | |
80 | + | else throw("Couldn't cast Any to Int") | |
81 | + | } | |
82 | + | if ((r == r)) | |
83 | + | then nil | |
84 | + | else throw("Strict value is not equal to itself.") | |
85 | + | } | |
86 | + | else { | |
87 | + | let withdrawn = getWithdrawn(assetString) | |
88 | + | let limitRemain = (dayLimit - withdrawn) | |
89 | + | if ((0 >= limitRemain)) | |
90 | + | then throw("withdrawn all limit for the day") | |
91 | + | else { | |
92 | + | let amount = min([reserveBalance, deposited, limitRemain]) | |
93 | + | let r = { | |
94 | + | let @ = invoke(viresAddress, "withdraw", [assetString, amount], nil) | |
95 | + | if ($isInstanceOf(@, "Int")) | |
96 | + | then @ | |
97 | + | else throw("Couldn't cast Any to Int") | |
98 | + | } | |
99 | + | if ((r == r)) | |
100 | + | then nil | |
101 | + | else throw("Strict value is not equal to itself.") | |
102 | + | } | |
103 | + | } | |
104 | + | } | |
105 | + | } | |
106 | + | } | |
107 | + | ||
108 | + | ||
14 | 109 | @Callable(i) | |
15 | - | func withdrawUSDC (minAmount,maxAmount) = { | |
16 | - | let reserveBalance = assetBalance(reserveUSDC, fromBase58String(assetStringUSDC)) | |
17 | - | if ((reserveBalance >= minAmount)) | |
18 | - | then { | |
19 | - | let withdrawAmount = if ((reserveBalance > maxAmount)) | |
20 | - | then maxAmount | |
21 | - | else reserveBalance | |
22 | - | let withdrawnAmount = { | |
23 | - | let @ = invoke(main, "withdraw", [assetStringUSDC, withdrawAmount], nil) | |
24 | - | if ($isInstanceOf(@, "Int")) | |
25 | - | then @ | |
26 | - | else throw("Couldn't cast Any to Int") | |
27 | - | } | |
28 | - | if ((withdrawnAmount == withdrawnAmount)) | |
29 | - | then nil | |
30 | - | else throw("Strict value is not equal to itself.") | |
31 | - | } | |
32 | - | else throw("Reserve balance too low") | |
33 | - | } | |
110 | + | func withdrawUSDT () = withdraw(assetStringUSDT, reserveUSDT) | |
34 | 111 | ||
35 | 112 | ||
36 | 113 | ||
37 | 114 | @Callable(i) | |
38 | - | func withdrawUSDT (minAmount,maxAmount) = { | |
39 | - | let reserveBalance = assetBalance(reserveUSDT, fromBase58String(assetStringUSDT)) | |
40 | - | if ((reserveBalance >= minAmount)) | |
41 | - | then { | |
42 | - | let withdrawAmount = if ((reserveBalance > maxAmount)) | |
43 | - | then maxAmount | |
44 | - | else reserveBalance | |
45 | - | let withdrawnAmount = { | |
46 | - | let @ = invoke(main, "withdraw", [assetStringUSDT, withdrawAmount], nil) | |
47 | - | if ($isInstanceOf(@, "Int")) | |
48 | - | then @ | |
49 | - | else throw("Couldn't cast Any to Int") | |
50 | - | } | |
51 | - | if ((withdrawnAmount == withdrawnAmount)) | |
52 | - | then nil | |
115 | + | func withdrawUSDC () = withdraw(assetStringUSDC, reserveUSDC) | |
116 | + | ||
117 | + | ||
118 | + | ||
119 | + | @Callable(i) | |
120 | + | func transferSupply (toAddressString,reserveString) = { | |
121 | + | let toAddress = addressFromStringValue(toAddressString) | |
122 | + | if ((toAddress == this)) | |
123 | + | then throw("toAddress == this") | |
124 | + | else { | |
125 | + | let payment = i.payments[0] | |
126 | + | let assetId = value(payment.assetId) | |
127 | + | let assetString = toBase58String(assetId) | |
128 | + | let amount = payment.amount | |
129 | + | let invokeDeposit = invoke(toAddress, "deposit", [reserveString], [payment]) | |
130 | + | if ((invokeDeposit == invokeDeposit)) | |
131 | + | then { | |
132 | + | let invokeWithdraw = invoke(viresAddress, "withdraw", [assetString, amount], nil) | |
133 | + | if ((invokeWithdraw == invokeWithdraw)) | |
134 | + | then nil | |
135 | + | else throw("Strict value is not equal to itself.") | |
136 | + | } | |
53 | 137 | else throw("Strict value is not equal to itself.") | |
54 | 138 | } | |
55 | - | else throw("Reserve balance too low") | |
56 | 139 | } | |
57 | 140 | ||
58 | 141 |
github/deemru/w8io/3ef1775 45.32 ms ◑