@defisaver/positions-sdk 2.1.168 → 2.1.169-custom-fetching-2-dev

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 (42) hide show
  1. package/cjs/helpers/aaveV4Helpers/index.js +11 -1
  2. package/cjs/markets/morphoBlue/index.d.ts +2 -0
  3. package/cjs/markets/morphoBlue/index.js +18 -1
  4. package/cjs/moneymarket/moneymarketCommonService.js +12 -2
  5. package/cjs/portfolio/customDeFiData.d.ts +3 -0
  6. package/cjs/portfolio/customDeFiData.js +263 -0
  7. package/cjs/portfolio/index.d.ts +1 -0
  8. package/cjs/portfolio/index.js +15 -851
  9. package/cjs/services/viem.d.ts +2 -0
  10. package/cjs/services/viem.js +27 -1
  11. package/cjs/types/common.d.ts +1 -0
  12. package/cjs/types/common.js +1 -0
  13. package/cjs/types/morphoBlue.d.ts +1 -0
  14. package/cjs/types/morphoBlue.js +1 -0
  15. package/cjs/types/portfolio.d.ts +36 -0
  16. package/cjs/types/portfolio.js +18 -0
  17. package/esm/helpers/aaveV4Helpers/index.js +11 -1
  18. package/esm/markets/morphoBlue/index.d.ts +2 -0
  19. package/esm/markets/morphoBlue/index.js +16 -0
  20. package/esm/moneymarket/moneymarketCommonService.js +12 -2
  21. package/esm/portfolio/customDeFiData.d.ts +3 -0
  22. package/esm/portfolio/customDeFiData.js +257 -0
  23. package/esm/portfolio/index.d.ts +1 -0
  24. package/esm/portfolio/index.js +16 -849
  25. package/esm/services/viem.d.ts +2 -0
  26. package/esm/services/viem.js +25 -0
  27. package/esm/types/common.d.ts +1 -0
  28. package/esm/types/common.js +1 -0
  29. package/esm/types/morphoBlue.d.ts +1 -0
  30. package/esm/types/morphoBlue.js +1 -0
  31. package/esm/types/portfolio.d.ts +36 -0
  32. package/esm/types/portfolio.js +17 -1
  33. package/package.json +2 -2
  34. package/src/helpers/aaveV4Helpers/index.ts +12 -1
  35. package/src/markets/morphoBlue/index.ts +16 -0
  36. package/src/moneymarket/moneymarketCommonService.ts +13 -2
  37. package/src/portfolio/customDeFiData.ts +379 -0
  38. package/src/portfolio/index.ts +16 -834
  39. package/src/services/viem.ts +14 -0
  40. package/src/types/common.ts +1 -0
  41. package/src/types/morphoBlue.ts +1 -0
  42. package/src/types/portfolio.ts +39 -0
@@ -4403,6 +4403,8 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
4403
4403
  uid?: undefined;
4404
4404
  } & import("viem").ExactPartial<Pick<import("viem").PublicActions<import("viem").Transport, undefined, undefined>, "getBlockNumber" | "call" | "createContractEventFilter" | "createEventFilter" | "estimateContractGas" | "estimateGas" | "getBlock" | "getChainId" | "getContractEvents" | "getEnsText" | "getFilterChanges" | "getGasPrice" | "getLogs" | "getTransaction" | "getTransactionCount" | "getTransactionReceipt" | "prepareTransactionRequest" | "readContract" | "sendRawTransaction" | "simulateContract" | "uninstallFilter" | "watchBlockNumber" | "watchContractEvent"> & Pick<import("viem").WalletActions<undefined, undefined>, "sendTransaction" | "writeContract">>>(fn: (client: import("viem").Client<import("viem").Transport, undefined, undefined, import("viem").PublicRpcSchema, import("viem").PublicActions<import("viem").Transport, undefined>>) => client) => import("viem").Client<import("viem").Transport, undefined, undefined, import("viem").PublicRpcSchema, { [K in keyof client]: client[K]; } & import("viem").PublicActions<import("viem").Transport, undefined>>;
4405
4405
  };
4406
+ /** Rewrites 'latest' reads so a client built on this provider sees a fixed block. */
4407
+ export declare const pinProviderBlock: (provider: EthereumProvider, blockNumber: number | bigint) => EthereumProvider;
4406
4408
  export declare const setViemBlockNumber: (block: Blockish) => {
4407
4409
  blockNumber?: undefined;
4408
4410
  } | {
@@ -1,6 +1,15 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setViemBlockNumber = exports.getViemProvider = exports.getViemChain = void 0;
12
+ exports.setViemBlockNumber = exports.pinProviderBlock = exports.getViemProvider = exports.getViemChain = void 0;
4
13
  exports.encodeCalldata = encodeCalldata;
5
14
  const viem_1 = require("viem");
6
15
  const chains_1 = require("viem/chains");
@@ -26,6 +35,23 @@ const getViemChain = (network) => {
26
35
  exports.getViemChain = getViemChain;
27
36
  const getViemProvider = (provider, network, options) => (0, viem_1.createPublicClient)(Object.assign({ transport: (0, viem_1.custom)(provider), chain: (0, exports.getViemChain)(network) }, options));
28
37
  exports.getViemProvider = getViemProvider;
38
+ /** Rewrites 'latest' reads so a client built on this provider sees a fixed block. */
39
+ const pinProviderBlock = (provider, blockNumber) => {
40
+ const block = `0x${BigInt(blockNumber).toString(16)}`;
41
+ return {
42
+ request: (args) => __awaiter(void 0, void 0, void 0, function* () {
43
+ const params = [...(args.params || [])];
44
+ if (args.method === 'eth_blockNumber')
45
+ return block;
46
+ if (['eth_call', 'eth_getCode', 'eth_getBalance', 'eth_getStorageAt'].includes(args.method) && (params[1] === undefined || params[1] === 'latest'))
47
+ params[1] = block;
48
+ if (args.method === 'eth_getBlockByNumber' && params[0] === 'latest')
49
+ params[0] = block;
50
+ return provider.request(Object.assign(Object.assign({}, args), { params }));
51
+ }),
52
+ };
53
+ };
54
+ exports.pinProviderBlock = pinProviderBlock;
29
55
  const setViemBlockNumber = (block) => {
30
56
  if (block === 'latest')
31
57
  return {};
@@ -22,6 +22,7 @@ export declare enum LeverageType {
22
22
  Short = "short",
23
23
  VolatilePair = "volatile-pair",
24
24
  VolatilePairReverse = "volatile-pair-reverse",
25
+ StablePair = "stable-pair",
25
26
  None = ""
26
27
  }
27
28
  export interface IncentiveData {
@@ -30,6 +30,7 @@ var LeverageType;
30
30
  LeverageType["Short"] = "short";
31
31
  LeverageType["VolatilePair"] = "volatile-pair";
32
32
  LeverageType["VolatilePairReverse"] = "volatile-pair-reverse";
33
+ LeverageType["StablePair"] = "stable-pair";
33
34
  LeverageType["None"] = "";
34
35
  })(LeverageType || (exports.LeverageType = LeverageType = {}));
35
36
  var NetworkNumber;
@@ -110,6 +110,7 @@ export declare enum MorphoBlueVersions {
110
110
  MorphoBlueUSDeUSDC_915_Base = "morphoblueusdeusdc_915_base",// USDe/USDC 0.915
111
111
  MorphoBlueCbEthUSDC_770_Base = "morphobluecbethusdc_770_base",// cbETH/USDC 0.77
112
112
  MorphoBlueCbXRPUSDC_625_Base = "morphobluecbxrpusdc_625_base",// cbXRP/USDC 0.625
113
+ MorphoBlueCbHYPEUSDC_625_Base = "morphobluecbhypeusdc_625_base",// cbHYPE/USDC 0.625
113
114
  MorphoBlueSyrupUSDCUSDC_915_Arb = "morphobluesyrupusdcusdc_915_arb",// syrupUSDC/USDC
114
115
  MorphoBlueWBTCUSDC_860_Arb = "morphobluewbtcusdc_860_arb",// WBTC/USDC
115
116
  MorphoBlueWstEthUSDC_860_Arb = "morphobluewstethusdc_860_arb",// wstETH/USDC
@@ -120,6 +120,7 @@ var MorphoBlueVersions;
120
120
  MorphoBlueVersions["MorphoBlueUSDeUSDC_915_Base"] = "morphoblueusdeusdc_915_base";
121
121
  MorphoBlueVersions["MorphoBlueCbEthUSDC_770_Base"] = "morphobluecbethusdc_770_base";
122
122
  MorphoBlueVersions["MorphoBlueCbXRPUSDC_625_Base"] = "morphobluecbxrpusdc_625_base";
123
+ MorphoBlueVersions["MorphoBlueCbHYPEUSDC_625_Base"] = "morphobluecbhypeusdc_625_base";
123
124
  // ARBITRUM
124
125
  MorphoBlueVersions["MorphoBlueSyrupUSDCUSDC_915_Arb"] = "morphobluesyrupusdcusdc_915_arb";
125
126
  MorphoBlueVersions["MorphoBlueWBTCUSDC_860_Arb"] = "morphobluewbtcusdc_860_arb";
@@ -60,6 +60,42 @@ export interface PortfolioPositionsDataForAddress {
60
60
  export interface PortfolioPositionsData {
61
61
  [key: EthAddress]: PortfolioPositionsDataForAddress;
62
62
  }
63
+ export declare enum PortfolioProtocol {
64
+ AaveV2 = "aaveV2",
65
+ AaveV3 = "aaveV3",
66
+ AaveV4 = "aaveV4",
67
+ CompoundV2 = "compoundV2",
68
+ CompoundV3 = "compoundV3",
69
+ Spark = "spark",
70
+ MorphoBlue = "morphoBlue",
71
+ MorphoMidnight = "morphoMidnight",
72
+ CrvUsd = "crvUsd",
73
+ LlamaLend = "llamaLend",
74
+ Maker = "maker",
75
+ Liquity = "liquity",
76
+ LiquityV2 = "liquityV2",
77
+ Fluid = "fluid"
78
+ }
79
+ export interface CustomDeFiDataOptions {
80
+ /** Defaults to every protocol. */
81
+ protocols?: PortfolioProtocol[];
82
+ fetchStaking?: boolean;
83
+ fetchRewards?: boolean;
84
+ /** Keep Aave V3 / Spark positions with no supply so the eMode category is available. */
85
+ returnEmptyEModePositions?: boolean;
86
+ fetchFluidMarkets?: boolean;
87
+ isSim?: boolean;
88
+ /** viem multicall calldata cap in bytes; defaults to 250k (2k when isSim). */
89
+ batchSize?: number;
90
+ /** Pins every read to this block; defaults to latest. */
91
+ blockNumber?: number;
92
+ }
93
+ export interface CustomDeFiData {
94
+ positions: PortfolioPositionsData;
95
+ stakingPositions: Record<string, any>;
96
+ rewardsData: Record<string, any>;
97
+ markets: PortfolioMarketsData;
98
+ }
63
99
  export interface PortfolioMarketsData {
64
100
  morphoMarketsData: Record<string, MorphoBlueMarketInfo>;
65
101
  morphoMidnightMarketsData: Record<string, MorphoMidnightMarketInfo>;
@@ -1,2 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PortfolioProtocol = void 0;
4
+ var PortfolioProtocol;
5
+ (function (PortfolioProtocol) {
6
+ PortfolioProtocol["AaveV2"] = "aaveV2";
7
+ PortfolioProtocol["AaveV3"] = "aaveV3";
8
+ PortfolioProtocol["AaveV4"] = "aaveV4";
9
+ PortfolioProtocol["CompoundV2"] = "compoundV2";
10
+ PortfolioProtocol["CompoundV3"] = "compoundV3";
11
+ PortfolioProtocol["Spark"] = "spark";
12
+ PortfolioProtocol["MorphoBlue"] = "morphoBlue";
13
+ PortfolioProtocol["MorphoMidnight"] = "morphoMidnight";
14
+ PortfolioProtocol["CrvUsd"] = "crvUsd";
15
+ PortfolioProtocol["LlamaLend"] = "llamaLend";
16
+ PortfolioProtocol["Maker"] = "maker";
17
+ PortfolioProtocol["Liquity"] = "liquity";
18
+ PortfolioProtocol["LiquityV2"] = "liquityV2";
19
+ PortfolioProtocol["Fluid"] = "fluid";
20
+ })(PortfolioProtocol || (exports.PortfolioProtocol = PortfolioProtocol = {}));
@@ -151,12 +151,15 @@ export const isLeveragedPosAaveV4 = (usedAssets, dustLimit = 5) => {
151
151
  let supplyUnstable = 0;
152
152
  let longAsset = '';
153
153
  let shortAsset = '';
154
+ let stableCollAsset = '';
154
155
  Object.values(usedAssets).forEach(({ symbol, suppliedUsd, borrowedUsd, collateral, reserveId, }) => {
155
156
  const spokeAsset = `${symbol}-${reserveId}`;
156
157
  const isSupplied = (+suppliedUsd) > dustLimit; // ignore dust like <limit leftover supply
157
158
  const isBorrowed = (+borrowedUsd) > dustLimit; // ignore dust like <limit leftover supply
158
- if (isSupplied && STABLE_ASSETS.includes(symbol) && collateral)
159
+ if (isSupplied && STABLE_ASSETS.includes(symbol) && collateral) {
159
160
  supplyStable += 1;
161
+ stableCollAsset = spokeAsset;
162
+ }
160
163
  if (isBorrowed && STABLE_ASSETS.includes(symbol))
161
164
  borrowStable += 1;
162
165
  if (isBorrowed && !STABLE_ASSETS.includes(symbol)) {
@@ -171,6 +174,7 @@ export const isLeveragedPosAaveV4 = (usedAssets, dustLimit = 5) => {
171
174
  const isLong = borrowStable > 0 && borrowUnstable === 0 && supplyUnstable === 1 && supplyStable === 0;
172
175
  const isShort = supplyStable > 0 && supplyUnstable === 0 && borrowUnstable === 1 && borrowStable === 0;
173
176
  const isVolatilePair = supplyUnstable === 1 && borrowUnstable === 1 && supplyStable === 0 && borrowStable === 0;
177
+ const isStablePair = supplyStable === 1 && borrowStable === 1 && supplyUnstable === 0 && borrowUnstable === 0;
174
178
  if (isLong) {
175
179
  return {
176
180
  leveragedType: LeverageType.Long,
@@ -189,6 +193,12 @@ export const isLeveragedPosAaveV4 = (usedAssets, dustLimit = 5) => {
189
193
  leveragedAsset: longAsset,
190
194
  };
191
195
  }
196
+ if (isStablePair) {
197
+ return {
198
+ leveragedType: LeverageType.StablePair,
199
+ leveragedAsset: stableCollAsset,
200
+ };
201
+ }
192
202
  return {
193
203
  leveragedType: LeverageType.None,
194
204
  leveragedAsset: '',
@@ -109,6 +109,7 @@ export declare const MORPHO_BLUE_AERO_USDC_625_BASE: (networkId?: NetworkNumber)
109
109
  export declare const MORPHO_BLUE_USDE_USDC_915_BASE: (networkId?: NetworkNumber) => MorphoBlueMarketData;
110
110
  export declare const MORPHO_BLUE_CBETH_USDC_770_BASE: (networkId?: NetworkNumber) => MorphoBlueMarketData;
111
111
  export declare const MORPHO_BLUE_CBXRP_USDC_625_BASE: (networkId?: NetworkNumber) => MorphoBlueMarketData;
112
+ export declare const MORPHO_BLUE_CBHYPE_USDC_625_BASE: (networkId?: NetworkNumber) => MorphoBlueMarketData;
112
113
  export declare const MORPHO_BLUE_SYRUPUSDC_USDC_915_ARB: (networkId?: NetworkNumber) => MorphoBlueMarketData;
113
114
  export declare const MorphoBlueWBTCUSDC_860_Arb: (networkId?: NetworkNumber) => MorphoBlueMarketData;
114
115
  export declare const MORPHO_BLUE_WSTETH_USDC_860_ARB: (networkId?: NetworkNumber) => MorphoBlueMarketData;
@@ -226,6 +227,7 @@ export declare const MorphoBlueMarkets: (networkId: NetworkNumber) => {
226
227
  readonly morphoblueusdeusdc_915_base: MorphoBlueMarketData;
227
228
  readonly morphobluecbethusdc_770_base: MorphoBlueMarketData;
228
229
  readonly morphobluecbxrpusdc_625_base: MorphoBlueMarketData;
230
+ readonly morphobluecbhypeusdc_625_base: MorphoBlueMarketData;
229
231
  readonly morphobluewsuperoethbweth_915_base: MorphoBlueMarketData;
230
232
  readonly morphobluecbetheth_945_base: MorphoBlueMarketData;
231
233
  readonly morphobluecbetheth_965_base: MorphoBlueMarketData;
@@ -1652,6 +1652,21 @@ export const MORPHO_BLUE_CBXRP_USDC_625_BASE = (networkId = NetworkNumber.Base)
1652
1652
  marketId: '0xd4a903dc6d949519060c7707f9604fdc9772c046e05c2e3a8fce0bd7196e4109',
1653
1653
  protocolName: 'morpho-blue',
1654
1654
  });
1655
+ export const MORPHO_BLUE_CBHYPE_USDC_625_BASE = (networkId = NetworkNumber.Base) => ({
1656
+ chainIds: [NetworkNumber.Base],
1657
+ label: 'Morpho Blue',
1658
+ shortLabel: 'cbHYPE/USDC',
1659
+ value: MorphoBlueVersions.MorphoBlueCbHYPEUSDC_625_Base,
1660
+ url: 'cbhypeusdc-76629002',
1661
+ loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
1662
+ collateralToken: '0xB200000000000000000000451d033a5000cb479e',
1663
+ oracle: '0x7FaD8B8De2DDb7b4B415e1Aa3613e45EeF9E4bFf',
1664
+ oracleType: MorphoBlueOracleType.MARKET_RATE,
1665
+ irm: '0x46415998764C29aB2a25CbeA6254146D50D22687',
1666
+ lltv: 0.625,
1667
+ marketId: '0x76629002c9fdb20fb2092053a4f22c5c65e04a81887218b9546f2a2d82b4c0a8',
1668
+ protocolName: 'morpho-blue',
1669
+ });
1655
1670
  // ARBITRUM
1656
1671
  export const MORPHO_BLUE_SYRUPUSDC_USDC_915_ARB = (networkId = NetworkNumber.Eth) => ({
1657
1672
  chainIds: [NetworkNumber.Arb],
@@ -1926,6 +1941,7 @@ export const MorphoBlueMarkets = (networkId) => ({
1926
1941
  [MorphoBlueVersions.MorphoBlueUSDeUSDC_915_Base]: MORPHO_BLUE_USDE_USDC_915_BASE(networkId),
1927
1942
  [MorphoBlueVersions.MorphoBlueCbEthUSDC_770_Base]: MORPHO_BLUE_CBETH_USDC_770_BASE(networkId),
1928
1943
  [MorphoBlueVersions.MorphoBlueCbXRPUSDC_625_Base]: MORPHO_BLUE_CBXRP_USDC_625_BASE(networkId),
1944
+ [MorphoBlueVersions.MorphoBlueCbHYPEUSDC_625_Base]: MORPHO_BLUE_CBHYPE_USDC_625_BASE(networkId),
1929
1945
  [MorphoBlueVersions.MorphoBlueWsuperOETHbWETH_915_Base]: MORPHO_BLUE_WSUPEROETHB_WETH_915_BASE(networkId),
1930
1946
  [MorphoBlueVersions.MorphoBlueCbEthEth_945_Base]: MORPHO_BLUE_CBETH_ETH_945_BASE(networkId),
1931
1947
  [MorphoBlueVersions.MorphoBlueCbEthEth_965_Base]: MORPHO_BLUE_CBETH_ETH_965_BASE(networkId),
@@ -11,7 +11,7 @@ export const calcShortLiqPrice = (assetPrice, borrowedUsd, borrowLimitUsd) => ne
11
11
  export const calcLeverageLiqPrice = (leverageType, assetPrice, borrowedUsd, borrowLimitUsd) => {
12
12
  if (leverageType === LeverageType.Short || leverageType === LeverageType.VolatilePairReverse)
13
13
  return calcShortLiqPrice(assetPrice, borrowedUsd, borrowLimitUsd);
14
- if (leverageType === LeverageType.Long || leverageType === LeverageType.VolatilePair)
14
+ if (leverageType === LeverageType.Long || leverageType === LeverageType.VolatilePair || leverageType === LeverageType.StablePair)
15
15
  return calcLongLiqPrice(assetPrice, borrowedUsd, borrowLimitUsd);
16
16
  console.error('invalid leverageType', leverageType);
17
17
  return '0';
@@ -33,11 +33,14 @@ export const isLeveragedPos = (usedAssets, dustLimit = 5) => {
33
33
  let supplyUnstable = 0;
34
34
  let longAsset = '';
35
35
  let shortAsset = '';
36
+ let stableCollAsset = '';
36
37
  Object.values(usedAssets).forEach(({ symbol, suppliedUsd, borrowedUsd, collateral, }) => {
37
38
  const isSupplied = (+suppliedUsd) > dustLimit; // ignore dust like <limit leftover supply
38
39
  const isBorrowed = (+borrowedUsd) > dustLimit; // ignore dust like <limit leftover supply
39
- if (isSupplied && STABLE_ASSETS.includes(symbol) && collateral)
40
+ if (isSupplied && STABLE_ASSETS.includes(symbol) && collateral) {
40
41
  supplyStable += 1;
42
+ stableCollAsset = symbol;
43
+ }
41
44
  if (isBorrowed && STABLE_ASSETS.includes(symbol))
42
45
  borrowStable += 1;
43
46
  if (isBorrowed && !STABLE_ASSETS.includes(symbol)) {
@@ -52,6 +55,7 @@ export const isLeveragedPos = (usedAssets, dustLimit = 5) => {
52
55
  const isLong = borrowStable > 0 && borrowUnstable === 0 && supplyUnstable === 1 && supplyStable === 0;
53
56
  const isShort = supplyStable > 0 && supplyUnstable === 0 && borrowUnstable === 1 && borrowStable === 0;
54
57
  const isVolatilePair = supplyUnstable === 1 && borrowUnstable === 1 && supplyStable === 0 && borrowStable === 0;
58
+ const isStablePair = supplyStable === 1 && borrowStable === 1 && supplyUnstable === 0 && borrowUnstable === 0;
55
59
  if (isLong) {
56
60
  return {
57
61
  leveragedType: LeverageType.Long,
@@ -70,6 +74,12 @@ export const isLeveragedPos = (usedAssets, dustLimit = 5) => {
70
74
  leveragedAsset: longAsset,
71
75
  };
72
76
  }
77
+ if (isStablePair) {
78
+ return {
79
+ leveragedType: LeverageType.StablePair,
80
+ leveragedAsset: stableCollAsset,
81
+ };
82
+ }
73
83
  return {
74
84
  leveragedType: LeverageType.None,
75
85
  leveragedAsset: '',
@@ -0,0 +1,3 @@
1
+ import { EthAddress, EthereumProvider, NetworkNumber } from '../types/common';
2
+ import { CustomDeFiData, CustomDeFiDataOptions } from '../types';
3
+ export declare function getCustomDeFiData(provider: EthereumProvider, network: NetworkNumber, defaultProvider: EthereumProvider, addresses: EthAddress[], options?: CustomDeFiDataOptions): Promise<CustomDeFiData>;
@@ -0,0 +1,257 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import Dec from 'decimal.js';
11
+ import { NetworkNumber } from '../types/common';
12
+ import { AaveMarkets, AaveV4Spokes, CompoundMarkets, CrvUsdMarkets, LiquityV2Markets, LlamaLendMarkets, MakerActiveIlks, MorphoBlueMarkets, MorphoMidnightMarkets, SparkMarkets, } from '../markets';
13
+ import { AaveVersions, CompoundVersions, PortfolioProtocol, } from '../types';
14
+ import { getViemProvider, pinProviderBlock } from '../services/viem';
15
+ import { ZERO_ADDRESS } from '../constants';
16
+ import { _getAaveV2AccountData, _getAaveV2MarketsData } from '../aaveV2';
17
+ import { _getAaveV3AccountData, _getAaveV3MarketData, getStakeAaveData } from '../aaveV3';
18
+ import { _getAaveV4AccountData, _getAaveV4SpokeData } from '../aaveV4';
19
+ import { _getCompoundV2AccountData, _getCompoundV2MarketsData } from '../compoundV2';
20
+ import { _getCompoundV3AccountData, _getCompoundV3MarketsData } from '../compoundV3';
21
+ import { _getSparkAccountData, _getSparkMarketsData } from '../spark';
22
+ import { _getCurveUsdGlobalData, _getCurveUsdUserData } from '../curveUsd';
23
+ import { _getLlamaLendGlobalData, _getLlamaLendUserData } from '../llamaLend';
24
+ import { _getMorphoBlueAccountData, _getMorphoBluePortfolioMarketData, getMorphoEarn } from '../morphoBlue';
25
+ import { _getMorphoMidnightAccountData, _getMorphoMidnightMarketData } from '../morphoMidnight';
26
+ import { _getMakerCdpData, _getMakerIlksData, _getUserCdps } from '../maker';
27
+ import { _getLiquityTroveInfo, getLiquityStakingData } from '../liquity';
28
+ import { _getLiquityV2MarketData, getLiquitySAndYBold, getLiquityV2Staking } from '../liquityV2';
29
+ import { _getAllFluidMarketDataPortfolio, _getAllUserEarnPositionsWithFTokens, _getUserPositionsPortfolio } from '../fluid';
30
+ import { getUmbrellaData } from '../umbrella';
31
+ import { getMerklUnclaimedRewards, getUnclaimedRewardsForAllMarkets } from '../claiming/aaveV3';
32
+ import { fetchSparkAirdropRewards, fetchSparkRewards } from '../claiming/spark';
33
+ import { getKingRewards } from '../claiming/king';
34
+ import { fetchEthenaAirdropRewards } from '../claiming/ethena';
35
+ import { getUniswapRewards } from '../claiming/uniswap';
36
+ const lower = (address) => address.toLowerCase();
37
+ const positive = (value) => new Dec(value || '0').gt(0);
38
+ const supported = (list, network) => (Object.values(list).filter((m) => m.chainIds.includes(network)));
39
+ export function getCustomDeFiData(provider_1, network_1, defaultProvider_1, addresses_1) {
40
+ return __awaiter(this, arguments, void 0, function* (provider, network, defaultProvider, addresses, options = {}) {
41
+ var _a;
42
+ const { protocols = Object.values(PortfolioProtocol), fetchStaking = false, fetchRewards = false, returnEmptyEModePositions = false, fetchFluidMarkets = false, isSim = false, } = options;
43
+ // JSON-RPC body ends up ~4x the calldata cap; 250k keeps it under the ~2.5MB provider limit.
44
+ const batchSize = (_a = options.batchSize) !== null && _a !== void 0 ? _a : (isSim ? 2000 : 250000);
45
+ const has = (protocol) => protocols.includes(protocol);
46
+ const isMainnet = network === NetworkNumber.Eth;
47
+ const isFluidSupported = [NetworkNumber.Eth, NetworkNumber.Arb, NetworkNumber.Base, NetworkNumber.Plasma].includes(network);
48
+ const pin = (p) => (options.blockNumber !== undefined ? pinProviderBlock(p, options.blockNumber) : p);
49
+ const client = getViemProvider(pin(provider), network, { batch: { multicall: { batchSize } } });
50
+ const defaultClient = getViemProvider(pin(defaultProvider), network, { batch: { multicall: { batchSize } } });
51
+ const aaveV3Markets = has(PortfolioProtocol.AaveV3)
52
+ ? [AaveVersions.AaveV3, AaveVersions.AaveV3Lido, AaveVersions.AaveV3Etherfi].map((v) => AaveMarkets(network)[v]).filter((m) => m.chainIds.includes(network))
53
+ : [];
54
+ const aaveV2Markets = has(PortfolioProtocol.AaveV2) ? [AaveMarkets(network)[AaveVersions.AaveV2]].filter((m) => m.chainIds.includes(network)) : [];
55
+ const aaveV4Spokes = has(PortfolioProtocol.AaveV4) ? supported(AaveV4Spokes(network), network) : [];
56
+ const compoundV3Markets = has(PortfolioProtocol.CompoundV3) ? supported(CompoundMarkets(network), network).filter((m) => m.value !== CompoundVersions.CompoundV2) : [];
57
+ const compoundV2Markets = has(PortfolioProtocol.CompoundV2) ? [CompoundMarkets(network)[CompoundVersions.CompoundV2]].filter((m) => m.chainIds.includes(network)) : [];
58
+ const sparkMarkets = has(PortfolioProtocol.Spark) ? supported(SparkMarkets(network), network) : [];
59
+ const morphoMarkets = has(PortfolioProtocol.MorphoBlue) ? supported(MorphoBlueMarkets(network), network) : [];
60
+ const morphoMidnightMarkets = has(PortfolioProtocol.MorphoMidnight) ? supported(MorphoMidnightMarkets(network), network) : [];
61
+ const crvUsdMarkets = has(PortfolioProtocol.CrvUsd) ? supported(CrvUsdMarkets(network), network) : [];
62
+ const llamaLendMarkets = has(PortfolioProtocol.LlamaLend) && [NetworkNumber.Eth, NetworkNumber.Arb].includes(network) ? supported(LlamaLendMarkets(network), network) : [];
63
+ const liquityV2Markets = has(PortfolioProtocol.LiquityV2) && isMainnet ? Object.values(LiquityV2Markets(network)) : [];
64
+ const liquityV2StakingMarkets = liquityV2Markets.filter((m) => !m.isLegacy);
65
+ const fetchMaker = has(PortfolioProtocol.Maker) && isMainnet;
66
+ const fetchLiquity = has(PortfolioProtocol.Liquity) && isMainnet;
67
+ const fetchFluid = has(PortfolioProtocol.Fluid) && isFluidSupported;
68
+ const markets = {
69
+ morphoMarketsData: {},
70
+ morphoMidnightMarketsData: {},
71
+ compoundV3MarketsData: {},
72
+ sparkMarketsData: {},
73
+ aaveV3MarketsData: {},
74
+ aaveV2MarketsData: {},
75
+ compoundV2MarketsData: {},
76
+ crvUsdMarketsData: {},
77
+ llamaLendMarketsData: {},
78
+ liquityV2MarketsData: {},
79
+ aaveV4SpokesData: {},
80
+ fluidMarketsData: {},
81
+ makerMarketsData: {},
82
+ };
83
+ const makerCdps = {};
84
+ const positions = {};
85
+ const stakingPositions = {};
86
+ const rewardsData = {};
87
+ for (const address of addresses) {
88
+ positions[lower(address)] = {
89
+ aaveV3: {},
90
+ aaveV4: {},
91
+ morphoBlue: {},
92
+ morphoMidnight: {},
93
+ compoundV3: {},
94
+ spark: {},
95
+ maker: {},
96
+ aaveV2: {},
97
+ compoundV2: {},
98
+ liquity: {},
99
+ crvUsd: {},
100
+ llamaLend: {},
101
+ fluid: { error: '', data: {} },
102
+ };
103
+ if (fetchStaking) {
104
+ stakingPositions[lower(address)] = {
105
+ aaveV3: {}, morphoBlue: {}, liquity: {}, liquityV2: {}, fluid: { error: '', data: {} },
106
+ };
107
+ }
108
+ if (fetchRewards) {
109
+ rewardsData[lower(address)] = {
110
+ merkl: {}, aaveV3: {}, spark: {}, spk: {}, king: {}, ethena: {}, uniswap: {},
111
+ };
112
+ }
113
+ }
114
+ const run = (label, fetch, store, onError) => __awaiter(this, void 0, void 0, function* () {
115
+ try {
116
+ store(yield fetch());
117
+ }
118
+ catch (error) {
119
+ console.error(`Error fetching ${label}:`, error);
120
+ onError({ error: `Error fetching ${label}`, data: null });
121
+ }
122
+ });
123
+ const perAddress = (list, task) => list.map((m) => addresses.map((a) => task(m, a))).flat();
124
+ const batchRewards = (key, label, fetch, enabled = true) => (() => __awaiter(this, void 0, void 0, function* () {
125
+ if (!enabled) {
126
+ for (const address of addresses)
127
+ rewardsData[lower(address)][key] = { error: '', data: [] };
128
+ return;
129
+ }
130
+ try {
131
+ const result = yield fetch();
132
+ for (const address of addresses)
133
+ rewardsData[lower(address)][key] = { error: '', data: result[lower(address)] || [] };
134
+ }
135
+ catch (error) {
136
+ console.error(`Error fetching ${label}:`, error);
137
+ for (const address of addresses)
138
+ rewardsData[lower(address)][key] = { error: `Error fetching ${label}`, data: null };
139
+ }
140
+ }))();
141
+ yield Promise.allSettled([
142
+ ...morphoMarkets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.morphoMarketsData[m.value] = yield _getMorphoBluePortfolioMarketData(client, network, m); })),
143
+ ...morphoMidnightMarkets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.morphoMidnightMarketsData[m.value] = yield _getMorphoMidnightMarketData(client, network, m); })),
144
+ ...compoundV3Markets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.compoundV3MarketsData[m.value] = yield _getCompoundV3MarketsData(client, network, m, defaultClient); })),
145
+ ...sparkMarkets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.sparkMarketsData[m.value] = yield _getSparkMarketsData(client, network, m); })),
146
+ ...aaveV3Markets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.aaveV3MarketsData[m.value] = yield _getAaveV3MarketData(client, network, m); })),
147
+ ...aaveV4Spokes.map((s) => __awaiter(this, void 0, void 0, function* () { markets.aaveV4SpokesData[s.value] = yield _getAaveV4SpokeData(client, network, s); })),
148
+ ...aaveV2Markets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.aaveV2MarketsData[m.value] = yield _getAaveV2MarketsData(client, network, m); })),
149
+ ...compoundV2Markets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.compoundV2MarketsData[m.value] = yield _getCompoundV2MarketsData(client, network); })),
150
+ ...crvUsdMarkets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.crvUsdMarketsData[m.value] = yield _getCurveUsdGlobalData(client, network, m); })),
151
+ ...llamaLendMarkets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.llamaLendMarketsData[m.value] = yield _getLlamaLendGlobalData(client, network, m); })),
152
+ ...liquityV2Markets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.liquityV2MarketsData[m.value] = yield _getLiquityV2MarketData(client, network, m); })),
153
+ (() => __awaiter(this, void 0, void 0, function* () {
154
+ if (!fetchFluid || !fetchFluidMarkets)
155
+ return;
156
+ try {
157
+ markets.fluidMarketsData = yield _getAllFluidMarketDataPortfolio(client, network);
158
+ }
159
+ catch (error) {
160
+ console.error('Error fetching Fluid markets data:', error);
161
+ }
162
+ }))(),
163
+ (() => __awaiter(this, void 0, void 0, function* () {
164
+ if (!fetchMaker)
165
+ return;
166
+ try {
167
+ markets.makerMarketsData = yield _getMakerIlksData(client, network, MakerActiveIlks);
168
+ }
169
+ catch (error) {
170
+ console.error('Error fetching Maker ilks data:', error);
171
+ }
172
+ }))(),
173
+ ...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
174
+ if (!fetchMaker)
175
+ return;
176
+ makerCdps[lower(address)] = yield _getUserCdps(client, network, address);
177
+ })),
178
+ ...addresses.map((address) => fetchFluid && run(`Fluid positions for address ${address}`, () => _getUserPositionsPortfolio(client, network, address), (userPositions) => {
179
+ for (const position of userPositions) {
180
+ if (position.userData && positive(position.userData.suppliedUsd))
181
+ positions[lower(address)].fluid.data[position.userData.nftId] = position.userData;
182
+ }
183
+ }, (err) => { positions[lower(address)].fluid = { error: err.error, data: {} }; })),
184
+ ...(fetchStaking ? [
185
+ ...addresses.map((address) => fetchFluid && run(`Fluid lend data for address ${address}`, () => _getAllUserEarnPositionsWithFTokens(client, network, address), (data) => { stakingPositions[lower(address)].fluid = data; }, (err) => { stakingPositions[lower(address)].fluid = err; })),
186
+ ...addresses.map((address) => fetchLiquity && run(`Liquity staking data for address ${address}`, () => getLiquityStakingData(client, network, address), (data) => { stakingPositions[lower(address)].liquity = data; }, (err) => { stakingPositions[lower(address)].liquity = err; })),
187
+ ...addresses.map((address) => has(PortfolioProtocol.AaveV3) && isMainnet && run(`Aave V3 staking data for address ${address}`, () => getStakeAaveData(client, network, address), (data) => { stakingPositions[lower(address)].aaveV3 = data; }, (err) => { stakingPositions[lower(address)].aaveV3 = err; })),
188
+ ...addresses.map((address) => has(PortfolioProtocol.AaveV3) && isMainnet && run(`Umbrella staking data for address ${address}`, () => getUmbrellaData(client, network, address), (data) => { stakingPositions[lower(address)].umbrella = data; }, (err) => { stakingPositions[lower(address)].umbrella = err; })),
189
+ ...perAddress(liquityV2StakingMarkets, (market, address) => run(`Liquity V2 staking data for address ${address}, market ${market.value}`, () => getLiquityV2Staking(client, network, market.value, address), (data) => { stakingPositions[lower(address)].liquityV2[market.value] = { error: '', data }; }, (err) => { stakingPositions[lower(address)].liquityV2[market.value] = err; })),
190
+ ] : []),
191
+ ...(fetchRewards ? [
192
+ batchRewards('king', 'King rewards data', () => getKingRewards(client, network, addresses), isMainnet),
193
+ batchRewards('uniswap', 'Uniswap rewards data', () => getUniswapRewards(client, network, addresses), isMainnet),
194
+ batchRewards('spk', 'Spark Airdrop rewards data', () => fetchSparkAirdropRewards(client, network, addresses), isMainnet && has(PortfolioProtocol.Spark)),
195
+ batchRewards('ethena', 'Ethena Airdrop rewards data', () => fetchEthenaAirdropRewards(addresses), isMainnet),
196
+ ...addresses.map((address) => run(`Merkl rewards data for address ${address}`, () => getMerklUnclaimedRewards(address, network), (data) => { rewardsData[lower(address)].merkl = { error: '', data }; }, (err) => { rewardsData[lower(address)].merkl = err; })),
197
+ ...perAddress(aaveV3Markets, (market, address) => run(`Aave V3 rewards data for address ${address}, market ${market.value}`, () => getUnclaimedRewardsForAllMarkets(client, network, address, market.providerAddress), (data) => { rewardsData[lower(address)].aaveV3[market.value] = { error: '', data }; }, (err) => { rewardsData[lower(address)].aaveV3[market.value] = err; })),
198
+ ...perAddress(sparkMarkets, (market, address) => {
199
+ if (!isMainnet) {
200
+ rewardsData[lower(address)].spark[market.value] = { error: '', data: [] };
201
+ return Promise.resolve();
202
+ }
203
+ return run(`Spark rewards data for address ${address}, market ${market.value}`, () => fetchSparkRewards(client, network, address, market.providerAddress), (data) => { rewardsData[lower(address)].spark[market.value] = { error: '', data }; }, (err) => { rewardsData[lower(address)].spark[market.value] = err; });
204
+ }),
205
+ ] : []),
206
+ ]);
207
+ yield Promise.all([
208
+ ...perAddress(aaveV3Markets, (market, address) => run(`AaveV3 account data for address ${address} on market ${market.value}`, () => _getAaveV3AccountData(client, network, address, Object.assign({ selectedMarket: market }, markets.aaveV3MarketsData[market.value])), (data) => { if (returnEmptyEModePositions || positive(data.suppliedUsd))
209
+ positions[lower(address)].aaveV3[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].aaveV3[market.value] = err; })),
210
+ ...perAddress(sparkMarkets, (market, address) => run(`Spark account data for address ${address} on market ${market.value}`, () => _getSparkAccountData(client, network, address, { selectedMarket: market, assetsData: markets.sparkMarketsData[market.value].assetsData, eModeCategoriesData: markets.sparkMarketsData[market.value].eModeCategoriesData }), (data) => { if (returnEmptyEModePositions || positive(data.suppliedUsd))
211
+ positions[lower(address)].spark[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].spark[market.value] = err; })),
212
+ ...perAddress(aaveV4Spokes, (spoke, address) => run(`AaveV4 account data for address ${address} on spoke ${spoke.value}`, () => _getAaveV4AccountData(client, network, markets.aaveV4SpokesData[spoke.value], address), (data) => { if (positive(data.suppliedUsd))
213
+ positions[lower(address)].aaveV4[spoke.value] = { error: '', data }; }, (err) => { positions[lower(address)].aaveV4[spoke.value] = err; })),
214
+ ...perAddress(morphoMarkets, (market, address) => run(`MorphoBlue account data for address ${address} on market ${market.value}`, () => _getMorphoBlueAccountData(client, network, address, market, markets.morphoMarketsData[market.value]), (data) => { if (positive(data.suppliedUsd))
215
+ positions[lower(address)].morphoBlue[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].morphoBlue[market.value] = err; })),
216
+ ...(fetchStaking ? perAddress(morphoMarkets, (market, address) => run(`MorphoBlue earn data for address ${address} on market ${market.value}`, () => getMorphoEarn(client, network, address, market, markets.morphoMarketsData[market.value]), (data) => { if (data && positive(data.amount))
217
+ stakingPositions[lower(address)].morphoBlue[market.value] = { error: '', data }; }, (err) => { stakingPositions[lower(address)].morphoBlue[market.value] = err; })) : []),
218
+ ...perAddress(morphoMidnightMarkets, (market, address) => {
219
+ var _a;
220
+ if (!((_a = markets.morphoMidnightMarketsData[market.value]) === null || _a === void 0 ? void 0 : _a.isCreated))
221
+ return Promise.resolve();
222
+ return run(`MorphoMidnight account data for address ${address} on market ${market.value}`, () => _getMorphoMidnightAccountData(client, network, address, market, markets.morphoMidnightMarketsData[market.value]), (data) => { if (positive(data.suppliedUsd))
223
+ positions[lower(address)].morphoMidnight[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].morphoMidnight[market.value] = err; });
224
+ }),
225
+ ...perAddress(compoundV3Markets, (market, address) => run(`CompoundV3 account data for address ${address} on market ${market.value}`, () => _getCompoundV3AccountData(client, network, address, ZERO_ADDRESS, { selectedMarket: market, assetsData: markets.compoundV3MarketsData[market.value].assetsData }), (data) => { if (positive(data.suppliedUsd))
226
+ positions[lower(address)].compoundV3[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].compoundV3[market.value] = err; })),
227
+ ...perAddress(compoundV2Markets, (market, address) => run(`CompoundV2 account data for address ${address}`, () => _getCompoundV2AccountData(client, network, address, markets.compoundV2MarketsData[market.value].assetsData), (data) => { if (positive(data.suppliedUsd))
228
+ positions[lower(address)].compoundV2[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].compoundV2[market.value] = err; })),
229
+ ...perAddress(aaveV2Markets, (market, address) => run(`AaveV2 account data for address ${address}`, () => _getAaveV2AccountData(client, network, address, markets.aaveV2MarketsData[market.value].assetsData, market), (data) => { if (positive(data.suppliedUsd))
230
+ positions[lower(address)].aaveV2[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].aaveV2[market.value] = err; })),
231
+ ...perAddress(crvUsdMarkets, (market, address) => run(`Curve USD account data for address ${address} on market ${market.value}`, () => _getCurveUsdUserData(client, network, address, market, markets.crvUsdMarketsData[market.value].activeBand, markets.crvUsdMarketsData[market.value].borrowRate), (data) => { if (positive(data.suppliedUsd) || positive(data.borrowedUsd))
232
+ positions[lower(address)].crvUsd[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].crvUsd[market.value] = err; })),
233
+ ...perAddress(llamaLendMarkets, (market, address) => run(`LlamaLend account data for address ${address} on market ${market.value}`, () => _getLlamaLendUserData(client, network, address, market, markets.llamaLendMarketsData[market.value]), (data) => {
234
+ if (positive(data.suppliedUsd) || positive(data.borrowedUsd)) {
235
+ positions[lower(address)].llamaLend[market.value] = { error: '', data: Object.assign(Object.assign({}, data), { borrowRate: markets.llamaLendMarketsData[market.value].borrowRate }) };
236
+ }
237
+ }, (err) => { positions[lower(address)].llamaLend[market.value] = err; })),
238
+ ...addresses.map((address) => (makerCdps[lower(address)] || []).map((cdpInfo) => run(`Maker CDP data for address ${address} with ID ${cdpInfo.id}`, () => _getMakerCdpData(client, network, cdpInfo, markets.makerMarketsData[cdpInfo.ilkLabel]), (data) => { if (data)
239
+ positions[lower(address)].maker[cdpInfo.id] = { error: '', data }; }, (err) => { positions[lower(address)].maker[cdpInfo.id] = err; }))).flat(),
240
+ ...addresses.map((address) => fetchLiquity && run(`Liquity trove info for address ${address}`, () => _getLiquityTroveInfo(client, network, address), (data) => { if (positive(data.collateral))
241
+ positions[lower(address)].liquity = { error: '', data }; }, (err) => { positions[lower(address)].liquity = err; })),
242
+ ...(fetchStaking && has(PortfolioProtocol.LiquityV2) ? addresses.map((address) => {
243
+ if (!isMainnet) {
244
+ stakingPositions[lower(address)].liquityV2SBoldYBold = { error: '', data: null };
245
+ return Promise.resolve();
246
+ }
247
+ return run(`sBold/yBold data for address ${address}`, () => getLiquitySAndYBold(client, network, stakingPositions[lower(address)].liquityV2, address), (data) => { stakingPositions[lower(address)].liquityV2SBoldYBold = { error: '', data }; }, (err) => { stakingPositions[lower(address)].liquityV2SBoldYBold = err; });
248
+ }) : []),
249
+ ]);
250
+ return {
251
+ positions,
252
+ stakingPositions,
253
+ rewardsData,
254
+ markets,
255
+ };
256
+ });
257
+ }
@@ -11,4 +11,5 @@ export declare function getShifterPortfolioData(provider: EthereumProvider, netw
11
11
  markets: PortfolioMarketsData;
12
12
  }>;
13
13
  export * from './discovery';
14
+ export * from './customDeFiData';
14
15
  export { getWalletLendingSummaries } from './lendingSummaries';