@curvefi/llamalend-api 2.0.2 → 2.0.3
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/lib/constants/abis/ControllerV2.json +1891 -0
- package/lib/index.d.ts +2 -2
- package/lib/lendMarkets/LendMarketTemplate.d.ts +9 -5
- package/lib/lendMarkets/LendMarketTemplate.js +1 -1
- package/lib/lendMarkets/fetch/fetchLendMarkets.js +6 -1
- package/lib/lendMarkets/interfaces/v2/loanV2.d.ts +1 -1
- package/lib/lendMarkets/lendMarketConstructor.d.ts +1 -1
- package/lib/lendMarkets/lendMarketConstructor.js +6 -1
- package/lib/lendMarkets/modules/common/loanBase.d.ts +0 -1
- package/lib/lendMarkets/modules/common/loanBase.js +8 -23
- package/lib/lendMarkets/modules/v1/loanV1.d.ts +1 -0
- package/lib/lendMarkets/modules/v1/loanV1.js +19 -0
- package/lib/lendMarkets/modules/v2/loanV2.d.ts +5 -0
- package/lib/lendMarkets/modules/v2/loanV2.js +57 -0
- package/lib/llamalend.d.ts +1 -1
- package/package.json +9 -3
- package/src/constants/abis/ControllerV2.json +1891 -0
- package/src/lendMarkets/LendMarketTemplate.ts +13 -9
- package/src/lendMarkets/fetch/fetchLendMarkets.ts +7 -1
- package/src/lendMarkets/interfaces/v2/loanV2.ts +1 -1
- package/src/lendMarkets/lendMarketConstructor.ts +6 -2
- package/src/lendMarkets/modules/common/loanBase.ts +9 -24
- package/src/lendMarkets/modules/v1/loanV1.ts +12 -1
- package/src/lendMarkets/modules/v2/loanV2.ts +55 -1
- package/src/llamalend.ts +1 -1
|
@@ -24,6 +24,10 @@ import {
|
|
|
24
24
|
VaultModule,
|
|
25
25
|
} from "./modules/common";
|
|
26
26
|
|
|
27
|
+
type LoanForVersion<V extends 'v1' | 'v2'> = V extends 'v1' ? ILoanV1 : ILoanV2;
|
|
28
|
+
type StatsForVersion<V extends 'v1' | 'v2'> = V extends 'v1' ? IStatsV1 : IStatsV2;
|
|
29
|
+
type LeverageForVersion<V extends 'v1' | 'v2'> = V extends 'v1' ? ILeverageV1 : ILeverageV2;
|
|
30
|
+
|
|
27
31
|
type V1ModuleConstructors = {
|
|
28
32
|
UserPosition: typeof UserPositionModule;
|
|
29
33
|
Stats: typeof StatsV1Module;
|
|
@@ -73,11 +77,11 @@ const versionModules: { v1: V1ModuleConstructors; v2: V2ModuleConstructors } = {
|
|
|
73
77
|
},
|
|
74
78
|
};
|
|
75
79
|
|
|
76
|
-
export class LendMarketTemplate {
|
|
80
|
+
export class LendMarketTemplate<V extends 'v1' | 'v2' = 'v1' | 'v2'> {
|
|
77
81
|
private llamalend: Llamalend;
|
|
78
82
|
id: string;
|
|
79
83
|
name: string;
|
|
80
|
-
version:
|
|
84
|
+
version: V;
|
|
81
85
|
addresses: {
|
|
82
86
|
amm: string,
|
|
83
87
|
controller: string,
|
|
@@ -111,14 +115,14 @@ export class LendMarketTemplate {
|
|
|
111
115
|
prices: IPrices;
|
|
112
116
|
amm: IAmm;
|
|
113
117
|
vault: IVault;
|
|
114
|
-
stats:
|
|
115
|
-
loan:
|
|
116
|
-
leverage:
|
|
118
|
+
stats: StatsForVersion<V>;
|
|
119
|
+
loan: LoanForVersion<V>;
|
|
120
|
+
leverage: LeverageForVersion<V>;
|
|
117
121
|
leverageZapV2: ILeverageZapV2;
|
|
118
122
|
|
|
119
123
|
constructor(id: string, marketData: IOneWayMarket, llamalend: Llamalend) {
|
|
120
124
|
this.llamalend = llamalend;
|
|
121
|
-
this.version = marketData.version || 'v1';
|
|
125
|
+
this.version = (marketData.version || 'v1') as V;
|
|
122
126
|
this.id = id;
|
|
123
127
|
this.name = marketData.name;
|
|
124
128
|
this.addresses = marketData.addresses;
|
|
@@ -172,7 +176,7 @@ export class LendMarketTemplate {
|
|
|
172
176
|
totalDebt: stats.statsTotalDebt.bind(this),
|
|
173
177
|
ammBalances: stats.statsAmmBalances.bind(this),
|
|
174
178
|
capAndAvailable: stats.statsCapAndAvailable.bind(this),
|
|
175
|
-
}
|
|
179
|
+
} as StatsForVersion<V>
|
|
176
180
|
|
|
177
181
|
this.wallet = {
|
|
178
182
|
balances: wallet.balances.bind(this),
|
|
@@ -285,7 +289,7 @@ export class LendMarketTemplate {
|
|
|
285
289
|
partialSelfLiquidateApprove: loan.estimateGas.partialSelfLiquidateApprove,
|
|
286
290
|
partialSelfLiquidate: loan.partialSelfLiquidateEstimateGas.bind(loan),
|
|
287
291
|
},
|
|
288
|
-
}
|
|
292
|
+
} as LoanForVersion<V>
|
|
289
293
|
|
|
290
294
|
this.vault = {
|
|
291
295
|
maxDeposit: vault.vaultMaxDeposit.bind(vault),
|
|
@@ -389,7 +393,7 @@ export class LendMarketTemplate {
|
|
|
389
393
|
repayApprove: leverageZapV1.leverageRepayApproveEstimateGas.bind(leverageZapV1),
|
|
390
394
|
repay: leverageZapV1.leverageRepayEstimateGas.bind(leverageZapV1),
|
|
391
395
|
},
|
|
392
|
-
}
|
|
396
|
+
} as LeverageForVersion<V>
|
|
393
397
|
|
|
394
398
|
this.leverageZapV2 = {
|
|
395
399
|
hasLeverage: leverageZapV2.hasLeverage.bind(leverageZapV2),
|
|
@@ -4,11 +4,17 @@ import { getFactoryMarketDataV1, getFactoryMarketDataV2, getFactoryMarketDataByA
|
|
|
4
4
|
|
|
5
5
|
import LlammaABI from '../../constants/abis/Llamma.json' with {type: 'json'};
|
|
6
6
|
import ControllerABI from '../../constants/abis/Controller.json' with {type: 'json'};
|
|
7
|
+
import ControllerV2ABI from '../../constants/abis/ControllerV2.json' with {type: 'json'};
|
|
7
8
|
import MonetaryPolicyABI from '../../constants/abis/MonetaryPolicy.json' with {type: 'json'};
|
|
8
9
|
import VaultABI from '../../constants/abis/Vault.json' with {type: 'json'};
|
|
9
10
|
import GaugeABI from '../../constants/abis/GaugeV5.json' with {type: 'json'};
|
|
10
11
|
import SidechainGaugeABI from '../../constants/abis/SidechainGauge.json' with {type: 'json'};
|
|
11
12
|
|
|
13
|
+
const controllerAbiMap = {
|
|
14
|
+
'v1' : ControllerABI,
|
|
15
|
+
'v2' : ControllerV2ABI,
|
|
16
|
+
}
|
|
17
|
+
|
|
12
18
|
const registerMarkets = (
|
|
13
19
|
llamalend: Llamalend,
|
|
14
20
|
names: string[],
|
|
@@ -24,7 +30,7 @@ const registerMarkets = (
|
|
|
24
30
|
) => {
|
|
25
31
|
amms.forEach((amm: string, index: number) => {
|
|
26
32
|
llamalend.setContract(amms[index], LlammaABI);
|
|
27
|
-
llamalend.setContract(controllers[index],
|
|
33
|
+
llamalend.setContract(controllers[index], controllerAbiMap[version]);
|
|
28
34
|
llamalend.setContract(monetary_policies[index], MonetaryPolicyABI);
|
|
29
35
|
llamalend.setContract(vaults[index], VaultABI);
|
|
30
36
|
if (gauges[index]) {
|
|
@@ -41,7 +41,7 @@ export interface ILoanV2 {
|
|
|
41
41
|
repayPrices: (debt: TAmount, address?: string) => Promise<string[]>;
|
|
42
42
|
repayIsApproved: (debt: TAmount) => Promise<boolean>;
|
|
43
43
|
repayApprove: (debt: TAmount) => Promise<string[]>;
|
|
44
|
-
repayHealth: (debt: TAmount, full?: boolean, address?: string) => Promise<string>;
|
|
44
|
+
repayHealth: (debt: TAmount, shrink?: boolean, full?: boolean, address?: string) => Promise<string>;
|
|
45
45
|
repay: (debt: TAmount, address?: string) => Promise<string>;
|
|
46
46
|
repayFutureLeverage: (debt: TAmount, userAddress?: string) => Promise<string>;
|
|
47
47
|
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { LendMarketTemplate} from "./LendMarketTemplate.js";
|
|
2
2
|
import type { Llamalend } from "../llamalend.js";
|
|
3
3
|
|
|
4
|
-
export const getLendMarket = function (this: Llamalend, lendMarketId: string): LendMarketTemplate {
|
|
4
|
+
export const getLendMarket = function (this: Llamalend, lendMarketId: string): LendMarketTemplate<'v1'> | LendMarketTemplate<'v2'> {
|
|
5
5
|
if (!(lendMarketId in this.lendMarkets)) {
|
|
6
6
|
const marketData = this.constants.ONE_WAY_MARKETS[lendMarketId] || this.constants.ONE_WAY_MARKETS_V2[lendMarketId];
|
|
7
7
|
if (!marketData) throw new Error(`Lend market with id ${lendMarketId} not found`);
|
|
8
|
-
|
|
8
|
+
if (marketData.version === 'v2') {
|
|
9
|
+
this.lendMarkets[lendMarketId] = new LendMarketTemplate<'v2'>(lendMarketId, marketData, this);
|
|
10
|
+
} else {
|
|
11
|
+
this.lendMarkets[lendMarketId] = new LendMarketTemplate<'v1'>(lendMarketId, marketData, this);
|
|
12
|
+
}
|
|
9
13
|
}
|
|
10
14
|
return this.lendMarkets[lendMarketId];
|
|
11
15
|
}
|
|
@@ -155,11 +155,10 @@ export class LoanBaseModule {
|
|
|
155
155
|
const _debt = parseUnits(debt, this.market.borrowed_token.decimals);
|
|
156
156
|
|
|
157
157
|
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
158
|
-
// TODO: verify parameters
|
|
159
|
-
let _health = await contract.health_calculator(this.llamalend.constants.ZERO_ADDRESS, _collateral, _debt, full, range, this.llamalend.constantOptions) as bigint;
|
|
160
|
-
_health = _health * BigInt(100);
|
|
161
158
|
|
|
162
|
-
|
|
159
|
+
const _health = await contract.health_calculator(this.llamalend.constants.ZERO_ADDRESS, _collateral, _debt, full, range, this.llamalend.constantOptions) as bigint;
|
|
160
|
+
|
|
161
|
+
return formatUnits(_health * BigInt(100));
|
|
163
162
|
}
|
|
164
163
|
|
|
165
164
|
public async createLoanIsApproved(collateral: number | string): Promise<boolean> {
|
|
@@ -243,10 +242,9 @@ export class LoanBaseModule {
|
|
|
243
242
|
const _debt = parseUnits(debt, this.market.borrowed_token.decimals);
|
|
244
243
|
|
|
245
244
|
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
246
|
-
|
|
247
|
-
_health = _health * BigInt(100);
|
|
245
|
+
const _health = await contract.health_calculator(address, _collateral, _debt, full, 0, this.llamalend.constantOptions) as bigint;
|
|
248
246
|
|
|
249
|
-
return formatUnits(_health);
|
|
247
|
+
return formatUnits(_health * BigInt(100));
|
|
250
248
|
}
|
|
251
249
|
|
|
252
250
|
public async borrowMoreIsApproved(collateral: number | string): Promise<boolean> {
|
|
@@ -330,10 +328,9 @@ export class LoanBaseModule {
|
|
|
330
328
|
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
331
329
|
|
|
332
330
|
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
333
|
-
|
|
334
|
-
_health = _health * BigInt(100);
|
|
331
|
+
const _health = await contract.health_calculator(address, _collateral, 0, full, 0, this.llamalend.constantOptions) as bigint;
|
|
335
332
|
|
|
336
|
-
return formatUnits(_health);
|
|
333
|
+
return formatUnits(_health * BigInt(100));
|
|
337
334
|
}
|
|
338
335
|
|
|
339
336
|
public async addCollateralIsApproved(collateral: number | string): Promise<boolean> {
|
|
@@ -424,10 +421,9 @@ export class LoanBaseModule {
|
|
|
424
421
|
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals) * BigInt(-1);
|
|
425
422
|
|
|
426
423
|
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
427
|
-
|
|
428
|
-
_health = _health * BigInt(100);
|
|
424
|
+
const _health = await contract.health_calculator(address, _collateral, 0, full, 0, this.llamalend.constantOptions) as bigint;
|
|
429
425
|
|
|
430
|
-
return formatUnits(_health);
|
|
426
|
+
return formatUnits(_health * BigInt(100));
|
|
431
427
|
}
|
|
432
428
|
|
|
433
429
|
private async _removeCollateral(collateral: number | string, estimateGas: boolean): Promise<string | TGas> {
|
|
@@ -505,17 +501,6 @@ export class LoanBaseModule {
|
|
|
505
501
|
return await ensureAllowance.call(this.llamalend, [this.market.borrowed_token.address], [debt], this.market.addresses.controller);
|
|
506
502
|
}
|
|
507
503
|
|
|
508
|
-
public async repayHealth(debt: number | string, full = true, address = ""): Promise<string> {
|
|
509
|
-
address = _getAddress.call(this.llamalend, address);
|
|
510
|
-
const _debt = parseUnits(debt) * BigInt(-1);
|
|
511
|
-
|
|
512
|
-
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
513
|
-
let _health = await contract.health_calculator(address, 0, _debt, full, 0, this.llamalend.constantOptions) as bigint;
|
|
514
|
-
_health = _health * BigInt(100);
|
|
515
|
-
|
|
516
|
-
return formatUnits(_health);
|
|
517
|
-
}
|
|
518
|
-
|
|
519
504
|
private async _repay(debt: number | string, address: string, estimateGas: boolean): Promise<string | TGas> {
|
|
520
505
|
address = _getAddress.call(this.llamalend, address);
|
|
521
506
|
const { debt: currentDebt } = await this.market.userPosition.userState(address);
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
import { LoanBaseModule } from "../common/loanBase.js";
|
|
2
2
|
import { ILoanV1 } from "../../interfaces/v1/loanV1";
|
|
3
|
+
import {_getAddress, formatUnits, parseUnits} from "../../../utils";
|
|
3
4
|
|
|
4
|
-
export class LoanV1Module extends LoanBaseModule implements ILoanV1 {
|
|
5
|
+
export class LoanV1Module extends LoanBaseModule implements ILoanV1 {
|
|
6
|
+
public async repayHealth(debt: number | string, full = true, address = ""): Promise<string> {
|
|
7
|
+
address = _getAddress.call(this.llamalend, address);
|
|
8
|
+
const _debt = parseUnits(debt) * BigInt(-1);
|
|
9
|
+
|
|
10
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
11
|
+
const _health = await contract.health_calculator(address, 0, _debt, full, 0, this.llamalend.constantOptions) as bigint;
|
|
12
|
+
|
|
13
|
+
return formatUnits(_health * BigInt(100));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1,4 +1,58 @@
|
|
|
1
1
|
import { LoanBaseModule } from "../common/loanBase.js";
|
|
2
2
|
import { ILoanV2 } from "../../interfaces/v2";
|
|
3
|
+
import {_getAddress, formatUnits, parseUnits} from "../../../utils";
|
|
3
4
|
|
|
4
|
-
export class LoanV2Module extends LoanBaseModule implements ILoanV2 {
|
|
5
|
+
export class LoanV2Module extends LoanBaseModule implements ILoanV2 {
|
|
6
|
+
public async createLoanHealth(collateral: number | string, debt: number | string, range: number, full = true): Promise<string> {
|
|
7
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
8
|
+
const _debt = parseUnits(debt, this.market.borrowed_token.decimals);
|
|
9
|
+
const address = _getAddress.call(this.llamalend, '');
|
|
10
|
+
|
|
11
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
12
|
+
|
|
13
|
+
const _health = await contract.create_loan_health_preview(_collateral, _debt, range, address, full, this.llamalend.constantOptions) as bigint;
|
|
14
|
+
|
|
15
|
+
return formatUnits(_health * BigInt(100));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public async addCollateralHealth(collateral: number | string, full = true, address = ""): Promise<string> {
|
|
19
|
+
address = _getAddress.call(this.llamalend, address);
|
|
20
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
21
|
+
|
|
22
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
23
|
+
const _health = await contract.add_collateral_health_preview(_collateral, address, address, full, this.llamalend.constantOptions) as bigint;
|
|
24
|
+
|
|
25
|
+
return formatUnits(_health * BigInt(100));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public async removeCollateralHealth(collateral: number | string, full = true, address = ""): Promise<string> {
|
|
29
|
+
address = _getAddress.call(this.llamalend, address);
|
|
30
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
31
|
+
|
|
32
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
33
|
+
const _health = await contract.remove_collateral_health_preview(_collateral, address, full, this.llamalend.constantOptions) as bigint;
|
|
34
|
+
|
|
35
|
+
return formatUnits(_health * BigInt(100));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public async borrowMoreHealth(collateral: number | string, debt: number | string, full = true, address = ""): Promise<string> {
|
|
39
|
+
address = _getAddress.call(this.llamalend, address);
|
|
40
|
+
const _collateral = parseUnits(collateral, this.market.collateral_token.decimals);
|
|
41
|
+
const _debt = parseUnits(debt, this.market.borrowed_token.decimals);
|
|
42
|
+
|
|
43
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
44
|
+
const _health = await contract.borrow_more_health_preview(_collateral, _debt, address, full, this.llamalend.constantOptions) as bigint;
|
|
45
|
+
|
|
46
|
+
return formatUnits(_health * BigInt(100));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public async repayHealth(debt: number | string, shrink = false, full = true, address = ""): Promise<string> {
|
|
50
|
+
address = _getAddress.call(this.llamalend, address);
|
|
51
|
+
const _debt = parseUnits(debt);
|
|
52
|
+
|
|
53
|
+
const contract = this.llamalend.contracts[this.market.addresses.controller].contract;
|
|
54
|
+
const _health = await contract.repay_health_preview(0, _debt, address, address, shrink, full, this.llamalend.constantOptions) as bigint;
|
|
55
|
+
|
|
56
|
+
return formatUnits(_health * BigInt(100));
|
|
57
|
+
}
|
|
58
|
+
}
|
package/src/llamalend.ts
CHANGED
|
@@ -99,7 +99,7 @@ class Llamalend implements ILlamalend {
|
|
|
99
99
|
chainId: IChainId;
|
|
100
100
|
contracts: { [index: string]: ICurveContract };
|
|
101
101
|
mintMarkets: { [addres: string]: MintMarketTemplate };
|
|
102
|
-
lendMarkets: { [
|
|
102
|
+
lendMarkets: { [address: string]: LendMarketTemplate<'v1'> | LendMarketTemplate<'v2'> };
|
|
103
103
|
feeData: { gasPrice?: number, maxFeePerGas?: number, maxPriorityFeePerGas?: number };
|
|
104
104
|
constantOptions: { gasLimit: number };
|
|
105
105
|
options: { gasPrice?: number | bigint, maxFeePerGas?: number | bigint, maxPriorityFeePerGas?: number | bigint };
|