@curvefi/llamalend-api 1.0.22-beta.2 → 1.0.23
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.
- package/.github/workflows/publish.yml +1 -1
- package/README.md +346 -0
- package/lib/constants/llammas.js +2 -2
- package/lib/external-api.d.ts +0 -1
- package/lib/external-api.js +0 -6
- package/lib/lendMarkets/LendMarketTemplate.js +1 -1
- package/lib/llamalend.d.ts +0 -1
- package/lib/llamalend.js +28 -34
- package/lib/mintMarkets/MintMarketTemplate.d.ts +21 -4
- package/lib/mintMarkets/MintMarketTemplate.js +52 -0
- package/lib/mintMarkets/interfaces/leverage.d.ts +90 -0
- package/lib/mintMarkets/interfaces/leverage.js +1 -0
- package/lib/mintMarkets/modules/index.d.ts +1 -0
- package/lib/mintMarkets/modules/index.js +1 -0
- package/lib/mintMarkets/modules/leverageV2.d.ts +131 -0
- package/lib/mintMarkets/modules/leverageV2.js +788 -0
- package/package.json +1 -1
- package/src/constants/llammas.ts +2 -2
- package/src/external-api.ts +0 -10
- package/src/lendMarkets/LendMarketTemplate.ts +1 -1
- package/src/llamalend.ts +28 -33
- package/src/mintMarkets/MintMarketTemplate.ts +67 -4
- package/src/mintMarkets/interfaces/leverage.ts +104 -0
- package/src/mintMarkets/modules/index.ts +1 -0
- package/src/mintMarkets/modules/leverageV2.ts +932 -0
package/README.md
CHANGED
|
@@ -1976,4 +1976,350 @@ import llamalend from "@curvefi/llamalend-api";
|
|
|
1976
1976
|
// '344': { stablecoin: '0.0', collateral: '0.206573194768962407' }
|
|
1977
1977
|
// }
|
|
1978
1978
|
})()
|
|
1979
|
+
```
|
|
1980
|
+
|
|
1981
|
+
### LeverageV2 (createLoan, borrowMore, repay) for mintMarket
|
|
1982
|
+
```ts
|
|
1983
|
+
(async () => {
|
|
1984
|
+
await llamalend.init('JsonRpc', {}, {});
|
|
1985
|
+
|
|
1986
|
+
const mintMarket = llamalend.getMintMarket('cbbtc');
|
|
1987
|
+
console.log(await mintMarket.wallet.balances());
|
|
1988
|
+
// {
|
|
1989
|
+
// collateral: '100.0',
|
|
1990
|
+
// borrowed: '2000000.0',
|
|
1991
|
+
// vaultShares: '0.0',
|
|
1992
|
+
// gauge: '0'
|
|
1993
|
+
// }
|
|
1994
|
+
|
|
1995
|
+
|
|
1996
|
+
// - Create Loan -
|
|
1997
|
+
|
|
1998
|
+
// Creates leveraged position (userCollateral + collateralFromUserBorrowed + leverage_collateral)
|
|
1999
|
+
// ^
|
|
2000
|
+
// |
|
|
2001
|
+
// userCollateral | debt debt + userBorrowed
|
|
2002
|
+
// user ---> controller ----> leverage_zap ----> router
|
|
2003
|
+
// | ^ | ^ ^ |
|
|
2004
|
+
// | |__________________| | |___________________|
|
|
2005
|
+
// | leverageCollateral + collateralFromUserBorrowed
|
|
2006
|
+
// |_____________________________________|
|
|
2007
|
+
// userBorrowed
|
|
2008
|
+
|
|
2009
|
+
let userCollateral = 1;
|
|
2010
|
+
let userBorrowed = 1000;
|
|
2011
|
+
let debt = 2000;
|
|
2012
|
+
const range = 10;
|
|
2013
|
+
const slippage = 0.5; // %
|
|
2014
|
+
await mintMarket.leverageV2.maxLeverage(range);
|
|
2015
|
+
// 7.4728229145282742179
|
|
2016
|
+
await mintMarket.leverageV2.createLoanMaxRecv(userCollateral, userBorrowed, range);
|
|
2017
|
+
// {
|
|
2018
|
+
// maxDebt: '26089.494406081862861214',
|
|
2019
|
+
// maxTotalCollateral: '9.539182089833411347',
|
|
2020
|
+
// userCollateral: '1',
|
|
2021
|
+
// collateralFromUserBorrowed: '0.315221168834966496',
|
|
2022
|
+
// collateralFromMaxDebt: '8.223960920998444851',
|
|
2023
|
+
// maxLeverage: '7.25291100528992828612',
|
|
2024
|
+
// avgPrice: '3172.3757757003568790858'
|
|
2025
|
+
// }
|
|
2026
|
+
await mintMarket.leverageV2.createLoanExpectedCollateral(userCollateral, userBorrowed, debt, slippage);
|
|
2027
|
+
// {
|
|
2028
|
+
// totalCollateral: '1.946422996710829',
|
|
2029
|
+
// userCollateral: '1.0',
|
|
2030
|
+
// collateralFromUserBorrowed: '0.315474332236942984',
|
|
2031
|
+
// collateralFromDebt: '0.630948664473886',
|
|
2032
|
+
// leverage: '1.4796358613861877'
|
|
2033
|
+
// avgPrice: '3169.8299919022623523421'
|
|
2034
|
+
// }
|
|
2035
|
+
await mintMarket.leverageV2.createLoanPriceImpact(userBorrowed, debt);
|
|
2036
|
+
// 0.08944411854377342 %
|
|
2037
|
+
await mintMarket.leverageV2.createLoanMaxRange(userCollateral, userBorrowed, debt);
|
|
2038
|
+
// 50
|
|
2039
|
+
await mintMarket.leverageV2.createLoanBands(userCollateral, userBorrowed, debt, range);
|
|
2040
|
+
// [ 76, 67 ]
|
|
2041
|
+
await mintMarket.leverageV2.createLoanPrices(userCollateral, userBorrowed, debt, range);
|
|
2042
|
+
// [ '1027.977701011670136614', '1187.061409925215211173' ]
|
|
2043
|
+
await mintMarket.leverageV2.createLoanHealth(userCollateral, userBorrowed, debt, range);
|
|
2044
|
+
// 195.8994783042570637
|
|
2045
|
+
await mintMarket.leverageV2.createLoanHealth(userCollateral, userBorrowed, debt, range, false);
|
|
2046
|
+
// 3.2780908310686365
|
|
2047
|
+
await mintMarket.leverageV2.createLoanIsApproved(userCollateral, userBorrowed);
|
|
2048
|
+
// false
|
|
2049
|
+
await mintMarket.leverageV2.createLoanApprove(userCollateral, userBorrowed);
|
|
2050
|
+
// [
|
|
2051
|
+
// '0xd5491d9f1e9d8ac84b03867494e35b25efad151c597d2fa4211d7bf5d540c98e',
|
|
2052
|
+
// '0x93565f37ec5be902a824714a30bddc25cf9cd9ed39b4c0e8de61fab44af5bc8c'
|
|
2053
|
+
// ]
|
|
2054
|
+
await mintMarket.leverageV2.createLoanRouteImage(userBorrowed, debt);
|
|
2055
|
+
// 'data:image/svg+xml;base64,PHN2ZyBpZD0ic2Fua2V5UGFyZW50U3ZnIiB4bWxucz...'
|
|
2056
|
+
|
|
2057
|
+
|
|
2058
|
+
// You must call mintMarket.leverageV2.createLoanExpectedCollateral() with the same args before
|
|
2059
|
+
await mintMarket.leverageV2.createLoan(userCollateral, userBorrowed, debt, range);
|
|
2060
|
+
// 0xeb1b7a92bcb02598f00dc8bbfe8fa3a554e7a2b1ca764e0ee45e2bf583edf731
|
|
2061
|
+
|
|
2062
|
+
await mintMarket.wallet.balances();
|
|
2063
|
+
// {
|
|
2064
|
+
// collateral: '99.0',
|
|
2065
|
+
// borrowed: '599000.0',
|
|
2066
|
+
// vaultShares: '1400000000.0',
|
|
2067
|
+
// gauge: '0'
|
|
2068
|
+
// }
|
|
2069
|
+
await mintMarket.userState();
|
|
2070
|
+
// {
|
|
2071
|
+
// collateral: '1.945616160868693648',
|
|
2072
|
+
// borrowed: '0.0',
|
|
2073
|
+
// debt: '2000.0',
|
|
2074
|
+
// N: '10'
|
|
2075
|
+
// }
|
|
2076
|
+
await mintMarket.userBands();
|
|
2077
|
+
// [ 76, 67 ]
|
|
2078
|
+
await mintMarket.userPrices();
|
|
2079
|
+
// [ '1027.977718614028011906', '1187.061430251609195098' ]
|
|
2080
|
+
await mintMarket.userHealth();
|
|
2081
|
+
// 195.8372633833293605
|
|
2082
|
+
await mintMarket.userHealth(false);
|
|
2083
|
+
// 3.2518122092914609
|
|
2084
|
+
|
|
2085
|
+
|
|
2086
|
+
// - Borrow More -
|
|
2087
|
+
|
|
2088
|
+
// Updates leveraged position (dCollateral = userCollateral + collateralFromUserBorrowed + leverageCollateral)
|
|
2089
|
+
// ^
|
|
2090
|
+
// |
|
|
2091
|
+
// userCollateral | dDebt dDebt + userBorrowed
|
|
2092
|
+
// user ---> controller ----> leverage_zap ----> router
|
|
2093
|
+
// | ^ | ^ ^ |
|
|
2094
|
+
// | |__________________| | |___________________|
|
|
2095
|
+
// | leverageCollateral + collateralFromUSerBorrowed
|
|
2096
|
+
// |_____________________________________|
|
|
2097
|
+
// userBorrowed
|
|
2098
|
+
|
|
2099
|
+
userCollateral = 2;
|
|
2100
|
+
userBorrowed = 2000;
|
|
2101
|
+
debt = 10000;
|
|
2102
|
+
await mintMarket.leverageV2.borrowMoreMaxRecv(userCollateral, userBorrowed);
|
|
2103
|
+
// {
|
|
2104
|
+
// maxDebt: '76182.8497941193262889',
|
|
2105
|
+
// maxTotalCollateral: '26.639775583730298462',
|
|
2106
|
+
// userCollateral: '2',
|
|
2107
|
+
// collateralFromUserBorrowed: '1.677318306610359627',
|
|
2108
|
+
// collateralFromMaxDebt: '22.962457277119938834',
|
|
2109
|
+
// avgPrice: '3172.55402418338331369083'
|
|
2110
|
+
// }
|
|
2111
|
+
await mintMarket.leverageV2.borrowMoreExpectedCollateral(userCollateral, userBorrowed, debt, slippage);
|
|
2112
|
+
// {
|
|
2113
|
+
// totalCollateral: '5.783452104143246413',
|
|
2114
|
+
// userCollateral: '2.0',
|
|
2115
|
+
// collateralFromUserBorrowed: '0.630575350690541071',
|
|
2116
|
+
// collateralFromDebt: '3.152876753452705342'
|
|
2117
|
+
// avgPrice: '3171.70659749038129067231'
|
|
2118
|
+
// }
|
|
2119
|
+
await mintMarket.leverageV2.borrowMorePriceImpact(userBorrowed, debt);
|
|
2120
|
+
// 0.010784277354269765 %
|
|
2121
|
+
await mintMarket.leverageV2.borrowMoreBands(userCollateral, userBorrowed, debt);
|
|
2122
|
+
// [ 47, 38 ]
|
|
2123
|
+
await mintMarket.leverageV2.borrowMorePrices(userCollateral, userBorrowed, debt);
|
|
2124
|
+
// [ '1560.282474721398939216', '1801.742501325928269008' ]
|
|
2125
|
+
await mintMarket.leverageV2.borrowMoreHealth(userCollateral, userBorrowed, debt, true);
|
|
2126
|
+
// 91.6798951784708552
|
|
2127
|
+
await mintMarket.leverageV2.borrowMoreHealth(userCollateral, userBorrowed, debt, false);
|
|
2128
|
+
// 3.7614279042995641
|
|
2129
|
+
await mintMarket.leverageV2.borrowMoreIsApproved(userCollateral, userBorrowed);
|
|
2130
|
+
// true
|
|
2131
|
+
await mintMarket.leverageV2.borrowMoreApprove(userCollateral, userBorrowed);
|
|
2132
|
+
// []
|
|
2133
|
+
await mintMarket.leverageV2.borrowMoreRouteImage(userBorrowed, debt);
|
|
2134
|
+
// 'data:image/svg+xml;base64,PHN2ZyBpZD0ic2Fua2V5UGFyZW50U3ZnIiB4bWxucz...'
|
|
2135
|
+
|
|
2136
|
+
// You must call mintMarket.leverageV2.borrowMoreExpectedCollateral() with the same args before
|
|
2137
|
+
await mintMarket.leverageV2.borrowMore(userCollateral, userBorrowed, debt, slippage);
|
|
2138
|
+
// 0x6357dd6ea7250d7adb2344cd9295f8255fd8fbbe85f00120fbcd1ebf139e057c
|
|
2139
|
+
|
|
2140
|
+
await mintMarket.wallet.balances();
|
|
2141
|
+
// {
|
|
2142
|
+
// collateral: '97.0',
|
|
2143
|
+
// borrowed: '597000.0',
|
|
2144
|
+
// vaultShares: '1400000000.0',
|
|
2145
|
+
// gauge: '0'
|
|
2146
|
+
// }
|
|
2147
|
+
await mintMarket.userState();
|
|
2148
|
+
// {
|
|
2149
|
+
// collateral: '7.727839965845165558',
|
|
2150
|
+
// borrowed: '0.0',
|
|
2151
|
+
// debt: '12000.000010193901375446',
|
|
2152
|
+
// N: '10'
|
|
2153
|
+
// }
|
|
2154
|
+
await mintMarket.userBands();
|
|
2155
|
+
// [ 47, 38 ]
|
|
2156
|
+
await mintMarket.userPrices();
|
|
2157
|
+
// [ '1560.28248267408177179', '1801.742510509320950242' ]
|
|
2158
|
+
await mintMarket.userHealth();
|
|
2159
|
+
// 91.6519475547753288
|
|
2160
|
+
await lendMarket.userHealth(false);
|
|
2161
|
+
// 3.7449386373872907
|
|
2162
|
+
|
|
2163
|
+
|
|
2164
|
+
// - Repay -
|
|
2165
|
+
|
|
2166
|
+
|
|
2167
|
+
// Deleveraged position (-dDebt = borrowedFromStateCollateral + borrowedFromUSerCollateral + userBorrowed)
|
|
2168
|
+
// ^
|
|
2169
|
+
// | userCollateral
|
|
2170
|
+
// user ___|__________________________
|
|
2171
|
+
// | |
|
|
2172
|
+
// | | stateCollateral ↓ userCollateral + stateCollateral
|
|
2173
|
+
// | controller --> leverage_zap --> router
|
|
2174
|
+
// | ^ | ^ ^ |
|
|
2175
|
+
// | |______________________| | |___________________|
|
|
2176
|
+
// | | borrowedFromStateCollateral
|
|
2177
|
+
// |________________________________| +
|
|
2178
|
+
// userBorrowed borrowedFromUSerCollateral
|
|
2179
|
+
|
|
2180
|
+
const stateCollateral = 2;
|
|
2181
|
+
userCollateral = 1;
|
|
2182
|
+
userBorrowed = 1500;
|
|
2183
|
+
await mintMarket.leverageV2.repayExpectedBorrowed(stateCollateral, userCollateral, userBorrowed, slippage);
|
|
2184
|
+
// {
|
|
2185
|
+
// totalBorrowed: '10998.882838599741571472',
|
|
2186
|
+
// borrowedFromStateCollateral: '6332.588559066494374648',
|
|
2187
|
+
// borrowedFromUserCollateral: '3166.294279533247196824',
|
|
2188
|
+
// userBorrowed: '1500'
|
|
2189
|
+
// avgPrice: '3166.29427953324743125312'
|
|
2190
|
+
// }
|
|
2191
|
+
|
|
2192
|
+
await mintMarket.leverageV2.repayPriceImpact(stateCollateral, userCollateral);
|
|
2193
|
+
// 0.013150142802201724 %
|
|
2194
|
+
await mintMarket.leverageV2.repayIsFull(stateCollateral, userCollateral, userBorrowed);
|
|
2195
|
+
// false
|
|
2196
|
+
await mintMarket.leverageV2.repayIsAvailable(stateCollateral, userCollateral, userBorrowed);
|
|
2197
|
+
// true
|
|
2198
|
+
await mintMarket.leverageV2.repayBands(stateCollateral, userCollateral, userBorrowed);
|
|
2199
|
+
// [ 199, 190 ]
|
|
2200
|
+
await mintMarket.leverageV2.repayPrices(stateCollateral, userCollateral, userBorrowed);
|
|
2201
|
+
// [ '175.130965754280721633', '202.233191367561902757' ]
|
|
2202
|
+
await mintMarket.leverageV2.repayHealth(stateCollateral, userCollateral, userBorrowed, true);
|
|
2203
|
+
// 1699.6097751079226865
|
|
2204
|
+
await mintMarket.leverageV2.repayHealth(stateCollateral, userCollateral, userBorrowed, false);
|
|
2205
|
+
// 3.4560086962806991
|
|
2206
|
+
await mintMarket.leverageV2.repayIsApproved(userCollateral, userBorrowed);
|
|
2207
|
+
// false
|
|
2208
|
+
await mintMarket.leverageV2.repayApprove(userCollateral, userBorrowed);
|
|
2209
|
+
// ['0xd8a8d3b3f67395e1a4f4d4f95b041edcaf1c9f7bab5eb8a8a767467678295498']
|
|
2210
|
+
await mintMarket.leverageV2.repayRouteImage(stateCollateral, userCollateral);
|
|
2211
|
+
// 'data:image/svg+xml;base64,PHN2ZyBpZD0ic2Fua2V5UGFyZW50U3ZnIiB4bWxucz...'
|
|
2212
|
+
|
|
2213
|
+
// You must call mintMarket.leverageV2.repayExpectedBorrowed() with the same args before
|
|
2214
|
+
await mintMarket.leverageV2.repay(stateCollateral, userCollateral, userBorrowed, slippage);
|
|
2215
|
+
// 0xe48a97fef1c54180a2c7d104d210a95ac1a516fdd22109682179f1582da23a82
|
|
2216
|
+
|
|
2217
|
+
await mintMarket.wallet.balances();
|
|
2218
|
+
// {
|
|
2219
|
+
// collateral: '96.0',
|
|
2220
|
+
// borrowed: '595500.0',
|
|
2221
|
+
// vaultShares: '1400000000.0',
|
|
2222
|
+
// gauge: '0'
|
|
2223
|
+
// }
|
|
2224
|
+
await mintMarket.userState();
|
|
2225
|
+
// {
|
|
2226
|
+
// collateral: '5.727839965845165558',
|
|
2227
|
+
// borrowed: '0.0',
|
|
2228
|
+
// debt: '992.083214663467727334',
|
|
2229
|
+
// N: '10'
|
|
2230
|
+
// }
|
|
2231
|
+
await mintMarket.userBands();
|
|
2232
|
+
// [ 199, 190 ]
|
|
2233
|
+
await mintMarket.userPrices();
|
|
2234
|
+
// [ '175.13096689602455189', '202.233192685995210783' ]
|
|
2235
|
+
await mintMarket.userHealth();
|
|
2236
|
+
// 1716.0249924305707883
|
|
2237
|
+
await mintMarket.userHealth(false);
|
|
2238
|
+
// 3.6389352509210336
|
|
2239
|
+
})()
|
|
2240
|
+
```
|
|
2241
|
+
|
|
2242
|
+
### Leverage createLoan all ranges methods for mintMarket
|
|
2243
|
+
```ts
|
|
2244
|
+
await llamalend.init('JsonRpc', {}, {}, API_KEY_1INCH);
|
|
2245
|
+
|
|
2246
|
+
const mintMarket = llamalend.getMintMarket('cbbtc');
|
|
2247
|
+
|
|
2248
|
+
const userCollateral = 1;
|
|
2249
|
+
const userBorrowed = 1000;
|
|
2250
|
+
const debt = 2000;
|
|
2251
|
+
await mintMarket.leverageV2.createLoanMaxRecvAllRanges(userCollateral, userBorrowed);
|
|
2252
|
+
// {
|
|
2253
|
+
// '4': {
|
|
2254
|
+
// maxDebt: '37916.338071504823875251',
|
|
2255
|
+
// maxTotalCollateral: '13.286983617364703479',
|
|
2256
|
+
// userCollateral: '1',
|
|
2257
|
+
// collateralFromUserBorrowed: '0.315728154966395280',
|
|
2258
|
+
// collateralFromMaxDebt: '11.971255462398308199',
|
|
2259
|
+
// maxLeverage: '10.09857816541446843865',
|
|
2260
|
+
// avgPrice: '3167.28167656266072703689'
|
|
2261
|
+
// },
|
|
2262
|
+
// '5': {
|
|
2263
|
+
// maxDebt: '35363.440522143354729759',
|
|
2264
|
+
// maxTotalCollateral: '12.480961984286574804',
|
|
2265
|
+
// userCollateral: '1',
|
|
2266
|
+
// collateralFromUserBorrowed: '0.315728154966395280',
|
|
2267
|
+
// collateralFromMaxDebt: '11.165233829320179524',
|
|
2268
|
+
// maxLeverage: '9.48597317551918486951',
|
|
2269
|
+
// avgPrice: '3167.28167656266072703689'
|
|
2270
|
+
// },
|
|
2271
|
+
// '6': {
|
|
2272
|
+
// maxDebt: '33122.824118147617102062',
|
|
2273
|
+
// maxTotalCollateral: '11.773536301065561222',
|
|
2274
|
+
// userCollateral: '1',
|
|
2275
|
+
// collateralFromUserBorrowed: '0.315728154966395280',
|
|
2276
|
+
// collateralFromMaxDebt: '10.457808146099165942',
|
|
2277
|
+
// maxLeverage: '8.94830459971897955699',
|
|
2278
|
+
// avgPrice: '3167.28167656266072703689'
|
|
2279
|
+
// },
|
|
2280
|
+
// '7': {
|
|
2281
|
+
// maxDebt: '31140.555201395785060968',
|
|
2282
|
+
// maxTotalCollateral: '11.147678193332270290',
|
|
2283
|
+
// userCollateral: '1',
|
|
2284
|
+
// collateralFromUserBorrowed: '0.315728154966395280',
|
|
2285
|
+
// collateralFromMaxDebt: '9.831950038365875010',
|
|
2286
|
+
// maxLeverage: '8.47263027035929823721',
|
|
2287
|
+
// avgPrice: '3167.28167656266072703689'
|
|
2288
|
+
// },
|
|
2289
|
+
//
|
|
2290
|
+
// ...
|
|
2291
|
+
//
|
|
2292
|
+
// '50': {
|
|
2293
|
+
// maxDebt: '8122.705063645852013929',
|
|
2294
|
+
// maxTotalCollateral: '3.880294838047496482',
|
|
2295
|
+
// userCollateral: '1',
|
|
2296
|
+
// collateralFromUserBorrowed: '0.315728154966395280',
|
|
2297
|
+
// collateralFromMaxDebt: '2.564566683081101202',
|
|
2298
|
+
// maxLeverage: '2.94916151440614435181',
|
|
2299
|
+
// avgPrice: '3167.28167656266072703689'
|
|
2300
|
+
// }
|
|
2301
|
+
|
|
2302
|
+
await mintMarket.leverageV2.createLoanBandsAllRanges(userCollateral, userBorrowed, debt);
|
|
2303
|
+
// {
|
|
2304
|
+
// '4': [ 73, 70 ],
|
|
2305
|
+
// '5': [ 73, 69 ],
|
|
2306
|
+
// '6': [ 74, 69 ],
|
|
2307
|
+
// '7': [ 74, 68 ],
|
|
2308
|
+
//
|
|
2309
|
+
// ...
|
|
2310
|
+
//
|
|
2311
|
+
// '50': [ 97, 48 ]
|
|
2312
|
+
// }
|
|
2313
|
+
|
|
2314
|
+
await mintMarket.leverageV2.createLoanPricesAllRanges(userCollateral, userBorrowed, debt);
|
|
2315
|
+
// {
|
|
2316
|
+
// '4': [ '1073.323292757532604807', '1136.910693647788699808' ],
|
|
2317
|
+
// '5': [ '1073.323292757532604807', '1153.387660222394333133' ],
|
|
2318
|
+
// '6': [ '1057.990102860996424743', '1153.387660222394333133' ],
|
|
2319
|
+
// '7': [ '1057.990102860996424743', '1170.103423414023236507' ],
|
|
2320
|
+
//
|
|
2321
|
+
// ...
|
|
2322
|
+
//
|
|
2323
|
+
// '50': [ '759.898822708156242647', '1560.282492846180089068' ]
|
|
2324
|
+
// }
|
|
1979
2325
|
```
|
package/lib/constants/llammas.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import MonetaryPolicyABI from './abis/crvUSD/MonetaryPolicy.json'
|
|
2
|
-
import MonetaryPolicy2ABI from './abis/crvUSD/MonetaryPolicy2.json'
|
|
1
|
+
import MonetaryPolicyABI from './abis/crvUSD/MonetaryPolicy.json' with { type: 'json' };
|
|
2
|
+
import MonetaryPolicy2ABI from './abis/crvUSD/MonetaryPolicy2.json' with { type: 'json' };
|
|
3
3
|
import { lowerCaseLlammasAddresses } from "./utils";
|
|
4
4
|
export const LLAMMAS = lowerCaseLlammasAddresses({
|
|
5
5
|
sfrxeth: {
|
package/lib/external-api.d.ts
CHANGED
|
@@ -16,5 +16,4 @@ export declare const _getMarketsData: ((network: INetworkName) => Promise<IMarke
|
|
|
16
16
|
export declare function _getQuoteOdos(this: Llamalend, fromToken: string, toToken: string, _amount: bigint, blacklist: string, pathVizImage: boolean, slippage?: number): Promise<IQuoteOdos>;
|
|
17
17
|
export declare function _getExpectedOdos(this: Llamalend, fromToken: string, toToken: string, _amount: bigint, blacklist: string): Promise<string>;
|
|
18
18
|
export declare function _assembleTxOdos(this: Llamalend, pathId: string): Promise<string>;
|
|
19
|
-
export declare const _getHiddenPools: (() => Promise<IDict<string[]>>) & memoize.Memoized<() => Promise<IDict<string[]>>>;
|
|
20
19
|
export {};
|
package/lib/external-api.js
CHANGED
|
@@ -188,9 +188,3 @@ export function _assembleTxOdos(pathId) {
|
|
|
188
188
|
return _assembleTxOdosMemoized(this.constants.ALIASES.leverage_zap, pathId);
|
|
189
189
|
});
|
|
190
190
|
}
|
|
191
|
-
export const _getHiddenPools = memoize(() => fetch(`https://api.curve.finance/api/getHiddenPools`)
|
|
192
|
-
.then((r) => (r.json()))
|
|
193
|
-
.then((json) => json.data), {
|
|
194
|
-
promise: true,
|
|
195
|
-
maxAge: 5 * 60 * 1000, // 5m
|
|
196
|
-
});
|
|
@@ -11,7 +11,7 @@ import memoize from "memoizee";
|
|
|
11
11
|
import BigNumber from "bignumber.js";
|
|
12
12
|
import { _getAddress, parseUnits, BN, toBN, fromBN, getBalances, _ensureAllowance, ensureAllowance, hasAllowance, ensureAllowanceEstimateGas, _cutZeros, formatUnits, formatNumber, MAX_ALLOWANCE, MAX_ACTIVE_BAND, _mulBy1_3, _getUsdRate, DIGas, smartNumber, } from "../utils.js";
|
|
13
13
|
import { _getExpectedOdos, _getQuoteOdos, _assembleTxOdos, _getUserCollateral, _getMarketsData } from "../external-api.js";
|
|
14
|
-
import ERC20Abi from '../constants/abis/ERC20.json'
|
|
14
|
+
import ERC20Abi from '../constants/abis/ERC20.json' with { type: 'json' };
|
|
15
15
|
import { cacheKey, cacheStats } from "../cache/index.js";
|
|
16
16
|
const DAY = 86400;
|
|
17
17
|
const WEEK = 7 * DAY;
|
package/lib/llamalend.d.ts
CHANGED
|
@@ -76,6 +76,5 @@ declare class Llamalend implements ILlamalend {
|
|
|
76
76
|
formatUnits(value: BigNumberish, unit?: string | Numeric): string;
|
|
77
77
|
parseUnits(value: string, unit?: string | Numeric): bigint;
|
|
78
78
|
updateFeeData(): Promise<void>;
|
|
79
|
-
_filterHiddenPools(pools: IDict<ILlamma>): Promise<IDict<ILlamma>>;
|
|
80
79
|
}
|
|
81
80
|
export { Llamalend };
|
package/lib/llamalend.js
CHANGED
|
@@ -10,39 +10,39 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
import { ethers, Contract, AbstractProvider } from "ethers";
|
|
11
11
|
import { Provider as MulticallProvider, Contract as MulticallContract } from '@curvefi/ethcall';
|
|
12
12
|
// OneWayMarket ABIs
|
|
13
|
-
import OneWayLendingFactoryABI from "./constants/abis/OneWayLendingFactoryABI.json"
|
|
14
|
-
import ERC20ABI from './constants/abis/ERC20.json'
|
|
15
|
-
import ERC4626ABI from './constants/abis/ERC4626.json'
|
|
16
|
-
import LlammaABI from './constants/abis/Llamma.json'
|
|
17
|
-
import ControllerABI from './constants/abis/Controller.json'
|
|
18
|
-
import MonetaryPolicyABI from './constants/abis/MonetaryPolicy.json'
|
|
19
|
-
import VaultABI from './constants/abis/Vault.json'
|
|
20
|
-
import GaugeABI from './constants/abis/GaugeV5.json'
|
|
21
|
-
import SidechainGaugeABI from './constants/abis/SidechainGauge.json'
|
|
22
|
-
import GaugeControllerABI from './constants/abis/GaugeController.json'
|
|
23
|
-
import GaugeFactoryMainnetABI from './constants/abis/GaugeFactoryMainnet.json'
|
|
24
|
-
import GaugeFactorySidechainABI from './constants/abis/GaugeFactorySidechain.json'
|
|
25
|
-
import MinterABI from './constants/abis/Minter.json'
|
|
26
|
-
import LeverageZapABI from './constants/abis/LeverageZap.json'
|
|
27
|
-
import gasOracleABI from './constants/abis/gas_oracle_optimism.json'
|
|
28
|
-
import gasOracleBlobABI from './constants/abis/gas_oracle_optimism_blob.json'
|
|
13
|
+
import OneWayLendingFactoryABI from "./constants/abis/OneWayLendingFactoryABI.json" with { type: 'json' };
|
|
14
|
+
import ERC20ABI from './constants/abis/ERC20.json' with { type: 'json' };
|
|
15
|
+
import ERC4626ABI from './constants/abis/ERC4626.json' with { type: 'json' };
|
|
16
|
+
import LlammaABI from './constants/abis/Llamma.json' with { type: 'json' };
|
|
17
|
+
import ControllerABI from './constants/abis/Controller.json' with { type: 'json' };
|
|
18
|
+
import MonetaryPolicyABI from './constants/abis/MonetaryPolicy.json' with { type: 'json' };
|
|
19
|
+
import VaultABI from './constants/abis/Vault.json' with { type: 'json' };
|
|
20
|
+
import GaugeABI from './constants/abis/GaugeV5.json' with { type: 'json' };
|
|
21
|
+
import SidechainGaugeABI from './constants/abis/SidechainGauge.json' with { type: 'json' };
|
|
22
|
+
import GaugeControllerABI from './constants/abis/GaugeController.json' with { type: 'json' };
|
|
23
|
+
import GaugeFactoryMainnetABI from './constants/abis/GaugeFactoryMainnet.json' with { type: 'json' };
|
|
24
|
+
import GaugeFactorySidechainABI from './constants/abis/GaugeFactorySidechain.json' with { type: 'json' };
|
|
25
|
+
import MinterABI from './constants/abis/Minter.json' with { type: 'json' };
|
|
26
|
+
import LeverageZapABI from './constants/abis/LeverageZap.json' with { type: 'json' };
|
|
27
|
+
import gasOracleABI from './constants/abis/gas_oracle_optimism.json' with { type: 'json' };
|
|
28
|
+
import gasOracleBlobABI from './constants/abis/gas_oracle_optimism_blob.json' with { type: 'json' };
|
|
29
29
|
// crvUSD ABIs
|
|
30
|
-
import llammaABI from "./constants/abis/crvUSD/llamma.json"
|
|
31
|
-
import controllerABI from "./constants/abis/crvUSD/controller.json"
|
|
30
|
+
import llammaABI from "./constants/abis/crvUSD/llamma.json" with { type: 'json' };
|
|
31
|
+
import controllerABI from "./constants/abis/crvUSD/controller.json" with { type: 'json' };
|
|
32
32
|
import controllerV2ABI from "./constants/abis/crvUSD/controller_v2.json";
|
|
33
|
-
import PegKeeper from "./constants/abis/crvUSD/PegKeeper.json"
|
|
34
|
-
import FactoryABI from "./constants/abis/crvUSD/Factory.json"
|
|
35
|
-
import MonetaryPolicy2ABI from "./constants/abis/crvUSD/MonetaryPolicy2.json"
|
|
36
|
-
import HealthCalculatorZapABI from "./constants/abis/crvUSD/HealthCalculatorZap.json"
|
|
37
|
-
import LeverageZapCrvUSDABI from "./constants/abis/crvUSD/LeverageZap.json"
|
|
38
|
-
import DeleverageZapABI from "./constants/abis/crvUSD/DeleverageZap.json"
|
|
33
|
+
import PegKeeper from "./constants/abis/crvUSD/PegKeeper.json" with { type: 'json' };
|
|
34
|
+
import FactoryABI from "./constants/abis/crvUSD/Factory.json" with { type: 'json' };
|
|
35
|
+
import MonetaryPolicy2ABI from "./constants/abis/crvUSD/MonetaryPolicy2.json" with { type: 'json' };
|
|
36
|
+
import HealthCalculatorZapABI from "./constants/abis/crvUSD/HealthCalculatorZap.json" with { type: 'json' };
|
|
37
|
+
import LeverageZapCrvUSDABI from "./constants/abis/crvUSD/LeverageZap.json" with { type: 'json' };
|
|
38
|
+
import DeleverageZapABI from "./constants/abis/crvUSD/DeleverageZap.json" with { type: 'json' };
|
|
39
39
|
import { ALIASES_ETHEREUM, ALIASES_OPTIMISM, ALIASES_POLYGON, ALIASES_FANTOM, ALIASES_AVALANCHE, ALIASES_ARBITRUM, ALIASES_XDAI, ALIASES_MOONBEAM, ALIASES_AURORA, ALIASES_KAVA, ALIASES_CELO, ALIASES_ZKSYNC, ALIASES_BASE, ALIASES_BSC, ALIASES_FRAXTAL, ALIASES_SONIC, } from "./constants/aliases.js";
|
|
40
40
|
import { COINS_ETHEREUM, COINS_OPTIMISM, COINS_POLYGON, COINS_FANTOM, COINS_AVALANCHE, COINS_ARBITRUM, COINS_XDAI, COINS_MOONBEAM, COINS_AURORA, COINS_KAVA, COINS_CELO, COINS_ZKSYNC, COINS_BASE, COINS_BSC, COINS_FRAXTAL, COINS_SONIC, } from "./constants/coins.js";
|
|
41
41
|
import { LLAMMAS } from "./constants/llammas";
|
|
42
42
|
import { L2Networks } from "./constants/L2Networks.js";
|
|
43
43
|
import { createCall, handleMultiCallResponse } from "./utils.js";
|
|
44
44
|
import { cacheKey, cacheStats } from "./cache/index.js";
|
|
45
|
-
import {
|
|
45
|
+
import { _getMarketsData } from "./external-api.js";
|
|
46
46
|
import { extractDecimals } from "./constants/utils.js";
|
|
47
47
|
export const NETWORK_CONSTANTS = {
|
|
48
48
|
1: {
|
|
@@ -388,7 +388,7 @@ class Llamalend {
|
|
|
388
388
|
this.options = {};
|
|
389
389
|
this.constants = {
|
|
390
390
|
ONE_WAY_MARKETS: {},
|
|
391
|
-
LLAMMAS:
|
|
391
|
+
LLAMMAS: Object.assign({}, LLAMMAS),
|
|
392
392
|
COINS: {},
|
|
393
393
|
DECIMALS: {},
|
|
394
394
|
NETWORK_NAME: 'ethereum',
|
|
@@ -455,7 +455,7 @@ class Llamalend {
|
|
|
455
455
|
}
|
|
456
456
|
const network = yield this.provider.getNetwork();
|
|
457
457
|
this.chainId = Number(network.chainId) === 133 || Number(network.chainId) === 31337 ? 1 : Number(network.chainId);
|
|
458
|
-
console.log("CURVE-
|
|
458
|
+
console.log("CURVE-LLAMALEND-JS IS CONNECTED TO NETWORK:", { name: network.name.toUpperCase(), chainId: Number(this.chainId) });
|
|
459
459
|
if (this.chainId === 42161) {
|
|
460
460
|
this.constantOptions = { gasLimit: 1125899906842624 }; // https://arbiscan.io/chart/gaslimit
|
|
461
461
|
}
|
|
@@ -584,7 +584,7 @@ class Llamalend {
|
|
|
584
584
|
controller_address: controllers[i],
|
|
585
585
|
monetary_policy_address,
|
|
586
586
|
collateral_address: is_eth ? "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" : collaterals[i],
|
|
587
|
-
leverage_zap:
|
|
587
|
+
leverage_zap: this.constants.ALIASES.leverage_zap,
|
|
588
588
|
deleverage_zap: "0x0000000000000000000000000000000000000000",
|
|
589
589
|
collateral_symbol: is_eth ? "ETH" : collateral_symbol,
|
|
590
590
|
collateral_decimals,
|
|
@@ -676,11 +676,5 @@ class Llamalend {
|
|
|
676
676
|
}
|
|
677
677
|
});
|
|
678
678
|
}
|
|
679
|
-
_filterHiddenPools(pools) {
|
|
680
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
681
|
-
const hiddenPools = (yield _getHiddenPools())[this.constants.NETWORK_NAME] || [];
|
|
682
|
-
return Object.fromEntries(Object.entries(pools).filter(([id]) => !hiddenPools.includes(id)));
|
|
683
|
-
});
|
|
684
|
-
}
|
|
685
679
|
}
|
|
686
680
|
export { Llamalend };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import memoize from "memoizee";
|
|
2
2
|
import type { Llamalend } from "../llamalend.js";
|
|
3
3
|
import { IDict, TGas } from "../interfaces";
|
|
4
|
+
import { ILeverageV2 } from "./interfaces/leverage.js";
|
|
4
5
|
export declare class MintMarketTemplate {
|
|
5
6
|
private llamalend;
|
|
6
7
|
id: string;
|
|
@@ -112,6 +113,7 @@ export declare class MintMarketTemplate {
|
|
|
112
113
|
createLoan: (collateral: number | string, debt: number | string, range: number, slippage?: number) => Promise<TGas>;
|
|
113
114
|
};
|
|
114
115
|
};
|
|
116
|
+
leverageV2: ILeverageV2;
|
|
115
117
|
deleverage: {
|
|
116
118
|
repayStablecoins: (collateral: number | string) => Promise<{
|
|
117
119
|
stablecoins: string;
|
|
@@ -130,7 +132,21 @@ export declare class MintMarketTemplate {
|
|
|
130
132
|
};
|
|
131
133
|
};
|
|
132
134
|
constructor(id: string, llamalend: Llamalend);
|
|
133
|
-
|
|
135
|
+
statsParameters: (() => Promise<{
|
|
136
|
+
fee: string;
|
|
137
|
+
admin_fee: string;
|
|
138
|
+
rate: string;
|
|
139
|
+
future_rate: string;
|
|
140
|
+
liquidation_discount: string;
|
|
141
|
+
loan_discount: string;
|
|
142
|
+
}>) & memoize.Memoized<() => Promise<{
|
|
143
|
+
fee: string;
|
|
144
|
+
admin_fee: string;
|
|
145
|
+
rate: string;
|
|
146
|
+
future_rate: string;
|
|
147
|
+
liquidation_discount: string;
|
|
148
|
+
loan_discount: string;
|
|
149
|
+
}>>;
|
|
134
150
|
private statsBalances;
|
|
135
151
|
private statsMaxMinBands;
|
|
136
152
|
private statsActiveBand;
|
|
@@ -176,7 +192,7 @@ export declare class MintMarketTemplate {
|
|
|
176
192
|
calcBandPrices(n: number): Promise<[string, string]>;
|
|
177
193
|
calcRangePct(range: number): string;
|
|
178
194
|
private walletBalances;
|
|
179
|
-
|
|
195
|
+
_checkRange(range: number): void;
|
|
180
196
|
createLoanMaxRecv(collateral: number | string, range: number): Promise<string>;
|
|
181
197
|
createLoanMaxRecvAllRanges: ((collateral: number | string) => Promise<{
|
|
182
198
|
[index: number]: string;
|
|
@@ -186,8 +202,8 @@ export declare class MintMarketTemplate {
|
|
|
186
202
|
getMaxRange(collateral: number | string, debt: number | string): Promise<number>;
|
|
187
203
|
private _calcN1;
|
|
188
204
|
private _calcN1AllRanges;
|
|
189
|
-
|
|
190
|
-
|
|
205
|
+
_getPrices(_n2: bigint, _n1: bigint): Promise<string[]>;
|
|
206
|
+
_calcPrices(_n2: bigint, _n1: bigint): Promise<[string, string]>;
|
|
191
207
|
private _createLoanBands;
|
|
192
208
|
private _createLoanBandsAllRanges;
|
|
193
209
|
createLoanBands(collateral: number | string, debt: number | string, range: number): Promise<[number, number]>;
|
|
@@ -309,4 +325,5 @@ export declare class MintMarketTemplate {
|
|
|
309
325
|
private _deleverageRepay;
|
|
310
326
|
private deleverageRepayEstimateGas;
|
|
311
327
|
private deleverageRepay;
|
|
328
|
+
getLlamalend(): Llamalend;
|
|
312
329
|
}
|
|
@@ -11,6 +11,7 @@ import memoize from "memoizee";
|
|
|
11
11
|
import BigNumber from "bignumber.js";
|
|
12
12
|
import { _getAddress, parseUnits, BN, toBN, fromBN, getBalances, ensureAllowance, hasAllowance, ensureAllowanceEstimateGas, isEth, _cutZeros, formatUnits, smartNumber, MAX_ALLOWANCE, MAX_ACTIVE_BAND, _mulBy1_3, DIGas, } from "../utils";
|
|
13
13
|
import { _getUserCollateralCrvUsd } from "../external-api.js";
|
|
14
|
+
import { LeverageV2Module } from "./modules";
|
|
14
15
|
export class MintMarketTemplate {
|
|
15
16
|
constructor(id, llamalend) {
|
|
16
17
|
var _a;
|
|
@@ -312,6 +313,54 @@ export class MintMarketTemplate {
|
|
|
312
313
|
createLoan: this.leverageCreateLoanEstimateGas.bind(this),
|
|
313
314
|
},
|
|
314
315
|
};
|
|
316
|
+
const leverageV2 = new LeverageV2Module(this);
|
|
317
|
+
this.leverageV2 = {
|
|
318
|
+
hasLeverage: leverageV2.hasLeverage,
|
|
319
|
+
maxLeverage: leverageV2.maxLeverage,
|
|
320
|
+
createLoanMaxRecv: leverageV2.leverageCreateLoanMaxRecv,
|
|
321
|
+
createLoanMaxRecvAllRanges: leverageV2.leverageCreateLoanMaxRecvAllRanges,
|
|
322
|
+
createLoanExpectedCollateral: leverageV2.leverageCreateLoanExpectedCollateral,
|
|
323
|
+
createLoanPriceImpact: leverageV2.leverageCreateLoanPriceImpact,
|
|
324
|
+
createLoanMaxRange: leverageV2.leverageCreateLoanMaxRange,
|
|
325
|
+
createLoanBands: leverageV2.leverageCreateLoanBands,
|
|
326
|
+
createLoanBandsAllRanges: leverageV2.leverageCreateLoanBandsAllRanges,
|
|
327
|
+
createLoanPrices: leverageV2.leverageCreateLoanPrices,
|
|
328
|
+
createLoanPricesAllRanges: leverageV2.leverageCreateLoanPricesAllRanges,
|
|
329
|
+
createLoanHealth: leverageV2.leverageCreateLoanHealth,
|
|
330
|
+
createLoanIsApproved: leverageV2.leverageCreateLoanIsApproved,
|
|
331
|
+
createLoanApprove: leverageV2.leverageCreateLoanApprove,
|
|
332
|
+
createLoanRouteImage: leverageV2.leverageCreateLoanRouteImage,
|
|
333
|
+
createLoan: leverageV2.leverageCreateLoan,
|
|
334
|
+
borrowMoreMaxRecv: leverageV2.leverageBorrowMoreMaxRecv,
|
|
335
|
+
borrowMoreExpectedCollateral: leverageV2.leverageBorrowMoreExpectedCollateral,
|
|
336
|
+
borrowMorePriceImpact: leverageV2.leverageBorrowMorePriceImpact,
|
|
337
|
+
borrowMoreBands: leverageV2.leverageBorrowMoreBands,
|
|
338
|
+
borrowMorePrices: leverageV2.leverageBorrowMorePrices,
|
|
339
|
+
borrowMoreHealth: leverageV2.leverageBorrowMoreHealth,
|
|
340
|
+
borrowMoreIsApproved: leverageV2.leverageCreateLoanIsApproved,
|
|
341
|
+
borrowMoreApprove: leverageV2.leverageCreateLoanApprove,
|
|
342
|
+
borrowMoreRouteImage: leverageV2.leverageBorrowMoreRouteImage,
|
|
343
|
+
borrowMore: leverageV2.leverageBorrowMore,
|
|
344
|
+
repayExpectedBorrowed: leverageV2.leverageRepayExpectedBorrowed,
|
|
345
|
+
repayPriceImpact: leverageV2.leverageRepayPriceImpact,
|
|
346
|
+
repayIsFull: leverageV2.leverageRepayIsFull,
|
|
347
|
+
repayIsAvailable: leverageV2.leverageRepayIsAvailable,
|
|
348
|
+
repayBands: leverageV2.leverageRepayBands,
|
|
349
|
+
repayPrices: leverageV2.leverageRepayPrices,
|
|
350
|
+
repayHealth: leverageV2.leverageRepayHealth,
|
|
351
|
+
repayIsApproved: leverageV2.leverageRepayIsApproved,
|
|
352
|
+
repayApprove: leverageV2.leverageRepayApprove,
|
|
353
|
+
repayRouteImage: leverageV2.leverageRepayRouteImage,
|
|
354
|
+
repay: leverageV2.leverageRepay,
|
|
355
|
+
estimateGas: {
|
|
356
|
+
createLoanApprove: leverageV2.leverageCreateLoanApproveEstimateGas,
|
|
357
|
+
createLoan: leverageV2.leverageCreateLoanEstimateGas,
|
|
358
|
+
borrowMoreApprove: leverageV2.leverageCreateLoanApproveEstimateGas,
|
|
359
|
+
borrowMore: leverageV2.leverageBorrowMoreEstimateGas,
|
|
360
|
+
repayApprove: leverageV2.leverageRepayApproveEstimateGas,
|
|
361
|
+
repay: leverageV2.leverageRepayEstimateGas,
|
|
362
|
+
},
|
|
363
|
+
};
|
|
315
364
|
this.deleverage = {
|
|
316
365
|
repayStablecoins: this.deleverageRepayStablecoins.bind(this),
|
|
317
366
|
getRouteName: this.deleverageGetRouteName.bind(this),
|
|
@@ -1668,4 +1717,7 @@ export class MintMarketTemplate {
|
|
|
1668
1717
|
return yield this._deleverageRepay(collateral, slippage, false);
|
|
1669
1718
|
});
|
|
1670
1719
|
}
|
|
1720
|
+
getLlamalend() {
|
|
1721
|
+
return this.llamalend;
|
|
1722
|
+
}
|
|
1671
1723
|
}
|