@curvefi/llamalend-api 2.0.23 → 2.0.26

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.
Files changed (32) hide show
  1. package/docs/MARKET_DATA_INPUTS.md +64 -0
  2. package/lib/constants/abis/ControllerV2.json +0 -93
  3. package/lib/constants/llammas.js +0 -8
  4. package/lib/index.d.ts +4 -0
  5. package/lib/index.js +4 -0
  6. package/lib/interfaces.d.ts +0 -2
  7. package/lib/lendMarkets/fetch/fetchLendMarkets.js +2 -20
  8. package/lib/lendMarkets/lendMarketConstructor.d.ts +2 -0
  9. package/lib/lendMarkets/lendMarketConstructor.js +11 -0
  10. package/lib/lendMarkets/setupContracts.d.ts +3 -0
  11. package/lib/lendMarkets/setupContracts.js +30 -0
  12. package/lib/llamalend.js +8 -3
  13. package/lib/mintMarkets/fetch/fetchMintMarkets.js +26 -31
  14. package/lib/mintMarkets/mintMarketConstructor.d.ts +2 -0
  15. package/lib/mintMarkets/mintMarketConstructor.js +6 -0
  16. package/lib/mintMarkets/monetaryPolicyAbi.d.ts +1 -0
  17. package/lib/mintMarkets/monetaryPolicyAbi.js +10 -0
  18. package/lib/mintMarkets/setupContracts.d.ts +3 -0
  19. package/lib/mintMarkets/setupContracts.js +27 -0
  20. package/package.json +1 -1
  21. package/src/constants/abis/ControllerV2.json +0 -93
  22. package/src/constants/llammas.ts +0 -8
  23. package/src/index.ts +4 -0
  24. package/src/interfaces.ts +0 -2
  25. package/src/lendMarkets/fetch/fetchLendMarkets.ts +3 -22
  26. package/src/lendMarkets/lendMarketConstructor.ts +14 -0
  27. package/src/lendMarkets/setupContracts.ts +39 -0
  28. package/src/llamalend.ts +2 -3
  29. package/src/mintMarkets/fetch/fetchMintMarkets.ts +40 -33
  30. package/src/mintMarkets/mintMarketConstructor.ts +9 -0
  31. package/src/mintMarkets/monetaryPolicyAbi.ts +12 -0
  32. package/src/mintMarkets/setupContracts.ts +35 -0
@@ -0,0 +1,64 @@
1
+ # Market Data Inputs
2
+
3
+ Data shapes required by the "by-data" constructors:
4
+
5
+ | Function | Input type |
6
+ |-------------------------|-----------------|
7
+ | `getMintMarketByData` | `ILlamma` |
8
+ | `getLendMarketByData` | `IOneWayMarket` |
9
+
10
+ ---
11
+
12
+ ## `ILlamma` — for `getMintMarketByData`
13
+
14
+ ```ts
15
+ interface ILlamma {
16
+ amm_address: string; // LLAMMA AMM address
17
+ controller_address: string; // Controller address
18
+ monetary_policy_address: string; // Monetary policy address
19
+ collateral_address: string; // Collateral ERC-20 (use 0xeee...eee for native ETH)
20
+ leverage_zap: string; // Leverage zap (ZERO_ADDRESS if unsupported)
21
+ deleverage_zap: string; // Deleverage zap (ZERO_ADDRESS if unsupported)
22
+ health_calculator_zap?: string; // Optional health-calc helper
23
+ collateral_symbol: string; // e.g. "ETH", "wstETH"
24
+ collateral_decimals: number; // Collateral decimals
25
+ min_bands: number; // Min bands (prod: 4)
26
+ max_bands: number; // Max bands (prod: 50)
27
+ default_bands: number; // Default bands (prod: 10)
28
+ A: number; // LLAMMA amplification (prod: 100)
29
+ is_deleverage_supported?: boolean; // Defaults to false
30
+ index?: number; // Sequential factory index
31
+ }
32
+ ```
33
+
34
+ ---
35
+
36
+ ## `IOneWayMarket` — for `getLendMarketByData`
37
+
38
+ ```ts
39
+ interface IOneWayMarket {
40
+ name: string; // Empty → auto: "<collateral>/<borrowed>"
41
+ version: "v1" | "v2"; // Selects controller ABI & module set
42
+ addresses: {
43
+ amm: string;
44
+ controller: string;
45
+ borrowed_token: string;
46
+ collateral_token: string;
47
+ monetary_policy: string;
48
+ vault: string;
49
+ gauge: string; // ZERO_ADDRESS if none
50
+ };
51
+ borrowed_token: {
52
+ address: string; // Must match addresses.borrowed_token
53
+ name: string; // e.g. "Curve.Fi USD Stablecoin"
54
+ symbol: string; // e.g. "crvUSD"
55
+ decimals: number; // Token decimals
56
+ };
57
+ collateral_token: {
58
+ address: string; // Must match addresses.collateral_token
59
+ name: string; // e.g. "Wrapped Ether"
60
+ symbol: string; // e.g. "WETH"
61
+ decimals: number; // Token decimals
62
+ };
63
+ }
64
+ ```
@@ -670,78 +670,6 @@
670
670
  "stateMutability": "nonpayable",
671
671
  "type": "function"
672
672
  },
673
- {
674
- "inputs": [
675
- {
676
- "name": "_user",
677
- "type": "address"
678
- },
679
- {
680
- "name": "_min_x",
681
- "type": "uint256"
682
- },
683
- {
684
- "name": "_frac",
685
- "type": "uint256"
686
- }
687
- ],
688
- "name": "liquidate",
689
- "outputs": [],
690
- "stateMutability": "nonpayable",
691
- "type": "function"
692
- },
693
- {
694
- "inputs": [
695
- {
696
- "name": "_user",
697
- "type": "address"
698
- },
699
- {
700
- "name": "_min_x",
701
- "type": "uint256"
702
- },
703
- {
704
- "name": "_frac",
705
- "type": "uint256"
706
- },
707
- {
708
- "name": "_callbacker",
709
- "type": "address"
710
- }
711
- ],
712
- "name": "liquidate",
713
- "outputs": [],
714
- "stateMutability": "nonpayable",
715
- "type": "function"
716
- },
717
- {
718
- "inputs": [
719
- {
720
- "name": "_user",
721
- "type": "address"
722
- },
723
- {
724
- "name": "_min_x",
725
- "type": "uint256"
726
- },
727
- {
728
- "name": "_frac",
729
- "type": "uint256"
730
- },
731
- {
732
- "name": "_callbacker",
733
- "type": "address"
734
- },
735
- {
736
- "name": "_calldata",
737
- "type": "bytes"
738
- }
739
- ],
740
- "name": "liquidate",
741
- "outputs": [],
742
- "stateMutability": "nonpayable",
743
- "type": "function"
744
- },
745
673
  {
746
674
  "inputs": [],
747
675
  "name": "save_rate",
@@ -1263,27 +1191,6 @@
1263
1191
  "stateMutability": "view",
1264
1192
  "type": "function"
1265
1193
  },
1266
- {
1267
- "inputs": [
1268
- {
1269
- "name": "_user",
1270
- "type": "address"
1271
- },
1272
- {
1273
- "name": "_frac",
1274
- "type": "uint256"
1275
- }
1276
- ],
1277
- "name": "tokens_to_liquidate",
1278
- "outputs": [
1279
- {
1280
- "name": "",
1281
- "type": "uint256"
1282
- }
1283
- ],
1284
- "stateMutability": "view",
1285
- "type": "function"
1286
- },
1287
1194
  {
1288
1195
  "inputs": [
1289
1196
  {
@@ -1,5 +1,3 @@
1
- import MonetaryPolicyABI from './abis/crvUSD/MonetaryPolicy.json' with { type: 'json' };
2
- import MonetaryPolicy2ABI from './abis/crvUSD/MonetaryPolicy2.json' with { type: 'json' };
3
1
  import { lowerCaseLlammasAddresses } from "./utils.js";
4
2
  export const LLAMMAS = lowerCaseLlammasAddresses({
5
3
  sfrxeth: {
@@ -15,7 +13,6 @@ export const LLAMMAS = lowerCaseLlammasAddresses({
15
13
  max_bands: 50,
16
14
  default_bands: 10,
17
15
  A: 100,
18
- monetary_policy_abi: MonetaryPolicyABI,
19
16
  },
20
17
  wsteth: {
21
18
  amm_address: '0x37417b2238aa52d0dd2d6252d989e728e8f706e4',
@@ -30,7 +27,6 @@ export const LLAMMAS = lowerCaseLlammasAddresses({
30
27
  max_bands: 50,
31
28
  default_bands: 10,
32
29
  A: 100,
33
- monetary_policy_abi: MonetaryPolicy2ABI,
34
30
  },
35
31
  wbtc: {
36
32
  amm_address: '0xe0438eb3703bf871e31ce639bd351109c88666ea',
@@ -46,7 +42,6 @@ export const LLAMMAS = lowerCaseLlammasAddresses({
46
42
  max_bands: 50,
47
43
  default_bands: 10,
48
44
  A: 100,
49
- monetary_policy_abi: MonetaryPolicy2ABI,
50
45
  },
51
46
  eth: {
52
47
  amm_address: '0x1681195c176239ac5e72d9aebacf5b2492e0c4ee',
@@ -61,7 +56,6 @@ export const LLAMMAS = lowerCaseLlammasAddresses({
61
56
  max_bands: 50,
62
57
  default_bands: 10,
63
58
  A: 100,
64
- monetary_policy_abi: MonetaryPolicy2ABI,
65
59
  },
66
60
  sfrxeth2: {
67
61
  amm_address: '0xfa96ad0a9e64261db86950e2da362f5572c5c6fd',
@@ -76,7 +70,6 @@ export const LLAMMAS = lowerCaseLlammasAddresses({
76
70
  max_bands: 50,
77
71
  default_bands: 10,
78
72
  A: 100,
79
- monetary_policy_abi: MonetaryPolicy2ABI,
80
73
  },
81
74
  tbtc: {
82
75
  amm_address: '0xf9bd9da2427a50908c4c6d1599d8e62837c2bcb0',
@@ -91,6 +84,5 @@ export const LLAMMAS = lowerCaseLlammasAddresses({
91
84
  max_bands: 50,
92
85
  default_bands: 10,
93
86
  A: 100,
94
- monetary_policy_abi: MonetaryPolicy2ABI,
95
87
  },
96
88
  });
package/lib/index.d.ts CHANGED
@@ -28,6 +28,8 @@ export declare function createLlamalend(): {
28
28
  MintMarketTemplate: typeof MintMarketTemplate;
29
29
  getLendMarket: (lendMarketId: string) => LendMarketTemplate<"v1"> | LendMarketTemplate<"v2">;
30
30
  getMintMarket: (mintMarketId: string) => MintMarketTemplate;
31
+ getLendMarketByData: (id: string, marketData: import("./interfaces.js").IOneWayMarket) => LendMarketTemplate<"v1"> | LendMarketTemplate<"v2">;
32
+ getMintMarketByData: (id: string, llammaData: import("./interfaces.js").ILlamma) => MintMarketTemplate;
31
33
  totalSupply: () => Promise<{
32
34
  total: string;
33
35
  minted: string;
@@ -132,6 +134,8 @@ declare const _default: {
132
134
  MintMarketTemplate: typeof MintMarketTemplate;
133
135
  getLendMarket: (lendMarketId: string) => LendMarketTemplate<"v1"> | LendMarketTemplate<"v2">;
134
136
  getMintMarket: (mintMarketId: string) => MintMarketTemplate;
137
+ getLendMarketByData: (id: string, marketData: import("./interfaces.js").IOneWayMarket) => LendMarketTemplate<"v1"> | LendMarketTemplate<"v2">;
138
+ getMintMarketByData: (id: string, llammaData: import("./interfaces.js").ILlamma) => MintMarketTemplate;
135
139
  totalSupply: () => Promise<{
136
140
  total: string;
137
141
  minted: string;
package/lib/index.js CHANGED
@@ -12,6 +12,8 @@ import { MintMarketTemplate, getMintMarket } from "./mintMarkets/index.js";
12
12
  import { Llamalend } from "./llamalend.js";
13
13
  import { getBalances, getAllowance, hasAllowance, ensureAllowanceEstimateGas, ensureAllowance, getUsdRate, getGasPriceFromL2, getGasInfoForL2, getGasPriceFromL1, totalSupply, getLsdApy, } from "./utils.js";
14
14
  import { convertToAssets, convertToShares, userBalances, totalSupplyAndCrvUSDLocked, maxDeposit, previewDeposit, depositIsApproved, depositAllowance, depositApproveEstimateGas, depositApprove, depositEstimateGas, deposit, maxMint, previewMint, mintIsApproved, mintAllowance, mintApproveEstimateGas, mintApprove, mintEstimateGas, mint, maxWithdraw, previewWithdraw, withdrawEstimateGas, withdraw, maxRedeem, previewRedeem, redeemEstimateGas, redeem, } from "./st-crvUSD.js";
15
+ import { getMintMarketByData } from "./mintMarkets/mintMarketConstructor.js";
16
+ import { getLendMarketByData } from "./lendMarkets/lendMarketConstructor.js";
15
17
  export function createLlamalend() {
16
18
  const llamalend = new Llamalend();
17
19
  return {
@@ -32,6 +34,8 @@ export function createLlamalend() {
32
34
  // Market constructors
33
35
  getLendMarket: getLendMarket.bind(llamalend),
34
36
  getMintMarket: getMintMarket.bind(llamalend),
37
+ getLendMarketByData: getLendMarketByData.bind(llamalend),
38
+ getMintMarketByData: getMintMarketByData.bind(llamalend),
35
39
  // Utility functions
36
40
  totalSupply: totalSupply.bind(llamalend),
37
41
  getLsdApy: getLsdApy.bind(llamalend),
@@ -34,7 +34,6 @@ export interface ILlamma {
34
34
  max_bands: number;
35
35
  default_bands: number;
36
36
  A: number;
37
- monetary_policy_abi: any;
38
37
  is_deleverage_supported?: boolean;
39
38
  index?: number;
40
39
  }
@@ -215,7 +214,6 @@ export interface ILlamma {
215
214
  max_bands: number;
216
215
  default_bands: number;
217
216
  A: number;
218
- monetary_policy_abi: any;
219
217
  }
220
218
  export interface IResponseApi {
221
219
  data: any;
@@ -8,26 +8,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { getFactoryMarketDataV1, getFactoryMarketDataV2, getFactoryMarketDataByAPI } from "./fetchFactoryData.js";
11
- import LlammaABI from '../../constants/abis/Llamma.json' with { type: 'json' };
12
- import ControllerABI from '../../constants/abis/Controller.json' with { type: 'json' };
13
- import ControllerV2ABI from '../../constants/abis/ControllerV2.json' with { type: 'json' };
14
- import MonetaryPolicyABI from '../../constants/abis/MonetaryPolicy.json' with { type: 'json' };
15
- import VaultABI from '../../constants/abis/Vault.json' with { type: 'json' };
16
- import GaugeABI from '../../constants/abis/GaugeV5.json' with { type: 'json' };
17
- import SidechainGaugeABI from '../../constants/abis/SidechainGauge.json' with { type: 'json' };
18
- const controllerAbiMap = {
19
- 'v1': ControllerABI,
20
- 'v2': ControllerV2ABI,
21
- };
11
+ import { setupLendMarketContracts } from "../setupContracts.js";
22
12
  const registerMarkets = (llamalend, names, amms, controllers, borrowed_tokens, collateral_tokens, monetary_policies, vaults, gauges, COIN_DATA, version) => {
23
13
  amms.forEach((amm, index) => {
24
- llamalend.setContract(amms[index], LlammaABI);
25
- llamalend.setContract(controllers[index], controllerAbiMap[version]);
26
- llamalend.setContract(monetary_policies[index], MonetaryPolicyABI);
27
- llamalend.setContract(vaults[index], VaultABI);
28
- if (gauges[index]) {
29
- llamalend.setContract(gauges[index], llamalend.chainId === 1 ? GaugeABI : SidechainGaugeABI);
30
- }
31
14
  COIN_DATA[vaults[index]] = {
32
15
  address: vaults[index],
33
16
  decimals: 18,
@@ -40,8 +23,6 @@ const registerMarkets = (llamalend, names, amms, controllers, borrowed_tokens, c
40
23
  name: "curve.finance " + COIN_DATA[borrowed_tokens[index]].name + " Gauge Deposit",
41
24
  symbol: "cv" + COIN_DATA[borrowed_tokens[index]].symbol + "-gauge",
42
25
  };
43
- llamalend.constants.DECIMALS[vaults[index]] = 18;
44
- llamalend.constants.DECIMALS[gauges[index]] = 18;
45
26
  const marketData = {
46
27
  name: names[index] || `${COIN_DATA[collateral_tokens[index]].symbol}/${COIN_DATA[borrowed_tokens[index]].symbol}`,
47
28
  version: version,
@@ -57,6 +38,7 @@ const registerMarkets = (llamalend, names, amms, controllers, borrowed_tokens, c
57
38
  borrowed_token: COIN_DATA[borrowed_tokens[index]],
58
39
  collateral_token: COIN_DATA[collateral_tokens[index]],
59
40
  };
41
+ setupLendMarketContracts(llamalend, marketData);
60
42
  if (version === 'v2') {
61
43
  llamalend.constants.ONE_WAY_MARKETS_V2[`one-way-market-v2-${index}`] = marketData;
62
44
  }
@@ -1,3 +1,5 @@
1
1
  import { LendMarketTemplate } from "./LendMarketTemplate.js";
2
+ import type { IOneWayMarket } from "../interfaces.js";
2
3
  import type { Llamalend } from "../llamalend.js";
3
4
  export declare const getLendMarket: (this: Llamalend, lendMarketId: string) => LendMarketTemplate<"v1"> | LendMarketTemplate<"v2">;
5
+ export declare const getLendMarketByData: (this: Llamalend, id: string, marketData: IOneWayMarket) => LendMarketTemplate<"v1"> | LendMarketTemplate<"v2">;
@@ -1,4 +1,5 @@
1
1
  import { LendMarketTemplate } from "./LendMarketTemplate.js";
2
+ import { setupLendMarketContracts } from "./setupContracts.js";
2
3
  export const getLendMarket = function (lendMarketId) {
3
4
  if (!(lendMarketId in this.lendMarkets)) {
4
5
  const marketData = this.constants.ONE_WAY_MARKETS[lendMarketId] || this.constants.ONE_WAY_MARKETS_V2[lendMarketId];
@@ -13,3 +14,13 @@ export const getLendMarket = function (lendMarketId) {
13
14
  }
14
15
  return this.lendMarkets[lendMarketId];
15
16
  };
17
+ export const getLendMarketByData = function (id, marketData) {
18
+ setupLendMarketContracts(this, marketData);
19
+ if (marketData.version === 'v2') {
20
+ this.lendMarkets[id] = new LendMarketTemplate(id, marketData, this);
21
+ }
22
+ else {
23
+ this.lendMarkets[id] = new LendMarketTemplate(id, marketData, this);
24
+ }
25
+ return this.lendMarkets[id];
26
+ };
@@ -0,0 +1,3 @@
1
+ import type { Llamalend } from "../llamalend.js";
2
+ import type { IOneWayMarket } from "../interfaces.js";
3
+ export declare const setupLendMarketContracts: (llamalend: Llamalend, marketData: IOneWayMarket) => void;
@@ -0,0 +1,30 @@
1
+ import LlammaABI from '../constants/abis/Llamma.json' with { type: 'json' };
2
+ import ControllerABI from '../constants/abis/Controller.json' with { type: 'json' };
3
+ import ControllerV2ABI from '../constants/abis/ControllerV2.json' with { type: 'json' };
4
+ import MonetaryPolicyABI from '../constants/abis/MonetaryPolicy.json' with { type: 'json' };
5
+ import VaultABI from '../constants/abis/Vault.json' with { type: 'json' };
6
+ import GaugeABI from '../constants/abis/GaugeV5.json' with { type: 'json' };
7
+ import SidechainGaugeABI from '../constants/abis/SidechainGauge.json' with { type: 'json' };
8
+ import ERC20ABI from '../constants/abis/ERC20.json' with { type: 'json' };
9
+ const controllerAbiMap = {
10
+ v1: ControllerABI,
11
+ v2: ControllerV2ABI,
12
+ };
13
+ const VAULT_DECIMALS = 18;
14
+ const GAUGE_DECIMALS = 18;
15
+ export const setupLendMarketContracts = (llamalend, marketData) => {
16
+ const { addresses, borrowed_token, collateral_token, version } = marketData;
17
+ llamalend.setContract(addresses.amm, LlammaABI);
18
+ llamalend.setContract(addresses.controller, controllerAbiMap[version]);
19
+ llamalend.setContract(addresses.monetary_policy, MonetaryPolicyABI);
20
+ llamalend.setContract(addresses.vault, VaultABI);
21
+ llamalend.setContract(addresses.gauge, llamalend.chainId === 1 ? GaugeABI : SidechainGaugeABI);
22
+ llamalend.setContract(borrowed_token.address, ERC20ABI);
23
+ llamalend.setContract(collateral_token.address, ERC20ABI);
24
+ llamalend.constants.DECIMALS[borrowed_token.address] = borrowed_token.decimals;
25
+ llamalend.constants.DECIMALS[collateral_token.address] = collateral_token.decimals;
26
+ llamalend.constants.DECIMALS[addresses.vault] = VAULT_DECIMALS;
27
+ if (addresses.gauge && addresses.gauge !== llamalend.constants.ZERO_ADDRESS) {
28
+ llamalend.constants.DECIMALS[addresses.gauge] = GAUGE_DECIMALS;
29
+ }
30
+ };
package/lib/llamalend.js CHANGED
@@ -31,10 +31,10 @@ import DeleverageZapABI from "./constants/abis/crvUSD/DeleverageZap.json" with {
31
31
  import { ALIASES_ETHEREUM, ALIASES_OPTIMISM, ALIASES_ARBITRUM, ALIASES_FRAXTAL, ALIASES_SONIC, } from "./constants/aliases.js";
32
32
  import { COINS_ETHEREUM, COINS_OPTIMISM, COINS_ARBITRUM, COINS_FRAXTAL, COINS_SONIC, } from "./constants/coins.js";
33
33
  import { LLAMMAS } from "./constants/llammas.js";
34
+ import { resolveMonetaryPolicyAbi } from "./mintMarkets/monetaryPolicyAbi.js";
34
35
  import { L2Networks } from "./constants/L2Networks.js";
35
36
  import { createCall, handleMultiCallResponse } from "./utils.js";
36
37
  import { _getMarketsData, _getCrvUsdMarketsData } from "./external-api.js";
37
- import { extractDecimals } from "./constants/utils.js";
38
38
  import { fetchOneWayMarketsByBlockchain, fetchOneWayMarketsByAPI } from "./lendMarkets/fetch/fetchLendMarkets.js";
39
39
  import { fetchMintMarketsByBlockchain, fetchMintMarketsByAPI } from "./mintMarkets/fetch/fetchMintMarkets.js";
40
40
  const memoizeByAddress = (factory) => {
@@ -313,7 +313,12 @@ class Llamalend {
313
313
  this.setContract(this.constants.ALIASES.gauge_factory, GaugeFactorySidechainABI);
314
314
  }
315
315
  }
316
- this.constants.DECIMALS = Object.assign(Object.assign({}, extractDecimals(this.constants.LLAMMAS)), { [this.crvUsdAddress]: 18, [this.constants.ALIASES.crv]: 18, [this.constants.ALIASES.crvUSD]: 18, [this.constants.ALIASES.st_crvUSD]: 18 });
316
+ this.constants.DECIMALS = {
317
+ [this.crvUsdAddress]: 18,
318
+ [this.constants.ALIASES.crv]: 18,
319
+ [this.constants.ALIASES.crvUSD]: 18,
320
+ [this.constants.ALIASES.st_crvUSD]: 18,
321
+ };
317
322
  if (L2Networks.includes(this.chainId)) {
318
323
  // eslint-disable-next-line @typescript-eslint/no-this-alias
319
324
  const lendingInstance = this;
@@ -402,7 +407,7 @@ class Llamalend {
402
407
  llammas.forEach((llamma, i) => { llamma.monetary_policy_address = monetaryPolicies[i]; });
403
408
  }
404
409
  for (const llamma of llammas) {
405
- this.setContract(llamma.monetary_policy_address, llamma.monetary_policy_abi);
410
+ this.setContract(llamma.monetary_policy_address, resolveMonetaryPolicyAbi(llamma.monetary_policy_address));
406
411
  if (llamma.collateral_address === "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee") {
407
412
  this.setContract(this.constants.WETH, ERC20ABI);
408
413
  }
@@ -13,7 +13,9 @@ import llammaABI from "../../constants/abis/crvUSD/llamma.json" with { type: 'js
13
13
  import controllerABI from "../../constants/abis/crvUSD/controller.json" with { type: 'json' };
14
14
  import controllerV2ABI from "../../constants/abis/crvUSD/controller_v2.json";
15
15
  import FactoryABI from "../../constants/abis/crvUSD/Factory.json" with { type: 'json' };
16
- import MonetaryPolicy2ABI from "../../constants/abis/crvUSD/MonetaryPolicy2.json" with { type: 'json' };
16
+ import { extractDecimals } from "../../constants/utils.js";
17
+ import { handleMultiCallResponse } from "../../utils.js";
18
+ import { resolveMonetaryPolicyAbi } from "../monetaryPolicyAbi.js";
17
19
  export const fetchMintMarketsByAPI = (llamalend) => __awaiter(void 0, void 0, void 0, function* () {
18
20
  if (llamalend.chainId !== 1)
19
21
  return;
@@ -38,7 +40,7 @@ export const fetchMintMarketsByAPI = (llamalend) => __awaiter(void 0, void 0, vo
38
40
  const is_eth = collateral_address === llamalend.constants.WETH;
39
41
  const collateral_symbol = market.collateral_token.symbol;
40
42
  const monetary_policy_address = market.monetary_policy_address.toLowerCase();
41
- llamalend.setContract(monetary_policy_address, MonetaryPolicy2ABI);
43
+ llamalend.setContract(monetary_policy_address, resolveMonetaryPolicyAbi(monetary_policy_address));
42
44
  const _llammaId = is_eth ? "eth" : collateral_symbol.toLowerCase();
43
45
  let llammaId = _llammaId;
44
46
  let j = 2;
@@ -57,11 +59,11 @@ export const fetchMintMarketsByAPI = (llamalend) => __awaiter(void 0, void 0, vo
57
59
  max_bands: 50,
58
60
  default_bands: 10,
59
61
  A: market.amm_a,
60
- monetary_policy_abi: MonetaryPolicy2ABI,
61
62
  is_deleverage_supported: true,
62
63
  index: N1 + i,
63
64
  };
64
65
  }
66
+ llamalend.constants.DECIMALS = Object.assign(Object.assign({}, llamalend.constants.DECIMALS), extractDecimals(llamalend.constants.LLAMMAS));
65
67
  });
66
68
  export const fetchMintMarketsByBlockchain = (llamalend) => __awaiter(void 0, void 0, void 0, function* () {
67
69
  if (llamalend.chainId !== 1)
@@ -71,44 +73,37 @@ export const fetchMintMarketsByBlockchain = (llamalend) => __awaiter(void 0, voi
71
73
  const factoryMulticallContract = llamalend.contracts[llamalend.constants.FACTORY].multicallContract;
72
74
  const N1 = Object.keys(llamalend.constants.LLAMMAS).length;
73
75
  const N2 = yield factoryContract.n_collaterals(llamalend.constantOptions);
76
+ const coreCallsMap = ['collaterals', 'amms', 'controllers'];
74
77
  let calls = [];
75
78
  for (let i = N1; i < N2; i++) {
76
79
  calls.push(factoryMulticallContract.collaterals(i), factoryMulticallContract.amms(i), factoryMulticallContract.controllers(i));
77
80
  }
78
- const res = (yield llamalend.multicallProvider.all(calls)).map((c) => c.toLowerCase());
79
- const collaterals = res.filter((a, i) => i % 3 == 0);
80
- const amms = res.filter((a, i) => i % 3 == 1);
81
- const controllers = res.filter((a, i) => i % 3 == 2);
81
+ const coreAddresses = (yield llamalend.multicallProvider.all(calls)).map((c) => c.toLowerCase());
82
+ const { collaterals, amms, controllers } = handleMultiCallResponse(coreCallsMap, coreAddresses);
82
83
  if (collaterals.length === 0)
83
84
  return;
85
+ const N = collaterals.length;
84
86
  for (const collateral of collaterals)
85
87
  llamalend.setContract(collateral, ERC20ABI);
86
- calls = [];
87
- for (const collateral of collaterals) {
88
- calls.push(llamalend.contracts[collateral].multicallContract.symbol(), llamalend.contracts[collateral].multicallContract.decimals());
88
+ for (const amm of amms)
89
+ llamalend.setContract(amm, llammaABI);
90
+ for (let i = 0; i < N; i++) {
91
+ llamalend.setContract(controllers[i], i >= N - 3 ? controllerV2ABI : controllerABI);
89
92
  }
90
- const collateralData = (yield llamalend.multicallProvider.all(calls)).map((x) => {
91
- if (typeof x === "string")
92
- return x.toLowerCase();
93
- return x;
94
- });
93
+ const detailsCallsMap = ['symbols', 'decimals', 'amm_a', 'monetary_policies'];
95
94
  calls = [];
96
- for (const amm of amms) {
97
- llamalend.setContract(amm, llammaABI);
98
- calls.push(llamalend.contracts[amm].multicallContract.A());
95
+ for (let i = 0; i < N; i++) {
96
+ calls.push(llamalend.contracts[collaterals[i]].multicallContract.symbol(), llamalend.contracts[collaterals[i]].multicallContract.decimals(), llamalend.contracts[amms[i]].multicallContract.A(), llamalend.contracts[controllers[i]].multicallContract.monetary_policy());
99
97
  }
100
- const AParams = (yield llamalend.multicallProvider.all(calls)).map((x) => Number(x));
101
- for (let i = 0; i < collaterals.length; i++) {
98
+ const flat = (yield llamalend.multicallProvider.all(calls)).map((x) => typeof x === "string" ? x.toLowerCase() : x);
99
+ const { symbols, decimals, amm_a, monetary_policies } = handleMultiCallResponse(detailsCallsMap, flat);
100
+ for (const mp of monetary_policies)
101
+ llamalend.setContract(mp, resolveMonetaryPolicyAbi(mp));
102
+ for (let i = 0; i < N; i++) {
102
103
  const is_eth = collaterals[i] === llamalend.constants.WETH;
103
- const [collateral_symbol, collateral_decimals] = collateralData.splice(0, 2);
104
- if (i >= collaterals.length - 3) {
105
- llamalend.setContract(controllers[i], controllerV2ABI);
106
- }
107
- else {
108
- llamalend.setContract(controllers[i], controllerABI);
109
- }
110
- const monetary_policy_address = (yield llamalend.contracts[controllers[i]].contract.monetary_policy(llamalend.constantOptions)).toLowerCase();
111
- llamalend.setContract(monetary_policy_address, MonetaryPolicy2ABI);
104
+ const collateral_symbol = symbols[i];
105
+ const collateral_decimals = Number(decimals[i]);
106
+ const monetary_policy_address = monetary_policies[i];
112
107
  const _llammaId = is_eth ? "eth" : collateral_symbol.toLowerCase();
113
108
  let llammaId = _llammaId;
114
109
  let j = 2;
@@ -126,10 +121,10 @@ export const fetchMintMarketsByBlockchain = (llamalend) => __awaiter(void 0, voi
126
121
  min_bands: 4,
127
122
  max_bands: 50,
128
123
  default_bands: 10,
129
- A: AParams[i],
130
- monetary_policy_abi: MonetaryPolicy2ABI,
124
+ A: Number(amm_a[i]),
131
125
  is_deleverage_supported: true,
132
126
  index: N1 + i,
133
127
  };
134
128
  }
129
+ llamalend.constants.DECIMALS = Object.assign(Object.assign({}, llamalend.constants.DECIMALS), extractDecimals(llamalend.constants.LLAMMAS));
135
130
  });
@@ -1,3 +1,5 @@
1
1
  import { MintMarketTemplate } from "./MintMarketTemplate.js";
2
+ import type { ILlamma } from "../interfaces.js";
2
3
  import type { Llamalend } from "../llamalend.js";
3
4
  export declare const getMintMarket: (this: Llamalend, mintMarketId: string) => MintMarketTemplate;
5
+ export declare const getMintMarketByData: (this: Llamalend, id: string, llammaData: ILlamma) => MintMarketTemplate;
@@ -1,4 +1,5 @@
1
1
  import { MintMarketTemplate } from "./MintMarketTemplate.js";
2
+ import { setupMintMarketContracts } from "./setupContracts.js";
2
3
  export const getMintMarket = function (mintMarketId) {
3
4
  if (!(mintMarketId in this.mintMarkets)) {
4
5
  const llammaData = this.constants.LLAMMAS[mintMarketId];
@@ -8,3 +9,8 @@ export const getMintMarket = function (mintMarketId) {
8
9
  }
9
10
  return this.mintMarkets[mintMarketId];
10
11
  };
12
+ export const getMintMarketByData = function (id, llammaData) {
13
+ setupMintMarketContracts(this, llammaData);
14
+ this.mintMarkets[id] = new MintMarketTemplate(id, llammaData, this);
15
+ return this.mintMarkets[id];
16
+ };
@@ -0,0 +1 @@
1
+ export declare const resolveMonetaryPolicyAbi: (monetaryPolicyAddress: string) => any;
@@ -0,0 +1,10 @@
1
+ import MonetaryPolicyABI from "../constants/abis/crvUSD/MonetaryPolicy.json" with { type: "json" };
2
+ import MonetaryPolicy2ABI from "../constants/abis/crvUSD/MonetaryPolicy2.json" with { type: "json" };
3
+ const LEGACY_MONETARY_POLICIES = new Set([
4
+ "0xc684432fd6322c6d58b6bc5d28b18569aa0ad0a1",
5
+ ]);
6
+ export const resolveMonetaryPolicyAbi = (monetaryPolicyAddress) => {
7
+ return LEGACY_MONETARY_POLICIES.has(monetaryPolicyAddress.toLowerCase())
8
+ ? MonetaryPolicyABI
9
+ : MonetaryPolicy2ABI;
10
+ };
@@ -0,0 +1,3 @@
1
+ import type { Llamalend } from "../llamalend.js";
2
+ import type { ILlamma } from "../interfaces.js";
3
+ export declare const setupMintMarketContracts: (llamalend: Llamalend, llammaData: ILlamma) => void;
@@ -0,0 +1,27 @@
1
+ import ERC20ABI from "../constants/abis/ERC20.json" with { type: "json" };
2
+ import llammaABI from "../constants/abis/crvUSD/llamma.json" with { type: "json" };
3
+ import controllerABI from "../constants/abis/crvUSD/controller.json" with { type: "json" };
4
+ import controllerV2ABI from "../constants/abis/crvUSD/controller_v2.json" with { type: "json" };
5
+ import LeverageZapCrvUSDABI from "../constants/abis/crvUSD/LeverageZap.json" with { type: "json" };
6
+ import DeleverageZapABI from "../constants/abis/crvUSD/DeleverageZap.json" with { type: "json" };
7
+ import HealthCalculatorZapABI from "../constants/abis/crvUSD/HealthCalculatorZap.json" with { type: "json" };
8
+ import { resolveMonetaryPolicyAbi } from "./monetaryPolicyAbi.js";
9
+ const NATIVE_ETH_PLACEHOLDER = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
10
+ export const setupMintMarketContracts = (llamalend, llammaData) => {
11
+ const isV2Controller = llammaData.is_deleverage_supported === true;
12
+ llamalend.setContract(llammaData.amm_address, llammaABI);
13
+ llamalend.setContract(llammaData.controller_address, isV2Controller ? controllerV2ABI : controllerABI);
14
+ llamalend.setContract(llammaData.monetary_policy_address, resolveMonetaryPolicyAbi(llammaData.monetary_policy_address));
15
+ if (llammaData.collateral_address === NATIVE_ETH_PLACEHOLDER) {
16
+ llamalend.setContract(llamalend.constants.WETH, ERC20ABI);
17
+ }
18
+ else {
19
+ llamalend.setContract(llammaData.collateral_address, ERC20ABI);
20
+ }
21
+ llamalend.setContract(llammaData.leverage_zap, LeverageZapCrvUSDABI);
22
+ llamalend.setContract(llammaData.deleverage_zap, DeleverageZapABI);
23
+ if (llammaData.health_calculator_zap && llammaData.health_calculator_zap !== llamalend.constants.ZERO_ADDRESS) {
24
+ llamalend.setContract(llammaData.health_calculator_zap, HealthCalculatorZapABI);
25
+ }
26
+ llamalend.constants.DECIMALS[llammaData.collateral_address] = llammaData.collateral_decimals;
27
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curvefi/llamalend-api",
3
- "version": "2.0.23",
3
+ "version": "2.0.26",
4
4
  "description": "JavaScript library for Curve Lending",
5
5
  "main": "lib/index.js",
6
6
  "author": "Macket",
@@ -670,78 +670,6 @@
670
670
  "stateMutability": "nonpayable",
671
671
  "type": "function"
672
672
  },
673
- {
674
- "inputs": [
675
- {
676
- "name": "_user",
677
- "type": "address"
678
- },
679
- {
680
- "name": "_min_x",
681
- "type": "uint256"
682
- },
683
- {
684
- "name": "_frac",
685
- "type": "uint256"
686
- }
687
- ],
688
- "name": "liquidate",
689
- "outputs": [],
690
- "stateMutability": "nonpayable",
691
- "type": "function"
692
- },
693
- {
694
- "inputs": [
695
- {
696
- "name": "_user",
697
- "type": "address"
698
- },
699
- {
700
- "name": "_min_x",
701
- "type": "uint256"
702
- },
703
- {
704
- "name": "_frac",
705
- "type": "uint256"
706
- },
707
- {
708
- "name": "_callbacker",
709
- "type": "address"
710
- }
711
- ],
712
- "name": "liquidate",
713
- "outputs": [],
714
- "stateMutability": "nonpayable",
715
- "type": "function"
716
- },
717
- {
718
- "inputs": [
719
- {
720
- "name": "_user",
721
- "type": "address"
722
- },
723
- {
724
- "name": "_min_x",
725
- "type": "uint256"
726
- },
727
- {
728
- "name": "_frac",
729
- "type": "uint256"
730
- },
731
- {
732
- "name": "_callbacker",
733
- "type": "address"
734
- },
735
- {
736
- "name": "_calldata",
737
- "type": "bytes"
738
- }
739
- ],
740
- "name": "liquidate",
741
- "outputs": [],
742
- "stateMutability": "nonpayable",
743
- "type": "function"
744
- },
745
673
  {
746
674
  "inputs": [],
747
675
  "name": "save_rate",
@@ -1263,27 +1191,6 @@
1263
1191
  "stateMutability": "view",
1264
1192
  "type": "function"
1265
1193
  },
1266
- {
1267
- "inputs": [
1268
- {
1269
- "name": "_user",
1270
- "type": "address"
1271
- },
1272
- {
1273
- "name": "_frac",
1274
- "type": "uint256"
1275
- }
1276
- ],
1277
- "name": "tokens_to_liquidate",
1278
- "outputs": [
1279
- {
1280
- "name": "",
1281
- "type": "uint256"
1282
- }
1283
- ],
1284
- "stateMutability": "view",
1285
- "type": "function"
1286
- },
1287
1194
  {
1288
1195
  "inputs": [
1289
1196
  {
@@ -1,6 +1,4 @@
1
1
  import { IDict, ILlamma } from "../interfaces.js";
2
- import MonetaryPolicyABI from './abis/crvUSD/MonetaryPolicy.json' with {type: 'json'};
3
- import MonetaryPolicy2ABI from './abis/crvUSD/MonetaryPolicy2.json' with {type: 'json'};
4
2
  import { lowerCaseLlammasAddresses } from "./utils.js";
5
3
 
6
4
 
@@ -18,7 +16,6 @@ export const LLAMMAS: IDict<ILlamma> = lowerCaseLlammasAddresses({
18
16
  max_bands: 50,
19
17
  default_bands: 10,
20
18
  A: 100,
21
- monetary_policy_abi: MonetaryPolicyABI,
22
19
  },
23
20
  wsteth: {
24
21
  amm_address: '0x37417b2238aa52d0dd2d6252d989e728e8f706e4',
@@ -33,7 +30,6 @@ export const LLAMMAS: IDict<ILlamma> = lowerCaseLlammasAddresses({
33
30
  max_bands: 50,
34
31
  default_bands: 10,
35
32
  A: 100,
36
- monetary_policy_abi: MonetaryPolicy2ABI,
37
33
  },
38
34
  wbtc: {
39
35
  amm_address: '0xe0438eb3703bf871e31ce639bd351109c88666ea',
@@ -49,7 +45,6 @@ export const LLAMMAS: IDict<ILlamma> = lowerCaseLlammasAddresses({
49
45
  max_bands: 50,
50
46
  default_bands: 10,
51
47
  A: 100,
52
- monetary_policy_abi: MonetaryPolicy2ABI,
53
48
  },
54
49
  eth: {
55
50
  amm_address: '0x1681195c176239ac5e72d9aebacf5b2492e0c4ee',
@@ -64,7 +59,6 @@ export const LLAMMAS: IDict<ILlamma> = lowerCaseLlammasAddresses({
64
59
  max_bands: 50,
65
60
  default_bands: 10,
66
61
  A: 100,
67
- monetary_policy_abi: MonetaryPolicy2ABI,
68
62
  },
69
63
  sfrxeth2: {
70
64
  amm_address: '0xfa96ad0a9e64261db86950e2da362f5572c5c6fd',
@@ -79,7 +73,6 @@ export const LLAMMAS: IDict<ILlamma> = lowerCaseLlammasAddresses({
79
73
  max_bands: 50,
80
74
  default_bands: 10,
81
75
  A: 100,
82
- monetary_policy_abi: MonetaryPolicy2ABI,
83
76
  },
84
77
  tbtc: {
85
78
  amm_address: '0xf9bd9da2427a50908c4c6d1599d8e62837c2bcb0',
@@ -94,6 +87,5 @@ export const LLAMMAS: IDict<ILlamma> = lowerCaseLlammasAddresses({
94
87
  max_bands: 50,
95
88
  default_bands: 10,
96
89
  A: 100,
97
- monetary_policy_abi: MonetaryPolicy2ABI,
98
90
  },
99
91
  });
package/src/index.ts CHANGED
@@ -45,6 +45,8 @@ import {
45
45
  redeemEstimateGas,
46
46
  redeem,
47
47
  } from "./st-crvUSD.js";
48
+ import {getMintMarketByData} from "./mintMarkets/mintMarketConstructor.js";
49
+ import {getLendMarketByData} from "./lendMarkets/lendMarketConstructor.js";
48
50
 
49
51
 
50
52
  export function createLlamalend() {
@@ -73,6 +75,8 @@ export function createLlamalend() {
73
75
  // Market constructors
74
76
  getLendMarket: getLendMarket.bind(llamalend),
75
77
  getMintMarket: getMintMarket.bind(llamalend),
78
+ getLendMarketByData: getLendMarketByData.bind(llamalend),
79
+ getMintMarketByData: getMintMarketByData.bind(llamalend),
76
80
 
77
81
  // Utility functions
78
82
  totalSupply: totalSupply.bind(llamalend),
package/src/interfaces.ts CHANGED
@@ -40,7 +40,6 @@ export interface ILlamma {
40
40
  max_bands: number,
41
41
  default_bands: number,
42
42
  A: number,
43
- monetary_policy_abi: any
44
43
  is_deleverage_supported?: boolean
45
44
  index?: number
46
45
  }
@@ -226,7 +225,6 @@ export interface ILlamma {
226
225
  max_bands: number,
227
226
  default_bands: number,
228
227
  A: number,
229
- monetary_policy_abi: any
230
228
  }
231
229
 
232
230
  export interface IResponseApi {
@@ -1,19 +1,7 @@
1
1
  import type { Llamalend } from "../../llamalend.js";
2
2
  import type { ICoin, IDict } from "../../interfaces.js";
3
3
  import { getFactoryMarketDataV1, getFactoryMarketDataV2, getFactoryMarketDataByAPI } from "./fetchFactoryData.js";
4
-
5
- import LlammaABI from '../../constants/abis/Llamma.json' with {type: 'json'};
6
- import ControllerABI from '../../constants/abis/Controller.json' with {type: 'json'};
7
- import ControllerV2ABI from '../../constants/abis/ControllerV2.json' with {type: 'json'};
8
- import MonetaryPolicyABI from '../../constants/abis/MonetaryPolicy.json' with {type: 'json'};
9
- import VaultABI from '../../constants/abis/Vault.json' with {type: 'json'};
10
- import GaugeABI from '../../constants/abis/GaugeV5.json' with {type: 'json'};
11
- import SidechainGaugeABI from '../../constants/abis/SidechainGauge.json' with {type: 'json'};
12
-
13
- const controllerAbiMap = {
14
- 'v1' : ControllerABI,
15
- 'v2' : ControllerV2ABI,
16
- }
4
+ import { setupLendMarketContracts } from "../setupContracts.js";
17
5
 
18
6
  const registerMarkets = (
19
7
  llamalend: Llamalend,
@@ -29,13 +17,6 @@ const registerMarkets = (
29
17
  version: 'v1' | 'v2'
30
18
  ) => {
31
19
  amms.forEach((amm: string, index: number) => {
32
- llamalend.setContract(amms[index], LlammaABI);
33
- llamalend.setContract(controllers[index], controllerAbiMap[version]);
34
- llamalend.setContract(monetary_policies[index], MonetaryPolicyABI);
35
- llamalend.setContract(vaults[index], VaultABI);
36
- if (gauges[index]) {
37
- llamalend.setContract(gauges[index], llamalend.chainId === 1 ? GaugeABI : SidechainGaugeABI);
38
- }
39
20
  COIN_DATA[vaults[index]] = {
40
21
  address: vaults[index],
41
22
  decimals: 18,
@@ -48,8 +29,6 @@ const registerMarkets = (
48
29
  name: "curve.finance " + COIN_DATA[borrowed_tokens[index]].name + " Gauge Deposit",
49
30
  symbol: "cv" + COIN_DATA[borrowed_tokens[index]].symbol + "-gauge",
50
31
  };
51
- llamalend.constants.DECIMALS[vaults[index]] = 18;
52
- llamalend.constants.DECIMALS[gauges[index]] = 18;
53
32
 
54
33
  const marketData = {
55
34
  name: names[index] || `${COIN_DATA[collateral_tokens[index]].symbol}/${COIN_DATA[borrowed_tokens[index]].symbol}`,
@@ -67,6 +46,8 @@ const registerMarkets = (
67
46
  collateral_token: COIN_DATA[collateral_tokens[index]],
68
47
  };
69
48
 
49
+ setupLendMarketContracts(llamalend, marketData);
50
+
70
51
  if (version === 'v2') {
71
52
  llamalend.constants.ONE_WAY_MARKETS_V2[`one-way-market-v2-${index}`] = marketData;
72
53
  } else {
@@ -1,5 +1,7 @@
1
1
  import { LendMarketTemplate} from "./LendMarketTemplate.js";
2
+ import type { IOneWayMarket } from "../interfaces.js";
2
3
  import type { Llamalend } from "../llamalend.js";
4
+ import { setupLendMarketContracts } from "./setupContracts.js";
3
5
 
4
6
  export const getLendMarket = function (this: Llamalend, lendMarketId: string): LendMarketTemplate<'v1'> | LendMarketTemplate<'v2'> {
5
7
  if (!(lendMarketId in this.lendMarkets)) {
@@ -13,3 +15,15 @@ export const getLendMarket = function (this: Llamalend, lendMarketId: string): L
13
15
  }
14
16
  return this.lendMarkets[lendMarketId];
15
17
  }
18
+
19
+ export const getLendMarketByData = function (this: Llamalend, id: string, marketData: IOneWayMarket): LendMarketTemplate<'v1'> | LendMarketTemplate<'v2'> {
20
+ setupLendMarketContracts(this, marketData);
21
+
22
+ if (marketData.version === 'v2') {
23
+ this.lendMarkets[id] = new LendMarketTemplate<'v2'>(id, marketData, this);
24
+ } else {
25
+ this.lendMarkets[id] = new LendMarketTemplate<'v1'>(id, marketData, this);
26
+ }
27
+
28
+ return this.lendMarkets[id];
29
+ }
@@ -0,0 +1,39 @@
1
+ import type { Llamalend } from "../llamalend.js";
2
+ import type { IOneWayMarket } from "../interfaces.js";
3
+
4
+ import LlammaABI from '../constants/abis/Llamma.json' with {type: 'json'};
5
+ import ControllerABI from '../constants/abis/Controller.json' with {type: 'json'};
6
+ import ControllerV2ABI from '../constants/abis/ControllerV2.json' with {type: 'json'};
7
+ import MonetaryPolicyABI from '../constants/abis/MonetaryPolicy.json' with {type: 'json'};
8
+ import VaultABI from '../constants/abis/Vault.json' with {type: 'json'};
9
+ import GaugeABI from '../constants/abis/GaugeV5.json' with {type: 'json'};
10
+ import SidechainGaugeABI from '../constants/abis/SidechainGauge.json' with {type: 'json'};
11
+ import ERC20ABI from '../constants/abis/ERC20.json' with {type: 'json'};
12
+
13
+ const controllerAbiMap = {
14
+ v1: ControllerABI,
15
+ v2: ControllerV2ABI,
16
+ };
17
+
18
+ const VAULT_DECIMALS = 18;
19
+ const GAUGE_DECIMALS = 18;
20
+
21
+ export const setupLendMarketContracts = (llamalend: Llamalend, marketData: IOneWayMarket): void => {
22
+ const { addresses, borrowed_token, collateral_token, version } = marketData;
23
+
24
+ llamalend.setContract(addresses.amm, LlammaABI);
25
+ llamalend.setContract(addresses.controller, controllerAbiMap[version]);
26
+ llamalend.setContract(addresses.monetary_policy, MonetaryPolicyABI);
27
+ llamalend.setContract(addresses.vault, VaultABI);
28
+ llamalend.setContract(addresses.gauge, llamalend.chainId === 1 ? GaugeABI : SidechainGaugeABI);
29
+
30
+ llamalend.setContract(borrowed_token.address, ERC20ABI);
31
+ llamalend.setContract(collateral_token.address, ERC20ABI);
32
+
33
+ llamalend.constants.DECIMALS[borrowed_token.address] = borrowed_token.decimals;
34
+ llamalend.constants.DECIMALS[collateral_token.address] = collateral_token.decimals;
35
+ llamalend.constants.DECIMALS[addresses.vault] = VAULT_DECIMALS;
36
+ if (addresses.gauge && addresses.gauge !== llamalend.constants.ZERO_ADDRESS) {
37
+ llamalend.constants.DECIMALS[addresses.gauge] = GAUGE_DECIMALS;
38
+ }
39
+ };
package/src/llamalend.ts CHANGED
@@ -45,10 +45,10 @@ import {
45
45
  COINS_SONIC,
46
46
  } from "./constants/coins.js";
47
47
  import {LLAMMAS} from "./constants/llammas.js";
48
+ import {resolveMonetaryPolicyAbi} from "./mintMarkets/monetaryPolicyAbi.js";
48
49
  import {L2Networks} from "./constants/L2Networks.js";
49
50
  import {createCall, handleMultiCallResponse} from "./utils.js";
50
51
  import {_getMarketsData, _getCrvUsdMarketsData} from "./external-api.js";
51
- import {extractDecimals} from "./constants/utils.js";
52
52
  import {MintMarketTemplate} from "./mintMarkets";
53
53
  import {LendMarketTemplate} from "./lendMarkets";
54
54
  import {fetchOneWayMarketsByBlockchain, fetchOneWayMarketsByAPI} from "./lendMarkets/fetch/fetchLendMarkets.js";
@@ -310,7 +310,6 @@ class Llamalend implements ILlamalend {
310
310
 
311
311
 
312
312
  this.constants.DECIMALS = {
313
- ...extractDecimals(this.constants.LLAMMAS),
314
313
  [this.crvUsdAddress]: 18,
315
314
  [this.constants.ALIASES.crv]: 18,
316
315
  [this.constants.ALIASES.crvUSD]: 18,
@@ -416,7 +415,7 @@ class Llamalend implements ILlamalend {
416
415
  }
417
416
 
418
417
  for (const llamma of llammas) {
419
- this.setContract(llamma.monetary_policy_address, llamma.monetary_policy_abi);
418
+ this.setContract(llamma.monetary_policy_address, resolveMonetaryPolicyAbi(llamma.monetary_policy_address));
420
419
  if (llamma.collateral_address === "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee") {
421
420
  this.setContract(this.constants.WETH, ERC20ABI);
422
421
  } else {
@@ -5,7 +5,9 @@ import llammaABI from "../../constants/abis/crvUSD/llamma.json" with {type: 'jso
5
5
  import controllerABI from "../../constants/abis/crvUSD/controller.json" with {type: 'json'};
6
6
  import controllerV2ABI from "../../constants/abis/crvUSD/controller_v2.json";
7
7
  import FactoryABI from "../../constants/abis/crvUSD/Factory.json" with {type: 'json'};
8
- import MonetaryPolicy2ABI from "../../constants/abis/crvUSD/MonetaryPolicy2.json" with {type: 'json'};
8
+ import {extractDecimals} from "../../constants/utils.js";
9
+ import {handleMultiCallResponse} from "../../utils.js";
10
+ import {resolveMonetaryPolicyAbi} from "../monetaryPolicyAbi.js";
9
11
 
10
12
  export const fetchMintMarketsByAPI = async (llamalend: Llamalend): Promise<void> => {
11
13
  if (llamalend.chainId !== 1) return;
@@ -35,7 +37,7 @@ export const fetchMintMarketsByAPI = async (llamalend: Llamalend): Promise<void>
35
37
  const collateral_symbol = market.collateral_token.symbol;
36
38
  const monetary_policy_address = market.monetary_policy_address.toLowerCase();
37
39
 
38
- llamalend.setContract(monetary_policy_address, MonetaryPolicy2ABI);
40
+ llamalend.setContract(monetary_policy_address, resolveMonetaryPolicyAbi(monetary_policy_address));
39
41
 
40
42
  const _llammaId = is_eth ? "eth" : collateral_symbol.toLowerCase();
41
43
  let llammaId = _llammaId;
@@ -55,11 +57,12 @@ export const fetchMintMarketsByAPI = async (llamalend: Llamalend): Promise<void>
55
57
  max_bands: 50,
56
58
  default_bands: 10,
57
59
  A: market.amm_a,
58
- monetary_policy_abi: MonetaryPolicy2ABI,
59
60
  is_deleverage_supported: true,
60
61
  index: N1 + i,
61
62
  };
62
63
  }
64
+
65
+ llamalend.constants.DECIMALS = {...llamalend.constants.DECIMALS, ...extractDecimals(llamalend.constants.LLAMMAS)}
63
66
  };
64
67
 
65
68
  export const fetchMintMarketsByBlockchain = async (llamalend: Llamalend): Promise<void> => {
@@ -71,6 +74,8 @@ export const fetchMintMarketsByBlockchain = async (llamalend: Llamalend): Promis
71
74
 
72
75
  const N1 = Object.keys(llamalend.constants.LLAMMAS).length;
73
76
  const N2 = await factoryContract.n_collaterals(llamalend.constantOptions);
77
+
78
+ const coreCallsMap = ['collaterals', 'amms', 'controllers'];
74
79
  let calls = [];
75
80
  for (let i = N1; i < N2; i++) {
76
81
  calls.push(
@@ -79,46 +84,47 @@ export const fetchMintMarketsByBlockchain = async (llamalend: Llamalend): Promis
79
84
  factoryMulticallContract.controllers(i)
80
85
  );
81
86
  }
82
- const res: string[] = (await llamalend.multicallProvider.all(calls) as string[]).map((c) => c.toLowerCase());
83
- const collaterals = res.filter((a, i) => i % 3 == 0) as string[];
84
- const amms = res.filter((a, i) => i % 3 == 1) as string[];
85
- const controllers = res.filter((a, i) => i % 3 == 2) as string[];
87
+
88
+ const coreAddresses = (await llamalend.multicallProvider.all(calls) as string[]).map((c) => c.toLowerCase());
89
+ const { collaterals, amms, controllers } = handleMultiCallResponse(coreCallsMap, coreAddresses) as {
90
+ collaterals: string[]; amms: string[]; controllers: string[];
91
+ };
86
92
 
87
93
  if (collaterals.length === 0) return;
88
94
 
95
+ const N = collaterals.length;
96
+
89
97
  for (const collateral of collaterals) llamalend.setContract(collateral, ERC20ABI);
98
+ for (const amm of amms) llamalend.setContract(amm, llammaABI);
99
+ for (let i = 0; i < N; i++) {
100
+ llamalend.setContract(controllers[i], i >= N - 3 ? controllerV2ABI : controllerABI);
101
+ }
90
102
 
103
+ const detailsCallsMap = ['symbols', 'decimals', 'amm_a', 'monetary_policies'];
91
104
  calls = [];
92
- for (const collateral of collaterals) {
105
+ for (let i = 0; i < N; i++) {
93
106
  calls.push(
94
- llamalend.contracts[collateral].multicallContract.symbol(),
95
- llamalend.contracts[collateral].multicallContract.decimals()
107
+ llamalend.contracts[collaterals[i]].multicallContract.symbol(),
108
+ llamalend.contracts[collaterals[i]].multicallContract.decimals(),
109
+ llamalend.contracts[amms[i]].multicallContract.A(),
110
+ llamalend.contracts[controllers[i]].multicallContract.monetary_policy()
96
111
  );
97
112
  }
98
- const collateralData = (await llamalend.multicallProvider.all(calls)).map((x) => {
99
- if (typeof x === "string") return x.toLowerCase();
100
- return x;
101
- });
102
113
 
103
- calls = [];
104
- for (const amm of amms) {
105
- llamalend.setContract(amm, llammaABI);
106
- calls.push(llamalend.contracts[amm].multicallContract.A());
107
- }
108
- const AParams = (await llamalend.multicallProvider.all(calls)).map((x) => Number(x));
109
-
110
- for (let i = 0; i < collaterals.length; i++) {
111
- const is_eth = collaterals[i] === llamalend.constants.WETH;
112
- const [collateral_symbol, collateral_decimals] = collateralData.splice(0, 2) as [string, number];
114
+ const flat = (await llamalend.multicallProvider.all(calls)).map((x) =>
115
+ typeof x === "string" ? x.toLowerCase() : x
116
+ );
117
+ const { symbols, decimals, amm_a, monetary_policies } = handleMultiCallResponse(detailsCallsMap, flat) as {
118
+ symbols: string[]; decimals: unknown[]; amm_a: unknown[]; monetary_policies: string[];
119
+ };
113
120
 
114
- if (i >= collaterals.length - 3) {
115
- llamalend.setContract(controllers[i], controllerV2ABI);
116
- } else {
117
- llamalend.setContract(controllers[i], controllerABI);
118
- }
121
+ for (const mp of monetary_policies) llamalend.setContract(mp, resolveMonetaryPolicyAbi(mp));
119
122
 
120
- const monetary_policy_address = (await llamalend.contracts[controllers[i]].contract.monetary_policy(llamalend.constantOptions)).toLowerCase();
121
- llamalend.setContract(monetary_policy_address, MonetaryPolicy2ABI);
123
+ for (let i = 0; i < N; i++) {
124
+ const is_eth = collaterals[i] === llamalend.constants.WETH;
125
+ const collateral_symbol = symbols[i];
126
+ const collateral_decimals = Number(decimals[i]);
127
+ const monetary_policy_address = monetary_policies[i];
122
128
 
123
129
  const _llammaId: string = is_eth ? "eth" : collateral_symbol.toLowerCase();
124
130
  let llammaId = _llammaId;
@@ -137,10 +143,11 @@ export const fetchMintMarketsByBlockchain = async (llamalend: Llamalend): Promis
137
143
  min_bands: 4,
138
144
  max_bands: 50,
139
145
  default_bands: 10,
140
- A: AParams[i],
141
- monetary_policy_abi: MonetaryPolicy2ABI,
146
+ A: Number(amm_a[i]),
142
147
  is_deleverage_supported: true,
143
148
  index: N1 + i,
144
149
  };
145
150
  }
151
+
152
+ llamalend.constants.DECIMALS = {...llamalend.constants.DECIMALS, ...extractDecimals(llamalend.constants.LLAMMAS)}
146
153
  };
@@ -1,5 +1,7 @@
1
1
  import { MintMarketTemplate} from "./MintMarketTemplate.js";
2
+ import type { ILlamma } from "../interfaces.js";
2
3
  import type { Llamalend } from "../llamalend.js";
4
+ import { setupMintMarketContracts } from "./setupContracts.js";
3
5
 
4
6
  export const getMintMarket = function (this: Llamalend, mintMarketId: string): MintMarketTemplate {
5
7
  if (!(mintMarketId in this.mintMarkets)) {
@@ -9,3 +11,10 @@ export const getMintMarket = function (this: Llamalend, mintMarketId: string): M
9
11
  }
10
12
  return this.mintMarkets[mintMarketId]
11
13
  }
14
+
15
+ export const getMintMarketByData = function (this: Llamalend, id: string, llammaData: ILlamma): MintMarketTemplate {
16
+ setupMintMarketContracts(this, llammaData);
17
+ this.mintMarkets[id] = new MintMarketTemplate(id, llammaData, this);
18
+
19
+ return this.mintMarkets[id];
20
+ }
@@ -0,0 +1,12 @@
1
+ import MonetaryPolicyABI from "../constants/abis/crvUSD/MonetaryPolicy.json" with { type: "json" };
2
+ import MonetaryPolicy2ABI from "../constants/abis/crvUSD/MonetaryPolicy2.json" with { type: "json" };
3
+
4
+ const LEGACY_MONETARY_POLICIES: ReadonlySet<string> = new Set([
5
+ "0xc684432fd6322c6d58b6bc5d28b18569aa0ad0a1",
6
+ ]);
7
+
8
+ export const resolveMonetaryPolicyAbi = (monetaryPolicyAddress: string): any => {
9
+ return LEGACY_MONETARY_POLICIES.has(monetaryPolicyAddress.toLowerCase())
10
+ ? MonetaryPolicyABI
11
+ : MonetaryPolicy2ABI;
12
+ };
@@ -0,0 +1,35 @@
1
+ import type { Llamalend } from "../llamalend.js";
2
+ import type { ILlamma } from "../interfaces.js";
3
+
4
+ import ERC20ABI from "../constants/abis/ERC20.json" with { type: "json" };
5
+ import llammaABI from "../constants/abis/crvUSD/llamma.json" with { type: "json" };
6
+ import controllerABI from "../constants/abis/crvUSD/controller.json" with { type: "json" };
7
+ import controllerV2ABI from "../constants/abis/crvUSD/controller_v2.json" with { type: "json" };
8
+ import LeverageZapCrvUSDABI from "../constants/abis/crvUSD/LeverageZap.json" with { type: "json" };
9
+ import DeleverageZapABI from "../constants/abis/crvUSD/DeleverageZap.json" with { type: "json" };
10
+ import HealthCalculatorZapABI from "../constants/abis/crvUSD/HealthCalculatorZap.json" with { type: "json" };
11
+ import { resolveMonetaryPolicyAbi } from "./monetaryPolicyAbi.js";
12
+
13
+ const NATIVE_ETH_PLACEHOLDER = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
14
+
15
+ export const setupMintMarketContracts = (llamalend: Llamalend, llammaData: ILlamma): void => {
16
+ const isV2Controller = llammaData.is_deleverage_supported === true;
17
+
18
+ llamalend.setContract(llammaData.amm_address, llammaABI);
19
+ llamalend.setContract(llammaData.controller_address, isV2Controller ? controllerV2ABI : controllerABI);
20
+ llamalend.setContract(llammaData.monetary_policy_address, resolveMonetaryPolicyAbi(llammaData.monetary_policy_address));
21
+
22
+ if (llammaData.collateral_address === NATIVE_ETH_PLACEHOLDER) {
23
+ llamalend.setContract(llamalend.constants.WETH, ERC20ABI);
24
+ } else {
25
+ llamalend.setContract(llammaData.collateral_address, ERC20ABI);
26
+ }
27
+
28
+ llamalend.setContract(llammaData.leverage_zap, LeverageZapCrvUSDABI);
29
+ llamalend.setContract(llammaData.deleverage_zap, DeleverageZapABI);
30
+ if (llammaData.health_calculator_zap && llammaData.health_calculator_zap !== llamalend.constants.ZERO_ADDRESS) {
31
+ llamalend.setContract(llammaData.health_calculator_zap, HealthCalculatorZapABI);
32
+ }
33
+
34
+ llamalend.constants.DECIMALS[llammaData.collateral_address] = llammaData.collateral_decimals;
35
+ };