@defisaver/positions-sdk 2.1.168-stable-pair-dev → 2.1.169-custom-fetching-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.
@@ -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,40 @@ 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
+ }
91
+ export interface CustomDeFiData {
92
+ positions: PortfolioPositionsData;
93
+ stakingPositions: Record<string, any>;
94
+ rewardsData: Record<string, any>;
95
+ markets: PortfolioMarketsData;
96
+ }
63
97
  export interface PortfolioMarketsData {
64
98
  morphoMarketsData: Record<string, MorphoBlueMarketInfo>;
65
99
  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 = {}));
@@ -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),
@@ -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,256 @@
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 } 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 client = getViemProvider(provider, network, { batch: { multicall: { batchSize } } });
49
+ const defaultClient = getViemProvider(defaultProvider, network, { batch: { multicall: { batchSize } } });
50
+ const aaveV3Markets = has(PortfolioProtocol.AaveV3)
51
+ ? [AaveVersions.AaveV3, AaveVersions.AaveV3Lido, AaveVersions.AaveV3Etherfi].map((v) => AaveMarkets(network)[v]).filter((m) => m.chainIds.includes(network))
52
+ : [];
53
+ const aaveV2Markets = has(PortfolioProtocol.AaveV2) ? [AaveMarkets(network)[AaveVersions.AaveV2]].filter((m) => m.chainIds.includes(network)) : [];
54
+ const aaveV4Spokes = has(PortfolioProtocol.AaveV4) ? supported(AaveV4Spokes(network), network) : [];
55
+ const compoundV3Markets = has(PortfolioProtocol.CompoundV3) ? supported(CompoundMarkets(network), network).filter((m) => m.value !== CompoundVersions.CompoundV2) : [];
56
+ const compoundV2Markets = has(PortfolioProtocol.CompoundV2) ? [CompoundMarkets(network)[CompoundVersions.CompoundV2]].filter((m) => m.chainIds.includes(network)) : [];
57
+ const sparkMarkets = has(PortfolioProtocol.Spark) ? supported(SparkMarkets(network), network) : [];
58
+ const morphoMarkets = has(PortfolioProtocol.MorphoBlue) ? supported(MorphoBlueMarkets(network), network) : [];
59
+ const morphoMidnightMarkets = has(PortfolioProtocol.MorphoMidnight) ? supported(MorphoMidnightMarkets(network), network) : [];
60
+ const crvUsdMarkets = has(PortfolioProtocol.CrvUsd) ? supported(CrvUsdMarkets(network), network) : [];
61
+ const llamaLendMarkets = has(PortfolioProtocol.LlamaLend) && [NetworkNumber.Eth, NetworkNumber.Arb].includes(network) ? supported(LlamaLendMarkets(network), network) : [];
62
+ const liquityV2Markets = has(PortfolioProtocol.LiquityV2) && isMainnet ? Object.values(LiquityV2Markets(network)) : [];
63
+ const liquityV2StakingMarkets = liquityV2Markets.filter((m) => !m.isLegacy);
64
+ const fetchMaker = has(PortfolioProtocol.Maker) && isMainnet;
65
+ const fetchLiquity = has(PortfolioProtocol.Liquity) && isMainnet;
66
+ const fetchFluid = has(PortfolioProtocol.Fluid) && isFluidSupported;
67
+ const markets = {
68
+ morphoMarketsData: {},
69
+ morphoMidnightMarketsData: {},
70
+ compoundV3MarketsData: {},
71
+ sparkMarketsData: {},
72
+ aaveV3MarketsData: {},
73
+ aaveV2MarketsData: {},
74
+ compoundV2MarketsData: {},
75
+ crvUsdMarketsData: {},
76
+ llamaLendMarketsData: {},
77
+ liquityV2MarketsData: {},
78
+ aaveV4SpokesData: {},
79
+ fluidMarketsData: {},
80
+ makerMarketsData: {},
81
+ };
82
+ const makerCdps = {};
83
+ const positions = {};
84
+ const stakingPositions = {};
85
+ const rewardsData = {};
86
+ for (const address of addresses) {
87
+ positions[lower(address)] = {
88
+ aaveV3: {},
89
+ aaveV4: {},
90
+ morphoBlue: {},
91
+ morphoMidnight: {},
92
+ compoundV3: {},
93
+ spark: {},
94
+ maker: {},
95
+ aaveV2: {},
96
+ compoundV2: {},
97
+ liquity: {},
98
+ crvUsd: {},
99
+ llamaLend: {},
100
+ fluid: { error: '', data: {} },
101
+ };
102
+ if (fetchStaking) {
103
+ stakingPositions[lower(address)] = {
104
+ aaveV3: {}, morphoBlue: {}, liquity: {}, liquityV2: {}, fluid: { error: '', data: {} },
105
+ };
106
+ }
107
+ if (fetchRewards) {
108
+ rewardsData[lower(address)] = {
109
+ merkl: {}, aaveV3: {}, spark: {}, spk: {}, king: {}, ethena: {}, uniswap: {},
110
+ };
111
+ }
112
+ }
113
+ const run = (label, fetch, store, onError) => __awaiter(this, void 0, void 0, function* () {
114
+ try {
115
+ store(yield fetch());
116
+ }
117
+ catch (error) {
118
+ console.error(`Error fetching ${label}:`, error);
119
+ onError({ error: `Error fetching ${label}`, data: null });
120
+ }
121
+ });
122
+ const perAddress = (list, task) => list.map((m) => addresses.map((a) => task(m, a))).flat();
123
+ const batchRewards = (key, label, fetch, enabled = true) => (() => __awaiter(this, void 0, void 0, function* () {
124
+ if (!enabled) {
125
+ for (const address of addresses)
126
+ rewardsData[lower(address)][key] = { error: '', data: [] };
127
+ return;
128
+ }
129
+ try {
130
+ const result = yield fetch();
131
+ for (const address of addresses)
132
+ rewardsData[lower(address)][key] = { error: '', data: result[lower(address)] || [] };
133
+ }
134
+ catch (error) {
135
+ console.error(`Error fetching ${label}:`, error);
136
+ for (const address of addresses)
137
+ rewardsData[lower(address)][key] = { error: `Error fetching ${label}`, data: null };
138
+ }
139
+ }))();
140
+ yield Promise.allSettled([
141
+ ...morphoMarkets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.morphoMarketsData[m.value] = yield _getMorphoBluePortfolioMarketData(client, network, m); })),
142
+ ...morphoMidnightMarkets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.morphoMidnightMarketsData[m.value] = yield _getMorphoMidnightMarketData(client, network, m); })),
143
+ ...compoundV3Markets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.compoundV3MarketsData[m.value] = yield _getCompoundV3MarketsData(client, network, m, defaultClient); })),
144
+ ...sparkMarkets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.sparkMarketsData[m.value] = yield _getSparkMarketsData(client, network, m); })),
145
+ ...aaveV3Markets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.aaveV3MarketsData[m.value] = yield _getAaveV3MarketData(client, network, m); })),
146
+ ...aaveV4Spokes.map((s) => __awaiter(this, void 0, void 0, function* () { markets.aaveV4SpokesData[s.value] = yield _getAaveV4SpokeData(client, network, s); })),
147
+ ...aaveV2Markets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.aaveV2MarketsData[m.value] = yield _getAaveV2MarketsData(client, network, m); })),
148
+ ...compoundV2Markets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.compoundV2MarketsData[m.value] = yield _getCompoundV2MarketsData(client, network); })),
149
+ ...crvUsdMarkets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.crvUsdMarketsData[m.value] = yield _getCurveUsdGlobalData(client, network, m); })),
150
+ ...llamaLendMarkets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.llamaLendMarketsData[m.value] = yield _getLlamaLendGlobalData(client, network, m); })),
151
+ ...liquityV2Markets.map((m) => __awaiter(this, void 0, void 0, function* () { markets.liquityV2MarketsData[m.value] = yield _getLiquityV2MarketData(client, network, m); })),
152
+ (() => __awaiter(this, void 0, void 0, function* () {
153
+ if (!fetchFluid || !fetchFluidMarkets)
154
+ return;
155
+ try {
156
+ markets.fluidMarketsData = yield _getAllFluidMarketDataPortfolio(client, network);
157
+ }
158
+ catch (error) {
159
+ console.error('Error fetching Fluid markets data:', error);
160
+ }
161
+ }))(),
162
+ (() => __awaiter(this, void 0, void 0, function* () {
163
+ if (!fetchMaker)
164
+ return;
165
+ try {
166
+ markets.makerMarketsData = yield _getMakerIlksData(client, network, MakerActiveIlks);
167
+ }
168
+ catch (error) {
169
+ console.error('Error fetching Maker ilks data:', error);
170
+ }
171
+ }))(),
172
+ ...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
173
+ if (!fetchMaker)
174
+ return;
175
+ makerCdps[lower(address)] = yield _getUserCdps(client, network, address);
176
+ })),
177
+ ...addresses.map((address) => fetchFluid && run(`Fluid positions for address ${address}`, () => _getUserPositionsPortfolio(client, network, address), (userPositions) => {
178
+ for (const position of userPositions) {
179
+ if (position.userData && positive(position.userData.suppliedUsd))
180
+ positions[lower(address)].fluid.data[position.userData.nftId] = position.userData;
181
+ }
182
+ }, (err) => { positions[lower(address)].fluid = { error: err.error, data: {} }; })),
183
+ ...(fetchStaking ? [
184
+ ...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; })),
185
+ ...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; })),
186
+ ...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; })),
187
+ ...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; })),
188
+ ...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; })),
189
+ ] : []),
190
+ ...(fetchRewards ? [
191
+ batchRewards('king', 'King rewards data', () => getKingRewards(client, network, addresses), isMainnet),
192
+ batchRewards('uniswap', 'Uniswap rewards data', () => getUniswapRewards(client, network, addresses), isMainnet),
193
+ batchRewards('spk', 'Spark Airdrop rewards data', () => fetchSparkAirdropRewards(client, network, addresses), isMainnet && has(PortfolioProtocol.Spark)),
194
+ batchRewards('ethena', 'Ethena Airdrop rewards data', () => fetchEthenaAirdropRewards(addresses), isMainnet),
195
+ ...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; })),
196
+ ...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; })),
197
+ ...perAddress(sparkMarkets, (market, address) => {
198
+ if (!isMainnet) {
199
+ rewardsData[lower(address)].spark[market.value] = { error: '', data: [] };
200
+ return Promise.resolve();
201
+ }
202
+ 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; });
203
+ }),
204
+ ] : []),
205
+ ]);
206
+ yield Promise.all([
207
+ ...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))
208
+ positions[lower(address)].aaveV3[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].aaveV3[market.value] = err; })),
209
+ ...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))
210
+ positions[lower(address)].spark[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].spark[market.value] = err; })),
211
+ ...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))
212
+ positions[lower(address)].aaveV4[spoke.value] = { error: '', data }; }, (err) => { positions[lower(address)].aaveV4[spoke.value] = err; })),
213
+ ...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))
214
+ positions[lower(address)].morphoBlue[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].morphoBlue[market.value] = err; })),
215
+ ...(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))
216
+ stakingPositions[lower(address)].morphoBlue[market.value] = { error: '', data }; }, (err) => { stakingPositions[lower(address)].morphoBlue[market.value] = err; })) : []),
217
+ ...perAddress(morphoMidnightMarkets, (market, address) => {
218
+ var _a;
219
+ if (!((_a = markets.morphoMidnightMarketsData[market.value]) === null || _a === void 0 ? void 0 : _a.isCreated))
220
+ return Promise.resolve();
221
+ 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))
222
+ positions[lower(address)].morphoMidnight[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].morphoMidnight[market.value] = err; });
223
+ }),
224
+ ...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))
225
+ positions[lower(address)].compoundV3[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].compoundV3[market.value] = err; })),
226
+ ...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))
227
+ positions[lower(address)].compoundV2[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].compoundV2[market.value] = err; })),
228
+ ...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))
229
+ positions[lower(address)].aaveV2[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].aaveV2[market.value] = err; })),
230
+ ...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))
231
+ positions[lower(address)].crvUsd[market.value] = { error: '', data }; }, (err) => { positions[lower(address)].crvUsd[market.value] = err; })),
232
+ ...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) => {
233
+ if (positive(data.suppliedUsd) || positive(data.borrowedUsd)) {
234
+ positions[lower(address)].llamaLend[market.value] = { error: '', data: Object.assign(Object.assign({}, data), { borrowRate: markets.llamaLendMarketsData[market.value].borrowRate }) };
235
+ }
236
+ }, (err) => { positions[lower(address)].llamaLend[market.value] = err; })),
237
+ ...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)
238
+ positions[lower(address)].maker[cdpInfo.id] = { error: '', data }; }, (err) => { positions[lower(address)].maker[cdpInfo.id] = err; }))).flat(),
239
+ ...addresses.map((address) => fetchLiquity && run(`Liquity trove info for address ${address}`, () => _getLiquityTroveInfo(client, network, address), (data) => { if (positive(data.collateral))
240
+ positions[lower(address)].liquity = { error: '', data }; }, (err) => { positions[lower(address)].liquity = err; })),
241
+ ...(fetchStaking && has(PortfolioProtocol.LiquityV2) ? addresses.map((address) => {
242
+ if (!isMainnet) {
243
+ stakingPositions[lower(address)].liquityV2SBoldYBold = { error: '', data: null };
244
+ return Promise.resolve();
245
+ }
246
+ 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; });
247
+ }) : []),
248
+ ]);
249
+ return {
250
+ positions,
251
+ stakingPositions,
252
+ rewardsData,
253
+ markets,
254
+ };
255
+ });
256
+ }
@@ -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';