@defisaver/positions-sdk 2.1.169-portfolio-api-dev → 2.1.169
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/aaveV3/index.d.ts +12 -2
- package/cjs/aaveV3/sgho.d.ts +16 -2
- package/cjs/aaveV4/lend.d.ts +43 -2
- package/cjs/claiming/aaveV3.d.ts +2 -2
- package/cjs/claiming/ethena.d.ts +1 -2
- package/cjs/claiming/king.d.ts +1 -2
- package/cjs/claiming/spark.d.ts +2 -2
- package/cjs/fluid/index.d.ts +49 -5
- package/cjs/liquity/index.d.ts +12 -2
- package/cjs/liquityV2/index.d.ts +23 -8
- package/cjs/liquityV2/index.js +19 -37
- package/cjs/markets/morphoBlue/index.d.ts +2 -0
- package/cjs/markets/morphoBlue/index.js +18 -1
- package/cjs/portfolio/index.d.ts +8 -16
- package/cjs/portfolio/index.js +520 -458
- package/cjs/savings/index.d.ts +2 -8
- package/cjs/savings/index.js +4 -33
- package/cjs/types/aave.d.ts +2 -98
- package/cjs/types/aaveV4.d.ts +0 -44
- package/cjs/types/compound.d.ts +2 -26
- package/cjs/types/curveUsd.d.ts +1 -9
- package/cjs/types/fluid.d.ts +0 -13
- package/cjs/types/index.d.ts +0 -1
- package/cjs/types/index.js +0 -1
- package/cjs/types/liquity.d.ts +0 -12
- package/cjs/types/liquityV2.d.ts +0 -24
- package/cjs/types/llamaLend.d.ts +1 -12
- package/cjs/types/morphoBlue.d.ts +1 -2
- package/cjs/types/morphoBlue.js +1 -0
- package/cjs/types/portfolio.d.ts +5 -125
- package/cjs/types/savings/index.d.ts +1 -9
- package/cjs/types/spark.d.ts +1 -21
- package/cjs/umbrella/index.d.ts +3 -2
- package/esm/aaveV3/index.d.ts +12 -2
- package/esm/aaveV3/sgho.d.ts +16 -2
- package/esm/aaveV4/lend.d.ts +43 -2
- package/esm/claiming/aaveV3.d.ts +2 -2
- package/esm/claiming/aaveV3.js +1 -1
- package/esm/claiming/ethena.d.ts +1 -2
- package/esm/claiming/king.d.ts +1 -2
- package/esm/claiming/spark.d.ts +2 -2
- package/esm/claiming/spark.js +1 -1
- package/esm/fluid/index.d.ts +49 -5
- package/esm/liquity/index.d.ts +12 -2
- package/esm/liquityV2/index.d.ts +23 -8
- package/esm/liquityV2/index.js +18 -35
- package/esm/markets/morphoBlue/index.d.ts +2 -0
- package/esm/markets/morphoBlue/index.js +16 -0
- package/esm/portfolio/index.d.ts +8 -16
- package/esm/portfolio/index.js +522 -458
- package/esm/savings/index.d.ts +2 -8
- package/esm/savings/index.js +3 -31
- package/esm/types/aave.d.ts +2 -98
- package/esm/types/aaveV4.d.ts +0 -44
- package/esm/types/compound.d.ts +2 -26
- package/esm/types/curveUsd.d.ts +1 -9
- package/esm/types/fluid.d.ts +0 -13
- package/esm/types/index.d.ts +0 -1
- package/esm/types/index.js +0 -1
- package/esm/types/liquity.d.ts +0 -12
- package/esm/types/liquityV2.d.ts +0 -24
- package/esm/types/llamaLend.d.ts +1 -12
- package/esm/types/morphoBlue.d.ts +1 -2
- package/esm/types/morphoBlue.js +1 -0
- package/esm/types/portfolio.d.ts +5 -125
- package/esm/types/savings/index.d.ts +1 -9
- package/esm/types/spark.d.ts +1 -21
- package/esm/umbrella/index.d.ts +3 -2
- package/package.json +2 -2
- package/src/aaveV3/index.ts +1 -2
- package/src/aaveV3/sgho.ts +17 -2
- package/src/aaveV4/lend.ts +48 -2
- package/src/claiming/aaveV3.ts +2 -4
- package/src/claiming/ethena.ts +5 -5
- package/src/claiming/king.ts +3 -3
- package/src/claiming/spark.ts +4 -6
- package/src/fluid/index.ts +3 -4
- package/src/liquity/index.ts +2 -2
- package/src/liquityV2/index.ts +22 -48
- package/src/markets/morphoBlue/index.ts +16 -0
- package/src/portfolio/index.ts +331 -306
- package/src/savings/index.ts +4 -41
- package/src/types/aave.ts +1 -104
- package/src/types/aaveV4.ts +0 -49
- package/src/types/compound.ts +2 -38
- package/src/types/curveUsd.ts +1 -17
- package/src/types/fluid.ts +0 -14
- package/src/types/index.ts +0 -1
- package/src/types/liquity.ts +1 -13
- package/src/types/liquityV2.ts +1 -26
- package/src/types/llamaLend.ts +1 -19
- package/src/types/morphoBlue.ts +1 -3
- package/src/types/portfolio.ts +5 -151
- package/src/types/savings/index.ts +1 -12
- package/src/types/spark.ts +1 -25
- package/src/umbrella/index.ts +1 -2
- package/cjs/portfolio/lendingProtocols.d.ts +0 -184
- package/cjs/portfolio/lendingProtocols.js +0 -196
- package/esm/portfolio/lendingProtocols.d.ts +0 -184
- package/esm/portfolio/lendingProtocols.js +0 -189
- package/src/portfolio/lendingProtocols.ts +0 -281
package/cjs/portfolio/index.js
CHANGED
|
@@ -27,21 +27,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.getWalletLendingSummaries = void 0;
|
|
30
|
-
exports.getPortfolioMarketsData = getPortfolioMarketsData;
|
|
31
|
-
exports.getPortfolioUserData = getPortfolioUserData;
|
|
32
30
|
exports.getPortfolioData = getPortfolioData;
|
|
33
31
|
exports.getShifterPortfolioData = getShifterPortfolioData;
|
|
34
32
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
35
33
|
const common_1 = require("../types/common");
|
|
36
34
|
const markets_1 = require("../markets");
|
|
37
35
|
const morphoBlue_1 = require("../morphoBlue");
|
|
36
|
+
const morphoMidnight_1 = require("../morphoMidnight");
|
|
38
37
|
const types_1 = require("../types");
|
|
39
38
|
const compoundV3_1 = require("../compoundV3");
|
|
40
39
|
const spark_1 = require("../spark");
|
|
41
40
|
const curveUsd_1 = require("../curveUsd");
|
|
42
41
|
const llamaLend_1 = require("../llamaLend");
|
|
43
42
|
const aaveV3_1 = require("../aaveV3");
|
|
44
|
-
const aaveV4_1 = require("../aaveV4");
|
|
45
43
|
const constants_1 = require("../constants");
|
|
46
44
|
const maker_1 = require("../maker");
|
|
47
45
|
const aaveV2_1 = require("../aaveV2");
|
|
@@ -55,227 +53,225 @@ const aaveV3_2 = require("../claiming/aaveV3");
|
|
|
55
53
|
const spark_2 = require("../claiming/spark");
|
|
56
54
|
const king_1 = require("../claiming/king");
|
|
57
55
|
const ethena_1 = require("../claiming/ethena");
|
|
56
|
+
const aaveV4_1 = require("../aaveV4");
|
|
58
57
|
const uniswap_1 = require("../claiming/uniswap");
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const errors = {};
|
|
108
|
-
for (const [key, failed] of [...lendingFailed, ['liquityV2MarketsData', liquityV2Failed]]) {
|
|
109
|
-
if (Object.keys(failed).length)
|
|
110
|
-
errors[key] = failed;
|
|
111
|
-
}
|
|
112
|
-
return { markets, errors };
|
|
113
|
-
});
|
|
114
|
-
const _getPortfolioUserData = (client, network, addresses, marketsData, isSim, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
115
|
-
const isMainnet = network === common_1.NetworkNumber.Eth;
|
|
116
|
-
const includePositions = options.positions !== false;
|
|
117
|
-
const includeStaking = options.staking !== false;
|
|
118
|
-
const includeRewards = options.rewards !== false;
|
|
119
|
-
const includeLiquityV2 = includePositions && options.liquityV2 === true;
|
|
120
|
-
// The addresses positions, staking, rewards and Liquity V2 troves are read for: none when left out, so their fetches
|
|
121
|
-
// below make no calls.
|
|
122
|
-
const positionsAddresses = includePositions ? addresses : [];
|
|
123
|
-
const stakingAddresses = includeStaking ? addresses : [];
|
|
124
|
-
const rewardsAddresses = includeRewards ? addresses : [];
|
|
125
|
-
const liquityV2Addresses = includeLiquityV2 ? addresses : [];
|
|
126
|
-
const isFluidSupported = [common_1.NetworkNumber.Eth, common_1.NetworkNumber.Arb, common_1.NetworkNumber.Base, common_1.NetworkNumber.Plasma].includes(network);
|
|
127
|
-
const { liquityV2Markets, liquityV2MarketsStaking } = getPortfolioMarkets(network);
|
|
128
|
-
const positions = {};
|
|
129
|
-
const stakingPositions = {};
|
|
130
|
-
const rewardsData = {};
|
|
131
|
-
const makerCdpsErrors = {};
|
|
132
|
-
for (const address of positionsAddresses) {
|
|
133
|
-
positions[address.toLowerCase()] = Object.assign(Object.assign(Object.assign({}, Object.fromEntries(lendingProtocols_1.LENDING_PROTOCOLS.map((protocol) => [protocol.key, {}]))), { maker: {}, liquity: {}, fluid: {
|
|
134
|
-
error: '',
|
|
135
|
-
data: {},
|
|
136
|
-
} }), (includeLiquityV2 ? { liquityV2: {} } : {}));
|
|
137
|
-
}
|
|
138
|
-
// TODO: check default values, probably needed when fetching portfolio on unsupported networks
|
|
139
|
-
for (const address of stakingAddresses) {
|
|
140
|
-
stakingPositions[address.toLowerCase()] = {
|
|
141
|
-
aaveV3: {},
|
|
142
|
-
morphoBlue: {},
|
|
143
|
-
compoundV3: {},
|
|
144
|
-
spark: {},
|
|
145
|
-
aaveV2: {},
|
|
146
|
-
compoundV2: {},
|
|
147
|
-
liquity: {},
|
|
148
|
-
liquityV2: {},
|
|
149
|
-
fluid: {
|
|
150
|
-
error: '',
|
|
151
|
-
data: {},
|
|
152
|
-
},
|
|
153
|
-
// Set by the sBOLD/yBOLD fetch below, whether it succeeds or fails.
|
|
154
|
-
liquityV2SBoldYBold: { error: '', data: null },
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
for (const address of rewardsAddresses) {
|
|
158
|
-
// merkl, spk, king and uniswap are set by their fetches below, whether they succeed or fail.
|
|
159
|
-
rewardsData[address.toLowerCase()] = {
|
|
160
|
-
merkl: { error: '', data: null },
|
|
161
|
-
aaveV3: {},
|
|
162
|
-
spark: {},
|
|
163
|
-
spk: { error: '', data: null },
|
|
164
|
-
king: { error: '', data: null },
|
|
165
|
-
ethena: {},
|
|
166
|
-
uniswap: { error: '', data: null },
|
|
58
|
+
function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1) {
|
|
59
|
+
return __awaiter(this, arguments, void 0, function* (provider, network, defaultProvider, addresses, isSim = false) {
|
|
60
|
+
const isMainnet = network === common_1.NetworkNumber.Eth;
|
|
61
|
+
const isFluidSupported = [common_1.NetworkNumber.Eth, common_1.NetworkNumber.Arb, common_1.NetworkNumber.Base, common_1.NetworkNumber.Plasma].includes(network);
|
|
62
|
+
const morphoMarkets = Object.values((0, markets_1.MorphoBlueMarkets)(network)).filter((market) => market.chainIds.includes(network));
|
|
63
|
+
const morphoMidnightMarkets = Object.values((0, markets_1.MorphoMidnightMarkets)(network)).filter((market) => market.chainIds.includes(network));
|
|
64
|
+
const compoundV3Markets = Object.values((0, markets_1.CompoundMarkets)(network)).filter((market) => market.chainIds.includes(network) && market.value !== types_1.CompoundVersions.CompoundV2);
|
|
65
|
+
const sparkMarkets = Object.values((0, markets_1.SparkMarkets)(network)).filter((market) => market.chainIds.includes(network));
|
|
66
|
+
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));
|
|
67
|
+
const aaveV2Markets = [types_1.AaveVersions.AaveV2].map((version) => (0, markets_1.AaveMarkets)(network)[version]).filter((market) => market.chainIds.includes(network));
|
|
68
|
+
const compoundV2Markets = [types_1.CompoundVersions.CompoundV2].map((version) => (0, markets_1.CompoundMarkets)(network)[version]).filter((market) => market.chainIds.includes(network));
|
|
69
|
+
const crvUsdMarkets = Object.values((0, markets_1.CrvUsdMarkets)(network)).filter((market) => market.chainIds.includes(network));
|
|
70
|
+
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)) : [];
|
|
71
|
+
const liquityV2Markets = [common_1.NetworkNumber.Eth].includes(network) ? Object.values((0, markets_1.LiquityV2Markets)(network)) : [];
|
|
72
|
+
const liquityV2MarketsStaking = [common_1.NetworkNumber.Eth].includes(network) ? Object.values((0, markets_1.LiquityV2Markets)(network)).filter(market => !market.isLegacy) : [];
|
|
73
|
+
const aaveV4Spokes = Object.values((0, markets_1.AaveV4Spokes)(network)).filter((market) => market.chainIds.includes(network));
|
|
74
|
+
// batchSize is viem's cap on a batch's raw subcall calldata (bytes); the JSON-RPC body ends up
|
|
75
|
+
// ~4x larger (hex + aggregate3 ABI + JSON overhead) and RPC providers reject bodies over
|
|
76
|
+
// ~2.5MB with HTTP 413, so keep this small enough that no single body gets near that.
|
|
77
|
+
// 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
|
|
78
|
+
// (e.g. adding new markets may result in body size going over alchemy body size limit)
|
|
79
|
+
const args = [network, { batch: { multicall: { batchSize: isSim ? 2000 : 250000 } } }];
|
|
80
|
+
const client = (0, viem_1.getViemProvider)(provider, ...args);
|
|
81
|
+
const defaultClient = (0, viem_1.getViemProvider)(defaultProvider, ...args);
|
|
82
|
+
const morphoMarketsData = {};
|
|
83
|
+
const morphoMidnightMarketsData = {};
|
|
84
|
+
const compoundV3MarketsData = {};
|
|
85
|
+
const sparkMarketsData = {};
|
|
86
|
+
const aaveV3MarketsData = {};
|
|
87
|
+
const makerCdps = {};
|
|
88
|
+
const aaveV2MarketsData = {};
|
|
89
|
+
const compoundV2MarketsData = {};
|
|
90
|
+
const crvUsdMarketsData = {};
|
|
91
|
+
const llamaLendMarketsData = {};
|
|
92
|
+
const liquityV2MarketsData = {};
|
|
93
|
+
const aaveV4SpokesData = {};
|
|
94
|
+
const markets = {
|
|
95
|
+
morphoMarketsData,
|
|
96
|
+
morphoMidnightMarketsData,
|
|
97
|
+
compoundV3MarketsData,
|
|
98
|
+
sparkMarketsData,
|
|
99
|
+
aaveV3MarketsData,
|
|
100
|
+
aaveV2MarketsData,
|
|
101
|
+
compoundV2MarketsData,
|
|
102
|
+
crvUsdMarketsData,
|
|
103
|
+
llamaLendMarketsData,
|
|
104
|
+
liquityV2MarketsData,
|
|
105
|
+
aaveV4SpokesData,
|
|
167
106
|
};
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
107
|
+
const positions = {};
|
|
108
|
+
const stakingPositions = {};
|
|
109
|
+
const rewardsData = {};
|
|
110
|
+
const allAddresses = [...addresses];
|
|
111
|
+
for (const address of allAddresses) {
|
|
112
|
+
positions[address.toLowerCase()] = {
|
|
113
|
+
aaveV3: {},
|
|
114
|
+
aaveV4: {},
|
|
115
|
+
morphoBlue: {},
|
|
116
|
+
morphoMidnight: {},
|
|
117
|
+
compoundV3: {},
|
|
118
|
+
spark: {},
|
|
119
|
+
maker: {},
|
|
120
|
+
aaveV2: {},
|
|
121
|
+
compoundV2: {},
|
|
122
|
+
liquity: {},
|
|
123
|
+
crvUsd: {},
|
|
124
|
+
llamaLend: {},
|
|
125
|
+
fluid: {
|
|
126
|
+
error: '',
|
|
127
|
+
data: {},
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
// TODO: check default values, probably needed when fetching portfolio on unsupported networks
|
|
132
|
+
for (const address of addresses) {
|
|
133
|
+
stakingPositions[address.toLowerCase()] = {
|
|
134
|
+
aaveV3: {},
|
|
135
|
+
morphoBlue: {},
|
|
136
|
+
compoundV3: {},
|
|
137
|
+
spark: {},
|
|
138
|
+
aaveV2: {},
|
|
139
|
+
compoundV2: {},
|
|
140
|
+
liquity: {},
|
|
141
|
+
liquityV2: {},
|
|
142
|
+
fluid: {
|
|
143
|
+
error: '',
|
|
144
|
+
data: {},
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
rewardsData[address.toLowerCase()] = {
|
|
148
|
+
merkl: {},
|
|
149
|
+
aaveV3: {},
|
|
150
|
+
spark: {},
|
|
151
|
+
spk: {},
|
|
152
|
+
king: {},
|
|
153
|
+
ethena: {},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
yield Promise.allSettled([
|
|
157
|
+
// === MARKET DATA (needs to be fetched first) ===
|
|
158
|
+
...morphoMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
159
|
+
const marketData = yield (0, morphoBlue_1._getMorphoBluePortfolioMarketData)(client, network, market);
|
|
160
|
+
morphoMarketsData[market.value] = marketData;
|
|
161
|
+
})),
|
|
162
|
+
...morphoMidnightMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
163
|
+
const marketData = yield (0, morphoMidnight_1._getMorphoMidnightMarketData)(client, network, market);
|
|
164
|
+
morphoMidnightMarketsData[market.value] = marketData;
|
|
165
|
+
})),
|
|
166
|
+
...compoundV3Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
167
|
+
const marketData = yield (0, compoundV3_1._getCompoundV3MarketsData)(client, network, market, defaultClient);
|
|
168
|
+
compoundV3MarketsData[market.value] = marketData;
|
|
169
|
+
})),
|
|
170
|
+
...sparkMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
171
|
+
const marketData = yield (0, spark_1._getSparkMarketsData)(client, network, market);
|
|
172
|
+
sparkMarketsData[market.value] = marketData;
|
|
173
|
+
})),
|
|
174
|
+
...aaveV3Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
175
|
+
const marketData = yield (0, aaveV3_1._getAaveV3MarketData)(client, network, market);
|
|
176
|
+
aaveV3MarketsData[market.value] = marketData;
|
|
177
|
+
})),
|
|
178
|
+
...aaveV4Spokes.map((spoke) => __awaiter(this, void 0, void 0, function* () {
|
|
179
|
+
const spokeData = yield (0, aaveV4_1._getAaveV4SpokeData)(client, network, spoke);
|
|
180
|
+
aaveV4SpokesData[spoke.value] = spokeData;
|
|
181
|
+
})),
|
|
182
|
+
...aaveV2Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
183
|
+
const marketData = yield (0, aaveV2_1._getAaveV2MarketsData)(client, network, market);
|
|
184
|
+
aaveV2MarketsData[market.value] = marketData;
|
|
185
|
+
})),
|
|
186
|
+
...compoundV2Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
187
|
+
const marketData = yield (0, compoundV2_1._getCompoundV2MarketsData)(client, network);
|
|
188
|
+
compoundV2MarketsData[market.value] = marketData;
|
|
189
|
+
})),
|
|
190
|
+
...crvUsdMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
191
|
+
const marketData = yield (0, curveUsd_1._getCurveUsdGlobalData)(client, network, market);
|
|
192
|
+
crvUsdMarketsData[market.value] = marketData;
|
|
193
|
+
})),
|
|
194
|
+
...llamaLendMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
195
|
+
const marketData = yield (0, llamaLend_1._getLlamaLendGlobalData)(client, network, market);
|
|
196
|
+
llamaLendMarketsData[market.value] = marketData;
|
|
197
|
+
})),
|
|
198
|
+
...liquityV2Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
|
|
199
|
+
const marketData = yield (0, liquityV2_1._getLiquityV2MarketData)(client, network, market);
|
|
200
|
+
liquityV2MarketsData[market.value] = marketData;
|
|
201
|
+
})),
|
|
202
|
+
// === INDEPENDENT USER DATA (doesn't depend on market data) ===
|
|
203
|
+
...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
204
|
+
if (!isMainnet)
|
|
205
|
+
return; // Maker CDPs are only available on mainnet
|
|
206
|
+
const makerCdp = yield (0, maker_1._getUserCdps)(client, network, address);
|
|
207
|
+
makerCdps[address.toLowerCase()] = makerCdp;
|
|
208
|
+
})),
|
|
209
|
+
...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
187
210
|
try {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
211
|
+
if (!isFluidSupported)
|
|
212
|
+
return; // Fluid is not available on Optimism
|
|
213
|
+
const userPositions = (yield (0, fluid_1._getUserPositionsPortfolio)(client, network, address));
|
|
214
|
+
for (const position of userPositions) {
|
|
215
|
+
if (position.userData && new decimal_js_1.default(position.userData.suppliedUsd).gt(0)) {
|
|
216
|
+
positions[address.toLowerCase()].fluid.data[position.userData.nftId] = position.userData;
|
|
217
|
+
}
|
|
191
218
|
}
|
|
192
219
|
}
|
|
193
220
|
catch (error) {
|
|
194
|
-
console.error(`Error fetching
|
|
195
|
-
positions[address.toLowerCase()].
|
|
221
|
+
console.error(`Error fetching Fluid positions for address ${address}:`, error);
|
|
222
|
+
positions[address.toLowerCase()].fluid = {
|
|
223
|
+
error: `Error fetching Fluid positions for address ${address}`,
|
|
224
|
+
data: {},
|
|
225
|
+
};
|
|
196
226
|
}
|
|
197
|
-
}))
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
for (const position of userPositions) {
|
|
205
|
-
if (position.userData && new decimal_js_1.default(position.userData.suppliedUsd).gt(0)) {
|
|
206
|
-
positions[address.toLowerCase()].fluid.data[position.userData.nftId] = position.userData;
|
|
207
|
-
}
|
|
227
|
+
})),
|
|
228
|
+
// === STAKING DATA (independent of market data) ===
|
|
229
|
+
...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
230
|
+
try {
|
|
231
|
+
if (!isFluidSupported)
|
|
232
|
+
return;
|
|
233
|
+
stakingPositions[address.toLowerCase()].fluid = yield (0, fluid_1._getAllUserEarnPositionsWithFTokens)(client, network, address);
|
|
208
234
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
catch (error) {
|
|
250
|
-
console.error(`Error fetching Liquity staking data for address ${address}:`, error);
|
|
251
|
-
stakingPositions[address.toLowerCase()].liquity = { error: `Error fetching Liquity staking data for address ${address}`, data: null };
|
|
252
|
-
}
|
|
253
|
-
})),
|
|
254
|
-
...stakingAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
255
|
-
try {
|
|
256
|
-
if (!isMainnet)
|
|
257
|
-
return;
|
|
258
|
-
stakingPositions[address.toLowerCase()].aaveV3 = yield (0, aaveV3_1.getStakeAaveData)(client, network, address);
|
|
259
|
-
}
|
|
260
|
-
catch (error) {
|
|
261
|
-
console.error(`Error fetching Aave V3 staking data for address ${address}:`, error);
|
|
262
|
-
stakingPositions[address.toLowerCase()].aaveV3 = { error: `Error fetching Aave V3 staking data for address ${address}`, data: null };
|
|
263
|
-
}
|
|
264
|
-
})),
|
|
265
|
-
...stakingAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
266
|
-
try {
|
|
267
|
-
if (!isMainnet)
|
|
268
|
-
return;
|
|
269
|
-
stakingPositions[address.toLowerCase()].umbrella = yield (0, umbrella_1.getUmbrellaData)(client, network, address);
|
|
270
|
-
}
|
|
271
|
-
catch (error) {
|
|
272
|
-
console.error(`Error fetching Umbrella staking data for address ${address}:`, error);
|
|
273
|
-
stakingPositions[address.toLowerCase()].umbrella = { error: `Error fetching Umbrella staking data for address ${address}`, data: null };
|
|
274
|
-
}
|
|
275
|
-
})),
|
|
276
|
-
// Liquity V2 stability pools, then sBOLD/yBOLD, which reads them.
|
|
277
|
-
...stakingAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
278
|
-
yield Promise.all(liquityV2MarketsStaking.map((market) => __awaiter(void 0, void 0, void 0, function* () {
|
|
235
|
+
catch (error) {
|
|
236
|
+
console.error(`Error fetching Fluid lend data for address ${address}:`, error);
|
|
237
|
+
stakingPositions[address.toLowerCase()].fluid = { error: `Error fetching Fluid lend data for address ${address}`, data: null };
|
|
238
|
+
}
|
|
239
|
+
})),
|
|
240
|
+
...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
241
|
+
try {
|
|
242
|
+
if (!isMainnet)
|
|
243
|
+
return;
|
|
244
|
+
stakingPositions[address.toLowerCase()].liquity = yield (0, liquity_1.getLiquityStakingData)(client, network, address);
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
console.error(`Error fetching Liquity staking data for address ${address}:`, error);
|
|
248
|
+
stakingPositions[address.toLowerCase()].liquity = { error: `Error fetching Liquity staking data for address ${address}`, data: null };
|
|
249
|
+
}
|
|
250
|
+
})),
|
|
251
|
+
...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
252
|
+
try {
|
|
253
|
+
if (!isMainnet)
|
|
254
|
+
return;
|
|
255
|
+
stakingPositions[address.toLowerCase()].aaveV3 = yield (0, aaveV3_1.getStakeAaveData)(client, network, address);
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
console.error(`Error fetching Aave V3 staking data for address ${address}:`, error);
|
|
259
|
+
stakingPositions[address.toLowerCase()].aaveV3 = { error: `Error fetching Aave V3 staking data for address ${address}`, data: null };
|
|
260
|
+
}
|
|
261
|
+
})),
|
|
262
|
+
...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
263
|
+
try {
|
|
264
|
+
if (!isMainnet)
|
|
265
|
+
return;
|
|
266
|
+
stakingPositions[address.toLowerCase()].umbrella = yield (0, umbrella_1.getUmbrellaData)(client, network, address);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
console.error(`Error fetching Umbrella staking data for address ${address}:`, error);
|
|
270
|
+
stakingPositions[address.toLowerCase()].umbrella = { error: `Error fetching Umbrella staking data for address ${address}`, data: null };
|
|
271
|
+
}
|
|
272
|
+
})),
|
|
273
|
+
// Liquity V2 staking
|
|
274
|
+
...liquityV2MarketsStaking.map(market => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
279
275
|
try {
|
|
280
276
|
if (!isMainnet) {
|
|
281
277
|
stakingPositions[address.toLowerCase()].liquityV2[market.value] = { error: '', data: null };
|
|
@@ -288,271 +284,337 @@ const _getPortfolioUserData = (client, network, addresses, marketsData, isSim, o
|
|
|
288
284
|
console.error(`Error fetching Liquity V2 staking data for address ${address}, market ${market.value}:`, error);
|
|
289
285
|
stakingPositions[address.toLowerCase()].liquityV2[market.value] = { error: `Error fetching Liquity V2 staking data for address ${address}`, data: null };
|
|
290
286
|
}
|
|
291
|
-
})))
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
287
|
+
}))).flat(),
|
|
288
|
+
// === REWARDS DATA (independent of market data) ===
|
|
289
|
+
// Batch King rewards
|
|
290
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
291
|
+
try {
|
|
292
|
+
if (!isMainnet) {
|
|
293
|
+
for (const address of addresses) {
|
|
294
|
+
rewardsData[address.toLowerCase()].king = { error: '', data: [] };
|
|
295
|
+
}
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
const kingRewards = yield (0, king_1.getKingRewards)(client, network, addresses);
|
|
299
|
+
for (const address of addresses) {
|
|
300
|
+
const lowerAddress = address.toLowerCase();
|
|
301
|
+
rewardsData[lowerAddress].king = {
|
|
302
|
+
error: '',
|
|
303
|
+
data: kingRewards[lowerAddress] || [],
|
|
304
|
+
};
|
|
305
|
+
}
|
|
296
306
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
})),
|
|
305
|
-
// === REWARDS DATA (independent of market data) ===
|
|
306
|
-
// Batch King rewards
|
|
307
|
-
(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
308
|
-
try {
|
|
309
|
-
if (!isMainnet) {
|
|
310
|
-
for (const address of rewardsAddresses) {
|
|
311
|
-
rewardsData[address.toLowerCase()].king = { error: '', data: [] };
|
|
307
|
+
catch (error) {
|
|
308
|
+
console.error('Error fetching King rewards data in batch:', error);
|
|
309
|
+
for (const address of addresses) {
|
|
310
|
+
rewardsData[address.toLowerCase()].king = {
|
|
311
|
+
error: 'Error fetching King rewards data in batch',
|
|
312
|
+
data: null,
|
|
313
|
+
};
|
|
312
314
|
}
|
|
313
|
-
return;
|
|
314
315
|
}
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
316
|
+
}))(),
|
|
317
|
+
// Batch UNI rewards
|
|
318
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
319
|
+
try {
|
|
320
|
+
if (!isMainnet) {
|
|
321
|
+
for (const address of addresses) {
|
|
322
|
+
rewardsData[address.toLowerCase()].uniswap = { error: '', data: [] };
|
|
323
|
+
}
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
const uniswapRewards = yield (0, uniswap_1.getUniswapRewards)(client, network, addresses);
|
|
327
|
+
for (const address of addresses) {
|
|
328
|
+
const lowerAddress = address.toLowerCase();
|
|
329
|
+
rewardsData[lowerAddress].uniswap = {
|
|
330
|
+
error: '',
|
|
331
|
+
data: uniswapRewards[lowerAddress] || [],
|
|
332
|
+
};
|
|
333
|
+
}
|
|
322
334
|
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
console.error('Error fetching Uniswap rewards data in batch:', error);
|
|
337
|
+
for (const address of addresses) {
|
|
338
|
+
rewardsData[address.toLowerCase()].uniswap = {
|
|
339
|
+
error: 'Error fetching Uniswap rewards data in batch',
|
|
340
|
+
data: null,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
331
343
|
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
for (const address of rewardsAddresses) {
|
|
339
|
-
rewardsData[address.toLowerCase()].uniswap = { error: '', data: [] };
|
|
344
|
+
}))(),
|
|
345
|
+
...sparkMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
346
|
+
try {
|
|
347
|
+
if (!isMainnet) {
|
|
348
|
+
rewardsData[address.toLowerCase()].spark[market.value] = { error: '', data: [] };
|
|
349
|
+
return;
|
|
340
350
|
}
|
|
341
|
-
|
|
351
|
+
const sparkData = yield (0, spark_2.fetchSparkRewards)(client, network, address, market.providerAddress);
|
|
352
|
+
rewardsData[address.toLowerCase()].spark[market.value] = { error: '', data: sparkData };
|
|
342
353
|
}
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
rewardsData[lowerAddress].uniswap = {
|
|
347
|
-
error: '',
|
|
348
|
-
data: uniswapRewards[lowerAddress] || [],
|
|
349
|
-
};
|
|
354
|
+
catch (error) {
|
|
355
|
+
console.error(`Error fetching Spark rewards data for address ${address}, market ${market.value}:`, error);
|
|
356
|
+
rewardsData[address.toLowerCase()].spark[market.value] = { error: `Error fetching Spark rewards data for address ${address}`, data: null };
|
|
350
357
|
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
rewardsData[address.toLowerCase()].
|
|
356
|
-
error: 'Error fetching Uniswap rewards data in batch',
|
|
357
|
-
data: null,
|
|
358
|
-
};
|
|
358
|
+
}))).flat(),
|
|
359
|
+
...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
360
|
+
try {
|
|
361
|
+
const merklData = yield (0, aaveV3_2.getMerklUnclaimedRewards)(address, network);
|
|
362
|
+
rewardsData[address.toLowerCase()].merkl = { error: '', data: merklData };
|
|
359
363
|
}
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
364
|
+
catch (error) {
|
|
365
|
+
console.error(`Error fetching Merkl rewards data for address ${address}:`, error);
|
|
366
|
+
rewardsData[address.toLowerCase()].merkl = { error: `Error fetching Merkl rewards data for address ${address}`, data: null };
|
|
367
|
+
}
|
|
368
|
+
})),
|
|
369
|
+
...aaveV3Markets.map(market => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
370
|
+
try {
|
|
371
|
+
const aaveData = yield (0, aaveV3_2.getUnclaimedRewardsForAllMarkets)(client, network, address, market.providerAddress);
|
|
372
|
+
rewardsData[address.toLowerCase()].aaveV3[market.value] = { error: '', data: aaveData };
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
console.error(`Error fetching Aave V3 Merit rewards data for address ${address}:`, error);
|
|
376
|
+
rewardsData[address.toLowerCase()].aaveV3 = { error: `Error fetching Aave V3 rewards data for address ${address}`, data: null };
|
|
367
377
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
})),
|
|
386
|
-
...lendingProtocols_1.aaveV3Lending.markets(network).map(market => rewardsAddresses.map((address) => __awaiter(void 0, void 0, void 0, function* () {
|
|
387
|
-
try {
|
|
388
|
-
const aaveData = yield (0, aaveV3_2.getUnclaimedRewardsForAllMarkets)(client, network, address, market.providerAddress);
|
|
389
|
-
rewardsData[address.toLowerCase()].aaveV3[market.value] = { error: '', data: aaveData };
|
|
390
|
-
}
|
|
391
|
-
catch (error) {
|
|
392
|
-
console.error(`Error fetching Aave V3 Merit rewards data for address ${address}:`, error);
|
|
393
|
-
// This market only: the other markets keep their rewards.
|
|
394
|
-
rewardsData[address.toLowerCase()].aaveV3[market.value] = { error: `Error fetching Aave V3 rewards data for address ${address} on market ${market.value}`, data: null };
|
|
395
|
-
}
|
|
396
|
-
}))).flat(),
|
|
397
|
-
// Batch Spark Airdrop rewards
|
|
398
|
-
(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
399
|
-
try {
|
|
400
|
-
if (!isMainnet) {
|
|
401
|
-
for (const address of rewardsAddresses) {
|
|
402
|
-
rewardsData[address.toLowerCase()].spk = { error: '', data: [] };
|
|
378
|
+
}))).flat(),
|
|
379
|
+
// Batch Spark Airdrop rewards
|
|
380
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
381
|
+
try {
|
|
382
|
+
if (!isMainnet) {
|
|
383
|
+
for (const address of addresses) {
|
|
384
|
+
rewardsData[address.toLowerCase()].spk = { error: '', data: [] };
|
|
385
|
+
}
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
const sparkAirdropRewards = yield (0, spark_2.fetchSparkAirdropRewards)(client, network, addresses);
|
|
389
|
+
for (const address of addresses) {
|
|
390
|
+
const lowerAddress = address.toLowerCase();
|
|
391
|
+
rewardsData[lowerAddress].spk = {
|
|
392
|
+
error: '',
|
|
393
|
+
data: sparkAirdropRewards[lowerAddress] || [],
|
|
394
|
+
};
|
|
403
395
|
}
|
|
404
|
-
return;
|
|
405
396
|
}
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
const
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
397
|
+
catch (error) {
|
|
398
|
+
console.error('Error fetching Spark Airdrop rewards data in batch:', error);
|
|
399
|
+
for (const address of addresses) {
|
|
400
|
+
rewardsData[address.toLowerCase()].spk = {
|
|
401
|
+
error: 'Error fetching Spark Airdrop rewards data in batch',
|
|
402
|
+
data: null,
|
|
403
|
+
};
|
|
404
|
+
}
|
|
413
405
|
}
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
406
|
+
}))(),
|
|
407
|
+
(() => __awaiter(this, void 0, void 0, function* () {
|
|
408
|
+
try {
|
|
409
|
+
if (!isMainnet) {
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
const ethenaAirdropRewards = yield (0, ethena_1.fetchEthenaAirdropRewards)(addresses);
|
|
413
|
+
for (const address of addresses) {
|
|
414
|
+
const lowerAddress = address.toLowerCase();
|
|
415
|
+
rewardsData[lowerAddress].ethena = {
|
|
416
|
+
error: '',
|
|
417
|
+
data: ethenaAirdropRewards[lowerAddress] || [],
|
|
418
|
+
};
|
|
419
|
+
}
|
|
422
420
|
}
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
421
|
+
catch (error) {
|
|
422
|
+
console.error('Error fetching Ethena Airdrop rewards data:', error);
|
|
423
|
+
for (const address of addresses) {
|
|
424
|
+
rewardsData[address.toLowerCase()].ethena = {
|
|
425
|
+
error: 'Error fetching Ethena Airdrop rewards data in batch',
|
|
426
|
+
data: null,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
429
|
}
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
430
|
+
}))(),
|
|
431
|
+
]);
|
|
432
|
+
yield Promise.all([
|
|
433
|
+
...aaveV3Markets.map((market) => allAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
434
|
+
try {
|
|
435
|
+
const accData = yield (0, aaveV3_1._getAaveV3AccountData)(client, network, address, Object.assign({ selectedMarket: market }, aaveV3MarketsData[market.value]));
|
|
436
|
+
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
437
|
+
positions[address.toLowerCase()].aaveV3[market.value] = { error: '', data: accData };
|
|
437
438
|
}
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
for (const address of rewardsAddresses) {
|
|
442
|
-
rewardsData[address.toLowerCase()].ethena = {
|
|
443
|
-
error: 'Error fetching Ethena Airdrop rewards data in batch',
|
|
444
|
-
data: null,
|
|
445
|
-
};
|
|
439
|
+
catch (error) {
|
|
440
|
+
console.error(`Error fetching AaveV3 account data for address ${address} on market ${market.value}:`, error);
|
|
441
|
+
positions[address.toLowerCase()].aaveV3[market.value] = { error: `Error fetching AaveV3 account data for address ${address} on market ${market.value}`, data: null };
|
|
446
442
|
}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
443
|
+
}))).flat(),
|
|
444
|
+
...aaveV4Spokes.map((spoke) => allAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
445
|
+
try {
|
|
446
|
+
const accData = yield (0, aaveV4_1._getAaveV4AccountData)(client, network, aaveV4SpokesData[spoke.value], address);
|
|
447
|
+
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
448
|
+
positions[address.toLowerCase()].aaveV4[spoke.value] = { error: '', data: accData };
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
console.error(`Error fetching AaveV4 account data for address ${address} on spoke ${spoke.value}:`, error);
|
|
452
|
+
positions[address.toLowerCase()].aaveV4[spoke.value] = { error: `Error fetching AaveV4 account data for address ${address} on spoke ${spoke.value}`, data: null };
|
|
453
|
+
}
|
|
454
|
+
}))).flat(),
|
|
455
|
+
...morphoMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
456
|
+
try {
|
|
457
|
+
const [accDataPromise, earnDataPromise] = yield Promise.allSettled([
|
|
458
|
+
(0, morphoBlue_1._getMorphoBlueAccountData)(client, network, address, market, morphoMarketsData[market.value]),
|
|
459
|
+
(0, morphoBlue_1.getMorphoEarn)(client, network, address, market, morphoMarketsData[market.value]),
|
|
460
|
+
]);
|
|
461
|
+
if (accDataPromise.status === 'rejected') {
|
|
462
|
+
console.error(`Error fetching MorphoBlue account data for address ${address} on market ${market.value}:`, accDataPromise.reason);
|
|
463
|
+
positions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue account data for address ${address} on market ${market.value}`, data: null };
|
|
464
|
+
}
|
|
465
|
+
if (earnDataPromise.status === 'rejected') {
|
|
466
|
+
console.error(`Error fetching MorphoBlue account data for address ${address} on market ${market.value}:`, earnDataPromise.reason);
|
|
467
|
+
positions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue account data for address ${address} on market ${market.value}`, data: null };
|
|
468
|
+
}
|
|
469
|
+
if (accDataPromise.status !== 'rejected') {
|
|
470
|
+
const accData = accDataPromise.value;
|
|
471
|
+
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
472
|
+
positions[address.toLowerCase()].morphoBlue[market.value] = { error: '', data: accData };
|
|
473
|
+
}
|
|
474
|
+
if (earnDataPromise.status !== 'rejected') {
|
|
475
|
+
const earnData = earnDataPromise.value;
|
|
476
|
+
if (earnData && new decimal_js_1.default(earnData.amount).gt(0)) {
|
|
477
|
+
stakingPositions[address.toLowerCase()].morphoBlue[market.value] = {
|
|
478
|
+
error: '',
|
|
479
|
+
data: earnData,
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
catch (error) {
|
|
485
|
+
console.error(`Error fetching MorphoBlue account data for address ${address} on market ${market.value}:`, error);
|
|
486
|
+
positions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue account data for address ${address} on market ${market.value}`, data: null };
|
|
487
|
+
}
|
|
488
|
+
}))).flat(),
|
|
489
|
+
...morphoMidnightMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
488
490
|
var _a;
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
491
|
+
try {
|
|
492
|
+
// Markets are created lazily on the first position, so an uncreated one can hold no position.
|
|
493
|
+
if (!((_a = morphoMidnightMarketsData[market.value]) === null || _a === void 0 ? void 0 : _a.isCreated))
|
|
494
|
+
return;
|
|
495
|
+
const accData = yield (0, morphoMidnight_1._getMorphoMidnightAccountData)(client, network, address, market, morphoMidnightMarketsData[market.value]);
|
|
496
|
+
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
497
|
+
positions[address.toLowerCase()].morphoMidnight[market.value] = { error: '', data: accData };
|
|
498
|
+
}
|
|
499
|
+
catch (error) {
|
|
500
|
+
console.error(`Error fetching MorphoMidnight account data for address ${address} on market ${market.value}:`, error);
|
|
501
|
+
positions[address.toLowerCase()].morphoMidnight[market.value] = { error: `Error fetching MorphoMidnight account data for address ${address} on market ${market.value}`, data: null };
|
|
502
|
+
}
|
|
503
|
+
}))).flat(),
|
|
504
|
+
...compoundV3Markets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
505
|
+
try {
|
|
506
|
+
const accData = yield (0, compoundV3_1._getCompoundV3AccountData)(client, network, address, constants_1.ZERO_ADDRESS, { selectedMarket: market, assetsData: compoundV3MarketsData[market.value].assetsData });
|
|
507
|
+
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
508
|
+
positions[address.toLowerCase()].compoundV3[market.value] = { error: '', data: accData };
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
console.error(`Error fetching CompoundV3 account data for address ${address} on market ${market.value}:`, error);
|
|
512
|
+
positions[address.toLowerCase()].compoundV3[market.value] = { error: `Error fetching CompoundV3 account data for address ${address} on market ${market.value}`, data: null };
|
|
513
|
+
}
|
|
514
|
+
}))).flat(),
|
|
515
|
+
...sparkMarkets.map((market) => allAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
516
|
+
try {
|
|
517
|
+
const accData = yield (0, spark_1._getSparkAccountData)(client, network, address, { selectedMarket: market, assetsData: sparkMarketsData[market.value].assetsData, eModeCategoriesData: sparkMarketsData[market.value].eModeCategoriesData });
|
|
518
|
+
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
519
|
+
positions[address.toLowerCase()].spark[market.value] = { error: '', data: accData };
|
|
520
|
+
}
|
|
521
|
+
catch (error) {
|
|
522
|
+
console.error(`Error fetching Spark account data for address ${address} on market ${market.value}:`, error);
|
|
523
|
+
positions[address.toLowerCase()].spark[market.value] = { error: `Error fetching Spark account data for address ${address} on market ${market.value}`, data: null };
|
|
524
|
+
}
|
|
525
|
+
}))).flat(),
|
|
526
|
+
...addresses.map((address) => (makerCdps[address.toLowerCase()] || []).map((cdpInfo) => __awaiter(this, void 0, void 0, function* () {
|
|
527
|
+
try {
|
|
528
|
+
const cdpData = yield (0, maker_1._getMakerCdpData)(client, network, cdpInfo);
|
|
529
|
+
if (cdpData) {
|
|
530
|
+
positions[address.toLowerCase()].maker[cdpInfo.id] = { error: '', data: cdpData };
|
|
499
531
|
}
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
console.error(`Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}:`, error);
|
|
535
|
+
positions[address.toLowerCase()].maker[cdpInfo.id] = { error: `Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}`, data: null };
|
|
536
|
+
}
|
|
537
|
+
}))).flat(),
|
|
538
|
+
...aaveV2Markets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
539
|
+
try {
|
|
540
|
+
const accData = yield (0, aaveV2_1._getAaveV2AccountData)(client, network, address, aaveV2MarketsData[market.value].assetsData, market);
|
|
541
|
+
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
542
|
+
positions[address.toLowerCase()].aaveV2[market.value] = { error: '', data: accData };
|
|
543
|
+
}
|
|
544
|
+
catch (error) {
|
|
545
|
+
console.error(`Error fetching AaveV2 account data for address ${address}:`, error);
|
|
546
|
+
positions[address.toLowerCase()].aaveV2[market.value] = { error: `Error fetching AaveV2 account data for address ${address}`, data: null };
|
|
547
|
+
}
|
|
548
|
+
}))).flat(),
|
|
549
|
+
...compoundV2Markets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
550
|
+
try {
|
|
551
|
+
const accData = yield (0, compoundV2_1._getCompoundV2AccountData)(client, network, address, compoundV2MarketsData[market.value].assetsData);
|
|
552
|
+
if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
|
|
553
|
+
positions[address.toLowerCase()].compoundV2[market.value] = { error: '', data: accData };
|
|
554
|
+
}
|
|
555
|
+
catch (error) {
|
|
556
|
+
console.error(`Error fetching CompoundV2 account data for address ${address}:`, error);
|
|
557
|
+
positions[address.toLowerCase()].compoundV2[market.value] = { error: `Error fetching CompoundV2 account data for address ${address}`, data: null };
|
|
558
|
+
}
|
|
559
|
+
}))).flat(),
|
|
560
|
+
...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
561
|
+
try {
|
|
562
|
+
if (!isMainnet)
|
|
563
|
+
return; // Liquity trove info is only available on mainnet
|
|
564
|
+
const troveInfo = yield (0, liquity_1._getLiquityTroveInfo)(client, network, address);
|
|
565
|
+
if (new decimal_js_1.default(troveInfo.collateral).gt(0))
|
|
566
|
+
positions[address.toLowerCase()].liquity = { error: '', data: troveInfo };
|
|
567
|
+
}
|
|
568
|
+
catch (error) {
|
|
569
|
+
console.error(`Error fetching Liquity trove info for address ${address}:`, error);
|
|
570
|
+
positions[address.toLowerCase()].liquity = { error: `Error fetching Liquity trove info for address ${address}`, data: null };
|
|
571
|
+
}
|
|
572
|
+
})),
|
|
573
|
+
...crvUsdMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
574
|
+
try {
|
|
575
|
+
const accData = yield (0, curveUsd_1._getCurveUsdUserData)(client, network, address, market, crvUsdMarketsData[market.value].activeBand, crvUsdMarketsData[market.value].borrowRate);
|
|
576
|
+
if (new decimal_js_1.default(accData.suppliedUsd).gt(0) || new decimal_js_1.default(accData.borrowedUsd).gt(0)) {
|
|
577
|
+
positions[address.toLowerCase()].crvUsd[market.value] = { error: '', data: accData };
|
|
503
578
|
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
const { client } = getPortfolioClients(provider, provider, network, isSim);
|
|
538
|
-
return _getPortfolioUserData(client, network, addresses, Promise.resolve(markets), isSim, options);
|
|
539
|
-
});
|
|
540
|
-
}
|
|
541
|
-
function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1) {
|
|
542
|
-
return __awaiter(this, arguments, void 0, function* (provider, network, defaultProvider, addresses, isSim = false, options = {}) {
|
|
543
|
-
// One pair of clients for both halves, so their calls batch together.
|
|
544
|
-
const { client, defaultClient } = getPortfolioClients(provider, defaultProvider, network, isSim);
|
|
545
|
-
const marketsResult = _getPortfolioMarketsData(client, defaultClient, network);
|
|
546
|
-
const [{ markets, errors: marketsErrors }, userData] = yield Promise.all([
|
|
547
|
-
marketsResult,
|
|
548
|
-
_getPortfolioUserData(client, network, addresses, marketsResult.then((result) => result.markets), isSim, options),
|
|
579
|
+
}
|
|
580
|
+
catch (error) {
|
|
581
|
+
console.error(`Error fetching Curve USD account data for address ${address} on market ${market.value}:`, error);
|
|
582
|
+
positions[address.toLowerCase()].crvUsd[market.value] = { error: `Error fetching Curve USD account data for address ${address} on market ${market.value}`, data: null };
|
|
583
|
+
}
|
|
584
|
+
}))).flat(),
|
|
585
|
+
...llamaLendMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
586
|
+
try {
|
|
587
|
+
const accData = yield (0, llamaLend_1._getLlamaLendUserData)(client, network, address, market, llamaLendMarketsData[market.value]);
|
|
588
|
+
if (new decimal_js_1.default(accData.suppliedUsd).gt(0) || new decimal_js_1.default(accData.borrowedUsd).gt(0)) {
|
|
589
|
+
positions[address.toLowerCase()].llamaLend[market.value] = { error: '', data: Object.assign(Object.assign({}, accData), { borrowRate: llamaLendMarketsData[market.value].borrowRate }) };
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
catch (error) {
|
|
593
|
+
console.error(`Error fetching LlamaLend account data for address ${address} on market ${market.value}:`, error);
|
|
594
|
+
positions[address.toLowerCase()].llamaLend[market.value] = { error: `Error fetching LlamaLend account data for address ${address} on market ${market.value}`, data: null };
|
|
595
|
+
}
|
|
596
|
+
}))).flat(),
|
|
597
|
+
// liquity sBold/yBold and staking options
|
|
598
|
+
...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
|
|
599
|
+
try {
|
|
600
|
+
if (!isMainnet) {
|
|
601
|
+
stakingPositions[address.toLowerCase()].liquityV2SBoldYBold = { error: '', data: null };
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
const data = yield (0, liquityV2_1.getLiquitySAndYBold)(client, network, stakingPositions[address.toLowerCase()].liquityV2, address);
|
|
605
|
+
stakingPositions[address.toLowerCase()].liquityV2SBoldYBold = { error: '', data };
|
|
606
|
+
}
|
|
607
|
+
catch (error) {
|
|
608
|
+
console.error(`Error fetching SBold/YBold data for address ${address}:`, error);
|
|
609
|
+
stakingPositions[address.toLowerCase()].liquityV2SBoldYBold = { error: `Error fetching sBold/yBold data for address ${address}`, data: null };
|
|
610
|
+
}
|
|
611
|
+
})),
|
|
549
612
|
]);
|
|
550
613
|
return {
|
|
551
|
-
positions
|
|
552
|
-
stakingPositions
|
|
553
|
-
rewardsData
|
|
614
|
+
positions,
|
|
615
|
+
stakingPositions,
|
|
616
|
+
rewardsData,
|
|
554
617
|
markets,
|
|
555
|
-
errors: Object.assign(Object.assign({}, (Object.keys(marketsErrors).length ? { markets: marketsErrors } : {})), userData.errors),
|
|
556
618
|
};
|
|
557
619
|
});
|
|
558
620
|
}
|