@curvefi/llamalend-api 1.0.42 → 1.1.1
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/README.md +451 -1
- package/lib/constants/aliases.js +15 -0
- package/lib/external-api.js +1 -1
- package/lib/interfaces.d.ts +11 -0
- package/lib/lendMarkets/LendMarketTemplate.d.ts +6 -3
- package/lib/lendMarkets/LendMarketTemplate.js +40 -1
- package/lib/lendMarkets/interfaces/leverageZapV2.d.ts +223 -0
- package/lib/lendMarkets/interfaces/leverageZapV2.js +1 -0
- package/lib/lendMarkets/modules/index.d.ts +1 -0
- package/lib/lendMarkets/modules/index.js +1 -0
- package/lib/lendMarkets/modules/leverageZapV2.d.ts +253 -0
- package/lib/lendMarkets/modules/leverageZapV2.js +681 -0
- package/lib/llamalend.js +1 -0
- package/lib/utils.d.ts +1 -0
- package/lib/utils.js +5 -0
- package/package.json +2 -1
- package/src/cache/index.ts +1 -1
- package/src/constants/aliases.ts +15 -0
- package/src/external-api.ts +5 -5
- package/src/interfaces.ts +19 -0
- package/src/lendMarkets/LendMarketTemplate.ts +81 -32
- package/src/lendMarkets/interfaces/leverageZapV2.ts +282 -0
- package/src/lendMarkets/modules/index.ts +1 -0
- package/src/lendMarkets/modules/leverageZapV2.ts +991 -0
- package/src/llamalend.ts +1 -0
- package/src/utils.ts +12 -1
package/lib/llamalend.js
CHANGED
|
@@ -488,6 +488,7 @@ class Llamalend {
|
|
|
488
488
|
this.setContract(this.constants.ALIASES['one_way_factory'], OneWayLendingFactoryABI);
|
|
489
489
|
this.setContract(this.constants.ALIASES['gauge_controller'], GaugeControllerABI);
|
|
490
490
|
this.setContract(this.constants.ALIASES['leverage_zap'], LeverageZapABI);
|
|
491
|
+
this.setContract(this.constants.ALIASES['leverage_zap_v2'], LeverageZapABI);
|
|
491
492
|
if (this.chainId === 1) {
|
|
492
493
|
this.setContract(this.constants.ALIASES.minter, MinterABI);
|
|
493
494
|
this.setContract(this.constants.ALIASES.gauge_factory, GaugeFactoryMainnetABI);
|
package/lib/utils.d.ts
CHANGED
|
@@ -58,3 +58,4 @@ export declare const getLsdApy: ((name: "wstETH" | "sfrxETH") => Promise<{
|
|
|
58
58
|
apyMean30d: number;
|
|
59
59
|
}>>;
|
|
60
60
|
export declare const calculateFutureLeverage: (currentCollateral: number | string, totalDepositFromUser: number | string, collateral: number | string, operation: "add" | "remove") => string;
|
|
61
|
+
export declare const buildCalldataForLeverageZapV2: (routerAddress: string, exchangeCalldata: string) => string;
|
package/lib/utils.js
CHANGED
|
@@ -474,3 +474,8 @@ export const calculateFutureLeverage = (currentCollateral, totalDepositFromUser,
|
|
|
474
474
|
return currentCollateralBN.minus(collateralBN).div(totalDepositBN.minus(collateralBN)).toString();
|
|
475
475
|
}
|
|
476
476
|
};
|
|
477
|
+
export const buildCalldataForLeverageZapV2 = (routerAddress, exchangeCalldata) => {
|
|
478
|
+
const cleanCalldata = exchangeCalldata.startsWith('0x') ? exchangeCalldata.slice(2) : exchangeCalldata;
|
|
479
|
+
const abiCoder = ethers.AbiCoder.defaultAbiCoder();
|
|
480
|
+
return abiCoder.encode(['address', 'bytes'], [routerAddress, '0x' + cleanCalldata]);
|
|
481
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@curvefi/llamalend-api",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "JavaScript library for Curve Lending",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"author": "Macket",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"scripts": {
|
|
17
17
|
"build": "rm -rf lib && tsc --project tsconfig.build.json",
|
|
18
18
|
"lint": "eslint src --ext .ts",
|
|
19
|
+
"lint:fix": "eslint src --ext .ts --fix",
|
|
19
20
|
"watch": "tsc --watch",
|
|
20
21
|
"watch:lib": "rm -rf lib && tsc --watch --project tsconfig.build.json"
|
|
21
22
|
},
|
package/src/cache/index.ts
CHANGED
package/src/constants/aliases.ts
CHANGED
|
@@ -9,6 +9,7 @@ export const ALIASES_ETHEREUM = lowerCaseValues({
|
|
|
9
9
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
10
10
|
// "leverage_zap": "0x3294514B78Df4Bb90132567fcf8E5e99f390B687", // 1inch
|
|
11
11
|
"leverage_zap": "0xC5898606BdB494a994578453B92e7910a90aA873", // odos
|
|
12
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
12
13
|
"leverage_markets_start_id": "9",
|
|
13
14
|
"crvUSD": "0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E",
|
|
14
15
|
"st_crvUSD": "0x0655977FEb2f289A4aB78af67BAB0d17aAb84367",
|
|
@@ -20,6 +21,7 @@ export const ALIASES_POLYGON = lowerCaseValues({
|
|
|
20
21
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
21
22
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
22
23
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
24
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
23
25
|
});
|
|
24
26
|
|
|
25
27
|
export const ALIASES_FANTOM = lowerCaseValues({
|
|
@@ -28,6 +30,7 @@ export const ALIASES_FANTOM = lowerCaseValues({
|
|
|
28
30
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
29
31
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
30
32
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
33
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
31
34
|
});
|
|
32
35
|
|
|
33
36
|
export const ALIASES_AVALANCHE = lowerCaseValues({
|
|
@@ -36,6 +39,7 @@ export const ALIASES_AVALANCHE = lowerCaseValues({
|
|
|
36
39
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
37
40
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
38
41
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
42
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
39
43
|
});
|
|
40
44
|
|
|
41
45
|
export const ALIASES_ARBITRUM = lowerCaseValues({
|
|
@@ -45,6 +49,7 @@ export const ALIASES_ARBITRUM = lowerCaseValues({
|
|
|
45
49
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
46
50
|
// "leverage_zap": "0x61C404B60ee9c5fB09F70F9A645DD38fE5b3A956", // 1inch
|
|
47
51
|
"leverage_zap": "0xb7b240CFa985306563A301bC417Bc9715059a117", // odos
|
|
52
|
+
"leverage_zap_v2": "0x5b07Db9a85992c877b9fBeA6DCC4F79292577640",
|
|
48
53
|
"leverage_markets_start_id": "9",
|
|
49
54
|
});
|
|
50
55
|
|
|
@@ -55,6 +60,7 @@ export const ALIASES_OPTIMISM = lowerCaseValues({
|
|
|
55
60
|
"gauge_factory_old": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
56
61
|
"gauge_factory": "0x871fBD4E01012e2E8457346059e8C189d664DbA4",
|
|
57
62
|
"leverage_zap": "0x273e44B9a1841857d9360e8792bB59f9e1FfE9Da",
|
|
63
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
58
64
|
"leverage_markets_start_id": "0",
|
|
59
65
|
"gas_oracle": '0xc0d3C0d3C0d3c0D3C0D3C0d3C0d3C0D3C0D3000f',
|
|
60
66
|
"gas_oracle_blob": '0x420000000000000000000000000000000000000f',
|
|
@@ -66,6 +72,7 @@ export const ALIASES_XDAI = lowerCaseValues({
|
|
|
66
72
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
67
73
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
68
74
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
75
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
69
76
|
});
|
|
70
77
|
|
|
71
78
|
export const ALIASES_MOONBEAM = lowerCaseValues({
|
|
@@ -74,6 +81,7 @@ export const ALIASES_MOONBEAM = lowerCaseValues({
|
|
|
74
81
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
75
82
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
76
83
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
84
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
77
85
|
});
|
|
78
86
|
|
|
79
87
|
export const ALIASES_AURORA = lowerCaseValues({
|
|
@@ -89,6 +97,7 @@ export const ALIASES_KAVA = lowerCaseValues({
|
|
|
89
97
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
90
98
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
91
99
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
100
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
92
101
|
});
|
|
93
102
|
|
|
94
103
|
export const ALIASES_CELO = lowerCaseValues({
|
|
@@ -97,6 +106,7 @@ export const ALIASES_CELO = lowerCaseValues({
|
|
|
97
106
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
98
107
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
99
108
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
109
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
100
110
|
});
|
|
101
111
|
|
|
102
112
|
export const ALIASES_ZKSYNC = lowerCaseValues({
|
|
@@ -105,6 +115,7 @@ export const ALIASES_ZKSYNC = lowerCaseValues({
|
|
|
105
115
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB", // <--- TODO CHANGE
|
|
106
116
|
"gauge_factory": "0x0000000000000000000000000000000000000000",
|
|
107
117
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
118
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
108
119
|
});
|
|
109
120
|
|
|
110
121
|
export const ALIASES_BASE = lowerCaseValues({
|
|
@@ -113,6 +124,7 @@ export const ALIASES_BASE = lowerCaseValues({
|
|
|
113
124
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB", // <--- TODO CHANGE
|
|
114
125
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
115
126
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
127
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
116
128
|
});
|
|
117
129
|
|
|
118
130
|
export const ALIASES_BSC = lowerCaseValues({
|
|
@@ -121,6 +133,7 @@ export const ALIASES_BSC = lowerCaseValues({
|
|
|
121
133
|
"gauge_controller": "0x0000000000000000000000000000000000000000", // <--- TODO CHANGE
|
|
122
134
|
"gauge_factory": "0xabC000d88f23Bb45525E447528DBF656A9D55bf5",
|
|
123
135
|
"leverage_zap": "0x0000000000000000000000000000000000000000",
|
|
136
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
124
137
|
});
|
|
125
138
|
|
|
126
139
|
export const ALIASES_FRAXTAL = lowerCaseValues({
|
|
@@ -130,6 +143,7 @@ export const ALIASES_FRAXTAL = lowerCaseValues({
|
|
|
130
143
|
"gauge_factory_old": "0xeF672bD94913CB6f1d2812a6e18c1fFdEd8eFf5c",
|
|
131
144
|
"gauge_factory": "0x0b8d6b6cefc7aa1c2852442e518443b1b22e1c52",
|
|
132
145
|
"leverage_zap": "0x37c5ab57AF7100Bdc9B668d766e193CCbF6614FD", // odos
|
|
146
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
133
147
|
"leverage_markets_start_id": "0",
|
|
134
148
|
});
|
|
135
149
|
|
|
@@ -139,5 +153,6 @@ export const ALIASES_SONIC = lowerCaseValues({
|
|
|
139
153
|
"gauge_controller": "0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB",
|
|
140
154
|
"gauge_factory": "0xf3A431008396df8A8b2DF492C913706BDB0874ef",
|
|
141
155
|
"leverage_zap": "0x5552b631e2aD801fAa129Aacf4B701071cC9D1f7", // odos
|
|
156
|
+
"leverage_zap_v2": "0x0000000000000000000000000000000000000000",
|
|
142
157
|
"leverage_markets_start_id": "0",
|
|
143
158
|
});
|
package/src/external-api.ts
CHANGED
|
@@ -118,9 +118,9 @@ export const _getUserCollateral = memoize(
|
|
|
118
118
|
)
|
|
119
119
|
|
|
120
120
|
export const _getUserCollateralForce = async (
|
|
121
|
-
network: INetworkName,
|
|
122
|
-
controller: string,
|
|
123
|
-
user: string,
|
|
121
|
+
network: INetworkName,
|
|
122
|
+
controller: string,
|
|
123
|
+
user: string,
|
|
124
124
|
newTx: string
|
|
125
125
|
): Promise<void> => {
|
|
126
126
|
await fetch(`https://prices.curve.finance/v1/lending/collateral_events/${network}/${controller}/${user}?new_tx=${newTx}`);
|
|
@@ -177,7 +177,7 @@ export async function _getQuoteOdos(this: Llamalend, fromToken: string, toToken:
|
|
|
177
177
|
if (ethers.getAddress(fromToken) == "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE") fromToken = "0x0000000000000000000000000000000000000000";
|
|
178
178
|
if (ethers.getAddress(toToken) == "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE") toToken = "0x0000000000000000000000000000000000000000";
|
|
179
179
|
|
|
180
|
-
const url = `https://prices.curve.finance/odos/quote?chain_id=${this.chainId}&from_address=${ethers.getAddress(fromToken)}` +
|
|
180
|
+
const url = `https://prices.curve.finance/odos/v3/quote?chain_id=${this.chainId}&from_address=${ethers.getAddress(fromToken)}` +
|
|
181
181
|
`&to_address=${ethers.getAddress(toToken)}&amount=${_amount.toString()}&slippage=${slippage}&pathVizImage=${pathVizImage}` +
|
|
182
182
|
`&caller_address=${ethers.getAddress(this.constants.ALIASES.leverage_zap)}&blacklist=${ethers.getAddress(blacklist)}`;
|
|
183
183
|
|
|
@@ -234,4 +234,4 @@ async function fetchJson(url: string): Promise<any> {
|
|
|
234
234
|
async function fetchData(url: string) {
|
|
235
235
|
const {data} = await fetchJson(url);
|
|
236
236
|
return data;
|
|
237
|
-
}
|
|
237
|
+
}
|
package/src/interfaces.ts
CHANGED
|
@@ -230,3 +230,22 @@ export interface ILlamma {
|
|
|
230
230
|
export interface IResponseApi {
|
|
231
231
|
data: any
|
|
232
232
|
}
|
|
233
|
+
|
|
234
|
+
export interface IQuote {
|
|
235
|
+
outAmount: string,
|
|
236
|
+
priceImpact: number
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export interface ILeverageMetrics {
|
|
240
|
+
priceImpact: number,
|
|
241
|
+
bands: [number, number],
|
|
242
|
+
prices: string[],
|
|
243
|
+
health: string,
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export type GetExpectedFn = (
|
|
247
|
+
fromToken: string,
|
|
248
|
+
toToken: string,
|
|
249
|
+
amountIn: bigint,
|
|
250
|
+
blacklist: string | string[],
|
|
251
|
+
) => Promise<IQuote>;
|
|
@@ -27,6 +27,8 @@ import {IDict, TGas, TAmount, IReward, IQuoteOdos, IOneWayMarket, IPartialFrac}
|
|
|
27
27
|
import { _getExpectedOdos, _getQuoteOdos, _assembleTxOdos, _getUserCollateral, _getUserCollateralForce, _getMarketsData } from "../external-api.js";
|
|
28
28
|
import ERC20Abi from '../constants/abis/ERC20.json' with {type: 'json'};
|
|
29
29
|
import {cacheKey, cacheStats} from "../cache/index.js";
|
|
30
|
+
import {ILeverageZapV2} from "./interfaces/leverageZapV2.js";
|
|
31
|
+
import {LeverageZapV2Module} from "./modules/leverageZapV2.js";
|
|
30
32
|
|
|
31
33
|
|
|
32
34
|
const DAY = 86400;
|
|
@@ -237,6 +239,7 @@ export class LendMarketTemplate {
|
|
|
237
239
|
repay: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) => Promise<number>,
|
|
238
240
|
}
|
|
239
241
|
};
|
|
242
|
+
leverageZapV2: ILeverageZapV2;
|
|
240
243
|
|
|
241
244
|
constructor(id: string, marketData: IOneWayMarket, llamalend: Llamalend) {
|
|
242
245
|
this.llamalend = llamalend;
|
|
@@ -387,6 +390,51 @@ export class LendMarketTemplate {
|
|
|
387
390
|
},
|
|
388
391
|
}
|
|
389
392
|
|
|
393
|
+
const leverageZapV2 = new LeverageZapV2Module(this);
|
|
394
|
+
|
|
395
|
+
this.leverageZapV2 = {
|
|
396
|
+
hasLeverage: leverageZapV2.hasLeverage.bind(leverageZapV2),
|
|
397
|
+
|
|
398
|
+
maxLeverage: leverageZapV2.maxLeverage.bind(leverageZapV2),
|
|
399
|
+
|
|
400
|
+
createLoanMaxRecv: leverageZapV2.leverageCreateLoanMaxRecv.bind(leverageZapV2),
|
|
401
|
+
createLoanMaxRecvAllRanges: leverageZapV2.leverageCreateLoanMaxRecvAllRanges.bind(leverageZapV2),
|
|
402
|
+
createLoanExpectedCollateral: leverageZapV2.leverageCreateLoanExpectedCollateral.bind(leverageZapV2),
|
|
403
|
+
createLoanMaxRange: leverageZapV2.leverageCreateLoanMaxRange.bind(leverageZapV2),
|
|
404
|
+
createLoanBandsAllRanges: leverageZapV2.leverageCreateLoanBandsAllRanges.bind(leverageZapV2),
|
|
405
|
+
createLoanPricesAllRanges: leverageZapV2.leverageCreateLoanPricesAllRanges.bind(leverageZapV2),
|
|
406
|
+
createLoanIsApproved: leverageZapV2.leverageCreateLoanIsApproved.bind(leverageZapV2),
|
|
407
|
+
createLoanApprove: leverageZapV2.leverageCreateLoanApprove.bind(leverageZapV2),
|
|
408
|
+
createLoanExpectedMetrics: leverageZapV2.leverageCreateLoanExpectedMetrics.bind(leverageZapV2),
|
|
409
|
+
createLoan: leverageZapV2.leverageCreateLoan.bind(leverageZapV2),
|
|
410
|
+
|
|
411
|
+
borrowMoreMaxRecv: leverageZapV2.leverageBorrowMoreMaxRecv.bind(leverageZapV2),
|
|
412
|
+
borrowMoreExpectedCollateral: leverageZapV2.leverageBorrowMoreExpectedCollateral.bind(leverageZapV2),
|
|
413
|
+
borrowMoreIsApproved: leverageZapV2.leverageCreateLoanIsApproved.bind(leverageZapV2),
|
|
414
|
+
borrowMoreApprove: leverageZapV2.leverageCreateLoanApprove.bind(leverageZapV2),
|
|
415
|
+
borrowMoreExpectedMetrics: leverageZapV2.leverageBorrowMoreExpectedMetrics.bind(leverageZapV2),
|
|
416
|
+
borrowMore: leverageZapV2.leverageBorrowMore.bind(leverageZapV2),
|
|
417
|
+
|
|
418
|
+
repayExpectedBorrowed: leverageZapV2.leverageRepayExpectedBorrowed.bind(leverageZapV2),
|
|
419
|
+
repayIsFull: leverageZapV2.leverageRepayIsFull.bind(leverageZapV2),
|
|
420
|
+
repayIsAvailable: leverageZapV2.leverageRepayIsAvailable.bind(leverageZapV2),
|
|
421
|
+
repayExpectedMetrics: leverageZapV2.leverageRepayExpectedMetrics.bind(leverageZapV2),
|
|
422
|
+
repayIsApproved: leverageZapV2.leverageRepayIsApproved.bind(leverageZapV2),
|
|
423
|
+
repayApprove: leverageZapV2.leverageRepayApprove.bind(leverageZapV2),
|
|
424
|
+
repay: leverageZapV2.leverageRepay.bind(leverageZapV2),
|
|
425
|
+
|
|
426
|
+
estimateGas: {
|
|
427
|
+
createLoanApprove: leverageZapV2.leverageCreateLoanApproveEstimateGas.bind(leverageZapV2),
|
|
428
|
+
createLoan: leverageZapV2.leverageCreateLoanEstimateGas.bind(leverageZapV2),
|
|
429
|
+
|
|
430
|
+
borrowMoreApprove: leverageZapV2.leverageCreateLoanApproveEstimateGas.bind(leverageZapV2),
|
|
431
|
+
borrowMore: leverageZapV2.leverageBorrowMoreEstimateGas.bind(leverageZapV2),
|
|
432
|
+
|
|
433
|
+
repayApprove: leverageZapV2.leverageRepayApproveEstimateGas.bind(leverageZapV2),
|
|
434
|
+
repay: leverageZapV2.leverageRepayEstimateGas.bind(leverageZapV2),
|
|
435
|
+
},
|
|
436
|
+
}
|
|
437
|
+
|
|
390
438
|
}
|
|
391
439
|
|
|
392
440
|
private _getMarketId = (): number => Number(this.id.split("-").slice(-1)[0]);
|
|
@@ -807,8 +855,7 @@ export class LendMarketTemplate {
|
|
|
807
855
|
}
|
|
808
856
|
|
|
809
857
|
return tokens.map((token, i) => ({ token, symbol: tokenInfo[i * 2] as string, decimals: Number(tokenInfo[(i * 2) + 1]) }));
|
|
810
|
-
},
|
|
811
|
-
{
|
|
858
|
+
}, {
|
|
812
859
|
promise: true,
|
|
813
860
|
maxAge: 30 * 60 * 1000, // 30m
|
|
814
861
|
});
|
|
@@ -942,8 +989,7 @@ export class LendMarketTemplate {
|
|
|
942
989
|
.map((_x) => formatUnits(_x * BigInt(100)));
|
|
943
990
|
|
|
944
991
|
return { fee, admin_fee, liquidation_discount, loan_discount, base_price, A }
|
|
945
|
-
},
|
|
946
|
-
{
|
|
992
|
+
}, {
|
|
947
993
|
promise: true,
|
|
948
994
|
maxAge: 5 * 60 * 1000, // 5m
|
|
949
995
|
});
|
|
@@ -1404,7 +1450,7 @@ export class LendMarketTemplate {
|
|
|
1404
1450
|
|
|
1405
1451
|
// ---------------- CREATE LOAN ----------------
|
|
1406
1452
|
|
|
1407
|
-
|
|
1453
|
+
public _checkRange(range: number): void {
|
|
1408
1454
|
if (range < this.minBands) throw Error(`range must be >= ${this.minBands}`);
|
|
1409
1455
|
if (range > this.maxBands) throw Error(`range must be <= ${this.maxBands}`);
|
|
1410
1456
|
}
|
|
@@ -1460,7 +1506,7 @@ export class LendMarketTemplate {
|
|
|
1460
1506
|
return await this.llamalend.multicallProvider.all(calls) as bigint[];
|
|
1461
1507
|
}
|
|
1462
1508
|
|
|
1463
|
-
|
|
1509
|
+
public async _getPrices(_n2: bigint, _n1: bigint): Promise<string[]> {
|
|
1464
1510
|
const contract = this.llamalend.contracts[this.addresses.amm].multicallContract;
|
|
1465
1511
|
return (await this.llamalend.multicallProvider.all([
|
|
1466
1512
|
contract.p_oracle_down(_n2),
|
|
@@ -1468,7 +1514,7 @@ export class LendMarketTemplate {
|
|
|
1468
1514
|
]) as bigint[]).map((_p) => formatUnits(_p));
|
|
1469
1515
|
}
|
|
1470
1516
|
|
|
1471
|
-
|
|
1517
|
+
public async _calcPrices(_n2: bigint, _n1: bigint): Promise<[string, string]> {
|
|
1472
1518
|
return [await this.calcTickPrice(Number(_n2) + 1), await this.calcTickPrice(Number(_n1))];
|
|
1473
1519
|
}
|
|
1474
1520
|
|
|
@@ -2078,13 +2124,13 @@ export class LendMarketTemplate {
|
|
|
2078
2124
|
public async calcPartialFrac(amount: TAmount, address = ""): Promise<IPartialFrac> {
|
|
2079
2125
|
address = _getAddress.call(this.llamalend, address);
|
|
2080
2126
|
const tokensToLiquidate = await this.tokensToLiquidate(address);
|
|
2081
|
-
|
|
2127
|
+
|
|
2082
2128
|
const amountBN = BN(amount);
|
|
2083
2129
|
const tokensToLiquidateBN = BN(tokensToLiquidate);
|
|
2084
|
-
|
|
2130
|
+
|
|
2085
2131
|
if (amountBN.gt(tokensToLiquidateBN)) throw Error("Amount cannot be greater than total tokens to liquidate");
|
|
2086
2132
|
if (amountBN.lte(0)) throw Error("Amount must be greater than 0");
|
|
2087
|
-
|
|
2133
|
+
|
|
2088
2134
|
// Calculate frac = amount / tokensToLiquidate * 10**18
|
|
2089
2135
|
// 100% = 10**18
|
|
2090
2136
|
const fracDecimalBN = amountBN.div(tokensToLiquidateBN);
|
|
@@ -2136,33 +2182,33 @@ export class LendMarketTemplate {
|
|
|
2136
2182
|
if (slippage > 100) throw Error("Slippage must be <= 100");
|
|
2137
2183
|
if (Number(currentDebt) === 0) throw Error(`Loan for ${address} does not exist`);
|
|
2138
2184
|
if (Number(borrowed) === 0) throw Error(`User ${address} is not in liquidation mode`);
|
|
2139
|
-
|
|
2185
|
+
|
|
2140
2186
|
const frac = partialFrac.frac;
|
|
2141
2187
|
const fracBN = BN(partialFrac.fracDecimal);
|
|
2142
|
-
|
|
2188
|
+
|
|
2143
2189
|
const borrowedBN = BN(borrowed);
|
|
2144
2190
|
const expectedBorrowedBN = borrowedBN.times(fracBN);
|
|
2145
2191
|
const minAmountBN = expectedBorrowedBN.times(100 - slippage).div(100);
|
|
2146
2192
|
const _minAmount = fromBN(minAmountBN);
|
|
2147
|
-
|
|
2193
|
+
|
|
2148
2194
|
const contract = this.llamalend.contracts[this.addresses.controller].contract;
|
|
2149
2195
|
const gas = (await contract.liquidate_extended.estimateGas(
|
|
2150
|
-
address,
|
|
2151
|
-
_minAmount,
|
|
2152
|
-
frac,
|
|
2196
|
+
address,
|
|
2197
|
+
_minAmount,
|
|
2198
|
+
frac,
|
|
2153
2199
|
this.llamalend.constants.ZERO_ADDRESS,
|
|
2154
2200
|
[],
|
|
2155
2201
|
this.llamalend.constantOptions
|
|
2156
2202
|
));
|
|
2157
|
-
|
|
2203
|
+
|
|
2158
2204
|
if (estimateGas) return smartNumber(gas);
|
|
2159
2205
|
|
|
2160
2206
|
await this.llamalend.updateFeeData();
|
|
2161
2207
|
const gasLimit = _mulBy1_3(DIGas(gas));
|
|
2162
2208
|
return (await contract.liquidate_extended(
|
|
2163
|
-
address,
|
|
2164
|
-
_minAmount,
|
|
2165
|
-
frac,
|
|
2209
|
+
address,
|
|
2210
|
+
_minAmount,
|
|
2211
|
+
frac,
|
|
2166
2212
|
this.llamalend.constants.ZERO_ADDRESS,
|
|
2167
2213
|
[],
|
|
2168
2214
|
{ ...this.llamalend.options, gasLimit }
|
|
@@ -2376,14 +2422,14 @@ export class LendMarketTemplate {
|
|
|
2376
2422
|
const userEffectiveCollateralBN = BN(userCollateral).plus(BN(userBorrowed).div(pAvgBN as BigNumber));
|
|
2377
2423
|
|
|
2378
2424
|
const res: IDict<{
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2425
|
+
maxDebt: string,
|
|
2426
|
+
maxTotalCollateral: string,
|
|
2427
|
+
userCollateral: string,
|
|
2428
|
+
collateralFromUserBorrowed: string,
|
|
2429
|
+
collateralFromMaxDebt: string,
|
|
2430
|
+
maxLeverage: string,
|
|
2431
|
+
avgPrice: string,
|
|
2432
|
+
}> = {};
|
|
2387
2433
|
for (let N = this.minBands; N <= this.maxBands; N++) {
|
|
2388
2434
|
const j = N - this.minBands;
|
|
2389
2435
|
res[N] = {
|
|
@@ -2783,7 +2829,7 @@ export class LendMarketTemplate {
|
|
|
2783
2829
|
const _userBorrowed = parseUnits(userBorrowed, this.borrowed_token.decimals);
|
|
2784
2830
|
await this._setSwapDataToCache(this.addresses.borrowed_token, this.addresses.collateral_token, _dDebt + _userBorrowed, slippage);
|
|
2785
2831
|
const { _totalCollateral, _userCollateral, _collateralFromUserBorrowed, _collateralFromDebt, avgPrice } =
|
|
2786
|
-
|
|
2832
|
+
await this._leverageExpectedCollateral(userCollateral, userBorrowed, dDebt, address);
|
|
2787
2833
|
return {
|
|
2788
2834
|
totalCollateral: formatUnits(_totalCollateral, this.collateral_token.decimals),
|
|
2789
2835
|
userCollateral: formatUnits(_userCollateral, this.collateral_token.decimals),
|
|
@@ -3072,7 +3118,6 @@ export class LendMarketTemplate {
|
|
|
3072
3118
|
calldata = await _assembleTxOdos.call(this.llamalend, swapData.pathId as string);
|
|
3073
3119
|
}
|
|
3074
3120
|
|
|
3075
|
-
console.log('params', [0, parseUnits(this._getMarketId(), 0), _userCollateral, _userBorrowed], calldata)
|
|
3076
3121
|
const contract = this.llamalend.contracts[this.addresses.controller].contract;
|
|
3077
3122
|
const gas = await contract.repay_extended.estimateGas(
|
|
3078
3123
|
this.llamalend.constants.ALIASES.leverage_zap,
|
|
@@ -3189,7 +3234,7 @@ export class LendMarketTemplate {
|
|
|
3189
3234
|
public async forceUpdateUserState(newTx: string, userAddress?: string): Promise<void> {
|
|
3190
3235
|
const address = userAddress || this.llamalend.signerAddress;
|
|
3191
3236
|
if (!address) throw Error("Need to connect wallet or pass address into args");
|
|
3192
|
-
|
|
3237
|
+
|
|
3193
3238
|
await _getUserCollateralForce(
|
|
3194
3239
|
this.llamalend.constants.NETWORK_NAME,
|
|
3195
3240
|
this.addresses.controller,
|
|
@@ -3197,4 +3242,8 @@ export class LendMarketTemplate {
|
|
|
3197
3242
|
newTx
|
|
3198
3243
|
);
|
|
3199
3244
|
}
|
|
3200
|
-
|
|
3245
|
+
|
|
3246
|
+
public getLlamalend(): Llamalend {
|
|
3247
|
+
return this.llamalend;
|
|
3248
|
+
}
|
|
3249
|
+
}
|