@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.
@@ -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: 'v1' | 'v2';
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: IStatsV1 | IStatsV2;
115
- loan: ILoanV1 | ILoanV2;
116
- leverage: ILeverageV1 | ILeverageV2;
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], ControllerABI);
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
- this.lendMarkets[lendMarketId] = new LendMarketTemplate(lendMarketId, marketData, this);
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
- return formatUnits(_health);
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
- let _health = await contract.health_calculator(address, _collateral, _debt, full, 0, this.llamalend.constantOptions) as bigint;
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
- let _health = await contract.health_calculator(address, _collateral, 0, full, 0, this.llamalend.constantOptions) as bigint;
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
- let _health = await contract.health_calculator(address, _collateral, 0, full, 0, this.llamalend.constantOptions) as bigint;
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: { [addres: string]: LendMarketTemplate };
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 };