@defisaver/positions-sdk 2.1.161-portfolio-api-2-dev → 2.1.161-portfolio-api-3-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.
- package/cjs/aaveV2/index.js +2 -0
- package/cjs/aaveV3/index.d.ts +39 -0
- package/cjs/aaveV3/index.js +237 -2
- package/cjs/aaveV4/lend.d.ts +2 -43
- package/cjs/curveUsd/index.d.ts +5 -2
- package/cjs/curveUsd/index.js +30 -15
- package/cjs/fluid/index.d.ts +5 -0
- package/cjs/fluid/index.js +36 -1
- package/cjs/helpers/aaveHelpers/index.d.ts +9 -1
- package/cjs/helpers/aaveHelpers/index.js +26 -6
- package/cjs/helpers/aaveV4Helpers/index.js +1 -0
- package/cjs/helpers/compoundHelpers/index.js +2 -0
- package/cjs/helpers/curveUsdHelpers/index.d.ts +3 -1
- package/cjs/helpers/curveUsdHelpers/index.js +15 -2
- package/cjs/helpers/fluidHelpers/index.js +1 -0
- package/cjs/helpers/liquityV2Helpers/index.js +1 -0
- package/cjs/helpers/llamaLendHelpers/index.js +1 -0
- package/cjs/helpers/makerHelpers/index.d.ts +1 -1
- package/cjs/helpers/makerHelpers/index.js +2 -2
- package/cjs/helpers/morphoBlueHelpers/index.js +2 -0
- package/cjs/helpers/morphoMidnightHelpers/index.js +2 -0
- package/cjs/helpers/sparkHelpers/index.js +1 -0
- package/cjs/liquity/index.js +15 -2
- package/cjs/liquityV2/index.d.ts +5 -0
- package/cjs/liquityV2/index.js +37 -19
- package/cjs/maker/index.d.ts +7 -2
- package/cjs/maker/index.js +44 -12
- package/cjs/markets/index.d.ts +1 -0
- package/cjs/markets/index.js +3 -1
- package/cjs/markets/maker/index.d.ts +1 -0
- package/cjs/markets/maker/index.js +13 -0
- package/cjs/moneymarket/moneymarketCommonService.d.ts +9 -0
- package/cjs/moneymarket/moneymarketCommonService.js +13 -1
- package/cjs/portfolio/index.d.ts +17 -5
- package/cjs/portfolio/index.js +583 -394
- package/cjs/portfolio/lendingProtocols.d.ts +184 -0
- package/cjs/portfolio/lendingProtocols.js +196 -0
- package/cjs/savings/index.d.ts +8 -2
- package/cjs/savings/index.js +37 -5
- package/cjs/savings/morphoVaults/index.d.ts +1 -1
- package/cjs/savings/morphoVaults/index.js +56 -18
- package/cjs/savings/morphoVaults/options.d.ts +2 -0
- package/cjs/savings/morphoVaults/options.js +61 -1
- package/cjs/spark/index.js +1 -0
- package/cjs/staking/staking.d.ts +20 -0
- package/cjs/staking/staking.js +19 -1
- package/cjs/types/aave.d.ts +3 -0
- package/cjs/types/aaveV4.d.ts +45 -0
- package/cjs/types/compound.d.ts +2 -0
- package/cjs/types/curveUsd.d.ts +6 -0
- package/cjs/types/fluid.d.ts +1 -0
- package/cjs/types/liquity.d.ts +4 -0
- package/cjs/types/liquityV2.d.ts +2 -0
- package/cjs/types/maker.d.ts +4 -0
- package/cjs/types/morphoBlue.d.ts +2 -0
- package/cjs/types/morphoMidnight.d.ts +1 -0
- package/cjs/types/portfolio.d.ts +64 -6
- package/cjs/types/savings/index.d.ts +9 -1
- package/cjs/types/savings/morphoVaults.d.ts +10 -2
- package/cjs/types/savings/morphoVaults.js +9 -1
- package/cjs/types/spark.d.ts +2 -0
- package/esm/aaveV2/index.js +2 -0
- package/esm/aaveV3/index.d.ts +39 -0
- package/esm/aaveV3/index.js +231 -2
- package/esm/aaveV4/lend.d.ts +2 -43
- package/esm/curveUsd/index.d.ts +5 -2
- package/esm/curveUsd/index.js +30 -15
- package/esm/fluid/index.d.ts +5 -0
- package/esm/fluid/index.js +33 -0
- package/esm/helpers/aaveHelpers/index.d.ts +9 -1
- package/esm/helpers/aaveHelpers/index.js +23 -5
- package/esm/helpers/aaveV4Helpers/index.js +1 -0
- package/esm/helpers/compoundHelpers/index.js +2 -0
- package/esm/helpers/curveUsdHelpers/index.d.ts +3 -1
- package/esm/helpers/curveUsdHelpers/index.js +16 -3
- package/esm/helpers/fluidHelpers/index.js +1 -0
- package/esm/helpers/liquityV2Helpers/index.js +1 -0
- package/esm/helpers/llamaLendHelpers/index.js +2 -1
- package/esm/helpers/makerHelpers/index.d.ts +1 -1
- package/esm/helpers/makerHelpers/index.js +2 -2
- package/esm/helpers/morphoBlueHelpers/index.js +2 -0
- package/esm/helpers/morphoMidnightHelpers/index.js +2 -0
- package/esm/helpers/sparkHelpers/index.js +1 -0
- package/esm/liquity/index.js +16 -3
- package/esm/liquityV2/index.d.ts +5 -0
- package/esm/liquityV2/index.js +35 -18
- package/esm/maker/index.d.ts +7 -2
- package/esm/maker/index.js +44 -14
- package/esm/markets/index.d.ts +1 -0
- package/esm/markets/index.js +1 -0
- package/esm/markets/maker/index.d.ts +1 -0
- package/esm/markets/maker/index.js +10 -0
- package/esm/moneymarket/moneymarketCommonService.d.ts +9 -0
- package/esm/moneymarket/moneymarketCommonService.js +11 -0
- package/esm/portfolio/index.d.ts +17 -5
- package/esm/portfolio/index.js +584 -398
- package/esm/portfolio/lendingProtocols.d.ts +184 -0
- package/esm/portfolio/lendingProtocols.js +189 -0
- package/esm/savings/index.d.ts +8 -2
- package/esm/savings/index.js +35 -4
- package/esm/savings/morphoVaults/index.d.ts +1 -1
- package/esm/savings/morphoVaults/index.js +57 -19
- package/esm/savings/morphoVaults/options.d.ts +2 -0
- package/esm/savings/morphoVaults/options.js +61 -1
- package/esm/spark/index.js +1 -0
- package/esm/staking/staking.d.ts +20 -0
- package/esm/staking/staking.js +17 -0
- package/esm/types/aave.d.ts +3 -0
- package/esm/types/aaveV4.d.ts +45 -0
- package/esm/types/compound.d.ts +2 -0
- package/esm/types/curveUsd.d.ts +6 -0
- package/esm/types/fluid.d.ts +1 -0
- package/esm/types/liquity.d.ts +4 -0
- package/esm/types/liquityV2.d.ts +2 -0
- package/esm/types/maker.d.ts +4 -0
- package/esm/types/morphoBlue.d.ts +2 -0
- package/esm/types/morphoMidnight.d.ts +1 -0
- package/esm/types/portfolio.d.ts +64 -6
- package/esm/types/savings/index.d.ts +9 -1
- package/esm/types/savings/morphoVaults.d.ts +10 -2
- package/esm/types/savings/morphoVaults.js +8 -0
- package/esm/types/spark.d.ts +2 -0
- package/package.json +3 -2
- package/src/aaveV2/index.ts +2 -0
- package/src/aaveV3/index.ts +291 -1
- package/src/aaveV4/lend.ts +2 -48
- package/src/curveUsd/index.ts +33 -16
- package/src/fluid/index.ts +40 -0
- package/src/helpers/aaveHelpers/index.ts +27 -7
- package/src/helpers/aaveV4Helpers/index.ts +1 -0
- package/src/helpers/compoundHelpers/index.ts +2 -0
- package/src/helpers/curveUsdHelpers/index.ts +23 -3
- package/src/helpers/fluidHelpers/index.ts +1 -0
- package/src/helpers/liquityV2Helpers/index.ts +1 -0
- package/src/helpers/llamaLendHelpers/index.ts +2 -1
- package/src/helpers/makerHelpers/index.ts +2 -1
- package/src/helpers/morphoBlueHelpers/index.ts +2 -0
- package/src/helpers/morphoMidnightHelpers/index.ts +2 -0
- package/src/helpers/sparkHelpers/index.ts +1 -0
- package/src/liquity/index.ts +17 -3
- package/src/liquityV2/index.ts +45 -19
- package/src/maker/index.ts +77 -30
- package/src/markets/index.ts +2 -1
- package/src/markets/maker/index.ts +10 -0
- package/src/moneymarket/moneymarketCommonService.ts +15 -0
- package/src/portfolio/index.ts +428 -215
- package/src/portfolio/lendingProtocols.ts +281 -0
- package/src/savings/index.ts +45 -5
- package/src/savings/morphoVaults/index.ts +73 -21
- package/src/savings/morphoVaults/options.ts +67 -1
- package/src/spark/index.ts +1 -0
- package/src/staking/staking.ts +28 -0
- package/src/types/aave.ts +4 -0
- package/src/types/aaveV4.ts +50 -0
- package/src/types/compound.ts +2 -0
- package/src/types/curveUsd.ts +7 -0
- package/src/types/fluid.ts +1 -0
- package/src/types/liquity.ts +6 -0
- package/src/types/liquityV2.ts +2 -0
- package/src/types/maker.ts +6 -0
- package/src/types/morphoBlue.ts +2 -0
- package/src/types/morphoMidnight.ts +1 -0
- package/src/types/portfolio.ts +71 -6
- package/src/types/savings/index.ts +12 -1
- package/src/types/savings/morphoVaults.ts +11 -1
- package/src/types/spark.ts +2 -0
package/cjs/portfolio/index.js
CHANGED
|
@@ -26,18 +26,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.getPortfolioMarketsData = getPortfolioMarketsData;
|
|
30
|
+
exports.getPortfolioUserData = getPortfolioUserData;
|
|
29
31
|
exports.getPortfolioData = getPortfolioData;
|
|
32
|
+
exports.getShifterPortfolioData = getShifterPortfolioData;
|
|
30
33
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
31
34
|
const common_1 = require("../types/common");
|
|
32
35
|
const markets_1 = require("../markets");
|
|
33
36
|
const morphoBlue_1 = require("../morphoBlue");
|
|
34
|
-
const morphoMidnight_1 = require("../morphoMidnight");
|
|
35
37
|
const types_1 = require("../types");
|
|
36
38
|
const compoundV3_1 = require("../compoundV3");
|
|
37
39
|
const spark_1 = require("../spark");
|
|
38
40
|
const curveUsd_1 = require("../curveUsd");
|
|
39
41
|
const llamaLend_1 = require("../llamaLend");
|
|
40
42
|
const aaveV3_1 = require("../aaveV3");
|
|
43
|
+
const aaveV4_1 = require("../aaveV4");
|
|
41
44
|
const constants_1 = require("../constants");
|
|
42
45
|
const maker_1 = require("../maker");
|
|
43
46
|
const aaveV2_1 = require("../aaveV2");
|
|
@@ -51,19 +54,512 @@ const aaveV3_2 = require("../claiming/aaveV3");
|
|
|
51
54
|
const spark_2 = require("../claiming/spark");
|
|
52
55
|
const king_1 = require("../claiming/king");
|
|
53
56
|
const ethena_1 = require("../claiming/ethena");
|
|
54
|
-
const aaveV4_1 = require("../aaveV4");
|
|
55
57
|
const uniswap_1 = require("../claiming/uniswap");
|
|
58
|
+
const lendingProtocols_1 = require("./lendingProtocols");
|
|
59
|
+
/** The markets of the protocols read by their own code below; LENDING_PROTOCOLS has the others'. */
|
|
60
|
+
const getPortfolioMarkets = (network) => ({
|
|
61
|
+
liquityV2Markets: [common_1.NetworkNumber.Eth].includes(network) ? Object.values((0, markets_1.LiquityV2Markets)(network)) : [],
|
|
62
|
+
liquityV2MarketsStaking: [common_1.NetworkNumber.Eth].includes(network) ? Object.values((0, markets_1.LiquityV2Markets)(network)).filter(market => !market.isLegacy) : [],
|
|
63
|
+
});
|
|
64
|
+
const getPortfolioClients = (provider, defaultProvider, network, isSim) => {
|
|
65
|
+
// batchSize is viem's cap on a batch's raw subcall calldata (bytes); the JSON-RPC body ends up
|
|
66
|
+
// ~4x larger (hex + aggregate3 ABI + JSON overhead) and RPC providers reject bodies over
|
|
67
|
+
// ~2.5MB with HTTP 413, so keep this small enough that no single body gets near that.
|
|
68
|
+
// 250k gives the largest body of around 1.26MB - if we bump, we can save maybe 2-3 rpc calls but scaling takes a hit
|
|
69
|
+
// (e.g. adding new markets may result in body size going over alchemy body size limit)
|
|
70
|
+
const args = [network, { batch: { multicall: { batchSize: isSim ? 2000 : 250000 } } }];
|
|
71
|
+
return {
|
|
72
|
+
client: (0, viem_1.getViemProvider)(provider, ...args),
|
|
73
|
+
defaultClient: (0, viem_1.getViemProvider)(defaultProvider, ...args),
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
const _getPortfolioMarketsData = (client, defaultClient, network) => __awaiter(void 0, void 0, void 0, function* () {
|
|
77
|
+
const { liquityV2Markets } = getPortfolioMarkets(network);
|
|
78
|
+
const markets = {
|
|
79
|
+
morphoMarketsData: {},
|
|
80
|
+
morphoMidnightMarketsData: {},
|
|
81
|
+
compoundV3MarketsData: {},
|
|
82
|
+
sparkMarketsData: {},
|
|
83
|
+
aaveV3MarketsData: {},
|
|
84
|
+
aaveV2MarketsData: {},
|
|
85
|
+
compoundV2MarketsData: {},
|
|
86
|
+
crvUsdMarketsData: {},
|
|
87
|
+
llamaLendMarketsData: {},
|
|
88
|
+
liquityV2MarketsData: {},
|
|
89
|
+
aaveV4SpokesData: {},
|
|
90
|
+
};
|
|
91
|
+
const liquityV2Failed = {};
|
|
92
|
+
const [lendingFailed] = yield Promise.all([
|
|
93
|
+
Promise.all(lendingProtocols_1.LENDING_PROTOCOLS.map((protocol) => __awaiter(void 0, void 0, void 0, function* () { return [protocol.marketsKey, yield protocol.readMarkets({ client, defaultClient, network }, markets)]; }))),
|
|
94
|
+
// Liquity V2's markets: its troves are read by their own code below.
|
|
95
|
+
...liquityV2Markets.map((market) => __awaiter(void 0, void 0, void 0, function* () {
|
|
96
|
+
try {
|
|
97
|
+
markets.liquityV2MarketsData[market.value] = yield (0, liquityV2_1._getLiquityV2MarketData)(client, network, market);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error(`Error fetching liquityV2MarketsData for market ${market.value}:`, error);
|
|
101
|
+
liquityV2Failed[market.value] = `Error fetching liquityV2MarketsData for market ${market.value}`;
|
|
102
|
+
}
|
|
103
|
+
})),
|
|
104
|
+
]);
|
|
105
|
+
// A market that failed is left out of markets and named here, under its protocol's key.
|
|
106
|
+
const errors = {};
|
|
107
|
+
for (const [key, failed] of [...lendingFailed, ['liquityV2MarketsData', liquityV2Failed]]) {
|
|
108
|
+
if (Object.keys(failed).length)
|
|
109
|
+
errors[key] = failed;
|
|
110
|
+
}
|
|
111
|
+
return { markets, errors };
|
|
112
|
+
});
|
|
113
|
+
const _getPortfolioUserData = (client, network, addresses, marketsData, isSim, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
114
|
+
const isMainnet = network === common_1.NetworkNumber.Eth;
|
|
115
|
+
const includePositions = options.positions !== false;
|
|
116
|
+
const includeStaking = options.staking !== false;
|
|
117
|
+
const includeRewards = options.rewards !== false;
|
|
118
|
+
const includeLiquityV2 = includePositions && options.liquityV2 === true;
|
|
119
|
+
// The addresses positions, staking, rewards and Liquity V2 troves are read for: none when left out, so their fetches
|
|
120
|
+
// below make no calls.
|
|
121
|
+
const positionsAddresses = includePositions ? addresses : [];
|
|
122
|
+
const stakingAddresses = includeStaking ? addresses : [];
|
|
123
|
+
const rewardsAddresses = includeRewards ? addresses : [];
|
|
124
|
+
const liquityV2Addresses = includeLiquityV2 ? addresses : [];
|
|
125
|
+
const isFluidSupported = [common_1.NetworkNumber.Eth, common_1.NetworkNumber.Arb, common_1.NetworkNumber.Base, common_1.NetworkNumber.Plasma].includes(network);
|
|
126
|
+
const { liquityV2Markets, liquityV2MarketsStaking } = getPortfolioMarkets(network);
|
|
127
|
+
const positions = {};
|
|
128
|
+
const stakingPositions = {};
|
|
129
|
+
const rewardsData = {};
|
|
130
|
+
const makerCdpsErrors = {};
|
|
131
|
+
for (const address of positionsAddresses) {
|
|
132
|
+
positions[address.toLowerCase()] = Object.assign(Object.assign(Object.assign({}, Object.fromEntries(lendingProtocols_1.LENDING_PROTOCOLS.map((protocol) => [protocol.key, {}]))), { maker: {}, liquity: {}, fluid: {
|
|
133
|
+
error: '',
|
|
134
|
+
data: {},
|
|
135
|
+
} }), (includeLiquityV2 ? { liquityV2: {} } : {}));
|
|
136
|
+
}
|
|
137
|
+
// TODO: check default values, probably needed when fetching portfolio on unsupported networks
|
|
138
|
+
for (const address of stakingAddresses) {
|
|
139
|
+
stakingPositions[address.toLowerCase()] = {
|
|
140
|
+
aaveV3: {},
|
|
141
|
+
morphoBlue: {},
|
|
142
|
+
compoundV3: {},
|
|
143
|
+
spark: {},
|
|
144
|
+
aaveV2: {},
|
|
145
|
+
compoundV2: {},
|
|
146
|
+
liquity: {},
|
|
147
|
+
liquityV2: {},
|
|
148
|
+
fluid: {
|
|
149
|
+
error: '',
|
|
150
|
+
data: {},
|
|
151
|
+
},
|
|
152
|
+
// Set by the sBOLD/yBOLD fetch below, whether it succeeds or fails.
|
|
153
|
+
liquityV2SBoldYBold: { error: '', data: null },
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
for (const address of rewardsAddresses) {
|
|
157
|
+
// merkl, spk, king and uniswap are set by their fetches below, whether they succeed or fail.
|
|
158
|
+
rewardsData[address.toLowerCase()] = {
|
|
159
|
+
merkl: { error: '', data: null },
|
|
160
|
+
aaveV3: {},
|
|
161
|
+
spark: {},
|
|
162
|
+
spk: { error: '', data: null },
|
|
163
|
+
king: { error: '', data: null },
|
|
164
|
+
ethena: {},
|
|
165
|
+
uniswap: { error: '', data: null },
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// Everything starts at once; a read that needs a market's data waits for marketsData.
|
|
169
|
+
yield Promise.all([
|
|
170
|
+
// === POSITIONS THAT DO NOT NEED MARKET DATA ===
|
|
171
|
+
// Maker: the address's vault list, then each vault. A failed list is reported in errors.makerCdps: maker stays {},
|
|
172
|
+
// which would otherwise read as "no vaults".
|
|
173
|
+
...positionsAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
174
|
+
if (!isMainnet)
|
|
175
|
+
return; // Maker CDPs are only available on mainnet
|
|
176
|
+
let cdps;
|
|
177
|
+
try {
|
|
178
|
+
cdps = yield (0, maker_1._getUserCdps)(client, network, address);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
console.error(`Error fetching Maker CDPs for address ${address}:`, error);
|
|
182
|
+
makerCdpsErrors[address.toLowerCase()] = `Error fetching Maker CDPs for address ${address}`;
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
yield Promise.all(cdps.map((cdpInfo) => __awaiter(void 0, void 0, void 0, function* () {
|
|
186
|
+
try {
|
|
187
|
+
const cdpData = yield (0, maker_1._getMakerCdpData)(client, network, cdpInfo);
|
|
188
|
+
if (cdpData) {
|
|
189
|
+
positions[address.toLowerCase()].maker[cdpInfo.id] = { error: '', data: cdpData };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
console.error(`Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}:`, error);
|
|
194
|
+
positions[address.toLowerCase()].maker[cdpInfo.id] = { error: `Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}`, data: null };
|
|
195
|
+
}
|
|
196
|
+
})));
|
|
197
|
+
})),
|
|
198
|
+
...positionsAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
199
|
+
try {
|
|
200
|
+
if (!isFluidSupported)
|
|
201
|
+
return; // Fluid is not available on Optimism
|
|
202
|
+
const userPositions = (yield (0, fluid_1._getUserPositionsPortfolio)(client, network, address));
|
|
203
|
+
for (const position of userPositions) {
|
|
204
|
+
if (position.userData && new decimal_js_1.default(position.userData.suppliedUsd).gt(0)) {
|
|
205
|
+
positions[address.toLowerCase()].fluid.data[position.userData.nftId] = position.userData;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.error(`Error fetching Fluid positions for address ${address}:`, error);
|
|
211
|
+
positions[address.toLowerCase()].fluid = {
|
|
212
|
+
error: `Error fetching Fluid positions for address ${address}`,
|
|
213
|
+
data: {},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
})),
|
|
217
|
+
...positionsAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
218
|
+
try {
|
|
219
|
+
if (!isMainnet)
|
|
220
|
+
return; // Liquity trove info is only available on mainnet
|
|
221
|
+
const troveInfo = yield (0, liquity_1._getLiquityTroveInfo)(client, network, address);
|
|
222
|
+
if (new decimal_js_1.default(troveInfo.collateral).gt(0))
|
|
223
|
+
positions[address.toLowerCase()].liquity = { error: '', data: troveInfo };
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
console.error(`Error fetching Liquity trove info for address ${address}:`, error);
|
|
227
|
+
positions[address.toLowerCase()].liquity = { error: `Error fetching Liquity trove info for address ${address}`, data: null };
|
|
228
|
+
}
|
|
229
|
+
})),
|
|
230
|
+
// === STAKING DATA (independent of market data; Morpho Earn is with the positions below) ===
|
|
231
|
+
...stakingAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
232
|
+
try {
|
|
233
|
+
if (!isFluidSupported)
|
|
234
|
+
return;
|
|
235
|
+
stakingPositions[address.toLowerCase()].fluid = yield (0, fluid_1._getAllUserEarnPositionsWithFTokens)(client, network, address);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
console.error(`Error fetching Fluid lend data for address ${address}:`, error);
|
|
239
|
+
stakingPositions[address.toLowerCase()].fluid = { error: `Error fetching Fluid lend data for address ${address}`, data: null };
|
|
240
|
+
}
|
|
241
|
+
})),
|
|
242
|
+
...stakingAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
243
|
+
try {
|
|
244
|
+
if (!isMainnet)
|
|
245
|
+
return;
|
|
246
|
+
stakingPositions[address.toLowerCase()].liquity = yield (0, liquity_1.getLiquityStakingData)(client, network, address);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
console.error(`Error fetching Liquity staking data for address ${address}:`, error);
|
|
250
|
+
stakingPositions[address.toLowerCase()].liquity = { error: `Error fetching Liquity staking data for address ${address}`, data: null };
|
|
251
|
+
}
|
|
252
|
+
})),
|
|
253
|
+
...stakingAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
254
|
+
try {
|
|
255
|
+
if (!isMainnet)
|
|
256
|
+
return;
|
|
257
|
+
stakingPositions[address.toLowerCase()].aaveV3 = yield (0, aaveV3_1.getStakeAaveData)(client, network, address);
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
console.error(`Error fetching Aave V3 staking data for address ${address}:`, error);
|
|
261
|
+
stakingPositions[address.toLowerCase()].aaveV3 = { error: `Error fetching Aave V3 staking data for address ${address}`, data: null };
|
|
262
|
+
}
|
|
263
|
+
})),
|
|
264
|
+
...stakingAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
265
|
+
try {
|
|
266
|
+
if (!isMainnet)
|
|
267
|
+
return;
|
|
268
|
+
stakingPositions[address.toLowerCase()].umbrella = yield (0, umbrella_1.getUmbrellaData)(client, network, address);
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
console.error(`Error fetching Umbrella staking data for address ${address}:`, error);
|
|
272
|
+
stakingPositions[address.toLowerCase()].umbrella = { error: `Error fetching Umbrella staking data for address ${address}`, data: null };
|
|
273
|
+
}
|
|
274
|
+
})),
|
|
275
|
+
// Liquity V2 stability pools, then sBOLD/yBOLD, which reads them.
|
|
276
|
+
...stakingAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
277
|
+
yield Promise.all(liquityV2MarketsStaking.map((market) => __awaiter(void 0, void 0, void 0, function* () {
|
|
278
|
+
try {
|
|
279
|
+
if (!isMainnet) {
|
|
280
|
+
stakingPositions[address.toLowerCase()].liquityV2[market.value] = { error: '', data: null };
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
const liquityV2StakingData = yield (0, liquityV2_1.getLiquityV2Staking)(client, network, market.value, address);
|
|
284
|
+
stakingPositions[address.toLowerCase()].liquityV2[market.value] = { error: '', data: liquityV2StakingData };
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
console.error(`Error fetching Liquity V2 staking data for address ${address}, market ${market.value}:`, error);
|
|
288
|
+
stakingPositions[address.toLowerCase()].liquityV2[market.value] = { error: `Error fetching Liquity V2 staking data for address ${address}`, data: null };
|
|
289
|
+
}
|
|
290
|
+
})));
|
|
291
|
+
try {
|
|
292
|
+
if (!isMainnet) {
|
|
293
|
+
stakingPositions[address.toLowerCase()].liquityV2SBoldYBold = { error: '', data: null };
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const data = yield (0, liquityV2_1.getLiquitySAndYBold)(client, network, stakingPositions[address.toLowerCase()].liquityV2, address);
|
|
297
|
+
stakingPositions[address.toLowerCase()].liquityV2SBoldYBold = { error: '', data };
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
console.error(`Error fetching SBold/YBold data for address ${address}:`, error);
|
|
301
|
+
stakingPositions[address.toLowerCase()].liquityV2SBoldYBold = { error: `Error fetching sBold/yBold data for address ${address}`, data: null };
|
|
302
|
+
}
|
|
303
|
+
})),
|
|
304
|
+
// === REWARDS DATA (independent of market data) ===
|
|
305
|
+
// Batch King rewards
|
|
306
|
+
(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
307
|
+
try {
|
|
308
|
+
if (!isMainnet) {
|
|
309
|
+
for (const address of rewardsAddresses) {
|
|
310
|
+
rewardsData[address.toLowerCase()].king = { error: '', data: [] };
|
|
311
|
+
}
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const kingRewards = yield (0, king_1.getKingRewards)(client, network, rewardsAddresses);
|
|
315
|
+
for (const address of rewardsAddresses) {
|
|
316
|
+
const lowerAddress = address.toLowerCase();
|
|
317
|
+
rewardsData[lowerAddress].king = {
|
|
318
|
+
error: '',
|
|
319
|
+
data: kingRewards[lowerAddress] || [],
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
console.error('Error fetching King rewards data in batch:', error);
|
|
325
|
+
for (const address of rewardsAddresses) {
|
|
326
|
+
rewardsData[address.toLowerCase()].king = {
|
|
327
|
+
error: 'Error fetching King rewards data in batch',
|
|
328
|
+
data: null,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}))(),
|
|
333
|
+
// Batch UNI rewards
|
|
334
|
+
(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
335
|
+
try {
|
|
336
|
+
if (!isMainnet) {
|
|
337
|
+
for (const address of rewardsAddresses) {
|
|
338
|
+
rewardsData[address.toLowerCase()].uniswap = { error: '', data: [] };
|
|
339
|
+
}
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const uniswapRewards = yield (0, uniswap_1.getUniswapRewards)(client, network, rewardsAddresses);
|
|
343
|
+
for (const address of rewardsAddresses) {
|
|
344
|
+
const lowerAddress = address.toLowerCase();
|
|
345
|
+
rewardsData[lowerAddress].uniswap = {
|
|
346
|
+
error: '',
|
|
347
|
+
data: uniswapRewards[lowerAddress] || [],
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
console.error('Error fetching Uniswap rewards data in batch:', error);
|
|
353
|
+
for (const address of rewardsAddresses) {
|
|
354
|
+
rewardsData[address.toLowerCase()].uniswap = {
|
|
355
|
+
error: 'Error fetching Uniswap rewards data in batch',
|
|
356
|
+
data: null,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}))(),
|
|
361
|
+
...lendingProtocols_1.sparkLending.markets(network).map((market) => rewardsAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
362
|
+
try {
|
|
363
|
+
if (!isMainnet) {
|
|
364
|
+
rewardsData[address.toLowerCase()].spark[market.value] = { error: '', data: [] };
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const sparkData = yield (0, spark_2.fetchSparkRewards)(client, network, address, market.providerAddress);
|
|
368
|
+
rewardsData[address.toLowerCase()].spark[market.value] = { error: '', data: sparkData };
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
console.error(`Error fetching Spark rewards data for address ${address}, market ${market.value}:`, error);
|
|
372
|
+
rewardsData[address.toLowerCase()].spark[market.value] = { error: `Error fetching Spark rewards data for address ${address}`, data: null };
|
|
373
|
+
}
|
|
374
|
+
}))).flat(),
|
|
375
|
+
...rewardsAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
376
|
+
try {
|
|
377
|
+
const merklData = yield (0, aaveV3_2.getMerklUnclaimedRewards)(address, network);
|
|
378
|
+
rewardsData[address.toLowerCase()].merkl = { error: '', data: merklData };
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
console.error(`Error fetching Merkl rewards data for address ${address}:`, error);
|
|
382
|
+
rewardsData[address.toLowerCase()].merkl = { error: `Error fetching Merkl rewards data for address ${address}`, data: null };
|
|
383
|
+
}
|
|
384
|
+
})),
|
|
385
|
+
...lendingProtocols_1.aaveV3Lending.markets(network).map(market => rewardsAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
386
|
+
try {
|
|
387
|
+
const aaveData = yield (0, aaveV3_2.getUnclaimedRewardsForAllMarkets)(client, network, address, market.providerAddress);
|
|
388
|
+
rewardsData[address.toLowerCase()].aaveV3[market.value] = { error: '', data: aaveData };
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
console.error(`Error fetching Aave V3 Merit rewards data for address ${address}:`, error);
|
|
392
|
+
// This market only: the other markets keep their rewards.
|
|
393
|
+
rewardsData[address.toLowerCase()].aaveV3[market.value] = { error: `Error fetching Aave V3 rewards data for address ${address} on market ${market.value}`, data: null };
|
|
394
|
+
}
|
|
395
|
+
}))).flat(),
|
|
396
|
+
// Batch Spark Airdrop rewards
|
|
397
|
+
(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
398
|
+
try {
|
|
399
|
+
if (!isMainnet) {
|
|
400
|
+
for (const address of rewardsAddresses) {
|
|
401
|
+
rewardsData[address.toLowerCase()].spk = { error: '', data: [] };
|
|
402
|
+
}
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
const sparkAirdropRewards = yield (0, spark_2.fetchSparkAirdropRewards)(client, network, rewardsAddresses);
|
|
406
|
+
for (const address of rewardsAddresses) {
|
|
407
|
+
const lowerAddress = address.toLowerCase();
|
|
408
|
+
rewardsData[lowerAddress].spk = {
|
|
409
|
+
error: '',
|
|
410
|
+
data: sparkAirdropRewards[lowerAddress] || [],
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
catch (error) {
|
|
415
|
+
console.error('Error fetching Spark Airdrop rewards data in batch:', error);
|
|
416
|
+
for (const address of rewardsAddresses) {
|
|
417
|
+
rewardsData[address.toLowerCase()].spk = {
|
|
418
|
+
error: 'Error fetching Spark Airdrop rewards data in batch',
|
|
419
|
+
data: null,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}))(),
|
|
424
|
+
(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
425
|
+
try {
|
|
426
|
+
if (!isMainnet) {
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
const ethenaAirdropRewards = yield (0, ethena_1.fetchEthenaAirdropRewards)(rewardsAddresses);
|
|
430
|
+
for (const address of rewardsAddresses) {
|
|
431
|
+
const lowerAddress = address.toLowerCase();
|
|
432
|
+
rewardsData[lowerAddress].ethena = {
|
|
433
|
+
error: '',
|
|
434
|
+
data: ethenaAirdropRewards[lowerAddress] || [],
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
catch (error) {
|
|
439
|
+
console.error('Error fetching Ethena Airdrop rewards data:', error);
|
|
440
|
+
for (const address of rewardsAddresses) {
|
|
441
|
+
rewardsData[address.toLowerCase()].ethena = {
|
|
442
|
+
error: 'Error fetching Ethena Airdrop rewards data in batch',
|
|
443
|
+
data: null,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}))(),
|
|
448
|
+
// === POSITIONS ON MARKETS (each waits for its market's data) ===
|
|
449
|
+
...lendingProtocols_1.LENDING_PROTOCOLS.flatMap((protocol) => protocol.readPositions({ client, network }, positionsAddresses, marketsData, positions)),
|
|
450
|
+
// Morpho Blue Earn: a supply without a borrow, kept as staking, read on the same markets as Morpho Blue's positions.
|
|
451
|
+
...lendingProtocols_1.morphoBlueLending.markets(network).flatMap((market) => stakingAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
452
|
+
try {
|
|
453
|
+
const marketData = (0, lendingProtocols_1.requireMarket)((yield marketsData).morphoMarketsData, market.value);
|
|
454
|
+
const earnData = yield (0, morphoBlue_1.getMorphoEarn)(client, network, address, market, marketData);
|
|
455
|
+
if (earnData && new decimal_js_1.default(earnData.amount).gt(0)) {
|
|
456
|
+
stakingPositions[address.toLowerCase()].morphoBlue[market.value] = { error: '', data: earnData };
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
catch (error) {
|
|
460
|
+
console.error(`Error fetching MorphoBlue earn data for address ${address} on market ${market.value}:`, error);
|
|
461
|
+
stakingPositions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue earn data for address ${address} on market ${market.value}`, data: null };
|
|
462
|
+
}
|
|
463
|
+
}))),
|
|
464
|
+
// Liquity V2 troves: one market's trove ids for every address at once, then each trove's data. A failure is the
|
|
465
|
+
// market's error; the troves that did load stay in its data.
|
|
466
|
+
...(liquityV2Addresses.length ? liquityV2Markets : []).map((market) => __awaiter(void 0, void 0, void 0, function* () {
|
|
467
|
+
const setEntry = (address, entry) => {
|
|
468
|
+
positions[address.toLowerCase()].liquityV2[market.value] = entry;
|
|
469
|
+
};
|
|
470
|
+
const failAll = (error) => liquityV2Addresses.forEach((address) => setEntry(address, { error, data: {} }));
|
|
471
|
+
const allMarketsData = (yield marketsData).liquityV2MarketsData;
|
|
472
|
+
const marketData = allMarketsData[market.value];
|
|
473
|
+
if (!marketData) {
|
|
474
|
+
failAll(`Error fetching Liquity V2 market data for market ${market.value}`);
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
let troveIds;
|
|
478
|
+
try {
|
|
479
|
+
troveIds = yield (0, liquityV2_1._getLiquityV2UsersTroveIds)(client, network, market, marketData.marketData.troveNFTAddress, isSim, liquityV2Addresses);
|
|
480
|
+
}
|
|
481
|
+
catch (error) {
|
|
482
|
+
console.error(`Error fetching Liquity V2 trove ids on market ${market.value}:`, error);
|
|
483
|
+
failAll(`Error fetching Liquity V2 troves on market ${market.value}`);
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
yield Promise.all(liquityV2Addresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
487
|
+
var _a;
|
|
488
|
+
const entry = { error: '', data: {} };
|
|
489
|
+
const failed = [];
|
|
490
|
+
yield Promise.all(((_a = troveIds[address]) !== null && _a !== void 0 ? _a : []).map((troveId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
491
|
+
try {
|
|
492
|
+
entry.data[troveId] = yield (0, liquityV2_1._getLiquityV2TroveData)(client, network, {
|
|
493
|
+
selectedMarket: market,
|
|
494
|
+
assetsData: marketData.assetsData,
|
|
495
|
+
troveId,
|
|
496
|
+
allMarketsData: allMarketsData,
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
catch (error) {
|
|
500
|
+
console.error(`Error fetching Liquity V2 trove ${troveId} for address ${address} on market ${market.value}:`, error);
|
|
501
|
+
failed.push(troveId);
|
|
502
|
+
}
|
|
503
|
+
})));
|
|
504
|
+
if (failed.length)
|
|
505
|
+
entry.error = `Error fetching Liquity V2 troves ${failed.join(', ')} for address ${address} on market ${market.value}`;
|
|
506
|
+
setEntry(address, entry);
|
|
507
|
+
})));
|
|
508
|
+
})),
|
|
509
|
+
]);
|
|
510
|
+
return {
|
|
511
|
+
positions,
|
|
512
|
+
stakingPositions,
|
|
513
|
+
rewardsData,
|
|
514
|
+
errors: Object.keys(makerCdpsErrors).length ? { makerCdps: makerCdpsErrors } : {},
|
|
515
|
+
};
|
|
516
|
+
});
|
|
517
|
+
/**
|
|
518
|
+
* Every market the portfolio reads on a network — the markets half of getPortfolioData, for a caller that keeps
|
|
519
|
+
* markets apart from what it reads per address (a cache shared by many addresses). A market that fails is left out
|
|
520
|
+
* of `markets` and named in `errors`.
|
|
521
|
+
*/
|
|
522
|
+
function getPortfolioMarketsData(provider_1, network_1, defaultProvider_1) {
|
|
523
|
+
return __awaiter(this, arguments, void 0, function* (provider, network, defaultProvider, isSim = false) {
|
|
524
|
+
const { client, defaultClient } = getPortfolioClients(provider, defaultProvider, network, isSim);
|
|
525
|
+
return _getPortfolioMarketsData(client, defaultClient, network);
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* What the portfolio reads per address — the other half of getPortfolioData — against `markets` from
|
|
530
|
+
* getPortfolioMarketsData. `markets` can be a promise: reads that do not need a market (Maker, Fluid, Liquity, staking,
|
|
531
|
+
* rewards) start at once, and each read on a market waits for it. A position on a market missing from `markets` is an
|
|
532
|
+
* entry with an error.
|
|
533
|
+
*/
|
|
534
|
+
function getPortfolioUserData(provider_1, network_1, addresses_1, markets_2) {
|
|
535
|
+
return __awaiter(this, arguments, void 0, function* (provider, network, addresses, markets, isSim = false, options = {}) {
|
|
536
|
+
const { client } = getPortfolioClients(provider, provider, network, isSim);
|
|
537
|
+
return _getPortfolioUserData(client, network, addresses, Promise.resolve(markets), isSim, options);
|
|
538
|
+
});
|
|
539
|
+
}
|
|
56
540
|
function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1) {
|
|
57
541
|
return __awaiter(this, arguments, void 0, function* (provider, network, defaultProvider, addresses, isSim = false, options = {}) {
|
|
542
|
+
// One pair of clients for both halves, so their calls batch together.
|
|
543
|
+
const { client, defaultClient } = getPortfolioClients(provider, defaultProvider, network, isSim);
|
|
544
|
+
const marketsResult = _getPortfolioMarketsData(client, defaultClient, network);
|
|
545
|
+
const [{ markets, errors: marketsErrors }, userData] = yield Promise.all([
|
|
546
|
+
marketsResult,
|
|
547
|
+
_getPortfolioUserData(client, network, addresses, marketsResult.then((result) => result.markets), isSim, options),
|
|
548
|
+
]);
|
|
549
|
+
return {
|
|
550
|
+
positions: userData.positions,
|
|
551
|
+
stakingPositions: userData.stakingPositions,
|
|
552
|
+
rewardsData: userData.rewardsData,
|
|
553
|
+
markets,
|
|
554
|
+
errors: Object.assign(Object.assign({}, (Object.keys(marketsErrors).length ? { markets: marketsErrors } : {})), userData.errors),
|
|
555
|
+
};
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
function getShifterPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1) {
|
|
559
|
+
return __awaiter(this, arguments, void 0, function* (provider, network, defaultProvider, addresses, isSim = false) {
|
|
58
560
|
const isMainnet = network === common_1.NetworkNumber.Eth;
|
|
59
|
-
const includeStaking = options.staking !== false;
|
|
60
|
-
const includeRewards = options.rewards !== false;
|
|
61
|
-
// The addresses staking and rewards are read for: none when left out, so their fetches below make no calls.
|
|
62
|
-
const stakingAddresses = includeStaking ? addresses : [];
|
|
63
|
-
const rewardsAddresses = includeRewards ? addresses : [];
|
|
64
561
|
const isFluidSupported = [common_1.NetworkNumber.Eth, common_1.NetworkNumber.Arb, common_1.NetworkNumber.Base, common_1.NetworkNumber.Plasma].includes(network);
|
|
65
562
|
const morphoMarkets = Object.values((0, markets_1.MorphoBlueMarkets)(network)).filter((market) => market.chainIds.includes(network));
|
|
66
|
-
const morphoMidnightMarkets = Object.values((0, markets_1.MorphoMidnightMarkets)(network)).filter((market) => market.chainIds.includes(network));
|
|
67
563
|
const compoundV3Markets = Object.values((0, markets_1.CompoundMarkets)(network)).filter((market) => market.chainIds.includes(network) && market.value !== types_1.CompoundVersions.CompoundV2);
|
|
68
564
|
const sparkMarkets = Object.values((0, markets_1.SparkMarkets)(network)).filter((market) => market.chainIds.includes(network));
|
|
69
565
|
const aaveV3Markets = [types_1.AaveVersions.AaveV3, types_1.AaveVersions.AaveV3Lido, types_1.AaveVersions.AaveV3Etherfi].map((version) => (0, markets_1.AaveMarkets)(network)[version]).filter((market) => market.chainIds.includes(network));
|
|
@@ -72,51 +568,33 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
|
|
|
72
568
|
const crvUsdMarkets = Object.values((0, markets_1.CrvUsdMarkets)(network)).filter((market) => market.chainIds.includes(network));
|
|
73
569
|
const llamaLendMarkets = [common_1.NetworkNumber.Eth, common_1.NetworkNumber.Arb].includes(network) ? Object.values((0, markets_1.LlamaLendMarkets)(network)).filter((market) => market.chainIds.includes(network)) : [];
|
|
74
570
|
const liquityV2Markets = [common_1.NetworkNumber.Eth].includes(network) ? Object.values((0, markets_1.LiquityV2Markets)(network)) : [];
|
|
75
|
-
const liquityV2MarketsStaking = [common_1.NetworkNumber.Eth].includes(network) ? Object.values((0, markets_1.LiquityV2Markets)(network)).filter(market => !market.isLegacy) : [];
|
|
76
571
|
const aaveV4Spokes = Object.values((0, markets_1.AaveV4Spokes)(network)).filter((market) => market.chainIds.includes(network));
|
|
77
|
-
|
|
78
|
-
// ~4x larger (hex + aggregate3 ABI + JSON overhead) and RPC providers reject bodies over
|
|
79
|
-
// ~2.5MB with HTTP 413, so keep this small enough that no single body gets near that.
|
|
80
|
-
// 250k gives the largest body of around 1.26MB - if we bump, we can save maybe 2-3 rpc calls but scaling takes a hit
|
|
81
|
-
// (e.g. adding new markets may result in body size going over alchemy body size limit)
|
|
82
|
-
const args = [network, { batch: { multicall: { batchSize: isSim ? 2000 : 250000 } } }];
|
|
572
|
+
const args = [network, { batch: { multicall: { batchSize: isSim ? 2000 : 2500000 } } }];
|
|
83
573
|
const client = (0, viem_1.getViemProvider)(provider, ...args);
|
|
84
574
|
const defaultClient = (0, viem_1.getViemProvider)(defaultProvider, ...args);
|
|
85
|
-
const morphoMarketsData = {};
|
|
86
|
-
const morphoMidnightMarketsData = {};
|
|
87
|
-
const compoundV3MarketsData = {};
|
|
88
|
-
const sparkMarketsData = {};
|
|
89
|
-
const aaveV3MarketsData = {};
|
|
90
|
-
const makerCdps = {};
|
|
91
|
-
const aaveV2MarketsData = {};
|
|
92
|
-
const compoundV2MarketsData = {};
|
|
93
|
-
const crvUsdMarketsData = {};
|
|
94
|
-
const llamaLendMarketsData = {};
|
|
95
|
-
const liquityV2MarketsData = {};
|
|
96
|
-
const aaveV4SpokesData = {};
|
|
97
575
|
const markets = {
|
|
98
|
-
morphoMarketsData,
|
|
99
|
-
morphoMidnightMarketsData,
|
|
100
|
-
compoundV3MarketsData,
|
|
101
|
-
sparkMarketsData,
|
|
102
|
-
aaveV3MarketsData,
|
|
103
|
-
aaveV2MarketsData,
|
|
104
|
-
compoundV2MarketsData,
|
|
105
|
-
crvUsdMarketsData,
|
|
106
|
-
llamaLendMarketsData,
|
|
107
|
-
liquityV2MarketsData,
|
|
108
|
-
aaveV4SpokesData,
|
|
576
|
+
morphoMarketsData: {},
|
|
577
|
+
morphoMidnightMarketsData: {}, // Morpho Midnight is not fetched for the shifter; key kept so the payload shape is stable
|
|
578
|
+
compoundV3MarketsData: {},
|
|
579
|
+
sparkMarketsData: {},
|
|
580
|
+
aaveV3MarketsData: {},
|
|
581
|
+
aaveV2MarketsData: {},
|
|
582
|
+
compoundV2MarketsData: {},
|
|
583
|
+
crvUsdMarketsData: {},
|
|
584
|
+
llamaLendMarketsData: {},
|
|
585
|
+
liquityV2MarketsData: {},
|
|
586
|
+
aaveV4SpokesData: {},
|
|
587
|
+
fluidMarketsData: {},
|
|
588
|
+
makerMarketsData: {},
|
|
109
589
|
};
|
|
590
|
+
const makerCdps = {};
|
|
110
591
|
const positions = {};
|
|
111
|
-
const
|
|
112
|
-
const rewardsData = {};
|
|
113
|
-
const allAddresses = [...addresses];
|
|
114
|
-
for (const address of allAddresses) {
|
|
592
|
+
for (const address of addresses) {
|
|
115
593
|
positions[address.toLowerCase()] = {
|
|
116
594
|
aaveV3: {},
|
|
117
595
|
aaveV4: {},
|
|
118
596
|
morphoBlue: {},
|
|
119
|
-
morphoMidnight: {},
|
|
597
|
+
morphoMidnight: {}, // not fetched for the shifter (see markets above)
|
|
120
598
|
compoundV3: {},
|
|
121
599
|
spark: {},
|
|
122
600
|
maker: {},
|
|
@@ -131,83 +609,58 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
|
|
|
131
609
|
},
|
|
132
610
|
};
|
|
133
611
|
}
|
|
134
|
-
// TODO: check default values, probably needed when fetching portfolio on unsupported networks
|
|
135
|
-
for (const address of stakingAddresses) {
|
|
136
|
-
stakingPositions[address.toLowerCase()] = {
|
|
137
|
-
aaveV3: {},
|
|
138
|
-
morphoBlue: {},
|
|
139
|
-
compoundV3: {},
|
|
140
|
-
spark: {},
|
|
141
|
-
aaveV2: {},
|
|
142
|
-
compoundV2: {},
|
|
143
|
-
liquity: {},
|
|
144
|
-
liquityV2: {},
|
|
145
|
-
fluid: {
|
|
146
|
-
error: '',
|
|
147
|
-
data: {},
|
|
148
|
-
},
|
|
149
|
-
// Set by the sBOLD/yBOLD fetch below, whether it succeeds or fails.
|
|
150
|
-
liquityV2SBoldYBold: { error: '', data: null },
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
for (const address of rewardsAddresses) {
|
|
154
|
-
// merkl, spk, king and uniswap are set by their fetches below, whether they succeed or fail.
|
|
155
|
-
rewardsData[address.toLowerCase()] = {
|
|
156
|
-
merkl: { error: '', data: null },
|
|
157
|
-
aaveV3: {},
|
|
158
|
-
spark: {},
|
|
159
|
-
spk: { error: '', data: null },
|
|
160
|
-
king: { error: '', data: null },
|
|
161
|
-
ethena: {},
|
|
162
|
-
uniswap: { error: '', data: null },
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
612
|
yield Promise.allSettled([
|
|
166
613
|
// === MARKET DATA (needs to be fetched first) ===
|
|
167
614
|
...morphoMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
168
|
-
|
|
169
|
-
morphoMarketsData[market.value] = marketData;
|
|
170
|
-
})),
|
|
171
|
-
...morphoMidnightMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
172
|
-
const marketData = yield (0, morphoMidnight_1._getMorphoMidnightMarketData)(client, network, market);
|
|
173
|
-
morphoMidnightMarketsData[market.value] = marketData;
|
|
615
|
+
markets.morphoMarketsData[market.value] = yield (0, morphoBlue_1._getMorphoBluePortfolioMarketData)(client, network, market);
|
|
174
616
|
})),
|
|
175
617
|
...compoundV3Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
176
|
-
|
|
177
|
-
compoundV3MarketsData[market.value] = marketData;
|
|
618
|
+
markets.compoundV3MarketsData[market.value] = yield (0, compoundV3_1._getCompoundV3MarketsData)(client, network, market, defaultClient);
|
|
178
619
|
})),
|
|
179
620
|
...sparkMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
180
|
-
|
|
181
|
-
sparkMarketsData[market.value] = marketData;
|
|
621
|
+
markets.sparkMarketsData[market.value] = yield (0, spark_1._getSparkMarketsData)(client, network, market);
|
|
182
622
|
})),
|
|
183
623
|
...aaveV3Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
184
|
-
|
|
185
|
-
aaveV3MarketsData[market.value] = marketData;
|
|
624
|
+
markets.aaveV3MarketsData[market.value] = yield (0, aaveV3_1._getAaveV3MarketData)(client, network, market);
|
|
186
625
|
})),
|
|
187
626
|
...aaveV4Spokes.map((spoke) => __awaiter(this, void 0, void 0, function* () {
|
|
188
|
-
|
|
189
|
-
aaveV4SpokesData[spoke.value] = spokeData;
|
|
627
|
+
markets.aaveV4SpokesData[spoke.value] = yield (0, aaveV4_1._getAaveV4SpokeData)(client, network, spoke);
|
|
190
628
|
})),
|
|
191
629
|
...aaveV2Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
192
|
-
|
|
193
|
-
aaveV2MarketsData[market.value] = marketData;
|
|
630
|
+
markets.aaveV2MarketsData[market.value] = yield (0, aaveV2_1._getAaveV2MarketsData)(client, network, market);
|
|
194
631
|
})),
|
|
195
632
|
...compoundV2Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
196
|
-
|
|
197
|
-
compoundV2MarketsData[market.value] = marketData;
|
|
633
|
+
markets.compoundV2MarketsData[market.value] = yield (0, compoundV2_1._getCompoundV2MarketsData)(client, network);
|
|
198
634
|
})),
|
|
199
635
|
...crvUsdMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
200
|
-
|
|
201
|
-
crvUsdMarketsData[market.value] = marketData;
|
|
636
|
+
markets.crvUsdMarketsData[market.value] = yield (0, curveUsd_1._getCurveUsdGlobalData)(client, network, market);
|
|
202
637
|
})),
|
|
203
638
|
...llamaLendMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
204
|
-
|
|
205
|
-
llamaLendMarketsData[market.value] = marketData;
|
|
639
|
+
markets.llamaLendMarketsData[market.value] = yield (0, llamaLend_1._getLlamaLendGlobalData)(client, network, market);
|
|
206
640
|
})),
|
|
207
641
|
...liquityV2Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
208
|
-
|
|
209
|
-
liquityV2MarketsData[market.value] = marketData;
|
|
642
|
+
markets.liquityV2MarketsData[market.value] = yield (0, liquityV2_1._getLiquityV2MarketData)(client, network, market);
|
|
210
643
|
})),
|
|
644
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
645
|
+
if (!isFluidSupported)
|
|
646
|
+
return;
|
|
647
|
+
try {
|
|
648
|
+
markets.fluidMarketsData = yield (0, fluid_1._getAllFluidMarketDataPortfolio)(client, network);
|
|
649
|
+
}
|
|
650
|
+
catch (error) {
|
|
651
|
+
console.error('Error fetching Fluid markets data:', error);
|
|
652
|
+
}
|
|
653
|
+
}))(),
|
|
654
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
655
|
+
if (!isMainnet)
|
|
656
|
+
return; // Maker CDPs are only available on mainnet
|
|
657
|
+
try {
|
|
658
|
+
markets.makerMarketsData = yield (0, maker_1._getMakerIlksData)(client, network, markets_1.MakerActiveIlks);
|
|
659
|
+
}
|
|
660
|
+
catch (error) {
|
|
661
|
+
console.error('Error fetching Maker ilks data:', error);
|
|
662
|
+
}
|
|
663
|
+
}))(),
|
|
211
664
|
// === INDEPENDENT USER DATA (doesn't depend on market data) ===
|
|
212
665
|
...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
213
666
|
if (!isMainnet)
|
|
@@ -234,226 +687,22 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
|
|
|
234
687
|
};
|
|
235
688
|
}
|
|
236
689
|
})),
|
|
237
|
-
// === STAKING DATA (independent of market data) ===
|
|
238
|
-
...stakingAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
239
|
-
try {
|
|
240
|
-
if (!isFluidSupported)
|
|
241
|
-
return;
|
|
242
|
-
stakingPositions[address.toLowerCase()].fluid = yield (0, fluid_1._getAllUserEarnPositionsWithFTokens)(client, network, address);
|
|
243
|
-
}
|
|
244
|
-
catch (error) {
|
|
245
|
-
console.error(`Error fetching Fluid lend data for address ${address}:`, error);
|
|
246
|
-
stakingPositions[address.toLowerCase()].fluid = { error: `Error fetching Fluid lend data for address ${address}`, data: null };
|
|
247
|
-
}
|
|
248
|
-
})),
|
|
249
|
-
...stakingAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
250
|
-
try {
|
|
251
|
-
if (!isMainnet)
|
|
252
|
-
return;
|
|
253
|
-
stakingPositions[address.toLowerCase()].liquity = yield (0, liquity_1.getLiquityStakingData)(client, network, address);
|
|
254
|
-
}
|
|
255
|
-
catch (error) {
|
|
256
|
-
console.error(`Error fetching Liquity staking data for address ${address}:`, error);
|
|
257
|
-
stakingPositions[address.toLowerCase()].liquity = { error: `Error fetching Liquity staking data for address ${address}`, data: null };
|
|
258
|
-
}
|
|
259
|
-
})),
|
|
260
|
-
...stakingAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
261
|
-
try {
|
|
262
|
-
if (!isMainnet)
|
|
263
|
-
return;
|
|
264
|
-
stakingPositions[address.toLowerCase()].aaveV3 = yield (0, aaveV3_1.getStakeAaveData)(client, network, address);
|
|
265
|
-
}
|
|
266
|
-
catch (error) {
|
|
267
|
-
console.error(`Error fetching Aave V3 staking data for address ${address}:`, error);
|
|
268
|
-
stakingPositions[address.toLowerCase()].aaveV3 = { error: `Error fetching Aave V3 staking data for address ${address}`, data: null };
|
|
269
|
-
}
|
|
270
|
-
})),
|
|
271
|
-
...stakingAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
272
|
-
try {
|
|
273
|
-
if (!isMainnet)
|
|
274
|
-
return;
|
|
275
|
-
stakingPositions[address.toLowerCase()].umbrella = yield (0, umbrella_1.getUmbrellaData)(client, network, address);
|
|
276
|
-
}
|
|
277
|
-
catch (error) {
|
|
278
|
-
console.error(`Error fetching Umbrella staking data for address ${address}:`, error);
|
|
279
|
-
stakingPositions[address.toLowerCase()].umbrella = { error: `Error fetching Umbrella staking data for address ${address}`, data: null };
|
|
280
|
-
}
|
|
281
|
-
})),
|
|
282
|
-
// Liquity V2 staking
|
|
283
|
-
...liquityV2MarketsStaking.map(market => stakingAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
284
|
-
try {
|
|
285
|
-
if (!isMainnet) {
|
|
286
|
-
stakingPositions[address.toLowerCase()].liquityV2[market.value] = { error: '', data: null };
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
const liquityV2StakingData = yield (0, liquityV2_1.getLiquityV2Staking)(client, network, market.value, address);
|
|
290
|
-
stakingPositions[address.toLowerCase()].liquityV2[market.value] = { error: '', data: liquityV2StakingData };
|
|
291
|
-
}
|
|
292
|
-
catch (error) {
|
|
293
|
-
console.error(`Error fetching Liquity V2 staking data for address ${address}, market ${market.value}:`, error);
|
|
294
|
-
stakingPositions[address.toLowerCase()].liquityV2[market.value] = { error: `Error fetching Liquity V2 staking data for address ${address}`, data: null };
|
|
295
|
-
}
|
|
296
|
-
}))).flat(),
|
|
297
|
-
// === REWARDS DATA (independent of market data) ===
|
|
298
|
-
// Batch King rewards
|
|
299
|
-
(() => __awaiter(this, void 0, void 0, function* () {
|
|
300
|
-
try {
|
|
301
|
-
if (!isMainnet) {
|
|
302
|
-
for (const address of rewardsAddresses) {
|
|
303
|
-
rewardsData[address.toLowerCase()].king = { error: '', data: [] };
|
|
304
|
-
}
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
const kingRewards = yield (0, king_1.getKingRewards)(client, network, rewardsAddresses);
|
|
308
|
-
for (const address of rewardsAddresses) {
|
|
309
|
-
const lowerAddress = address.toLowerCase();
|
|
310
|
-
rewardsData[lowerAddress].king = {
|
|
311
|
-
error: '',
|
|
312
|
-
data: kingRewards[lowerAddress] || [],
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
catch (error) {
|
|
317
|
-
console.error('Error fetching King rewards data in batch:', error);
|
|
318
|
-
for (const address of rewardsAddresses) {
|
|
319
|
-
rewardsData[address.toLowerCase()].king = {
|
|
320
|
-
error: 'Error fetching King rewards data in batch',
|
|
321
|
-
data: null,
|
|
322
|
-
};
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
}))(),
|
|
326
|
-
// Batch UNI rewards
|
|
327
|
-
(() => __awaiter(this, void 0, void 0, function* () {
|
|
328
|
-
try {
|
|
329
|
-
if (!isMainnet) {
|
|
330
|
-
for (const address of rewardsAddresses) {
|
|
331
|
-
rewardsData[address.toLowerCase()].uniswap = { error: '', data: [] };
|
|
332
|
-
}
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
const uniswapRewards = yield (0, uniswap_1.getUniswapRewards)(client, network, rewardsAddresses);
|
|
336
|
-
for (const address of rewardsAddresses) {
|
|
337
|
-
const lowerAddress = address.toLowerCase();
|
|
338
|
-
rewardsData[lowerAddress].uniswap = {
|
|
339
|
-
error: '',
|
|
340
|
-
data: uniswapRewards[lowerAddress] || [],
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
catch (error) {
|
|
345
|
-
console.error('Error fetching Uniswap rewards data in batch:', error);
|
|
346
|
-
for (const address of rewardsAddresses) {
|
|
347
|
-
rewardsData[address.toLowerCase()].uniswap = {
|
|
348
|
-
error: 'Error fetching Uniswap rewards data in batch',
|
|
349
|
-
data: null,
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
}))(),
|
|
354
|
-
...sparkMarkets.map((market) => rewardsAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
355
|
-
try {
|
|
356
|
-
if (!isMainnet) {
|
|
357
|
-
rewardsData[address.toLowerCase()].spark[market.value] = { error: '', data: [] };
|
|
358
|
-
return;
|
|
359
|
-
}
|
|
360
|
-
const sparkData = yield (0, spark_2.fetchSparkRewards)(client, network, address, market.providerAddress);
|
|
361
|
-
rewardsData[address.toLowerCase()].spark[market.value] = { error: '', data: sparkData };
|
|
362
|
-
}
|
|
363
|
-
catch (error) {
|
|
364
|
-
console.error(`Error fetching Spark rewards data for address ${address}, market ${market.value}:`, error);
|
|
365
|
-
rewardsData[address.toLowerCase()].spark[market.value] = { error: `Error fetching Spark rewards data for address ${address}`, data: null };
|
|
366
|
-
}
|
|
367
|
-
}))).flat(),
|
|
368
|
-
...rewardsAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
369
|
-
try {
|
|
370
|
-
const merklData = yield (0, aaveV3_2.getMerklUnclaimedRewards)(address, network);
|
|
371
|
-
rewardsData[address.toLowerCase()].merkl = { error: '', data: merklData };
|
|
372
|
-
}
|
|
373
|
-
catch (error) {
|
|
374
|
-
console.error(`Error fetching Merkl rewards data for address ${address}:`, error);
|
|
375
|
-
rewardsData[address.toLowerCase()].merkl = { error: `Error fetching Merkl rewards data for address ${address}`, data: null };
|
|
376
|
-
}
|
|
377
|
-
})),
|
|
378
|
-
...aaveV3Markets.map(market => rewardsAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
379
|
-
try {
|
|
380
|
-
const aaveData = yield (0, aaveV3_2.getUnclaimedRewardsForAllMarkets)(client, network, address, market.providerAddress);
|
|
381
|
-
rewardsData[address.toLowerCase()].aaveV3[market.value] = { error: '', data: aaveData };
|
|
382
|
-
}
|
|
383
|
-
catch (error) {
|
|
384
|
-
console.error(`Error fetching Aave V3 Merit rewards data for address ${address}:`, error);
|
|
385
|
-
// This market only: the other markets keep their rewards.
|
|
386
|
-
rewardsData[address.toLowerCase()].aaveV3[market.value] = { error: `Error fetching Aave V3 rewards data for address ${address} on market ${market.value}`, data: null };
|
|
387
|
-
}
|
|
388
|
-
}))).flat(),
|
|
389
|
-
// Batch Spark Airdrop rewards
|
|
390
|
-
(() => __awaiter(this, void 0, void 0, function* () {
|
|
391
|
-
try {
|
|
392
|
-
if (!isMainnet) {
|
|
393
|
-
for (const address of rewardsAddresses) {
|
|
394
|
-
rewardsData[address.toLowerCase()].spk = { error: '', data: [] };
|
|
395
|
-
}
|
|
396
|
-
return;
|
|
397
|
-
}
|
|
398
|
-
const sparkAirdropRewards = yield (0, spark_2.fetchSparkAirdropRewards)(client, network, rewardsAddresses);
|
|
399
|
-
for (const address of rewardsAddresses) {
|
|
400
|
-
const lowerAddress = address.toLowerCase();
|
|
401
|
-
rewardsData[lowerAddress].spk = {
|
|
402
|
-
error: '',
|
|
403
|
-
data: sparkAirdropRewards[lowerAddress] || [],
|
|
404
|
-
};
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
catch (error) {
|
|
408
|
-
console.error('Error fetching Spark Airdrop rewards data in batch:', error);
|
|
409
|
-
for (const address of rewardsAddresses) {
|
|
410
|
-
rewardsData[address.toLowerCase()].spk = {
|
|
411
|
-
error: 'Error fetching Spark Airdrop rewards data in batch',
|
|
412
|
-
data: null,
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
}))(),
|
|
417
|
-
(() => __awaiter(this, void 0, void 0, function* () {
|
|
418
|
-
try {
|
|
419
|
-
if (!isMainnet) {
|
|
420
|
-
return;
|
|
421
|
-
}
|
|
422
|
-
const ethenaAirdropRewards = yield (0, ethena_1.fetchEthenaAirdropRewards)(rewardsAddresses);
|
|
423
|
-
for (const address of rewardsAddresses) {
|
|
424
|
-
const lowerAddress = address.toLowerCase();
|
|
425
|
-
rewardsData[lowerAddress].ethena = {
|
|
426
|
-
error: '',
|
|
427
|
-
data: ethenaAirdropRewards[lowerAddress] || [],
|
|
428
|
-
};
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
catch (error) {
|
|
432
|
-
console.error('Error fetching Ethena Airdrop rewards data:', error);
|
|
433
|
-
for (const address of rewardsAddresses) {
|
|
434
|
-
rewardsData[address.toLowerCase()].ethena = {
|
|
435
|
-
error: 'Error fetching Ethena Airdrop rewards data in batch',
|
|
436
|
-
data: null,
|
|
437
|
-
};
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}))(),
|
|
441
690
|
]);
|
|
442
691
|
yield Promise.all([
|
|
443
|
-
...aaveV3Markets.map((market) =>
|
|
692
|
+
...aaveV3Markets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
444
693
|
try {
|
|
445
|
-
const accData = yield (0, aaveV3_1._getAaveV3AccountData)(client, network, address, Object.assign({ selectedMarket: market }, aaveV3MarketsData[market.value]));
|
|
446
|
-
|
|
447
|
-
|
|
694
|
+
const accData = yield (0, aaveV3_1._getAaveV3AccountData)(client, network, address, Object.assign({ selectedMarket: market }, markets.aaveV3MarketsData[market.value]));
|
|
695
|
+
// Always store the position (even with no supply) so the eMode category is available to the shifter
|
|
696
|
+
positions[address.toLowerCase()].aaveV3[market.value] = { error: '', data: accData };
|
|
448
697
|
}
|
|
449
698
|
catch (error) {
|
|
450
699
|
console.error(`Error fetching AaveV3 account data for address ${address} on market ${market.value}:`, error);
|
|
451
700
|
positions[address.toLowerCase()].aaveV3[market.value] = { error: `Error fetching AaveV3 account data for address ${address} on market ${market.value}`, data: null };
|
|
452
701
|
}
|
|
453
702
|
}))).flat(),
|
|
454
|
-
...aaveV4Spokes.map((spoke) =>
|
|
703
|
+
...aaveV4Spokes.map((spoke) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
455
704
|
try {
|
|
456
|
-
const accData = yield (0, aaveV4_1._getAaveV4AccountData)(client, network, aaveV4SpokesData[spoke.value], address);
|
|
705
|
+
const accData = yield (0, aaveV4_1._getAaveV4AccountData)(client, network, markets.aaveV4SpokesData[spoke.value], address);
|
|
457
706
|
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
458
707
|
positions[address.toLowerCase()].aaveV4[spoke.value] = { error: '', data: accData };
|
|
459
708
|
}
|
|
@@ -464,57 +713,18 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
|
|
|
464
713
|
}))).flat(),
|
|
465
714
|
...morphoMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
466
715
|
try {
|
|
467
|
-
const
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
]);
|
|
471
|
-
if (accDataPromise.status === 'rejected') {
|
|
472
|
-
console.error(`Error fetching MorphoBlue account data for address ${address} on market ${market.value}:`, accDataPromise.reason);
|
|
473
|
-
positions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue account data for address ${address} on market ${market.value}`, data: null };
|
|
474
|
-
}
|
|
475
|
-
if (earnDataPromise.status === 'rejected') {
|
|
476
|
-
// An Earn failure belongs to the staking entry: the lending position is not the one that failed.
|
|
477
|
-
console.error(`Error fetching MorphoBlue earn data for address ${address} on market ${market.value}:`, earnDataPromise.reason);
|
|
478
|
-
stakingPositions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue earn data for address ${address} on market ${market.value}`, data: null };
|
|
479
|
-
}
|
|
480
|
-
if (accDataPromise.status !== 'rejected') {
|
|
481
|
-
const accData = accDataPromise.value;
|
|
482
|
-
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
483
|
-
positions[address.toLowerCase()].morphoBlue[market.value] = { error: '', data: accData };
|
|
484
|
-
}
|
|
485
|
-
if (earnDataPromise.status !== 'rejected') {
|
|
486
|
-
const earnData = earnDataPromise.value;
|
|
487
|
-
if (earnData && new decimal_js_1.default(earnData.amount).gt(0)) {
|
|
488
|
-
stakingPositions[address.toLowerCase()].morphoBlue[market.value] = {
|
|
489
|
-
error: '',
|
|
490
|
-
data: earnData,
|
|
491
|
-
};
|
|
492
|
-
}
|
|
493
|
-
}
|
|
716
|
+
const accData = yield (0, morphoBlue_1._getMorphoBlueAccountData)(client, network, address, market, markets.morphoMarketsData[market.value]);
|
|
717
|
+
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
718
|
+
positions[address.toLowerCase()].morphoBlue[market.value] = { error: '', data: accData };
|
|
494
719
|
}
|
|
495
720
|
catch (error) {
|
|
496
721
|
console.error(`Error fetching MorphoBlue account data for address ${address} on market ${market.value}:`, error);
|
|
497
722
|
positions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue account data for address ${address} on market ${market.value}`, data: null };
|
|
498
723
|
}
|
|
499
724
|
}))).flat(),
|
|
500
|
-
...morphoMidnightMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
501
|
-
var _a;
|
|
502
|
-
try {
|
|
503
|
-
// Markets are created lazily on the first position, so an uncreated one can hold no position.
|
|
504
|
-
if (!((_a = morphoMidnightMarketsData[market.value]) === null || _a === void 0 ? void 0 : _a.isCreated))
|
|
505
|
-
return;
|
|
506
|
-
const accData = yield (0, morphoMidnight_1._getMorphoMidnightAccountData)(client, network, address, market, morphoMidnightMarketsData[market.value]);
|
|
507
|
-
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
508
|
-
positions[address.toLowerCase()].morphoMidnight[market.value] = { error: '', data: accData };
|
|
509
|
-
}
|
|
510
|
-
catch (error) {
|
|
511
|
-
console.error(`Error fetching MorphoMidnight account data for address ${address} on market ${market.value}:`, error);
|
|
512
|
-
positions[address.toLowerCase()].morphoMidnight[market.value] = { error: `Error fetching MorphoMidnight account data for address ${address} on market ${market.value}`, data: null };
|
|
513
|
-
}
|
|
514
|
-
}))).flat(),
|
|
515
725
|
...compoundV3Markets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
516
726
|
try {
|
|
517
|
-
const accData = yield (0, compoundV3_1._getCompoundV3AccountData)(client, network, address, constants_1.ZERO_ADDRESS, { selectedMarket: market, assetsData: compoundV3MarketsData[market.value].assetsData });
|
|
727
|
+
const accData = yield (0, compoundV3_1._getCompoundV3AccountData)(client, network, address, constants_1.ZERO_ADDRESS, { selectedMarket: market, assetsData: markets.compoundV3MarketsData[market.value].assetsData });
|
|
518
728
|
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
519
729
|
positions[address.toLowerCase()].compoundV3[market.value] = { error: '', data: accData };
|
|
520
730
|
}
|
|
@@ -523,37 +733,33 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
|
|
|
523
733
|
positions[address.toLowerCase()].compoundV3[market.value] = { error: `Error fetching CompoundV3 account data for address ${address} on market ${market.value}`, data: null };
|
|
524
734
|
}
|
|
525
735
|
}))).flat(),
|
|
526
|
-
...sparkMarkets.map((market) =>
|
|
736
|
+
...sparkMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
527
737
|
try {
|
|
528
|
-
const accData = yield (0, spark_1._getSparkAccountData)(client, network, address, { selectedMarket: market, assetsData: sparkMarketsData[market.value].assetsData, eModeCategoriesData: sparkMarketsData[market.value].eModeCategoriesData });
|
|
529
|
-
|
|
530
|
-
|
|
738
|
+
const accData = yield (0, spark_1._getSparkAccountData)(client, network, address, { selectedMarket: market, assetsData: markets.sparkMarketsData[market.value].assetsData, eModeCategoriesData: markets.sparkMarketsData[market.value].eModeCategoriesData });
|
|
739
|
+
// Always store the position (even with no supply) so the eMode category is available to the shifter
|
|
740
|
+
positions[address.toLowerCase()].spark[market.value] = { error: '', data: accData };
|
|
531
741
|
}
|
|
532
742
|
catch (error) {
|
|
533
743
|
console.error(`Error fetching Spark account data for address ${address} on market ${market.value}:`, error);
|
|
534
744
|
positions[address.toLowerCase()].spark[market.value] = { error: `Error fetching Spark account data for address ${address} on market ${market.value}`, data: null };
|
|
535
745
|
}
|
|
536
746
|
}))).flat(),
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
const cdpData = yield (0, maker_1._getMakerCdpData)(client, network, cdpInfo);
|
|
544
|
-
if (cdpData) {
|
|
545
|
-
positions[address.toLowerCase()].maker[cdpInfo.id] = { error: '', data: cdpData };
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
catch (error) {
|
|
549
|
-
console.error(`Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}:`, error);
|
|
550
|
-
positions[address.toLowerCase()].maker[cdpInfo.id] = { error: `Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}`, data: null };
|
|
747
|
+
...addresses.map((address) => (makerCdps[address.toLowerCase()] || []).map((cdpInfo) => __awaiter(this, void 0, void 0, function* () {
|
|
748
|
+
try {
|
|
749
|
+
// reuse ilk data fetched for the markets payload; ilks outside the active set are fetched on demand
|
|
750
|
+
const cdpData = yield (0, maker_1._getMakerCdpData)(client, network, cdpInfo, markets.makerMarketsData[cdpInfo.ilkLabel]);
|
|
751
|
+
if (cdpData) {
|
|
752
|
+
positions[address.toLowerCase()].maker[cdpInfo.id] = { error: '', data: cdpData };
|
|
551
753
|
}
|
|
552
|
-
}
|
|
553
|
-
|
|
754
|
+
}
|
|
755
|
+
catch (error) {
|
|
756
|
+
console.error(`Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}:`, error);
|
|
757
|
+
positions[address.toLowerCase()].maker[cdpInfo.id] = { error: `Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}`, data: null };
|
|
758
|
+
}
|
|
759
|
+
}))).flat(),
|
|
554
760
|
...aaveV2Markets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
555
761
|
try {
|
|
556
|
-
const accData = yield (0, aaveV2_1._getAaveV2AccountData)(client, network, address, aaveV2MarketsData[market.value].assetsData, market);
|
|
762
|
+
const accData = yield (0, aaveV2_1._getAaveV2AccountData)(client, network, address, markets.aaveV2MarketsData[market.value].assetsData, market);
|
|
557
763
|
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
558
764
|
positions[address.toLowerCase()].aaveV2[market.value] = { error: '', data: accData };
|
|
559
765
|
}
|
|
@@ -564,7 +770,7 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
|
|
|
564
770
|
}))).flat(),
|
|
565
771
|
...compoundV2Markets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
566
772
|
try {
|
|
567
|
-
const accData = yield (0, compoundV2_1._getCompoundV2AccountData)(client, network, address, compoundV2MarketsData[market.value].assetsData);
|
|
773
|
+
const accData = yield (0, compoundV2_1._getCompoundV2AccountData)(client, network, address, markets.compoundV2MarketsData[market.value].assetsData);
|
|
568
774
|
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
569
775
|
positions[address.toLowerCase()].compoundV2[market.value] = { error: '', data: accData };
|
|
570
776
|
}
|
|
@@ -588,9 +794,9 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
|
|
|
588
794
|
})),
|
|
589
795
|
...crvUsdMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
590
796
|
try {
|
|
591
|
-
const accData = yield (0, curveUsd_1._getCurveUsdUserData)(client, network, address, market, crvUsdMarketsData[market.value].activeBand);
|
|
797
|
+
const accData = yield (0, curveUsd_1._getCurveUsdUserData)(client, network, address, market, markets.crvUsdMarketsData[market.value].activeBand, markets.crvUsdMarketsData[market.value].borrowRate);
|
|
592
798
|
if (new decimal_js_1.default(accData.suppliedUsd).gt(0) || new decimal_js_1.default(accData.borrowedUsd).gt(0)) {
|
|
593
|
-
positions[address.toLowerCase()].crvUsd[market.value] = { error: '', data:
|
|
799
|
+
positions[address.toLowerCase()].crvUsd[market.value] = { error: '', data: accData };
|
|
594
800
|
}
|
|
595
801
|
}
|
|
596
802
|
catch (error) {
|
|
@@ -600,9 +806,9 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
|
|
|
600
806
|
}))).flat(),
|
|
601
807
|
...llamaLendMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
602
808
|
try {
|
|
603
|
-
const accData = yield (0, llamaLend_1._getLlamaLendUserData)(client, network, address, market, llamaLendMarketsData[market.value]);
|
|
809
|
+
const accData = yield (0, llamaLend_1._getLlamaLendUserData)(client, network, address, market, markets.llamaLendMarketsData[market.value]);
|
|
604
810
|
if (new decimal_js_1.default(accData.suppliedUsd).gt(0) || new decimal_js_1.default(accData.borrowedUsd).gt(0)) {
|
|
605
|
-
positions[address.toLowerCase()].llamaLend[market.value] = { error: '', data: Object.assign(Object.assign({}, accData), { borrowRate: llamaLendMarketsData[market.value].borrowRate }) };
|
|
811
|
+
positions[address.toLowerCase()].llamaLend[market.value] = { error: '', data: Object.assign(Object.assign({}, accData), { borrowRate: markets.llamaLendMarketsData[market.value].borrowRate }) };
|
|
606
812
|
}
|
|
607
813
|
}
|
|
608
814
|
catch (error) {
|
|
@@ -610,26 +816,9 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
|
|
|
610
816
|
positions[address.toLowerCase()].llamaLend[market.value] = { error: `Error fetching LlamaLend account data for address ${address} on market ${market.value}`, data: null };
|
|
611
817
|
}
|
|
612
818
|
}))).flat(),
|
|
613
|
-
// liquity sBold/yBold and staking options
|
|
614
|
-
...stakingAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
615
|
-
try {
|
|
616
|
-
if (!isMainnet) {
|
|
617
|
-
stakingPositions[address.toLowerCase()].liquityV2SBoldYBold = { error: '', data: null };
|
|
618
|
-
return;
|
|
619
|
-
}
|
|
620
|
-
const data = yield (0, liquityV2_1.getLiquitySAndYBold)(client, network, stakingPositions[address.toLowerCase()].liquityV2, address);
|
|
621
|
-
stakingPositions[address.toLowerCase()].liquityV2SBoldYBold = { error: '', data };
|
|
622
|
-
}
|
|
623
|
-
catch (error) {
|
|
624
|
-
console.error(`Error fetching SBold/YBold data for address ${address}:`, error);
|
|
625
|
-
stakingPositions[address.toLowerCase()].liquityV2SBoldYBold = { error: `Error fetching sBold/yBold data for address ${address}`, data: null };
|
|
626
|
-
}
|
|
627
|
-
})),
|
|
628
819
|
]);
|
|
629
820
|
return {
|
|
630
821
|
positions,
|
|
631
|
-
stakingPositions,
|
|
632
|
-
rewardsData,
|
|
633
822
|
markets,
|
|
634
823
|
};
|
|
635
824
|
});
|