@curvefi/llamalend-api 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.eslintrc.json +40 -0
  2. package/.github/workflows/lint.yml +15 -0
  3. package/.github/workflows/publish.yml +55 -0
  4. package/LICENSE +21 -0
  5. package/README.md +1976 -0
  6. package/lib/cache/index.d.ts +14 -0
  7. package/lib/cache/index.js +31 -0
  8. package/lib/constants/L2Networks.d.ts +1 -0
  9. package/lib/constants/L2Networks.js +1 -0
  10. package/lib/constants/abis/Controller.json +1027 -0
  11. package/lib/constants/abis/ERC20.json +222 -0
  12. package/lib/constants/abis/ERC4626.json +1674 -0
  13. package/lib/constants/abis/GaugeController.json +794 -0
  14. package/lib/constants/abis/GaugeFactoryMainnet.json +1 -0
  15. package/lib/constants/abis/GaugeFactorySidechain.json +475 -0
  16. package/lib/constants/abis/GaugeV5.json +958 -0
  17. package/lib/constants/abis/LeverageZap.json +35 -0
  18. package/lib/constants/abis/Llamma.json +984 -0
  19. package/lib/constants/abis/Minter.json +1 -0
  20. package/lib/constants/abis/MonetaryPolicy.json +221 -0
  21. package/lib/constants/abis/OneWayLendingFactoryABI.json +899 -0
  22. package/lib/constants/abis/SidechainGauge.json +939 -0
  23. package/lib/constants/abis/Vault.json +721 -0
  24. package/lib/constants/abis/crvUSD/DeleverageZap.json +248 -0
  25. package/lib/constants/abis/crvUSD/Factory.json +514 -0
  26. package/lib/constants/abis/crvUSD/HealthCalculatorZap.json +54 -0
  27. package/lib/constants/abis/crvUSD/LeverageZap.json +312 -0
  28. package/lib/constants/abis/crvUSD/MonetaryPolicy.json +294 -0
  29. package/lib/constants/abis/crvUSD/MonetaryPolicy2.json +299 -0
  30. package/lib/constants/abis/crvUSD/PegKeeper.json +411 -0
  31. package/lib/constants/abis/crvUSD/controller.json +991 -0
  32. package/lib/constants/abis/crvUSD/llamma.json +984 -0
  33. package/lib/constants/abis/gas_oracle_optimism.json +149 -0
  34. package/lib/constants/abis/gas_oracle_optimism_blob.json +203 -0
  35. package/lib/constants/aliases.d.ts +16 -0
  36. package/lib/constants/aliases.js +124 -0
  37. package/lib/constants/coins.d.ts +16 -0
  38. package/lib/constants/coins.js +24 -0
  39. package/lib/constants/llammas.d.ts +2 -0
  40. package/lib/constants/llammas.js +96 -0
  41. package/lib/constants/utils.d.ts +4 -0
  42. package/lib/constants/utils.js +27 -0
  43. package/lib/external-api.d.ts +13 -0
  44. package/lib/external-api.js +436 -0
  45. package/lib/index.d.ts +104 -0
  46. package/lib/index.js +123 -0
  47. package/lib/interfaces.d.ts +228 -0
  48. package/lib/interfaces.js +1 -0
  49. package/lib/lendMarkets/LendMarketTemplate.d.ts +510 -0
  50. package/lib/lendMarkets/LendMarketTemplate.js +4682 -0
  51. package/lib/lendMarkets/index.d.ts +3 -0
  52. package/lib/lendMarkets/index.js +3 -0
  53. package/lib/lendMarkets/lendMarketConstructor.d.ts +2 -0
  54. package/lib/lendMarkets/lendMarketConstructor.js +6 -0
  55. package/lib/llamalend.d.ts +80 -0
  56. package/lib/llamalend.js +878 -0
  57. package/lib/mintMarkets/MintMarketTemplate.d.ts +308 -0
  58. package/lib/mintMarkets/MintMarketTemplate.js +2998 -0
  59. package/lib/mintMarkets/index.d.ts +3 -0
  60. package/lib/mintMarkets/index.js +3 -0
  61. package/lib/mintMarkets/mintMarketConstructor.d.ts +2 -0
  62. package/lib/mintMarkets/mintMarketConstructor.js +4 -0
  63. package/lib/st-crvUSD.d.ts +35 -0
  64. package/lib/st-crvUSD.js +505 -0
  65. package/lib/utils.d.ts +58 -0
  66. package/lib/utils.js +661 -0
  67. package/package.json +42 -0
  68. package/src/cache/index.ts +41 -0
  69. package/src/constants/L2Networks.ts +1 -0
  70. package/src/constants/abis/Controller.json +1027 -0
  71. package/src/constants/abis/ERC20.json +222 -0
  72. package/src/constants/abis/ERC4626.json +1674 -0
  73. package/src/constants/abis/GaugeController.json +794 -0
  74. package/src/constants/abis/GaugeFactoryMainnet.json +1 -0
  75. package/src/constants/abis/GaugeFactorySidechain.json +475 -0
  76. package/src/constants/abis/GaugeV5.json +958 -0
  77. package/src/constants/abis/LeverageZap.json +35 -0
  78. package/src/constants/abis/Llamma.json +984 -0
  79. package/src/constants/abis/Minter.json +1 -0
  80. package/src/constants/abis/MonetaryPolicy.json +221 -0
  81. package/src/constants/abis/OneWayLendingFactoryABI.json +899 -0
  82. package/src/constants/abis/SidechainGauge.json +939 -0
  83. package/src/constants/abis/Vault.json +721 -0
  84. package/src/constants/abis/crvUSD/DeleverageZap.json +248 -0
  85. package/src/constants/abis/crvUSD/ERC20.json +222 -0
  86. package/src/constants/abis/crvUSD/Factory.json +514 -0
  87. package/src/constants/abis/crvUSD/HealthCalculatorZap.json +54 -0
  88. package/src/constants/abis/crvUSD/LeverageZap.json +312 -0
  89. package/src/constants/abis/crvUSD/MonetaryPolicy.json +294 -0
  90. package/src/constants/abis/crvUSD/MonetaryPolicy2.json +299 -0
  91. package/src/constants/abis/crvUSD/PegKeeper.json +411 -0
  92. package/src/constants/abis/crvUSD/controller.json +991 -0
  93. package/src/constants/abis/crvUSD/llamma.json +984 -0
  94. package/src/constants/abis/gas_oracle_optimism.json +149 -0
  95. package/src/constants/abis/gas_oracle_optimism_blob.json +203 -0
  96. package/src/constants/aliases.ts +141 -0
  97. package/src/constants/coins.ts +41 -0
  98. package/src/constants/llammas.ts +99 -0
  99. package/src/constants/utils.ts +33 -0
  100. package/src/external-api.ts +325 -0
  101. package/src/index.ts +128 -0
  102. package/src/interfaces.ts +237 -0
  103. package/src/lendMarkets/LendMarketTemplate.ts +3022 -0
  104. package/src/lendMarkets/index.ts +7 -0
  105. package/src/lendMarkets/lendMarketConstructor.ts +7 -0
  106. package/src/llamalend.ts +785 -0
  107. package/src/mintMarkets/MintMarketTemplate.ts +1781 -0
  108. package/src/mintMarkets/index.ts +7 -0
  109. package/src/mintMarkets/mintMarketConstructor.ts +5 -0
  110. package/src/st-crvUSD.ts +244 -0
  111. package/src/utils.ts +497 -0
  112. package/test/fetch.test.ts +152 -0
  113. package/test/general.test.ts +216 -0
  114. package/test/leverageBorrowMore.test.ts +245 -0
  115. package/test/leverageCreateLoan.test.ts +236 -0
  116. package/test/leverageRepay.test.ts +240 -0
  117. package/test/readme.test.ts +475 -0
  118. package/test/selfLiquidate.test.ts +57 -0
  119. package/test/selfLiquidateCrvUSD.test.ts +54 -0
  120. package/test/st_crvUSD.test.ts +68 -0
  121. package/test/swap.test.ts +62 -0
  122. package/test/swapCrvUSD.test.ts +56 -0
  123. package/test/vault.test.ts +112 -0
  124. package/tsconfig.build.json +10 -0
  125. package/tsconfig.json +72 -0
package/README.md ADDED
@@ -0,0 +1,1976 @@
1
+ # CURVE LLAMALEND JS
2
+
3
+ ## Setup
4
+
5
+ Install from npm:
6
+
7
+ `npm install @curvefi/llamalend-api`
8
+
9
+ ## Init
10
+ ```ts
11
+ import llamalend from "@curvefi/llamalend-api";
12
+
13
+ (async () => {
14
+ // 1. Dev
15
+ await llamalend.init('JsonRpc', {url: 'http://localhost:8545/', privateKey: ''}, { gasPrice: 0, maxFeePerGas: 0, maxPriorityFeePerGas: 0, chainId: 1 });
16
+ // OR
17
+ await llamalend.init('JsonRpc', {}, {}); // In this case JsonRpc url, privateKey, fee data and chainId will be specified automatically
18
+
19
+ // 2. Infura
20
+ llamalend.init("Infura", { network: "homestead", apiKey: <INFURA_KEY> }, { chainId: 1 });
21
+
22
+ // 3. Web3 provider
23
+ llamalend.init('Web3', { externalProvider: <WEB3_PROVIDER> }, { chainId: 1 });
24
+ })()
25
+ ```
26
+ **Note 1.** ```chainId``` parameter is optional, but you must specify it in the case you use Metamask on localhost network, because Metamask has that [bug](https://hardhat.org/metamask-issue.html)
27
+
28
+ **Note 2.** Web3 init requires the address. Therefore, it can be initialized only after receiving the address.
29
+
30
+ **Wrong ❌️**
31
+ ```tsx
32
+ import type { FunctionComponent } from 'react'
33
+ import { useState, useMemo } from 'react'
34
+ import { providers } from 'ethers'
35
+ import Onboard from 'bnc-onboard'
36
+ import type { Wallet } from 'bnc-onboard/dist/src/interfaces'
37
+ import llamalend from '@curvefi/lending-api'
38
+ ...
39
+
40
+ const WalletProvider: FunctionComponent = ({ children }) => {
41
+ const [wallet, setWallet] = useState<Wallet>()
42
+ const [provider, setProvider] = useState<providers.Web3Provider>()
43
+ const [address, setAddress] = useState<string>()
44
+
45
+ const networkId = 1
46
+
47
+ const onboard = useMemo(
48
+ () =>
49
+ Onboard({
50
+ dappId: DAPP_ID,
51
+ networkId,
52
+
53
+ subscriptions: {
54
+ address: (address) => {
55
+ setAddress(address)
56
+ },
57
+
58
+ wallet: (wallet) => {
59
+ setWallet(wallet)
60
+ if (wallet.provider) {
61
+ llamalend.init("Web3", { externalProvider: wallet.provider }, { chainId: networkId })
62
+ }
63
+ },
64
+ },
65
+ walletSelect: {
66
+ wallets: wallets,
67
+ },
68
+ }),
69
+ []
70
+ )
71
+
72
+ ...
73
+ ```
74
+
75
+ **Right ✔️**
76
+ ```tsx
77
+ import type { FunctionComponent } from 'react'
78
+ import { useState, useMemo, useEffect } from 'react'
79
+ import { providers } from 'ethers'
80
+ import Onboard from 'bnc-onboard'
81
+ import type { Wallet } from 'bnc-onboard/dist/src/interfaces'
82
+ import llamalend from '@curvefi/lending-api'
83
+
84
+ ...
85
+
86
+ const WalletProvider: FunctionComponent = ({ children }) => {
87
+ const [wallet, setWallet] = useState<Wallet>()
88
+ const [provider, setProvider] = useState<providers.Web3Provider>()
89
+ const [address, setAddress] = useState<string>()
90
+
91
+ const networkId = 1
92
+
93
+ const onboard = useMemo(
94
+ () =>
95
+ Onboard({
96
+ dappId: DAPP_ID,
97
+ networkId,
98
+
99
+ subscriptions: {
100
+ address: (address) => {
101
+ setAddress(address)
102
+ },
103
+
104
+ wallet: (wallet) => {
105
+ setWallet(wallet)
106
+ },
107
+ },
108
+ walletSelect: {
109
+ wallets: wallets,
110
+ },
111
+ }),
112
+ []
113
+ )
114
+
115
+ useEffect(() => {
116
+ if (address && wallet?.provider) {
117
+ llamalend.init("Web3", { externalProvider: wallet.provider }, { chainId: networkId })
118
+ }
119
+ }, [address, wallet?.provider]);
120
+
121
+ ...
122
+ ```
123
+
124
+ ## Notes
125
+ - 1 Amounts can be passed in args either as numbers or strings.
126
+ - 2 lendMarket.swap**PriceImpact** method returns %, e. g. 0 < priceImpact <= 100.
127
+ - 3 Slippage arg should be passed as %, e. g. 0 < slippage <= 100.
128
+
129
+
130
+
131
+ ## General methods
132
+ ```ts
133
+ import llamalend from "@curvefi/llamalend-api";
134
+
135
+ (async () => {
136
+ await llamalend.init('JsonRpc', {});
137
+
138
+ const balances1 = await llamalend.getBalances(['sdt', 'weth']);
139
+ // OR const balances1 = await llamalend.getBalances(['0x361a5a4993493ce00f61c32d4ecca5512b82ce90', '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619']);
140
+ //['80980.0', '99.0']
141
+
142
+ // You can specify address
143
+ const balances2 = await llamalend.getBalances(['sdt', 'weth'], "0x0063046686E46Dc6F15918b61AE2B121458534a5");
144
+ // OR const balances2 = await llamalend.getBalances(['0x361a5a4993493ce00f61c32d4ecca5512b82ce90', '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'], '0x0063046686E46Dc6F15918b61AE2B121458534a5');
145
+ //['0.0', '0.0']
146
+
147
+ const spender = "0x136e783846ef68C8Bd00a3369F787dF8d683a696"
148
+
149
+ await llamalend.getAllowance(['sdt', 'weth'], llamalend.signerAddress, spender);
150
+ //['0.0', '0.0']
151
+ await llamalend.hasAllowance(['sdt', 'weth'], ['1000', '1000'], llamalend.signerAddress, spender);
152
+ //false
153
+ await llamalend.ensureAllowance(['sdt', 'weth'], ['1000', '1000'], spender);
154
+ //['0xab21975af93c403fff91ac50e3e0df6a55b59c3003b34e9900821f5fa19e5454', '0xb6e10a2975adbde7dfb4263c0957dcce6c28cbe7a862f285bb4bda43cca8d62d']
155
+
156
+ await llamalend.getUsdRate('0x7ceb23fd6bc0add59e62ac25578270cff1b9f619');
157
+ //2637.61
158
+ })()
159
+ ```
160
+
161
+ ## lendMarket
162
+
163
+ ### lendMarket fields
164
+ ```ts
165
+ import llamalend from "@curvefi/llamalend-api";
166
+
167
+ (async () => {
168
+ await llamalend.init('JsonRpc', {});
169
+
170
+ const lendMarket = llamalend.getLendMarket('one-way-market-0');
171
+
172
+ lendMarket.id
173
+ // "one-way-market-0"
174
+ lendMarket.name
175
+ // "market-0"
176
+ lendMarket.addresses
177
+ // {
178
+ // amm: "0x78f7f91dce40269df106a189e47f27bab561332b"
179
+ // borrowed_token: "0x361a5a4993493ce00f61c32d4ecca5512b82ce90"
180
+ // collateral_token: "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619"
181
+ // controller: "0xe27dda8e706f41ca0b496e6cf1b7f1e8308e6732"
182
+ // gauge: "0x0000000000000000000000000000000000000000"
183
+ // monetary_policy: "0xa845d0688745db0f377a6c5bf5fcde0a3a1a6aeb"
184
+ // vault: "0x42526886adb3b20a23a5a19c04e4bf81e9febb2b"
185
+ // }
186
+ lendMarket.borrowed_token
187
+ // {
188
+ // address: "0x361a5a4993493ce00f61c32d4ecca5512b82ce90"
189
+ // decimals: 18
190
+ // name: "Stake DAO Token (PoS)"
191
+ // symbol: "SDT"
192
+ // }
193
+ lendMarket.collateral_token
194
+ // {
195
+ // address: "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619"
196
+ // decimals: 18
197
+ // name: "Wrapped Ether"
198
+ // symbol: "WETH"
199
+ // }
200
+ lendMarket.coinAddresses
201
+ // ["0x361a5a4993493ce00f61c32d4ecca5512b82ce90", "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619"]
202
+ lendMarket.coinDecimals
203
+ // [18,18]
204
+ lendMarket.defaultBands
205
+ // 10
206
+ lendMarket.maxBands
207
+ // 50
208
+ lendMarket.minBands
209
+ // 4
210
+ })()
211
+ ````
212
+
213
+ ### Wallet balances for lendMarket
214
+ ```ts
215
+ import llamalend from "@curvefi/llamalend-api";
216
+
217
+ (async () => {
218
+ await llamalend.init('JsonRpc', {});
219
+ await llamalend.lendMarkets.fetchMarkets();
220
+
221
+ const lendMarket = llamalend.getLendMarket('one-way-market-0');
222
+
223
+ // 1. Current address (signer) balances
224
+ console.log(await lendMarket.wallet.balances());
225
+ //
226
+ {
227
+ borrowed: "100000.0"
228
+ collateral: "100.0"
229
+ vaultShares: "0.0"
230
+ }
231
+ //
232
+
233
+ // 2. You can specify the address
234
+ console.log(await lendMarket.wallet.balances("0x0063046686E46Dc6F15918b61AE2B121458534a5"));
235
+ //
236
+ {
237
+ borrowed: "0.0"
238
+ collateral: "0.0"
239
+ vaultShares: "0.0"
240
+ }
241
+ //
242
+ })()
243
+ ```
244
+
245
+ ### Stats for lendMarket
246
+ ```ts
247
+ import llamalend from "@curvefi/llamalend-api";
248
+
249
+ (async () => {
250
+ await llamalend.init('JsonRpc', {});
251
+
252
+ await llamalend.lendMarkets.fetchMarkets();
253
+
254
+ const lendMarket = llamalend.getLendMarket('one-way-market-0');
255
+
256
+ await lendMarket.stats.parameters();
257
+ // {
258
+ // A: "100"
259
+ // admin_fee: "0.0"
260
+ // base_price: "8595.062092132517715849"
261
+ // fee: "0.6"
262
+ // liquidation_discount: "6.0"
263
+ // loan_discount: "9.0"
264
+ // }
265
+ await lendMarket.stats.rates();
266
+ // {
267
+ // borrowApr: '17.8208613727056',
268
+ // lendApr: '13.829407727114368717',
269
+ // borrowApy: '19.507460419926105',
270
+ // lendApy: '15.138248271258824725'
271
+ // }
272
+ await lendMarket.stats.futureRates(10000, 0); // dReserves = 10000, dDebt = 0
273
+ // {
274
+ // borrowApr: '14.7869386793856',
275
+ // lendApr: '10.875115183120530145',
276
+ // borrowApy: '15.936145855611583',
277
+ // lendApy: '11.720304351866410822'
278
+ // }
279
+ await lendMarket.stats.futureRates(0, 10000); // dReserves = 0, dDebt = 10000
280
+ // {
281
+ // borrowApr: '22.979565109512',
282
+ // lendApr: '19.100290524367724358',
283
+ // borrowApy: '25.834284267258045',
284
+ // lendApy: '21.473092838884015799'
285
+ // }
286
+ await lendMarket.stats.balances();
287
+ const { activeBand, maxBand, minBand, liquidationBand } = await lendMarket.stats.bandsInfo();
288
+ // { activeBand: 0, maxBand: 15, minBand: 0, liquidationBand: null }
289
+ await lendMarket.stats.bandBalances(liquidatingBand ?? 0);
290
+ // {
291
+ // borrowed: "0.0"
292
+ // collateral: "0.0"
293
+ // }
294
+ await lendMarket.stats.bandsBalances();
295
+ // {
296
+ // '0': { borrowed: '0.0', collateral: '0.0' },
297
+ // '1': { borrowed: '0.0', collateral: '0.0' },
298
+ // '2': { borrowed: '0.0', collateral: '0.0' },
299
+ // '3': { borrowed: '0.0', collateral: '0.0' },
300
+ // '4': { borrowed: '0.0', collateral: '0.0' },
301
+ // '5': { borrowed: '0.0', collateral: '0.0' },
302
+ // '6': { borrowed: '0.0', collateral: '0.0' },
303
+ // '7': { borrowed: '0.0', collateral: '0.0' },
304
+ // '8': { borrowed: '0.0', collateral: '0.0' },
305
+ // '9': { borrowed: '0.0', collateral: '0.0' },
306
+ // '10': { borrowed: '0.0', collateral: '0.0' },
307
+ // '11': { borrowed: '0.0', collateral: '0.0' },
308
+ // '12': { borrowed: '0.0', collateral: '0.1' },
309
+ // '13': { borrowed: '0.0', collateral: '0.1' },
310
+ // '14': { borrowed: '0.0', collateral: '0.1' },
311
+ // '15': { borrowed: '0.0', collateral: '0.1' }
312
+ // }
313
+ await lendMarket.stats.totalDebt();
314
+ // 1000.0
315
+ await lendMarket.stats.ammBalances();
316
+ // {
317
+ // borrowed: "0"
318
+ // collateral: "0"
319
+ // }
320
+ await lendMarket.stats.capAndAvailable();
321
+ // {
322
+ // available: "0.0"
323
+ // cap: "0.0"
324
+ // }
325
+ })()
326
+ ````
327
+
328
+
329
+ ### Vault: deposit, mint, stake, unstake, withdraw, redeem for lendMarktet
330
+ ```ts
331
+ await llamalend.init('JsonRpc', {});
332
+ await llamalend.lendMarkets.fetchMarkets();
333
+
334
+ const lendMarket = llamalend.getLendMarket('one-way-market-1');
335
+
336
+
337
+ await lendMarket.wallet.balances();
338
+ // {
339
+ // collateral: '100000.0',
340
+ // borrowed: '1000000.0',
341
+ // vaultShares: '0.0',
342
+ // gauge: '0.0'
343
+ // }
344
+
345
+ // ------------ DEPOSIT ------------
346
+
347
+ await lendMarket.vault.maxDeposit();
348
+ // 1000000.0
349
+ await lendMarket.vault.previewDeposit(20000); // Shares to receive
350
+ // 19957279.880161894212096572
351
+ await lendMarket.vault.depositIsApproved(20000);
352
+ // false
353
+ await lendMarket.vault.depositApprove(20000);
354
+ // [
355
+ // '0xb4a9da37381d6a7b36d89c977c6974d6f7d0aa7b82564b7bdef7b06b2fbd58ae'
356
+ // ]
357
+ await lendMarket.vault.deposit(20000);
358
+ // 0x2670db285b6ac1d1e4fc63455554303b583ea0278ee7d75624be4573e018aa2e
359
+
360
+ await lendMarket.wallet.balances();
361
+ // {
362
+ // collateral: '100000.0',
363
+ // borrowed: '980000.0',
364
+ // vaultShares: '19957272.526619469933528807',
365
+ // gauge: '0.0'
366
+ // }
367
+
368
+ // ------------ MINT ------------
369
+
370
+ await lendMarket.vault.maxMint();
371
+ // 977906353.804354026742911543
372
+ await lendMarket.vault.previewMint(20000); // Assets to send
373
+ // 20.042818950659253842
374
+ await lendMarket.vault.mintIsApproved(20000);
375
+ // true
376
+ await lendMarket.vault.mintApprove(20000);
377
+ // []
378
+ await lendMarket.vault.mint(20000);
379
+ // 0x9e34e201edaeacd27cb3013e003d415c110f562ad105e587f7c8fb0c3b974142
380
+
381
+ let balances = await lendMarket.wallet.balances();
382
+ // {
383
+ // collateral: '100000.0',
384
+ // borrowed: '979979.95718098845915171',
385
+ // vaultShares: '19977272.526619469933528807',
386
+ // gauge: '0.0'
387
+ // }
388
+
389
+ // ------------ UTILS ------------
390
+
391
+ await lendMarket.vault.convertToAssets(100000);
392
+ // 100.0
393
+ await lendMarket.vault.convertToShares(100);
394
+ // 100000.0
395
+
396
+ // ------------ STAKE ------------
397
+
398
+ await lendMarket.vault.stakeIsApproved(balances.vaultShares);
399
+ // false
400
+ await lendMarket.vault.stakeApprove(balances.vaultShares);
401
+ // [
402
+ // '0xf3009825dfed3352d99b7d45b72d99b9a9b1773fae2abeabdb39d9880a3266d6'
403
+ // ]
404
+ await lendMarket.vault.stake(balances.vaultShares);
405
+ // 0x3572dfa980b98091061df4b27ea8f05dee8b49384cc781dbcd7b8cf099610426
406
+ balances = await lendMarket.wallet.balances();
407
+ // {
408
+ // collateral: '100000.0',
409
+ // borrowed: '979979.95718098845915171',
410
+ // vaultShares: '0.0',
411
+ // gauge: '19977272.526619469933528807'
412
+ // }
413
+
414
+ // ------------ UNSTAKE ------------
415
+
416
+ await lendMarket.vault.unstake(balances.gauge);
417
+ // 0x30216703c444705598b10b3b510d05a19b44ad84699d8e2f3f0198a4573def99
418
+
419
+ await lendMarket.wallet.balances();
420
+ // {
421
+ // collateral: '100000.0',
422
+ // borrowed: '979979.95718098845915171',
423
+ // vaultShares: '19977272.526619469933528807',
424
+ // gauge: '0.0'
425
+ // }
426
+
427
+ // ------------ WITHDRAW ------------
428
+
429
+ await lendMarket.vault.maxWithdraw();
430
+ // 20020.043244481699203505
431
+ await lendMarket.vault.previewWithdraw(10000); // Shares to send
432
+ // 9978636.051211318667087166
433
+ await lendMarket.vault.withdraw(10000);
434
+ //0xa8df19e420040dc21e60f1a25eedec01fead748e2d654100ca3e2d0e369a7ae0
435
+
436
+ await lendMarket.wallet.balances();
437
+ // {
438
+ // collateral: '100000.0',
439
+ // borrowed: '989979.95718098845915171',
440
+ // vaultShares: '9998636.505706074967248914',
441
+ // gauge: '0.0'
442
+ // }
443
+
444
+ // ------------ REDEEM ------------
445
+
446
+ await lendMarket.vault.maxRedeem();
447
+ // 9998636.505706074967248914
448
+ await lendMarket.vault.previewRedeem(10000); // Assets to receive
449
+ // 10.021409718764999588
450
+ await lendMarket.vault.redeem(10000);
451
+ // 0x391721baa517170c23819b070532a3429ab3c7a306042615bf8e1983d035e363
452
+
453
+ await lendMarket.wallet.balances();
454
+ // {
455
+ // collateral: '100000.0',
456
+ // borrowed: '989989.978590745251091246',
457
+ // vaultShares: '9988636.505706074967248914',
458
+ // gauge: '0.0'
459
+ // }
460
+
461
+ // ------------ REWARDS ------------
462
+
463
+ lendMarket.vault.rewardsOnly();
464
+ // false
465
+ await lendMarket.vault.totalLiquidity();
466
+ // 180638.919172
467
+ await lendMarket.vault.crvApr();
468
+ // [0, 0]
469
+ await lendMarket.vault.rewardTokens();
470
+ // []
471
+ await lendMarket.vault.rewardsApr();
472
+ // []
473
+ await lendMarket.vault.claimableCrv();
474
+ // 0.0
475
+ await lendMarket.vault.claimCrv();
476
+ // 0x8325bada809340d681c165ffc5bac0ba490f8350872b5d0aa82f3fe6c01205aa
477
+ await lendMarket.vault.claimableRewards();
478
+ // []
479
+ await lendMarket.vault.claimRewards();
480
+ // 0xb0906c3a2dea66d1ab6f280833f7205f46af7374f8cf9baa5429f881094140ba
481
+ ````
482
+
483
+ ### Create loan, add collateral, borrow more, repay for lendMarket
484
+ ```ts
485
+ (async () => {
486
+ await llamalend.init('JsonRpc', {});
487
+
488
+ await llamalend.lendMarkets.fetchMarkets();
489
+
490
+ const lendMarket = llamalend.getLendMarket('one-way-market-0');
491
+
492
+
493
+ // --- CREATE LOAN ---
494
+
495
+ await lendMarket.oraclePrice();
496
+ // 3000.0
497
+ await lendMarket.price();
498
+ // 3045.569137149127502965
499
+ await lendMarket.basePrice();
500
+ // '3000.0'
501
+ await lendMarket.wallet.balances();
502
+ // { borrowed: '0.0', collateral: '1.0' }
503
+ await lendMarket.createLoanMaxRecv(0.5, 5);
504
+ // 1375.74670276529114147
505
+ await lendMarket.createLoanBands(0.5, 1000, 5);
506
+ // [ 36, 32 ]
507
+ await lendMarket.createLoanPrices(0.5, 1000, 5);
508
+ // [ '2068.347257607234777', '2174.941007873561634' ]
509
+ await lendMarket.createLoanHealth(0.5, 1000, 5); // FULL
510
+ // 45.191203147616155
511
+ await lendMarket.createLoanHealth(0.5, 1000, 5, false); // NOT FULL
512
+ // 3.9382535412942367
513
+
514
+ await lendMarket.createLoanIsApproved(0.5);
515
+ // false
516
+ await lendMarketa.createLoanApprove(0.5);
517
+ // [
518
+ // '0xc111e471715ae6f5437e12d3b94868a5b6542cd7304efca18b5782d315760ae5'
519
+ // ]
520
+ await lendMarket.createLoan(0.5, 1000, 5);
521
+
522
+ console.log(await lendMarket.userLoanExists());
523
+ //true
524
+ console.log(await lendMarket.userState());
525
+ //
526
+ {
527
+ N: "5"
528
+ borrowed: "0.0"
529
+ collateral: "1.0"
530
+ debt: "1000.0"
531
+ }
532
+ //
533
+ console.log(await lendMarket.userHealth()); // FULL
534
+ //722.5902543890457276
535
+ console.log(await lendMarket.userHealth(false)); // NOT FULL
536
+ //3.4708541149110123
537
+ console.log(await lendMarket.userRange());
538
+ //5
539
+ console.log(await lendMarket.userBands());
540
+ //[206,,202]
541
+ console.log(await lendMarket.userPrices());
542
+ //["1073.332550295331639435","1128.647508360591547283]
543
+ console.log(await lendMarket.userBandsBalances());
544
+ //
545
+ // {
546
+ // 202: {collateral: '0.2', borrowed: '0.0'},
547
+ // 203: {collateral: '0.2', borrowed: '0.0'},
548
+ // 204: {collateral: '0.2', borrowed: '0.0'},
549
+ // 205: {collateral: '0.2', borrowed: '0.0'},
550
+ // 206: {collateral: '0.2', borrowed: '0.0'},
551
+ // }
552
+ //
553
+
554
+
555
+ // --- BORROW MORE ---
556
+
557
+ await lendMarket.borrowMoreMaxRecv(0.1);
558
+ // 650.896043318349376298
559
+ await lendMarket.borrowMoreBands(0.1, 500);
560
+ // [ 14, 10 ]
561
+ await lendMarket.borrowMorePrices(0.1, 500);
562
+ // [ '2580.175063923865968', '2713.146225026413746' ]
563
+ await lendMarket.borrowMoreHealth(0.1, 500); // FULL
564
+ // 15.200984677843693 %
565
+ await lendMarket.borrowMoreHealth(0.1, 500, false); // NOT FULL
566
+ // 3.7268336789002429 %
567
+
568
+ await lendMarket.borrowMoreIsApproved(0.1);
569
+ // true
570
+ await lendMarket.borrowMoreApprove(0.1);
571
+ // []
572
+
573
+ await lendMarket.borrowMore(0.1, 500);
574
+
575
+ // Full health: 15.200984677843694 %
576
+ // Not full health: 3.7268336789002439 %
577
+ // Bands: [ 14, 10 ]
578
+ // Prices: [ '2580.175063923865968', '2713.146225026413746' ]
579
+ // State: { collateral: '0.6', borrowed: '0.0', debt: '1500.0' }
580
+
581
+ // --- ADD COLLATERAL ---
582
+
583
+ await lendMarket.addCollateralBands(0.2);
584
+ // [ 43, 39 ]
585
+ await lendMarket.addCollateralPrices(0.2);
586
+ // [ '1927.834806254156043', '2027.187147180850842' ]
587
+ await lendMarket.addCollateralHealth(0.2); // FULL
588
+ // 55.2190795613534006
589
+ await lendMarket.addCollateralHealth(0.2, false); // NOT FULL
590
+ // 3.3357274109987789
591
+
592
+ await lendMarket.addCollateralIsApproved(0.2);
593
+ // true
594
+ await lendMarket.addCollateralApprove(0.2);
595
+ // []
596
+
597
+ await lendMarket.addCollateral(0.2); // OR await lendMarket.addCollateral(0.2, forAddress);
598
+
599
+ // Full health: 55.2190795613534014 %
600
+ // Not full health: 3.3357274109987797 %
601
+ // Bands: [ 43, 39 ]
602
+ // Prices: [ '1927.834806254156043', '2027.187147180850842' ]
603
+ // State: { collateral: '0.8', borrowed: '0.0', debt: '1500.0' }
604
+
605
+ // --- REMOVE COLLATERAL ---
606
+
607
+ await lendMarket.maxRemovable()
608
+ // 0.254841506439755199
609
+ await lendMarket.removeCollateralBands(0.1);
610
+ // [ 29, 25 ]
611
+ await lendMarket.removeCollateralPrices(0.1);
612
+ // [ '2219.101120164841944', '2333.46407819744091' ]
613
+ await lendMarket.removeCollateralHealth(0.1); // FULL
614
+ // 35.1846612411492316
615
+ await lendMarket.removeCollateralHealth(0.1, false); // NOT FULL
616
+ // 4.0796515570298074
617
+
618
+ await lendMarket.removeCollateral(0.1);
619
+
620
+ // Full health: 35.1846612411492326 %
621
+ // Not full health: 4.0796515570298084 %
622
+ // Bands: [ 29, 25 ]
623
+ // Prices: [ '2219.101120164841944', '2333.46407819744091', ]
624
+ // State: { collateral: '0.7', borrowed: '0.0', debt: '1500.0' }
625
+
626
+ // --- REPAY ---
627
+
628
+ await lendMarket.wallet.balances();
629
+ // { borrowed: '1500.0', collateral: '0.3' }
630
+
631
+ await lendMarket.repayBands(1000);
632
+ // [ 139, 135 ]
633
+ await lendMarket.repayPrices(1000);
634
+ // [ '734.595897104762463', '772.453820291837448' ]
635
+ await lendMarket.repayHealth(1000); // FULL
636
+ // 315.2178906180373138
637
+ await lendMarket.repayHealth(1000, false); // NOT FULL
638
+ // 3.3614254588945566
639
+
640
+ await lendMarket.repayIsApproved(1000);
641
+ // true
642
+ await lendMarket.repayApprove(1000);
643
+ // []
644
+ await lendMarket.repay(1000);
645
+
646
+ // Full health: 315.2178906180373149 %
647
+ // Not full health: 3.3614254588945577 %
648
+ // Bands: [ 139, 135 ]
649
+ // Prices: [ '734.595897104762463', '772.453820291837448' ]
650
+ // State: { collateral: '0.7', borrowed: '0.0', debt: '500.0' }
651
+
652
+ // --- FULL REPAY ---
653
+
654
+ await lendMarket.fullRepayIsApproved();
655
+ // true
656
+ await lendMarket.fullRepayApprove();
657
+ // []
658
+ await lendMarket.fullRepay();
659
+
660
+ // Loan exists: false
661
+ // State: { collateral: '0.0', borrowed: '0.0', debt: '0.0' }
662
+ })()
663
+ ```
664
+
665
+ ### Create loan all ranges methods for lendMarket
666
+ ```ts
667
+ await llamalend.init('JsonRpc', {});
668
+
669
+ const lendMarket = llamalend.getLendMarket('one-way-market-0');
670
+
671
+ await lendMarket.createLoanMaxRecvAllRanges(1);
672
+ // {
673
+ // '5': '2751.493405530582454486',
674
+ // '6': '2737.828112577888632315',
675
+ // '7': '2724.253615257658154585',
676
+ // '8': '2710.76923397831492797',
677
+ // '9': '2697.374294577689210021',
678
+ // '10': '2684.068128277815937982',
679
+ // '11': '2670.850071640120547429',
680
+ // '12': '2657.719466520988458715',
681
+ // '13': '2644.675660027714709155',
682
+ // '14': '2631.718004474831209682',
683
+ // '15': '2618.845857340807263461',
684
+ // '16': '2606.058581225120973696',
685
+ // '17': '2593.355543805697908653',
686
+ // '18': '2580.736117796713531552',
687
+ // '19': '2568.199680906757040338',
688
+ // '20': '2555.745615797352299399',
689
+ //
690
+ // ...
691
+ //
692
+ // '50': '2217.556229455652339229'
693
+ // }
694
+
695
+ await lendMarket.createLoanBandsAllRanges(1, 2600);
696
+ // {
697
+ // '5': [ 10, 6 ],
698
+ // '6': [ 11, 6 ],
699
+ // '7': [ 11, 5 ],
700
+ // '8': [ 12, 5 ],
701
+ // '9': [ 12, 4 ],
702
+ // '10': [ 13, 4 ],
703
+ // '11': [ 13, 3 ],
704
+ // '12': [ 14, 3 ],
705
+ // '13': [ 14, 2 ],
706
+ // '14': [ 15, 2 ],
707
+ // '15': [ 15, 1 ],
708
+ // '16': [ 16, 1 ],
709
+ // '17': null,
710
+ // '18': null,
711
+ // '19': null,
712
+ // '20': null,
713
+ //
714
+ // ...
715
+ //
716
+ // '50': null
717
+ // }
718
+
719
+ await lendMarket.createLoanPricesAllRanges(1, 2600);
720
+ // {
721
+ // '5': [ '2686.01476277614933533', '2824.440448203' ],
722
+ // '6': [ '2659.154615148387841976', '2824.440448203' ],
723
+ // '7': [ '2659.154615148387841976', '2852.9701497' ],
724
+ // '8': [ '2632.563068996903963557', '2852.9701497' ],
725
+ // '9': [ '2632.563068996903963557', '2881.78803' ],
726
+ // '10': [ '2606.237438306934923921', '2881.78803' ],
727
+ // '11': [ '2606.237438306934923921', '2910.897' ],
728
+ // '12': [ '2580.175063923865574682', '2910.897' ],
729
+ // '13': [ '2580.175063923865574682', '2940.3' ],
730
+ // '14': [ '2554.373313284626918935', '2940.3' ],
731
+ // '15': [ '2554.373313284626918935', '2970' ],
732
+ // '16': [ '2528.829580151780649746', '2970' ],
733
+ // '17': null,
734
+ // '18': null,
735
+ // '19': null,
736
+ // '20': null,
737
+ //
738
+ // ...
739
+ //
740
+ // '50': null
741
+ // }
742
+ ```
743
+
744
+ ### Swap for lendMarket
745
+ ```ts
746
+ (async () => {
747
+ await llamalend.init('JsonRpc', {});
748
+
749
+ const lendMarket = llamalend.getLendMarket('one-way-market-0');
750
+
751
+ await lendMarket.wallet.balances();
752
+ // {
753
+ // borrowed: '301.533523886491869218',
754
+ // collateral: '0.860611976623971606'
755
+ // }
756
+
757
+
758
+ await lendMarket.maxSwappable(0, 1);
759
+ // 380.672763174593107707
760
+ await lendMarket.swapExpected(0, 1, 100); // 100 - in_amount
761
+ // 0.03679356627103543 (out_amount)
762
+ await lendMarket.swapRequired(0, 1, 0.03679356627103543); // 0.03679356627103543 - out_amount
763
+ // 100.000000000000000558 (in_amount)
764
+ await lendMarket.swapPriceImpact(0, 1, 100);
765
+ // 0.170826
766
+ await lendMarket.swapIsApproved(0, 100);
767
+ // true
768
+ await lendMarket.swapApprove(0, 100);
769
+ // []
770
+ await lendMarket.swap(0, 1, 100, 0.1);
771
+
772
+ await lendMarket.wallet.balances();
773
+ // {
774
+ // borrowed: '201.533523886491869218',
775
+ // collateral: '0.897405542895007036'
776
+ // }
777
+ })()
778
+ ```
779
+
780
+ ### Self-liquidation for lendMarket
781
+ ```ts
782
+ (async () => {
783
+ await llamalend.init('JsonRpc', {});
784
+
785
+ const lendMarket = llamalend.getLendMarket('one-way-market-0');
786
+
787
+ // Wallet balances: {
788
+ // borrowed: '301.533523886491869218',
789
+ // collateral: '0.860611976623971606'
790
+ // }
791
+ // State: {
792
+ // collateral: '0.139388023376028394',
793
+ // borrowed: '2751.493405530582315609',
794
+ // debt: '3053.026929417074184827'
795
+ // }
796
+
797
+ await lendMarket.tokensToLiquidate();
798
+ // 301.533523886491869218
799
+ await lendMarket.selfLiquidateIsApproved();
800
+ // true
801
+ await lendMarket.selfLiquidateApprove();
802
+ // []
803
+ await lendMarket.selfLiquidate(0.1); // slippage = 0.1 %
804
+
805
+ // Wallet balances: { borrowed: '0.0', collateral: '1.0' }
806
+ // State: { collateral: '0.0', borrowed: '0.0', debt: '0.0' }
807
+ })()
808
+ ```
809
+
810
+ ### Liquidation for lendMarket
811
+ ```ts
812
+ (async () => {
813
+ await llamalend.init('JsonRpc', {});
814
+
815
+ const lendMarket = llamalend.getLendMarket('one-way-market-0');
816
+ const addressToLiquidate = "0x66aB6D9362d4F35596279692F0251Db635165871";
817
+
818
+ await lendMarket.wallet.balances();
819
+ // Liquidator wallet balances: {
820
+ // borrowed: '301.533523886491869218',
821
+ // collateral: '0.860611976623971606'
822
+ // }
823
+ await lendMarket.userState(addressToLiquidate);
824
+ // State of the account we are goning to liquidate: {
825
+ // collateral: '0.139388023376028394',
826
+ // borrowed: '2751.493405530582315609',
827
+ // debt: '3053.026929417074184827'
828
+ // }
829
+
830
+ await lendMarket.currentLeverage()
831
+ //0.94083266399502623316
832
+
833
+ await lendMarket.currentPosition()
834
+ // {
835
+ // currentPosition: "95777.510614373750083"
836
+ // deposited: "219533.5105208847"
837
+ // percentage: "-56.372259347958530763"
838
+ // }
839
+
840
+ await lendMarket.tokensToLiquidate(addressToLiquidate);
841
+ // 301.533523886491869218
842
+ await lendMarket.liquidateIsApproved();
843
+ // true
844
+ await lendMarket.liquidateApprove();
845
+ // []
846
+ await lendMarket.liquidate(addressToLiquidate, 0.1); // slippage = 0.1 %
847
+
848
+ // Liquidator wallet balances: { borrowed: '0.0', collateral: '1.0' }
849
+ // State of liquidated account: { collateral: '0.0', borrowed: '0.0', debt: '0.0' }
850
+ })()
851
+ ```
852
+
853
+ ### User loss for lendMarket
854
+ ```ts
855
+ (async () => {
856
+ await llamalend.init('JsonRpc', {});
857
+
858
+ const lendMarket = llamalend.getLendMarket('sfrxeth');
859
+
860
+ console.log(await lendMarket.userLoss("0x0063046686E46Dc6F15918b61AE2B121458534a5"));
861
+ // {
862
+ // deposited_collateral: '929.933909709140155529',
863
+ // current_collateral_estimation: '883.035865972092328038',
864
+ // loss: '46.898043737047827491',
865
+ // loss_pct: '5.043158793049750311'
866
+ // }
867
+ })()
868
+ ```
869
+
870
+ ### Leverage (createLoan, borrowMore, repay) for lendMarket
871
+ ```ts
872
+ (async () => {
873
+ await llamalend.init('JsonRpc', {}, {}, API_KEY_1INCH);
874
+ await llamalend.lendMarkets.fetchMarkets();
875
+
876
+ const lendMarket = llamalend.getLendMarket('one-way-market-0');
877
+ console.log(lendMarket.collateral_token, lendMarket.borrowed_token);
878
+ // {
879
+ // address: '0x82af49447d8a07e3bd95bd0d56f35241523fbab1',
880
+ // decimals: 18,
881
+ // name: 'Wrapped Ether',
882
+ // symbol: 'WETH'
883
+ // }
884
+ //
885
+ // {
886
+ // address: '0x498bf2b1e120fed3ad3d42ea2165e9b73f99c1e5',
887
+ // decimals: 18,
888
+ // name: 'Curve.Fi USD Stablecoin',
889
+ // symbol: 'crvUSD'
890
+ // }
891
+ console.log(await lendMarket.wallet.balances());
892
+ // {
893
+ // collateral: '100.0',
894
+ // borrowed: '2000000.0',
895
+ // vaultShares: '0.0',
896
+ // gauge: '0'
897
+ // }
898
+
899
+
900
+ // - Create Loan -
901
+
902
+ // Creates leveraged position (userCollateral + collateralFromUserBorrowed + leverage_collateral)
903
+ // ^
904
+ // |
905
+ // userCollateral | debt debt + userBorrowed
906
+ // user ---> controller ----> leverage_zap ----> router
907
+ // | ^ | ^ ^ |
908
+ // | |__________________| | |___________________|
909
+ // | leverageCollateral + collateralFromUserBorrowed
910
+ // |_____________________________________|
911
+ // userBorrowed
912
+
913
+ let userCollateral = 1;
914
+ let userBorrowed = 1000;
915
+ let debt = 2000;
916
+ const range = 10;
917
+ const slippage = 0.5; // %
918
+ await lendMarket.leverage.maxLeverage(range);
919
+ // 7.4728229145282742179
920
+ await lendMarket.leverage.createLoanMaxRecv(userCollateral, userBorrowed, range);
921
+ // {
922
+ // maxDebt: '26089.494406081862861214',
923
+ // maxTotalCollateral: '9.539182089833411347',
924
+ // userCollateral: '1',
925
+ // collateralFromUserBorrowed: '0.315221168834966496',
926
+ // collateralFromMaxDebt: '8.223960920998444851',
927
+ // maxLeverage: '7.25291100528992828612',
928
+ // avgPrice: '3172.3757757003568790858'
929
+ // }
930
+ await lendMarket.leverage.createLoanExpectedCollateral(userCollateral, userBorrowed, debt, slippage);
931
+ // {
932
+ // totalCollateral: '1.946422996710829',
933
+ // userCollateral: '1.0',
934
+ // collateralFromUserBorrowed: '0.315474332236942984',
935
+ // collateralFromDebt: '0.630948664473886',
936
+ // leverage: '1.4796358613861877'
937
+ // avgPrice: '3169.8299919022623523421'
938
+ // }
939
+ await lendMarket.leverage.createLoanPriceImpact(userBorrowed, debt);
940
+ // 0.08944411854377342 %
941
+ await lendMarket.leverage.createLoanMaxRange(userCollateral, userBorrowed, debt);
942
+ // 50
943
+ await lendMarket.leverage.createLoanBands(userCollateral, userBorrowed, debt, range);
944
+ // [ 76, 67 ]
945
+ await lendMarket.leverage.createLoanPrices(userCollateral, userBorrowed, debt, range);
946
+ // [ '1027.977701011670136614', '1187.061409925215211173' ]
947
+ await lendMarket.leverage.createLoanHealth(userCollateral, userBorrowed, debt, range);
948
+ // 195.8994783042570637
949
+ await lendMarket.leverage.createLoanHealth(userCollateral, userBorrowed, debt, range, false);
950
+ // 3.2780908310686365
951
+ await lendMarket.leverage.createLoanIsApproved(userCollateral, userBorrowed);
952
+ // false
953
+ await lendMarket.leverage.createLoanApprove(userCollateral, userBorrowed);
954
+ // [
955
+ // '0xd5491d9f1e9d8ac84b03867494e35b25efad151c597d2fa4211d7bf5d540c98e',
956
+ // '0x93565f37ec5be902a824714a30bddc25cf9cd9ed39b4c0e8de61fab44af5bc8c'
957
+ // ]
958
+ await lendMarket.leverage.createLoanRouteImage(userBorrowed, debt);
959
+ // 'data:image/svg+xml;base64,PHN2ZyBpZD0ic2Fua2V5UGFyZW50U3ZnIiB4bWxucz...'
960
+
961
+
962
+ // You must call lendMarket.leverage.createLoanExpectedCollateral() with the same args before
963
+ await lendMarket.leverage.createLoan(userCollateral, userBorrowed, debt, range);
964
+ // 0xeb1b7a92bcb02598f00dc8bbfe8fa3a554e7a2b1ca764e0ee45e2bf583edf731
965
+
966
+ await lendMarket.wallet.balances();
967
+ // {
968
+ // collateral: '99.0',
969
+ // borrowed: '599000.0',
970
+ // vaultShares: '1400000000.0',
971
+ // gauge: '0'
972
+ // }
973
+ await lendMarket.userState();
974
+ // {
975
+ // collateral: '1.945616160868693648',
976
+ // borrowed: '0.0',
977
+ // debt: '2000.0',
978
+ // N: '10'
979
+ // }
980
+ await lendMarket.userBands();
981
+ // [ 76, 67 ]
982
+ await lendMarket.userPrices();
983
+ // [ '1027.977718614028011906', '1187.061430251609195098' ]
984
+ await lendMarket.userHealth();
985
+ // 195.8372633833293605
986
+ await lendMarket.userHealth(false);
987
+ // 3.2518122092914609
988
+
989
+
990
+ // - Borrow More -
991
+
992
+ // Updates leveraged position (dCollateral = userCollateral + collateralFromUserBorrowed + leverageCollateral)
993
+ // ^
994
+ // |
995
+ // userCollateral | dDebt dDebt + userBorrowed
996
+ // user ---> controller ----> leverage_zap ----> router
997
+ // | ^ | ^ ^ |
998
+ // | |__________________| | |___________________|
999
+ // | leverageCollateral + collateralFromUSerBorrowed
1000
+ // |_____________________________________|
1001
+ // userBorrowed
1002
+
1003
+ userCollateral = 2;
1004
+ userBorrowed = 2000;
1005
+ debt = 10000;
1006
+ await lendMarket.leverage.borrowMoreMaxRecv(userCollateral, userBorrowed);
1007
+ // {
1008
+ // maxDebt: '76182.8497941193262889',
1009
+ // maxTotalCollateral: '26.639775583730298462',
1010
+ // userCollateral: '2',
1011
+ // collateralFromUserBorrowed: '1.677318306610359627',
1012
+ // collateralFromMaxDebt: '22.962457277119938834',
1013
+ // avgPrice: '3172.55402418338331369083'
1014
+ // }
1015
+ await lendMarket.leverage.borrowMoreExpectedCollateral(userCollateral, userBorrowed, debt, slippage);
1016
+ // {
1017
+ // totalCollateral: '5.783452104143246413',
1018
+ // userCollateral: '2.0',
1019
+ // collateralFromUserBorrowed: '0.630575350690541071',
1020
+ // collateralFromDebt: '3.152876753452705342'
1021
+ // avgPrice: '3171.70659749038129067231'
1022
+ // }
1023
+ await lendMarket.leverage.borrowMorePriceImpact(userBorrowed, debt);
1024
+ // 0.010784277354269765 %
1025
+ await lendMarket.leverage.borrowMoreBands(userCollateral, userBorrowed, debt);
1026
+ // [ 47, 38 ]
1027
+ await lendMarket.leverage.borrowMorePrices(userCollateral, userBorrowed, debt);
1028
+ // [ '1560.282474721398939216', '1801.742501325928269008' ]
1029
+ await lendMarket.leverage.borrowMoreHealth(userCollateral, userBorrowed, debt, true);
1030
+ // 91.6798951784708552
1031
+ await lendMarket.leverage.borrowMoreHealth(userCollateral, userBorrowed, debt, false);
1032
+ // 3.7614279042995641
1033
+ await lendMarket.leverage.borrowMoreIsApproved(userCollateral, userBorrowed);
1034
+ // true
1035
+ await lendMarket.leverage.borrowMoreApprove(userCollateral, userBorrowed);
1036
+ // []
1037
+ await lendMarket.leverage.borrowMoreRouteImage(userBorrowed, debt);
1038
+ // 'data:image/svg+xml;base64,PHN2ZyBpZD0ic2Fua2V5UGFyZW50U3ZnIiB4bWxucz...'
1039
+
1040
+ // You must call lendMarket.leverage.borrowMoreExpectedCollateral() with the same args before
1041
+ await lendMarket.leverage.borrowMore(userCollateral, userBorrowed, debt, slippage);
1042
+ // 0x6357dd6ea7250d7adb2344cd9295f8255fd8fbbe85f00120fbcd1ebf139e057c
1043
+
1044
+ await lendMarket.wallet.balances();
1045
+ // {
1046
+ // collateral: '97.0',
1047
+ // borrowed: '597000.0',
1048
+ // vaultShares: '1400000000.0',
1049
+ // gauge: '0'
1050
+ // }
1051
+ await lendMarket.userState();
1052
+ // {
1053
+ // collateral: '7.727839965845165558',
1054
+ // borrowed: '0.0',
1055
+ // debt: '12000.000010193901375446',
1056
+ // N: '10'
1057
+ // }
1058
+ await lendMarket.userBands();
1059
+ // [ 47, 38 ]
1060
+ await lendMarket.userPrices();
1061
+ // [ '1560.28248267408177179', '1801.742510509320950242' ]
1062
+ await lendMarket.userHealth();
1063
+ // 91.6519475547753288
1064
+ await lendMarket.userHealth(false);
1065
+ // 3.7449386373872907
1066
+
1067
+
1068
+ // - Repay -
1069
+
1070
+
1071
+ // Deleveraged position (-dDebt = borrowedFromStateCollateral + borrowedFromUSerCollateral + userBorrowed)
1072
+ // ^
1073
+ // | userCollateral
1074
+ // user ___|__________________________
1075
+ // | |
1076
+ // | | stateCollateral ↓ userCollateral + stateCollateral
1077
+ // | controller --> leverage_zap --> router
1078
+ // | ^ | ^ ^ |
1079
+ // | |______________________| | |___________________|
1080
+ // | | borrowedFromStateCollateral
1081
+ // |________________________________| +
1082
+ // userBorrowed borrowedFromUSerCollateral
1083
+
1084
+ const stateCollateral = 2;
1085
+ userCollateral = 1;
1086
+ userBorrowed = 1500;
1087
+ await lendMarket.leverage.repayExpectedBorrowed(stateCollateral, userCollateral, userBorrowed, slippage);
1088
+ // {
1089
+ // totalBorrowed: '10998.882838599741571472',
1090
+ // borrowedFromStateCollateral: '6332.588559066494374648',
1091
+ // borrowedFromUserCollateral: '3166.294279533247196824',
1092
+ // userBorrowed: '1500'
1093
+ // avgPrice: '3166.29427953324743125312'
1094
+ // }
1095
+
1096
+ await lendMarket.leverage.repayPriceImpact(stateCollateral, userCollateral);
1097
+ // 0.013150142802201724 %
1098
+ await lendMarket.leverage.repayIsFull(stateCollateral, userCollateral, userBorrowed);
1099
+ // false
1100
+ await lendMarket.leverage.repayIsAvailable(stateCollateral, userCollateral, userBorrowed);
1101
+ // true
1102
+ await lendMarket.leverage.repayBands(stateCollateral, userCollateral, userBorrowed);
1103
+ // [ 199, 190 ]
1104
+ await lendMarket.leverage.repayPrices(stateCollateral, userCollateral, userBorrowed);
1105
+ // [ '175.130965754280721633', '202.233191367561902757' ]
1106
+ await lendMarket.leverage.repayHealth(stateCollateral, userCollateral, userBorrowed, true);
1107
+ // 1699.6097751079226865
1108
+ await lendMarket.leverage.repayHealth(stateCollateral, userCollateral, userBorrowed, false);
1109
+ // 3.4560086962806991
1110
+ await lendMarket.leverage.repayIsApproved(userCollateral, userBorrowed);
1111
+ // false
1112
+ await lendMarket.leverage.repayApprove(userCollateral, userBorrowed);
1113
+ // ['0xd8a8d3b3f67395e1a4f4d4f95b041edcaf1c9f7bab5eb8a8a767467678295498']
1114
+ await lendMarket.leverage.repayRouteImage(stateCollateral, userCollateral);
1115
+ // 'data:image/svg+xml;base64,PHN2ZyBpZD0ic2Fua2V5UGFyZW50U3ZnIiB4bWxucz...'
1116
+
1117
+ // You must call lendMarket.leverage.repayExpectedBorrowed() with the same args before
1118
+ await lendMarket.leverage.repay(stateCollateral, userCollateral, userBorrowed, slippage);
1119
+ // 0xe48a97fef1c54180a2c7d104d210a95ac1a516fdd22109682179f1582da23a82
1120
+
1121
+ await lendMarket.wallet.balances();
1122
+ // {
1123
+ // collateral: '96.0',
1124
+ // borrowed: '595500.0',
1125
+ // vaultShares: '1400000000.0',
1126
+ // gauge: '0'
1127
+ // }
1128
+ await lendMarket.userState();
1129
+ // {
1130
+ // collateral: '5.727839965845165558',
1131
+ // borrowed: '0.0',
1132
+ // debt: '992.083214663467727334',
1133
+ // N: '10'
1134
+ // }
1135
+ await lendMarket.userBands();
1136
+ // [ 199, 190 ]
1137
+ await lendMarket.userPrices();
1138
+ // [ '175.13096689602455189', '202.233192685995210783' ]
1139
+ await lendMarket.userHealth();
1140
+ // 1716.0249924305707883
1141
+ await lendMarket.userHealth(false);
1142
+ // 3.6389352509210336
1143
+ })()
1144
+ ```
1145
+
1146
+ ### Leverage createLoan all ranges methods for lendMarket
1147
+ ```ts
1148
+ await llamalend.init('JsonRpc', {}, {}, API_KEY_1INCH);
1149
+ await llamalend.lendMarkets.fetchMarkets();
1150
+
1151
+ const lendMarket = llamalend.getLendMarket('one-way-market-0');
1152
+
1153
+ const userCollateral = 1;
1154
+ const userBorrowed = 1000;
1155
+ const debt = 2000;
1156
+ await lendMarket.leverage.createLoanMaxRecvAllRanges(userCollateral, userBorrowed);
1157
+ // {
1158
+ // '4': {
1159
+ // maxDebt: '37916.338071504823875251',
1160
+ // maxTotalCollateral: '13.286983617364703479',
1161
+ // userCollateral: '1',
1162
+ // collateralFromUserBorrowed: '0.315728154966395280',
1163
+ // collateralFromMaxDebt: '11.971255462398308199',
1164
+ // maxLeverage: '10.09857816541446843865',
1165
+ // avgPrice: '3167.28167656266072703689'
1166
+ // },
1167
+ // '5': {
1168
+ // maxDebt: '35363.440522143354729759',
1169
+ // maxTotalCollateral: '12.480961984286574804',
1170
+ // userCollateral: '1',
1171
+ // collateralFromUserBorrowed: '0.315728154966395280',
1172
+ // collateralFromMaxDebt: '11.165233829320179524',
1173
+ // maxLeverage: '9.48597317551918486951',
1174
+ // avgPrice: '3167.28167656266072703689'
1175
+ // },
1176
+ // '6': {
1177
+ // maxDebt: '33122.824118147617102062',
1178
+ // maxTotalCollateral: '11.773536301065561222',
1179
+ // userCollateral: '1',
1180
+ // collateralFromUserBorrowed: '0.315728154966395280',
1181
+ // collateralFromMaxDebt: '10.457808146099165942',
1182
+ // maxLeverage: '8.94830459971897955699',
1183
+ // avgPrice: '3167.28167656266072703689'
1184
+ // },
1185
+ // '7': {
1186
+ // maxDebt: '31140.555201395785060968',
1187
+ // maxTotalCollateral: '11.147678193332270290',
1188
+ // userCollateral: '1',
1189
+ // collateralFromUserBorrowed: '0.315728154966395280',
1190
+ // collateralFromMaxDebt: '9.831950038365875010',
1191
+ // maxLeverage: '8.47263027035929823721',
1192
+ // avgPrice: '3167.28167656266072703689'
1193
+ // },
1194
+ //
1195
+ // ...
1196
+ //
1197
+ // '50': {
1198
+ // maxDebt: '8122.705063645852013929',
1199
+ // maxTotalCollateral: '3.880294838047496482',
1200
+ // userCollateral: '1',
1201
+ // collateralFromUserBorrowed: '0.315728154966395280',
1202
+ // collateralFromMaxDebt: '2.564566683081101202',
1203
+ // maxLeverage: '2.94916151440614435181',
1204
+ // avgPrice: '3167.28167656266072703689'
1205
+ // }
1206
+
1207
+ await lendMarket.leverage.createLoanBandsAllRanges(userCollateral, userBorrowed, debt);
1208
+ // {
1209
+ // '4': [ 73, 70 ],
1210
+ // '5': [ 73, 69 ],
1211
+ // '6': [ 74, 69 ],
1212
+ // '7': [ 74, 68 ],
1213
+ //
1214
+ // ...
1215
+ //
1216
+ // '50': [ 97, 48 ]
1217
+ // }
1218
+
1219
+ await lendMarket.leverage.createLoanPricesAllRanges(userCollateral, userBorrowed, debt);
1220
+ // {
1221
+ // '4': [ '1073.323292757532604807', '1136.910693647788699808' ],
1222
+ // '5': [ '1073.323292757532604807', '1153.387660222394333133' ],
1223
+ // '6': [ '1057.990102860996424743', '1153.387660222394333133' ],
1224
+ // '7': [ '1057.990102860996424743', '1170.103423414023236507' ],
1225
+ //
1226
+ // ...
1227
+ //
1228
+ // '50': [ '759.898822708156242647', '1560.282492846180089068' ]
1229
+ // }
1230
+ ```
1231
+
1232
+ ## MintMarket
1233
+
1234
+ ### MintMarket fields
1235
+
1236
+ ```ts
1237
+ import llamalend from "@curvefi/llamalend-api";
1238
+ import {llamalend} from "./llamalend";
1239
+
1240
+ (async () => {
1241
+ await llamalend.init('JsonRpc', {});
1242
+
1243
+ const mintMarket = llamalend.getMintMarket('eth');
1244
+
1245
+ mintMarket.id;
1246
+ // eth
1247
+ mintMarket.address;
1248
+ // 0x3897810a334833184Ef7D6B419ba4d78EC2bBF80
1249
+ mintMarket.controller;
1250
+ // 0x1eF9f7C2abD0E351a8966f00565e1b04765d3f0C
1251
+ mintMarket.monetaryPolicy;
1252
+ // 0xc684432FD6322c6D58b6bC5d28B18569aA0AD0A1
1253
+ mintMarket.collateral;
1254
+ // 0xac3E018457B222d93114458476f3E3416Abbe38F
1255
+ mintMarket.collateralSymbol;
1256
+ // WETH
1257
+ mintMarket.collateralDecimals;
1258
+ // 18
1259
+ mintMarket.coins;
1260
+ // [ 'crvUSD', 'WETH' ]
1261
+ mintMarket.coinAddresses;
1262
+ // [
1263
+ // '0x3194cBDC3dbcd3E11a07892e7bA5c3394048Cc87',
1264
+ // '0xa3B53dDCd2E3fC28e8E130288F2aBD8d5EE37472'
1265
+ // ]
1266
+ mintMarket.coinDecimals;
1267
+ // [ 18, 18 ]
1268
+ mintMarket.minBands;
1269
+ // 5
1270
+ mintMarket.maxBands;
1271
+ // 50
1272
+ mintMarket.defaultBands;
1273
+ // 20
1274
+ mintMarket.A;
1275
+ // 100
1276
+ mintMarket.tickSpace;
1277
+ // 1 %
1278
+ })()
1279
+ ````
1280
+
1281
+ ### Wallet balances for mintMarket
1282
+ ```ts
1283
+ import llamalend from "@curvefi/llamalend-api";
1284
+
1285
+ (async () => {
1286
+ await llamalend.init('JsonRpc', {});
1287
+
1288
+ const mintMarket = llamalend.getMintMarket('eth');
1289
+
1290
+ // 1. Current address (signer) balances
1291
+
1292
+ await mintMarket.wallet.balances();
1293
+ // { stablecoin: '0.0', collateral: '1.0' }
1294
+
1295
+
1296
+ // 2. You can specify the address
1297
+
1298
+ await mintMarket.wallet.balances("0x0063046686E46Dc6F15918b61AE2B121458534a5");
1299
+ // { stablecoin: '0.0', collateral: '0.0' }
1300
+ })()
1301
+ ```
1302
+
1303
+ ### Stats for mintMarket
1304
+ ```ts
1305
+ import llamalend from "@curvefi/llamalend-api";
1306
+
1307
+ (async () => {
1308
+ await llamalend.init('JsonRpc', {});
1309
+
1310
+ const mintMarket = llamalend.getMintMarket('eth');
1311
+
1312
+ await mintMarket.stats.parameters();
1313
+ // {
1314
+ // fee: '0.0',
1315
+ // admin_fee: '0.0',
1316
+ // rate: '0.0',
1317
+ // future_rate: '0.0',
1318
+ // liquidation_discount: '2.0',
1319
+ // loan_discount: '5.0'
1320
+ // }
1321
+ await mintMarket.stats.balances();
1322
+ // [ '300.0', '0.402268776965776345' ]
1323
+ await mintMarket.stats.maxMinBands();
1324
+ // [ 15, 0 ]
1325
+ await mintMarket.stats.activeBand();
1326
+ // 11
1327
+ const liquidatingBand = await mintMarket.stats.liquidatingBand(); // null when there is no liquidation
1328
+ // 11
1329
+ await mintMarket.stats.bandBalances(liquidatingBand);
1330
+ // { stablecoin: '300.0', collateral: '0.002268776965776345' }
1331
+ await mintMarket.stats.bandsBalances();
1332
+ // {
1333
+ // '0': { stablecoin: '0.0', collateral: '0.0' },
1334
+ // '1': { stablecoin: '0.0', collateral: '0.0' },
1335
+ // '2': { stablecoin: '0.0', collateral: '0.0' },
1336
+ // '3': { stablecoin: '0.0', collateral: '0.0' },
1337
+ // '4': { stablecoin: '0.0', collateral: '0.0' },
1338
+ // '5': { stablecoin: '0.0', collateral: '0.0' },
1339
+ // '6': { stablecoin: '0.0', collateral: '0.0' },
1340
+ // '7': { stablecoin: '0.0', collateral: '0.0' },
1341
+ // '8': { stablecoin: '0.0', collateral: '0.0' },
1342
+ // '9': { stablecoin: '0.0', collateral: '0.0' },
1343
+ // '10': { stablecoin: '0.0', collateral: '0.0' },
1344
+ // '11': { stablecoin: '300.0', collateral: '0.002268776965776345' },
1345
+ // '12': { stablecoin: '0.0', collateral: '0.1' },
1346
+ // '13': { stablecoin: '0.0', collateral: '0.1' },
1347
+ // '14': { stablecoin: '0.0', collateral: '0.1' },
1348
+ // '15': { stablecoin: '0.0', collateral: '0.1' }
1349
+ // }
1350
+ await mintMarket.stats.totalSupply();
1351
+ // 1375.74
1352
+ await mintMarket.stats.totalDebt();
1353
+ // 1375.74
1354
+ await mintMarket.stats.totalStablecoin();
1355
+ // 300.0
1356
+ await mintMarket.stats.totalCollateral();
1357
+ // 0.402268776965776345
1358
+ await mintMarket.stats.capAndAvailable();
1359
+ // { cap: '10000000.0', available: '172237.031342956400517635' }
1360
+ })()
1361
+ ````
1362
+
1363
+ ### Create loan, add collateral, borrow more, repay for mintMarket
1364
+ ```ts
1365
+ (async () => {
1366
+ await llamalend.init('JsonRpc', {});
1367
+
1368
+ console.log(llamalend.getMintMarketList());
1369
+ // [ 'sfrxeth' ]
1370
+
1371
+ const mintMarket = llamalend.getMintMarket('eth');
1372
+
1373
+
1374
+ // --- CREATE LOAN ---
1375
+
1376
+ await mintMarket.oraclePrice();
1377
+ // 3000.0
1378
+ await mintMarket.price();
1379
+ // 3045.569137149127502965
1380
+ await mintMarket.basePrice();
1381
+ // '3000.0'
1382
+ await mintMarket.wallet.balances();
1383
+ // { stablecoin: '0.0', collateral: '1.0' }
1384
+ await mintMarket.createLoanMaxRecv(0.5, 5);
1385
+ // 1375.74670276529114147
1386
+ await mintMarket.createLoanBands(0.5, 1000, 5);
1387
+ // [ 36, 32 ]
1388
+ await mintMarket.createLoanPrices(0.5, 1000, 5);
1389
+ // [ '2068.347257607234777', '2174.941007873561634' ]
1390
+ await mintMarket.createLoanHealth(0.5, 1000, 5); // FULL
1391
+ // 45.191203147616155
1392
+ await mintMarket.createLoanHealth(0.5, 1000, 5, false); // NOT FULL
1393
+ // 3.9382535412942367
1394
+
1395
+ await mintMarket.createLoanIsApproved(0.5);
1396
+ // false
1397
+ await mintMarket.createLoanApprove(0.5);
1398
+ // [
1399
+ // '0xc111e471715ae6f5437e12d3b94868a5b6542cd7304efca18b5782d315760ae5'
1400
+ // ]
1401
+ await mintMarket.createLoan(0.5, 1000, 5);
1402
+
1403
+ await mintMarket.debt(); // OR await mintMarket.debt(address);
1404
+ // 1000.0
1405
+ await mintMarket.loanExists();
1406
+ // true
1407
+ await mintMarket.userHealth(); // FULL
1408
+ // 45.1912031476161562 %
1409
+ await mintMarket.userHealth(false); // NOT FULL
1410
+ // 3.9382535412942379
1411
+ await mintMarket.userRange()
1412
+ // 5
1413
+ await mintMarket.userBands();
1414
+ // [ 36, 32 ]
1415
+ await mintMarket.userPrices();
1416
+ // [ '2068.347257607234777', '2174.941007873561634' ]
1417
+ await mintMarket.userState();
1418
+ // { collateral: '0.5', stablecoin: '0.0', debt: '1000.0' }
1419
+ await mintMarket.userBandsBalances();
1420
+ // {
1421
+ // '32': { stablecoin: '0.0', collateral: '0.1' },
1422
+ // '33': { stablecoin: '0.0', collateral: '0.1' },
1423
+ // '34': { stablecoin: '0.0', collateral: '0.1' },
1424
+ // '35': { stablecoin: '0.0', collateral: '0.1' },
1425
+ // '36': { stablecoin: '0.0', collateral: '0.1' }
1426
+ // }
1427
+
1428
+ // --- BORROW MORE ---
1429
+
1430
+ await mintMarket.borrowMoreMaxRecv(0.1);
1431
+ // 650.896043318349376298
1432
+ await mintMarket.borrowMoreBands(0.1, 500);
1433
+ // [ 14, 10 ]
1434
+ await mintMarket.borrowMorePrices(0.1, 500);
1435
+ // [ '2580.175063923865968', '2713.146225026413746' ]
1436
+ await mintMarket.borrowMoreHealth(0.1, 500); // FULL
1437
+ // 15.200984677843693 %
1438
+ await mintMarket.borrowMoreHealth(0.1, 500, false); // NOT FULL
1439
+ // 3.7268336789002429 %
1440
+
1441
+ await mintMarket.borrowMoreIsApproved(0.1);
1442
+ // true
1443
+ await mintMarket.borrowMoreApprove(0.1);
1444
+ // []
1445
+
1446
+ await mintMarket.borrowMore(0.1, 500);
1447
+
1448
+ // Full health: 15.200984677843694 %
1449
+ // Not full health: 3.7268336789002439 %
1450
+ // Bands: [ 14, 10 ]
1451
+ // Prices: [ '2580.175063923865968', '2713.146225026413746' ]
1452
+ // State: { collateral: '0.6', stablecoin: '0.0', debt: '1500.0' }
1453
+
1454
+ // --- ADD COLLATERAL ---
1455
+
1456
+ await mintMarket.addCollateralBands(0.2);
1457
+ // [ 43, 39 ]
1458
+ await mintMarket.addCollateralPrices(0.2);
1459
+ // [ '1927.834806254156043', '2027.187147180850842' ]
1460
+ await mintMarket.addCollateralHealth(0.2); // FULL
1461
+ // 55.2190795613534006
1462
+ await mintMarket.addCollateralHealth(0.2, false); // NOT FULL
1463
+ // 3.3357274109987789
1464
+
1465
+ await mintMarket.addCollateralIsApproved(0.2);
1466
+ // true
1467
+ await mintMarket.addCollateralApprove(0.2);
1468
+ // []
1469
+
1470
+ await mintMarket.addCollateral(0.2); // OR await mintMarket.addCollateral(0.2, forAddress);
1471
+
1472
+ // Full health: 55.2190795613534014 %
1473
+ // Not full health: 3.3357274109987797 %
1474
+ // Bands: [ 43, 39 ]
1475
+ // Prices: [ '1927.834806254156043', '2027.187147180850842' ]
1476
+ // State: { collateral: '0.8', stablecoin: '0.0', debt: '1500.0' }
1477
+
1478
+ // --- REMOVE COLLATERAL ---
1479
+
1480
+ await mintMarket.maxRemovable()
1481
+ // 0.254841506439755199
1482
+ await mintMarket.removeCollateralBands(0.1);
1483
+ // [ 29, 25 ]
1484
+ await mintMarket.removeCollateralPrices(0.1);
1485
+ // [ '2219.101120164841944', '2333.46407819744091' ]
1486
+ await mintMarket.removeCollateralHealth(0.1); // FULL
1487
+ // 35.1846612411492316
1488
+ await mintMarket.removeCollateralHealth(0.1, false); // NOT FULL
1489
+ // 4.0796515570298074
1490
+
1491
+ await mintMarket.removeCollateral(0.1);
1492
+
1493
+ // Full health: 35.1846612411492326 %
1494
+ // Not full health: 4.0796515570298084 %
1495
+ // Bands: [ 29, 25 ]
1496
+ // Prices: [ '2219.101120164841944', '2333.46407819744091', ]
1497
+ // State: { collateral: '0.7', stablecoin: '0.0', debt: '1500.0' }
1498
+
1499
+ // --- REPAY ---
1500
+
1501
+ await mintMarket.wallet.balances();
1502
+ // { stablecoin: '1500.0', collateral: '0.3' }
1503
+
1504
+ await mintMarket.repayBands(1000);
1505
+ // [ 139, 135 ]
1506
+ await mintMarket.repayPrices(1000);
1507
+ // [ '734.595897104762463', '772.453820291837448' ]
1508
+ await mintMarket.repayHealth(1000); // FULL
1509
+ // 315.2178906180373138
1510
+ await mintMarket.repayHealth(1000, false); // NOT FULL
1511
+ // 3.3614254588945566
1512
+
1513
+ await mintMarket.repayIsApproved(1000);
1514
+ // true
1515
+ await mintMarket.repayApprove(1000);
1516
+ // []
1517
+ await mintMarket.repay(1000);
1518
+
1519
+ // Full health: 315.2178906180373149 %
1520
+ // Not full health: 3.3614254588945577 %
1521
+ // Bands: [ 139, 135 ]
1522
+ // Prices: [ '734.595897104762463', '772.453820291837448' ]
1523
+ // State: { collateral: '0.7', stablecoin: '0.0', debt: '500.0' }
1524
+
1525
+ // --- FULL REPAY ---
1526
+
1527
+ await mintMarket.fullRepayIsApproved();
1528
+ // true
1529
+ await mintMarket.fullRepayApprove();
1530
+ // []
1531
+ await mintMarket.fullRepay();
1532
+
1533
+ // Loan exists: false
1534
+ // State: { collateral: '0.0', stablecoin: '0.0', debt: '0.0' }
1535
+ })()
1536
+ ```
1537
+
1538
+ ### Create loan all ranges methods for mintMarket
1539
+ ```ts
1540
+ await llamalend.init('JsonRpc', {});
1541
+
1542
+ const mintMarket = llamalend.getMintMarket('eth');
1543
+
1544
+ await mintMarket.createLoanMaxRecvAllRanges(1);
1545
+ // {
1546
+ // '5': '2751.493405530582454486',
1547
+ // '6': '2737.828112577888632315',
1548
+ // '7': '2724.253615257658154585',
1549
+ // '8': '2710.76923397831492797',
1550
+ // '9': '2697.374294577689210021',
1551
+ // '10': '2684.068128277815937982',
1552
+ // '11': '2670.850071640120547429',
1553
+ // '12': '2657.719466520988458715',
1554
+ // '13': '2644.675660027714709155',
1555
+ // '14': '2631.718004474831209682',
1556
+ // '15': '2618.845857340807263461',
1557
+ // '16': '2606.058581225120973696',
1558
+ // '17': '2593.355543805697908653',
1559
+ // '18': '2580.736117796713531552',
1560
+ // '19': '2568.199680906757040338',
1561
+ // '20': '2555.745615797352299399',
1562
+ //
1563
+ // ...
1564
+ //
1565
+ // '50': '2217.556229455652339229'
1566
+ // }
1567
+
1568
+ await mintMarket.createLoanBandsAllRanges(1, 2600);
1569
+ // {
1570
+ // '5': [ 10, 6 ],
1571
+ // '6': [ 11, 6 ],
1572
+ // '7': [ 11, 5 ],
1573
+ // '8': [ 12, 5 ],
1574
+ // '9': [ 12, 4 ],
1575
+ // '10': [ 13, 4 ],
1576
+ // '11': [ 13, 3 ],
1577
+ // '12': [ 14, 3 ],
1578
+ // '13': [ 14, 2 ],
1579
+ // '14': [ 15, 2 ],
1580
+ // '15': [ 15, 1 ],
1581
+ // '16': [ 16, 1 ],
1582
+ // '17': null,
1583
+ // '18': null,
1584
+ // '19': null,
1585
+ // '20': null,
1586
+ //
1587
+ // ...
1588
+ //
1589
+ // '50': null
1590
+ // }
1591
+
1592
+ await mintMarket.createLoanPricesAllRanges(1, 2600);
1593
+ // {
1594
+ // '5': [ '2686.01476277614933533', '2824.440448203' ],
1595
+ // '6': [ '2659.154615148387841976', '2824.440448203' ],
1596
+ // '7': [ '2659.154615148387841976', '2852.9701497' ],
1597
+ // '8': [ '2632.563068996903963557', '2852.9701497' ],
1598
+ // '9': [ '2632.563068996903963557', '2881.78803' ],
1599
+ // '10': [ '2606.237438306934923921', '2881.78803' ],
1600
+ // '11': [ '2606.237438306934923921', '2910.897' ],
1601
+ // '12': [ '2580.175063923865574682', '2910.897' ],
1602
+ // '13': [ '2580.175063923865574682', '2940.3' ],
1603
+ // '14': [ '2554.373313284626918935', '2940.3' ],
1604
+ // '15': [ '2554.373313284626918935', '2970' ],
1605
+ // '16': [ '2528.829580151780649746', '2970' ],
1606
+ // '17': null,
1607
+ // '18': null,
1608
+ // '19': null,
1609
+ // '20': null,
1610
+ //
1611
+ // ...
1612
+ //
1613
+ // '50': null
1614
+ // }
1615
+ ```
1616
+
1617
+ ### Swap for mintMarket
1618
+ ```ts
1619
+ (async () => {
1620
+ await llamalend.init('JsonRpc', {});
1621
+
1622
+ const mintMarket = llamalend.getMintMarket('eth');
1623
+
1624
+ await mintMarket.wallet.balances();
1625
+ // {
1626
+ // stablecoin: '301.533523886491869218',
1627
+ // collateral: '0.860611976623971606'
1628
+ // }
1629
+
1630
+
1631
+ await mintMarket.maxSwappable(0, 1);
1632
+ // 380.672763174593107707
1633
+ await mintMarket.swapExpected(0, 1, 100); // 100 - in_amount
1634
+ // 0.03679356627103543 (out_amount)
1635
+ await mintMarket.swapRequired(0, 1, 0.03679356627103543); // 0.03679356627103543 - out_amount
1636
+ // 100.000000000000000558 (in_amount)
1637
+ await mintMarket.swapPriceImpact(0, 1, 100);
1638
+ // 0.170826
1639
+ await mintMarket.swapIsApproved(0, 100);
1640
+ // true
1641
+ await mintMarket.swapApprove(0, 100);
1642
+ // []
1643
+ await mintMarket.swap(0, 1, 100, 0.1);
1644
+
1645
+ await mintMarket.wallet.balances();
1646
+ // {
1647
+ // stablecoin: '201.533523886491869218',
1648
+ // collateral: '0.897405542895007036'
1649
+ // }
1650
+ })()
1651
+ ```
1652
+
1653
+ ### Self-liquidation for mintMarket
1654
+ ```ts
1655
+ (async () => {
1656
+ await llamalend.init('JsonRpc', {});
1657
+
1658
+ const mintMarket = llamalend.getMintMarket('eth');
1659
+
1660
+ // Wallet balances: {
1661
+ // stablecoin: '301.533523886491869218',
1662
+ // collateral: '0.860611976623971606'
1663
+ // }
1664
+ // State: {
1665
+ // collateral: '0.139388023376028394',
1666
+ // stablecoin: '2751.493405530582315609',
1667
+ // debt: '3053.026929417074184827'
1668
+ // }
1669
+
1670
+ await mintMarket.tokensToLiquidate();
1671
+ // 301.533523886491869218
1672
+ await mintMarket.selfLiquidateIsApproved();
1673
+ // true
1674
+ await mintMarket.selfLiquidateApprove();
1675
+ // []
1676
+ await mintMarket.selfLiquidate(0.1); // slippage = 0.1 %
1677
+
1678
+ // Wallet balances: { stablecoin: '0.0', collateral: '1.0' }
1679
+ // State: { collateral: '0.0', stablecoin: '0.0', debt: '0.0' }
1680
+ })()
1681
+ ```
1682
+
1683
+ ### Liquidation for mintMarket
1684
+ ```ts
1685
+ (async () => {
1686
+ await llamalend.init('JsonRpc', {});
1687
+
1688
+ const mintMarket = llamalend.getMintMarket('eth');
1689
+ const addressToLiquidate = "0x66aB6D9362d4F35596279692F0251Db635165871";
1690
+
1691
+ await mintMarket.wallet.balances();
1692
+ // Liquidator wallet balances: {
1693
+ // stablecoin: '301.533523886491869218',
1694
+ // collateral: '0.860611976623971606'
1695
+ // }
1696
+ await mintMarket.userState(addressToLiquidate);
1697
+ // State of the account we are goning to liquidate: {
1698
+ // collateral: '0.139388023376028394',
1699
+ // stablecoin: '2751.493405530582315609',
1700
+ // debt: '3053.026929417074184827'
1701
+ // }
1702
+
1703
+ await mintMarket.tokensToLiquidate(addressToLiquidate);
1704
+ // 301.533523886491869218
1705
+ await mintMarket.liquidateIsApproved();
1706
+ // true
1707
+ await mintMarket.liquidateApprove();
1708
+ // []
1709
+ await mintMarket.liquidate(addressToLiquidate, 0.1); // slippage = 0.1 %
1710
+
1711
+ // Liquidator wallet balances: { stablecoin: '0.0', collateral: '1.0' }
1712
+ // State of liquidated account: { collateral: '0.0', stablecoin: '0.0', debt: '0.0' }
1713
+ })()
1714
+ ```
1715
+
1716
+ ### User loss for mintMarket
1717
+ ```ts
1718
+ (async () => {
1719
+ await llamalend.init('JsonRpc', {});
1720
+
1721
+ const mintMarket = llamalend.getMintMarket('sfrxeth');
1722
+
1723
+ console.log(await mintMarket.userLoss("0x0063046686E46Dc6F15918b61AE2B121458534a5"));
1724
+ // {
1725
+ // deposited_collateral: '929.933909709140155529',
1726
+ // current_collateral_estimation: '883.035865972092328038',
1727
+ // loss: '46.898043737047827491',
1728
+ // loss_pct: '5.043158793049750311'
1729
+ // }
1730
+ })()
1731
+ ```
1732
+
1733
+ ### Leverage for mintMarket
1734
+ ```ts
1735
+ (async () => {
1736
+
1737
+ // Creates leveraged position (collateral + leverage_collateral)
1738
+ // ^
1739
+ // |
1740
+ // collateral | crvUSD crvUSD
1741
+ // user --> controller --> leverage_zap --> curve_router
1742
+ // ^ | ^ |
1743
+ // |______________________| |___________________|
1744
+ // leverage_collateral leverage_collateral
1745
+
1746
+ await llamalend.init('JsonRpc', {});
1747
+
1748
+ const mintMarket = llamalend.getMintMarket('wsteth');
1749
+
1750
+
1751
+ await mintMarket.leverage.createLoanMaxRecv(1, 5);
1752
+ // {
1753
+ // maxBorrowable: '16547.886068664425693035',
1754
+ // maxCollateral: '8.789653769216069731',
1755
+ // leverage: '8.7897',
1756
+ // routeIdx: 1
1757
+ // }
1758
+ const { collateral, leverage, routeIdx } = await mintMarket.leverage.createLoanCollateral(1, 1000);
1759
+ // { collateral: '1.470781767566863562', leverage: '1.4708', routeIdx: 1 }
1760
+ await mintMarket.leverage.getRouteName(routeIdx);
1761
+ // crvUSD/USDT --> tricrypto2 --> steth
1762
+ await mintMarket.leverage.getMaxRange(1, 1000);
1763
+ // 50
1764
+ await mintMarket.leverage.createLoanBands(1, 1000, 5);
1765
+ // [ 103, 99 ]
1766
+ await mintMarket.leverage.createLoanPrices(1, 1000, 5);
1767
+ // [ '731.101353314760924139', '768.779182694401331144' ]
1768
+ await mintMarket.leverage.createLoanHealth(1, 1000, 5); // FULL
1769
+ // 203.0010181561119221
1770
+ await mintMarket.leverage.createLoanHealth(1, 1000, 5, false); // NOT FULL
1771
+ // 3.6596075146233826
1772
+ await mintMarket.leverage.priceImpact(1, 1000);
1773
+ // 0.0007 %
1774
+
1775
+ await mintMarket.leverage.createLoanIsApproved(1);
1776
+ // false
1777
+ await mintMarket.leverage.createLoanApprove(1);
1778
+ // [
1779
+ // '0xc111e471715ae6f5437e12d3b94868a5b6542cd7304efca18b5782d315760ae5'
1780
+ // ]
1781
+ await mintMarket.leverage.createLoan(1, 1000, 5);
1782
+ // 0x0c6fbfdbd5c35d84b6137d3f27b91235100c540f97d87f27eefe9c53d3fe2727
1783
+
1784
+ await mintMarket.debt(); // OR await mintMarket.debt(address);
1785
+ // 1000.0
1786
+ await mintMarket.loanExists();
1787
+ // true
1788
+ await mintMarket.userHealth(); // FULL
1789
+ // 202.9745534261399119
1790
+ await mintMarket.userHealth(false); // NOT FULL
1791
+ // 3.664403959327331
1792
+ await mintMarket.userRange()
1793
+ // 5
1794
+ await mintMarket.userBands();
1795
+ // [ 103, 99 ]
1796
+ await mintMarket.userPrices();
1797
+ // [ '731.101559601446893847', '768.779399612218705572' ]
1798
+ await mintMarket.userState();
1799
+ // {
1800
+ // collateral: '1.47084941027800225',
1801
+ // stablecoin: '0.0',
1802
+ // debt: '1000.0'
1803
+ // }
1804
+ await mintMarket.userBandsBalances();
1805
+ // {
1806
+ // '99': { stablecoin: '0.0', collateral: '0.29416988205560045' },
1807
+ // '100': { stablecoin: '0.0', collateral: '0.29416988205560045' },
1808
+ // '101': { stablecoin: '0.0', collateral: '0.29416988205560045' },
1809
+ // '102': { stablecoin: '0.0', collateral: '0.29416988205560045' },
1810
+ // '103': { stablecoin: '0.0', collateral: '0.29416988205560045' }
1811
+ // }
1812
+
1813
+ })()
1814
+ ```
1815
+
1816
+ ### Leverage all ranges methods for mintMarket
1817
+ ```ts
1818
+ await llamalend.init('JsonRpc', {});
1819
+
1820
+ const mintMarket = llamalend.getMintMarket('wsteth');
1821
+
1822
+ await mintMarket.leverage.createLoanMaxRecvAllRanges(1);
1823
+ // {
1824
+ // '4': {
1825
+ // maxBorrowable: '17147.090188198024935509',
1826
+ // maxCollateral: '9.062551195413331339',
1827
+ // leverage: '9.0626',
1828
+ // routeIdx: 1
1829
+ // },
1830
+ // '5': {
1831
+ // maxBorrowable: '16403.646954605099577422',
1832
+ // maxCollateral: '8.713012324116998431',
1833
+ // leverage: '8.7130',
1834
+ // routeIdx: 1
1835
+ // },
1836
+ // '6': {
1837
+ // maxBorrowable: '15719.798733163998861372',
1838
+ // maxCollateral: '8.391490399698554111',
1839
+ // leverage: '8.3915',
1840
+ // routeIdx: 1
1841
+ // },
1842
+ // '7': {
1843
+ // maxBorrowable: '15088.670386359222674207',
1844
+ // maxCollateral: '8.094753549413418159',
1845
+ // leverage: '8.0948',
1846
+ // routeIdx: 1
1847
+ // },
1848
+ // '8': {
1849
+ // maxBorrowable: '14504.40446852885551856',
1850
+ // maxCollateral: '7.820048255346502533',
1851
+ // leverage: '7.8200',
1852
+ // routeIdx: 1
1853
+ // },
1854
+ // '9': {
1855
+ // maxBorrowable: '13961.979739583096049766',
1856
+ // maxCollateral: '7.565014055477733007',
1857
+ // leverage: '7.5650',
1858
+ // routeIdx: 1
1859
+ // },
1860
+ // '10': {
1861
+ // maxBorrowable: '13457.067188253192169488',
1862
+ // maxCollateral: '7.327615875203003395',
1863
+ // leverage: '7.3276',
1864
+ // routeIdx: 1
1865
+ // },
1866
+ //
1867
+ // ...
1868
+ //
1869
+ // '50': {
1870
+ // maxBorrowable: '5292.589588751249894884',
1871
+ // maxCollateral: '3.488707841886932836',
1872
+ // leverage: '3.4887',
1873
+ // routeIdx: 1
1874
+ // }
1875
+ // }
1876
+
1877
+ await mintMarket.leverage.createLoanBandsAllRanges(1, 14000);
1878
+ // {
1879
+ // '4': [ 3, 0 ],
1880
+ // '5': [ 3, -1 ],
1881
+ // '6': [ 4, -1 ],
1882
+ // '7': [ 4, -2 ],
1883
+ // '8': [ 5, -2 ],
1884
+ // '9': null,
1885
+ // '10': null,
1886
+ //
1887
+ // ...
1888
+ //
1889
+ // '50': null
1890
+ // }
1891
+
1892
+ await mintMarket.leverage.createLoanPricesAllRanges(1, 14000);
1893
+ // {
1894
+ // '4': [ '1997.376270314867650039', '2079.309355360395105159' ],
1895
+ // '5': [ '1997.376270314867650039', '2100.312480162015257736' ],
1896
+ // '6': [ '1977.402507611718973539', '2100.312480162015257736' ],
1897
+ // '7': [ '1977.402507611718973539', '2121.527757739409351246' ],
1898
+ // '8': [ '1957.628482535601783803', '2121.527757739409351246' ],
1899
+ // '9': null,
1900
+ // '10': null,
1901
+ //
1902
+ // ...
1903
+ //
1904
+ // '50': null
1905
+ // }
1906
+ ```
1907
+
1908
+ ### Deleverage for mintMarket
1909
+ ```ts
1910
+ (async () => {
1911
+
1912
+ // Deleveraged position (fully or partially)
1913
+ // ^
1914
+ // |
1915
+ // | collateral collateral
1916
+ // controller --> leverage_zap --> curve_router
1917
+ // ^ | ^ |
1918
+ // |______________________| |___________________|
1919
+ // crvUSD crvUSD
1920
+
1921
+ await llamalend.init('JsonRpc', {});
1922
+
1923
+ const mintMarket = llamalend.getMintMarket('wsteth');
1924
+
1925
+
1926
+ await mintMarket.userState();
1927
+ // {
1928
+ // collateral: '1.532865973844812038',
1929
+ // stablecoin: '0.0',
1930
+ // debt: '1000.0'
1931
+ // }
1932
+ const { stablecoins, routeIdx } = await mintMarket.deleverage.repayStablecoins(0.5);
1933
+ // { stablecoins: '936.993512434228957835', routeIdx: 2 }
1934
+ await mintMarket.deleverage.getRouteName(routeIdx)
1935
+ // wstETH wrapper -> steth -> factory-tricrypto-4 (TriCRV)
1936
+ await mintMarket.deleverage.repayBands(0.5)
1937
+ // [ 344, 340 ]
1938
+ await mintMarket.deleverage.repayPrices(0.5)
1939
+ // [ '65.389368517832066821', '68.759256234814550815' ]
1940
+ await mintMarket.deleverage.repayHealth(0.5) // FULL
1941
+ // 2962.6116372201716629
1942
+ await mintMarket.deleverage.repayHealth(0.5, false) // NOT FULL
1943
+ // 3.3355078309621505
1944
+ await mintMarket.deleverage.priceImpact(0.5)
1945
+ // 0.0080 %
1946
+ await mintMarket.deleverage.isAvailable(0.5)
1947
+ // true
1948
+ await mintMarket.deleverage.isFullRepayment(0.5)
1949
+ // false
1950
+
1951
+ await mintMarket.deleverage.repay(0.5, 0.3)
1952
+
1953
+ await mintMarket.userState()
1954
+ // {
1955
+ // collateral: '1.032865973844812038',
1956
+ // stablecoin: '0.0',
1957
+ // debt: '63.006629410173187253'
1958
+ // }
1959
+ await mintMarket.userBands()
1960
+ // [ 344, 340 ]
1961
+ await mintMarket.userPrices()
1962
+ // [ '65.389377792947951092', '68.759265987930143609' ]
1963
+ await mintMarket.userHealth() // FULL
1964
+ // 2962.6210276926274746
1965
+ await mintMarket.userHealth(false) // NOT FULL
1966
+ // 3.3352898532375197
1967
+ await mintMarket.userBandsBalances()
1968
+ // {
1969
+ // '340': { stablecoin: '0.0', collateral: '0.20657319476896241' },
1970
+ // '341': { stablecoin: '0.0', collateral: '0.206573194768962407' },
1971
+ // '342': { stablecoin: '0.0', collateral: '0.206573194768962407' },
1972
+ // '343': { stablecoin: '0.0', collateral: '0.206573194768962407' },
1973
+ // '344': { stablecoin: '0.0', collateral: '0.206573194768962407' }
1974
+ // }
1975
+ })()
1976
+ ```