@curvefi/llamalend-api 1.0.22-beta.2 → 1.0.22
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/external-api.d.ts +0 -1
- package/lib/external-api.js +0 -6
- package/lib/llamalend.d.ts +0 -1
- package/lib/llamalend.js +4 -10
- 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/external-api.ts +0 -10
- package/src/llamalend.ts +4 -9
- 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/package.json
CHANGED
package/src/external-api.ts
CHANGED
|
@@ -209,13 +209,3 @@ const _assembleTxOdosMemoized = memoize(
|
|
|
209
209
|
export async function _assembleTxOdos(this: Llamalend, pathId: string): Promise<string> {
|
|
210
210
|
return _assembleTxOdosMemoized(this.constants.ALIASES.leverage_zap, pathId);
|
|
211
211
|
}
|
|
212
|
-
|
|
213
|
-
export const _getHiddenPools = memoize(
|
|
214
|
-
() => fetch(`https://api.curve.finance/api/getHiddenPools`)
|
|
215
|
-
.then((r) => (r.json()))
|
|
216
|
-
.then((json) => (json as {data: IDict<string[]>}).data),
|
|
217
|
-
{
|
|
218
|
-
promise: true,
|
|
219
|
-
maxAge: 5 * 60 * 1000, // 5m
|
|
220
|
-
}
|
|
221
|
-
)
|
package/src/llamalend.ts
CHANGED
|
@@ -79,7 +79,7 @@ import {LLAMMAS} from "./constants/llammas";
|
|
|
79
79
|
import {L2Networks} from "./constants/L2Networks.js";
|
|
80
80
|
import {createCall, handleMultiCallResponse} from "./utils.js";
|
|
81
81
|
import {cacheKey, cacheStats} from "./cache/index.js";
|
|
82
|
-
import {
|
|
82
|
+
import {_getMarketsData} from "./external-api.js";
|
|
83
83
|
import {extractDecimals} from "./constants/utils.js";
|
|
84
84
|
|
|
85
85
|
export const NETWORK_CONSTANTS: { [index: number]: any } = {
|
|
@@ -244,7 +244,7 @@ class Llamalend implements ILlamalend {
|
|
|
244
244
|
this.options = {};
|
|
245
245
|
this.constants = {
|
|
246
246
|
ONE_WAY_MARKETS: {},
|
|
247
|
-
LLAMMAS:
|
|
247
|
+
LLAMMAS: {...LLAMMAS},
|
|
248
248
|
COINS: {},
|
|
249
249
|
DECIMALS: {},
|
|
250
250
|
NETWORK_NAME: 'ethereum',
|
|
@@ -309,7 +309,7 @@ class Llamalend implements ILlamalend {
|
|
|
309
309
|
|
|
310
310
|
const network = await this.provider.getNetwork();
|
|
311
311
|
this.chainId = Number(network.chainId) === 133 || Number(network.chainId) === 31337 ? 1 : Number(network.chainId) as IChainId;
|
|
312
|
-
console.log("CURVE-
|
|
312
|
+
console.log("CURVE-LLAMALEND-JS IS CONNECTED TO NETWORK:", { name: network.name.toUpperCase(), chainId: Number(this.chainId) });
|
|
313
313
|
|
|
314
314
|
if(this.chainId === 42161) {
|
|
315
315
|
this.constantOptions = { gasLimit: 1125899906842624 } // https://arbiscan.io/chart/gaslimit
|
|
@@ -455,7 +455,7 @@ class Llamalend implements ILlamalend {
|
|
|
455
455
|
controller_address: controllers[i],
|
|
456
456
|
monetary_policy_address,
|
|
457
457
|
collateral_address: is_eth ? "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" : collaterals[i],
|
|
458
|
-
leverage_zap:
|
|
458
|
+
leverage_zap: this.constants.ALIASES.leverage_zap,
|
|
459
459
|
deleverage_zap: "0x0000000000000000000000000000000000000000",
|
|
460
460
|
collateral_symbol: is_eth ? "ETH" : collateral_symbol,
|
|
461
461
|
collateral_decimals,
|
|
@@ -797,11 +797,6 @@ class Llamalend implements ILlamalend {
|
|
|
797
797
|
feeData.maxPriorityFeePerGas;
|
|
798
798
|
}
|
|
799
799
|
}
|
|
800
|
-
|
|
801
|
-
async _filterHiddenPools(pools: IDict<ILlamma>): Promise<IDict<ILlamma>> {
|
|
802
|
-
const hiddenPools = (await _getHiddenPools())[this.constants.NETWORK_NAME] || [];
|
|
803
|
-
return Object.fromEntries(Object.entries(pools).filter(([id]) => !hiddenPools.includes(id))) as IDict<ILlamma>;
|
|
804
|
-
}
|
|
805
800
|
}
|
|
806
801
|
|
|
807
802
|
export { Llamalend };
|
|
@@ -22,6 +22,8 @@ import {
|
|
|
22
22
|
} from "../utils";
|
|
23
23
|
import {IDict, TGas} from "../interfaces";
|
|
24
24
|
import {_getUserCollateralCrvUsd} from "../external-api.js";
|
|
25
|
+
import { ILeverageV2 } from "./interfaces/leverage.js";
|
|
26
|
+
import { LeverageV2Module } from "./modules";
|
|
25
27
|
|
|
26
28
|
|
|
27
29
|
export class MintMarketTemplate {
|
|
@@ -107,6 +109,7 @@ export class MintMarketTemplate {
|
|
|
107
109
|
createLoan: (collateral: number | string, debt: number | string, range: number, slippage?: number) => Promise<TGas>,
|
|
108
110
|
}
|
|
109
111
|
}
|
|
112
|
+
leverageV2: ILeverageV2
|
|
110
113
|
deleverage: {
|
|
111
114
|
repayStablecoins: (collateral: number | string) => Promise<{ stablecoins: string, routeIdx: number }>,
|
|
112
115
|
getRouteName: (routeIdx: number) => Promise<string>,
|
|
@@ -201,6 +204,62 @@ export class MintMarketTemplate {
|
|
|
201
204
|
createLoan: this.leverageCreateLoanEstimateGas.bind(this),
|
|
202
205
|
},
|
|
203
206
|
}
|
|
207
|
+
|
|
208
|
+
const leverageV2 = new LeverageV2Module(this);
|
|
209
|
+
this.leverageV2 = {
|
|
210
|
+
hasLeverage: leverageV2.hasLeverage,
|
|
211
|
+
|
|
212
|
+
maxLeverage: leverageV2.maxLeverage,
|
|
213
|
+
|
|
214
|
+
createLoanMaxRecv: leverageV2.leverageCreateLoanMaxRecv,
|
|
215
|
+
createLoanMaxRecvAllRanges: leverageV2.leverageCreateLoanMaxRecvAllRanges,
|
|
216
|
+
createLoanExpectedCollateral: leverageV2.leverageCreateLoanExpectedCollateral,
|
|
217
|
+
createLoanPriceImpact: leverageV2.leverageCreateLoanPriceImpact,
|
|
218
|
+
createLoanMaxRange: leverageV2.leverageCreateLoanMaxRange,
|
|
219
|
+
createLoanBands: leverageV2.leverageCreateLoanBands,
|
|
220
|
+
createLoanBandsAllRanges: leverageV2.leverageCreateLoanBandsAllRanges,
|
|
221
|
+
createLoanPrices: leverageV2.leverageCreateLoanPrices,
|
|
222
|
+
createLoanPricesAllRanges: leverageV2.leverageCreateLoanPricesAllRanges,
|
|
223
|
+
createLoanHealth: leverageV2.leverageCreateLoanHealth,
|
|
224
|
+
createLoanIsApproved: leverageV2.leverageCreateLoanIsApproved,
|
|
225
|
+
createLoanApprove: leverageV2.leverageCreateLoanApprove,
|
|
226
|
+
createLoanRouteImage: leverageV2.leverageCreateLoanRouteImage,
|
|
227
|
+
createLoan: leverageV2.leverageCreateLoan,
|
|
228
|
+
|
|
229
|
+
borrowMoreMaxRecv: leverageV2.leverageBorrowMoreMaxRecv,
|
|
230
|
+
borrowMoreExpectedCollateral: leverageV2.leverageBorrowMoreExpectedCollateral,
|
|
231
|
+
borrowMorePriceImpact: leverageV2.leverageBorrowMorePriceImpact,
|
|
232
|
+
borrowMoreBands: leverageV2.leverageBorrowMoreBands,
|
|
233
|
+
borrowMorePrices: leverageV2.leverageBorrowMorePrices,
|
|
234
|
+
borrowMoreHealth: leverageV2.leverageBorrowMoreHealth,
|
|
235
|
+
borrowMoreIsApproved: leverageV2.leverageCreateLoanIsApproved,
|
|
236
|
+
borrowMoreApprove: leverageV2.leverageCreateLoanApprove,
|
|
237
|
+
borrowMoreRouteImage: leverageV2.leverageBorrowMoreRouteImage,
|
|
238
|
+
borrowMore: leverageV2.leverageBorrowMore,
|
|
239
|
+
|
|
240
|
+
repayExpectedBorrowed: leverageV2.leverageRepayExpectedBorrowed,
|
|
241
|
+
repayPriceImpact: leverageV2.leverageRepayPriceImpact,
|
|
242
|
+
repayIsFull: leverageV2.leverageRepayIsFull,
|
|
243
|
+
repayIsAvailable: leverageV2.leverageRepayIsAvailable,
|
|
244
|
+
repayBands: leverageV2.leverageRepayBands,
|
|
245
|
+
repayPrices: leverageV2.leverageRepayPrices,
|
|
246
|
+
repayHealth: leverageV2.leverageRepayHealth,
|
|
247
|
+
repayIsApproved: leverageV2.leverageRepayIsApproved,
|
|
248
|
+
repayApprove: leverageV2.leverageRepayApprove,
|
|
249
|
+
repayRouteImage: leverageV2.leverageRepayRouteImage,
|
|
250
|
+
repay: leverageV2.leverageRepay,
|
|
251
|
+
|
|
252
|
+
estimateGas: {
|
|
253
|
+
createLoanApprove: leverageV2.leverageCreateLoanApproveEstimateGas,
|
|
254
|
+
createLoan: leverageV2.leverageCreateLoanEstimateGas,
|
|
255
|
+
|
|
256
|
+
borrowMoreApprove: leverageV2.leverageCreateLoanApproveEstimateGas,
|
|
257
|
+
borrowMore: leverageV2.leverageBorrowMoreEstimateGas,
|
|
258
|
+
|
|
259
|
+
repayApprove: leverageV2.leverageRepayApproveEstimateGas,
|
|
260
|
+
repay: leverageV2.leverageRepayEstimateGas,
|
|
261
|
+
},
|
|
262
|
+
}
|
|
204
263
|
this.deleverage = {
|
|
205
264
|
repayStablecoins: this.deleverageRepayStablecoins.bind(this),
|
|
206
265
|
getRouteName: this.deleverageGetRouteName.bind(this),
|
|
@@ -219,7 +278,7 @@ export class MintMarketTemplate {
|
|
|
219
278
|
|
|
220
279
|
// ---------------- STATS ----------------
|
|
221
280
|
|
|
222
|
-
|
|
281
|
+
public statsParameters = memoize(async (): Promise<{
|
|
223
282
|
fee: string, // %
|
|
224
283
|
admin_fee: string, // %
|
|
225
284
|
rate: string, // %
|
|
@@ -591,7 +650,7 @@ export class MintMarketTemplate {
|
|
|
591
650
|
|
|
592
651
|
// ---------------- CREATE LOAN ----------------
|
|
593
652
|
|
|
594
|
-
|
|
653
|
+
public _checkRange(range: number): void {
|
|
595
654
|
if (range < this.minBands) throw Error(`range must be >= ${this.minBands}`);
|
|
596
655
|
if (range > this.maxBands) throw Error(`range must be <= ${this.maxBands}`);
|
|
597
656
|
}
|
|
@@ -646,7 +705,7 @@ export class MintMarketTemplate {
|
|
|
646
705
|
return await this.llamalend.multicallProvider.all(calls) as bigint[];
|
|
647
706
|
}
|
|
648
707
|
|
|
649
|
-
|
|
708
|
+
public async _getPrices(_n2: bigint, _n1: bigint): Promise<string[]> {
|
|
650
709
|
const contract = this.llamalend.contracts[this.address].multicallContract;
|
|
651
710
|
return (await this.llamalend.multicallProvider.all([
|
|
652
711
|
contract.p_oracle_down(_n2),
|
|
@@ -654,7 +713,7 @@ export class MintMarketTemplate {
|
|
|
654
713
|
]) as bigint[]).map((_p) => formatUnits(_p));
|
|
655
714
|
}
|
|
656
715
|
|
|
657
|
-
|
|
716
|
+
public async _calcPrices(_n2: bigint, _n1: bigint): Promise<[string, string]> {
|
|
658
717
|
return [await this.calcTickPrice(Number(_n2) + 1), await this.calcTickPrice(Number(_n1))];
|
|
659
718
|
}
|
|
660
719
|
|
|
@@ -1786,4 +1845,8 @@ export class MintMarketTemplate {
|
|
|
1786
1845
|
this._checkDeleverageZap();
|
|
1787
1846
|
return await this._deleverageRepay(collateral, slippage, false) as string;
|
|
1788
1847
|
}
|
|
1848
|
+
|
|
1849
|
+
public getLlamalend(): Llamalend {
|
|
1850
|
+
return this.llamalend;
|
|
1851
|
+
}
|
|
1789
1852
|
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import {IDict, TAmount, TGas} from "../../interfaces";
|
|
2
|
+
|
|
3
|
+
export interface ILeverageV2 {
|
|
4
|
+
hasLeverage: () => boolean,
|
|
5
|
+
|
|
6
|
+
maxLeverage: (N: number) => Promise<string>,
|
|
7
|
+
|
|
8
|
+
createLoanMaxRecv: (userCollateral: TAmount, userBorrowed: TAmount, range: number) =>
|
|
9
|
+
Promise<{
|
|
10
|
+
maxDebt: string,
|
|
11
|
+
maxTotalCollateral: string,
|
|
12
|
+
userCollateral: string,
|
|
13
|
+
collateralFromUserBorrowed: string,
|
|
14
|
+
collateralFromMaxDebt: string,
|
|
15
|
+
maxLeverage: string,
|
|
16
|
+
avgPrice: string,
|
|
17
|
+
}>,
|
|
18
|
+
createLoanMaxRecvAllRanges: (userCollateral: TAmount, userBorrowed: TAmount) =>
|
|
19
|
+
Promise<IDict<{
|
|
20
|
+
maxDebt: string,
|
|
21
|
+
maxTotalCollateral: string,
|
|
22
|
+
userCollateral: string,
|
|
23
|
+
collateralFromUserBorrowed: string,
|
|
24
|
+
collateralFromMaxDebt: string,
|
|
25
|
+
maxLeverage: string,
|
|
26
|
+
avgPrice: string,
|
|
27
|
+
}>>,
|
|
28
|
+
createLoanExpectedCollateral: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, slippage?: number) =>
|
|
29
|
+
Promise<{
|
|
30
|
+
totalCollateral: string,
|
|
31
|
+
userCollateral: string,
|
|
32
|
+
collateralFromUserBorrowed: string,
|
|
33
|
+
collateralFromDebt: string,
|
|
34
|
+
leverage: string,
|
|
35
|
+
avgPrice: string
|
|
36
|
+
}>,
|
|
37
|
+
createLoanPriceImpact: (userBorrowed: TAmount, debt: TAmount) => Promise<string>,
|
|
38
|
+
createLoanMaxRange: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount) => Promise<number>,
|
|
39
|
+
createLoanBands: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, range: number) => Promise<[number, number]>,
|
|
40
|
+
createLoanBandsAllRanges: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount) => Promise<IDict<[number, number] | null>>,
|
|
41
|
+
createLoanPrices: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, range: number) => Promise<string[]>,
|
|
42
|
+
createLoanPricesAllRanges: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount) => Promise<IDict<[string, string] | null>>,
|
|
43
|
+
createLoanHealth: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, range: number, full?: boolean) => Promise<string>,
|
|
44
|
+
createLoanIsApproved: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<boolean>,
|
|
45
|
+
createLoanApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<string[]>,
|
|
46
|
+
createLoanRouteImage: (userBorrowed: TAmount, debt: TAmount) => Promise<string>,
|
|
47
|
+
createLoan: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, range: number, slippage?: number) => Promise<string>,
|
|
48
|
+
|
|
49
|
+
borrowMoreMaxRecv: (userCollateral: TAmount, userBorrowed: TAmount, address?: string) =>
|
|
50
|
+
Promise<{
|
|
51
|
+
maxDebt: string,
|
|
52
|
+
maxTotalCollateral: string,
|
|
53
|
+
userCollateral: string,
|
|
54
|
+
collateralFromUserBorrowed: string,
|
|
55
|
+
collateralFromMaxDebt: string,
|
|
56
|
+
avgPrice: string,
|
|
57
|
+
}>,
|
|
58
|
+
borrowMoreExpectedCollateral: (userCollateral: TAmount, userBorrowed: TAmount, dDebt: TAmount, slippage?: number, address?: string) =>
|
|
59
|
+
Promise<{
|
|
60
|
+
totalCollateral: string,
|
|
61
|
+
userCollateral: string,
|
|
62
|
+
collateralFromUserBorrowed: string,
|
|
63
|
+
collateralFromDebt: string,
|
|
64
|
+
avgPrice: string
|
|
65
|
+
}>,
|
|
66
|
+
borrowMorePriceImpact: (userBorrowed: TAmount, dDebt: TAmount, address?: string) => Promise<string>,
|
|
67
|
+
borrowMoreBands: (userCollateral: TAmount, userBorrowed: TAmount, dDebt: TAmount, address?: string) => Promise<[number, number]>,
|
|
68
|
+
borrowMorePrices: (userCollateral: TAmount, userBorrowed: TAmount, dDebt: TAmount, address?: string) => Promise<string[]>,
|
|
69
|
+
borrowMoreHealth: (userCollateral: TAmount, userBorrowed: TAmount, dDebt: TAmount, full?: boolean, address?: string) => Promise<string>,
|
|
70
|
+
borrowMoreIsApproved: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<boolean>,
|
|
71
|
+
borrowMoreApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<string[]>,
|
|
72
|
+
borrowMoreRouteImage: (userBorrowed: TAmount, debt: TAmount) => Promise<string>,
|
|
73
|
+
borrowMore: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, slippage?: number) => Promise<string>,
|
|
74
|
+
|
|
75
|
+
repayExpectedBorrowed: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) =>
|
|
76
|
+
Promise<{
|
|
77
|
+
totalBorrowed: string,
|
|
78
|
+
borrowedFromStateCollateral: string,
|
|
79
|
+
borrowedFromUserCollateral: string,
|
|
80
|
+
userBorrowed: string,
|
|
81
|
+
avgPrice: string
|
|
82
|
+
}>,
|
|
83
|
+
repayPriceImpact: (stateCollateral: TAmount, userCollateral: TAmount) => Promise<string>,
|
|
84
|
+
repayIsFull: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, address?: string) => Promise<boolean>,
|
|
85
|
+
repayIsAvailable: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, address?: string) => Promise<boolean>,
|
|
86
|
+
repayBands: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, address?: string) => Promise<[number, number]>,
|
|
87
|
+
repayPrices: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, address?: string) => Promise<string[]>,
|
|
88
|
+
repayHealth: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, full?: boolean, address?: string) => Promise<string>,
|
|
89
|
+
repayIsApproved: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<boolean>,
|
|
90
|
+
repayApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<string[]>,
|
|
91
|
+
repayRouteImage: (stateCollateral: TAmount, userCollateral: TAmount) => Promise<string>,
|
|
92
|
+
repay: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) => Promise<string>,
|
|
93
|
+
|
|
94
|
+
estimateGas: {
|
|
95
|
+
createLoanApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<TGas>,
|
|
96
|
+
createLoan: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, range: number, slippage?: number) => Promise<number>,
|
|
97
|
+
|
|
98
|
+
borrowMoreApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<TGas>,
|
|
99
|
+
borrowMore: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, slippage?: number) => Promise<number>,
|
|
100
|
+
|
|
101
|
+
repayApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<TGas>,
|
|
102
|
+
repay: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) => Promise<number>,
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { LeverageV2Module } from './leverageV2.js';
|