@defisaver/positions-sdk 2.1.25 → 2.1.26-fluid-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/fluid/index.d.ts +12 -12
- package/cjs/fluid/index.js +26 -14
- package/cjs/portfolio/index.js +2 -2
- package/esm/fluid/index.d.ts +12 -12
- package/esm/fluid/index.js +26 -14
- package/esm/portfolio/index.js +2 -2
- package/package.json +1 -1
- package/src/fluid/index.ts +23 -12
- package/src/portfolio/index.ts +2 -2
package/cjs/fluid/index.d.ts
CHANGED
|
@@ -26,8 +26,8 @@ export declare const EMPTY_FLUID_DATA: {
|
|
|
26
26
|
automationResubscribeRequired: boolean;
|
|
27
27
|
lastUpdated: number;
|
|
28
28
|
};
|
|
29
|
-
export declare const _getFluidMarketData: (provider: PublicClient, network: NetworkNumber, market: FluidMarketInfo) => Promise<FluidMarketData>;
|
|
30
|
-
export declare const getFluidMarketData: (provider: EthereumProvider, network: NetworkNumber, market: FluidMarketInfo) => Promise<FluidMarketData>;
|
|
29
|
+
export declare const _getFluidMarketData: (provider: PublicClient, network: NetworkNumber, market: FluidMarketInfo) => Promise<FluidMarketData | undefined>;
|
|
30
|
+
export declare const getFluidMarketData: (provider: EthereumProvider, network: NetworkNumber, market: FluidMarketInfo) => Promise<FluidMarketData | undefined>;
|
|
31
31
|
export declare const _getFluidVaultIdsForUser: (provider: Client, network: NetworkNumber, user: EthAddress) => Promise<string[]>;
|
|
32
32
|
export declare const getFluidVaultIdsForUser: (provider: EthereumProvider, network: NetworkNumber, user: EthAddress) => Promise<string[]>;
|
|
33
33
|
export declare const _getFluidPosition: (provider: Client, network: NetworkNumber, vaultId: string, extractedState: {
|
|
@@ -41,13 +41,13 @@ export declare const getFluidPosition: (provider: EthereumProvider, network: Net
|
|
|
41
41
|
export declare const _getFluidPositionWithMarket: (provider: PublicClient, network: NetworkNumber, vaultId: string) => Promise<{
|
|
42
42
|
userData: FluidVaultData;
|
|
43
43
|
marketData: FluidMarketData;
|
|
44
|
-
}>;
|
|
44
|
+
} | undefined>;
|
|
45
45
|
export declare const getFluidPositionWithMarket: (provider: EthereumProvider, network: NetworkNumber, vaultId: string) => Promise<{
|
|
46
46
|
userData: FluidVaultData;
|
|
47
47
|
marketData: FluidMarketData;
|
|
48
|
-
}>;
|
|
49
|
-
export declare const _getAllFluidMarketDataChunked: (network: NetworkNumber, provider: PublicClient) => Promise<FluidMarketData[]>;
|
|
50
|
-
export declare const getAllFluidMarketDataChunked: (network: NetworkNumber, provider: EthereumProvider) => Promise<FluidMarketData[]>;
|
|
48
|
+
} | undefined>;
|
|
49
|
+
export declare const _getAllFluidMarketDataChunked: (network: NetworkNumber, provider: PublicClient) => Promise<(FluidMarketData | undefined)[]>;
|
|
50
|
+
export declare const getAllFluidMarketDataChunked: (network: NetworkNumber, provider: EthereumProvider) => Promise<(FluidMarketData | undefined)[]>;
|
|
51
51
|
export declare const _getFluidTokenData: (provider: Client, network: NetworkNumber, token: string) => Promise<{
|
|
52
52
|
fTokenAddress: any;
|
|
53
53
|
fTokenSymbol: string;
|
|
@@ -117,7 +117,7 @@ export declare const getAllUserEarnPositionsWithFTokens: (provider: EthereumProv
|
|
|
117
117
|
depositedShares: string;
|
|
118
118
|
}[]>;
|
|
119
119
|
export declare const _getUserPositions: (provider: PublicClient, network: NetworkNumber, user: EthAddress) => Promise<{
|
|
120
|
-
marketData: FluidMarketData;
|
|
120
|
+
marketData: FluidMarketData | undefined;
|
|
121
121
|
userData: {
|
|
122
122
|
suppliedUsd: string;
|
|
123
123
|
borrowedUsd: string;
|
|
@@ -145,10 +145,10 @@ export declare const _getUserPositions: (provider: PublicClient, network: Networ
|
|
|
145
145
|
supplyShares?: string;
|
|
146
146
|
borrowShares?: string;
|
|
147
147
|
nftId: string;
|
|
148
|
-
};
|
|
148
|
+
} | undefined;
|
|
149
149
|
}[]>;
|
|
150
150
|
export declare const getUserPositions: (provider: EthereumProvider, network: NetworkNumber, user: EthAddress) => Promise<{
|
|
151
|
-
marketData: FluidMarketData;
|
|
151
|
+
marketData: FluidMarketData | undefined;
|
|
152
152
|
userData: {
|
|
153
153
|
suppliedUsd: string;
|
|
154
154
|
borrowedUsd: string;
|
|
@@ -176,10 +176,10 @@ export declare const getUserPositions: (provider: EthereumProvider, network: Net
|
|
|
176
176
|
supplyShares?: string;
|
|
177
177
|
borrowShares?: string;
|
|
178
178
|
nftId: string;
|
|
179
|
-
};
|
|
179
|
+
} | undefined;
|
|
180
180
|
}[]>;
|
|
181
181
|
export declare const _getUserPositionsPortfolio: (provider: PublicClient, network: NetworkNumber, user: EthAddress) => Promise<{
|
|
182
|
-
marketData: FluidMarketData;
|
|
182
|
+
marketData: FluidMarketData | undefined;
|
|
183
183
|
userData: {
|
|
184
184
|
suppliedUsd: string;
|
|
185
185
|
borrowedUsd: string;
|
|
@@ -207,5 +207,5 @@ export declare const _getUserPositionsPortfolio: (provider: PublicClient, networ
|
|
|
207
207
|
supplyShares?: string;
|
|
208
208
|
borrowShares?: string;
|
|
209
209
|
nftId: string;
|
|
210
|
-
};
|
|
210
|
+
} | undefined;
|
|
211
211
|
}[]>;
|
package/cjs/fluid/index.js
CHANGED
|
@@ -51,7 +51,7 @@ const getChainLinkPricesForTokens = (tokens, network, client) => __awaiter(void
|
|
|
51
51
|
const ethFeedContract = (0, contracts_1.ETHPriceFeedContractViem)(client, network);
|
|
52
52
|
const staticCalls = [
|
|
53
53
|
{
|
|
54
|
-
address: ethFeedContract.address,
|
|
54
|
+
address: ethFeedContract.address, //
|
|
55
55
|
abi: ethFeedContract.abi,
|
|
56
56
|
functionName: 'latestAnswer',
|
|
57
57
|
args: [],
|
|
@@ -887,6 +887,10 @@ const parseT4MarketData = (provider_1, data_1, network_1, ...args_1) => __awaite
|
|
|
887
887
|
};
|
|
888
888
|
});
|
|
889
889
|
const parseMarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null) {
|
|
890
|
+
const marketInfo = (0, markets_1.getFluidMarketInfoById)(+(data.vaultId.toString()), network);
|
|
891
|
+
if (!marketInfo) {
|
|
892
|
+
return; // skip unsupported market
|
|
893
|
+
}
|
|
890
894
|
const vaultType = parseVaultType(+(data.vaultType.toString()));
|
|
891
895
|
switch (vaultType) {
|
|
892
896
|
case types_1.FluidVaultType.T1:
|
|
@@ -1127,6 +1131,9 @@ const _getFluidPositionWithMarket = (provider, network, vaultId) => __awaiter(vo
|
|
|
1127
1131
|
const view = (0, contracts_1.FluidViewContractViem)(provider, network);
|
|
1128
1132
|
const data = yield view.read.getPositionByNftId([BigInt(vaultId)]);
|
|
1129
1133
|
const marketData = yield parseMarketData(provider, data[1], network);
|
|
1134
|
+
if (!marketData) {
|
|
1135
|
+
return;
|
|
1136
|
+
}
|
|
1130
1137
|
const userData = parseUserData(data[0], marketData);
|
|
1131
1138
|
return {
|
|
1132
1139
|
userData,
|
|
@@ -1241,12 +1248,12 @@ exports.getAllUserEarnPositionsWithFTokens = getAllUserEarnPositionsWithFTokens;
|
|
|
1241
1248
|
const _getUserPositions = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1242
1249
|
const view = (0, contracts_1.FluidViewContractViem)(provider, network);
|
|
1243
1250
|
const data = yield view.read.getUserPositions([user]);
|
|
1244
|
-
const parsedMarketData = yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network); })));
|
|
1245
|
-
const userData = data[0].map((position, i) => (Object.assign({}, parseUserData(position, parsedMarketData[i]))));
|
|
1251
|
+
const parsedMarketData = (yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network); }))));
|
|
1252
|
+
const userData = data[0].map((position, i) => (parsedMarketData[i] && Object.assign({}, parseUserData(position, parsedMarketData[i]))));
|
|
1246
1253
|
return parsedMarketData.map((market, i) => ({
|
|
1247
1254
|
marketData: market,
|
|
1248
1255
|
userData: userData[i],
|
|
1249
|
-
}));
|
|
1256
|
+
})).filter(md => md.marketData !== undefined);
|
|
1250
1257
|
});
|
|
1251
1258
|
exports._getUserPositions = _getUserPositions;
|
|
1252
1259
|
const getUserPositions = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () { return (0, exports._getUserPositions)((0, viem_1.getViemProvider)(provider, network), network, user); });
|
|
@@ -1313,13 +1320,18 @@ const getTokensPricesForPortfolio = (tokens, provider, network) => __awaiter(voi
|
|
|
1313
1320
|
const tokensWithChainlinkPrices = tokens.filter((token) => !tokensWithoutChainlinkPrices.includes(token));
|
|
1314
1321
|
const pricesFromChainlink = {};
|
|
1315
1322
|
yield Promise.all(tokensWithChainlinkPrices.map((token) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
+
try {
|
|
1324
|
+
const price = yield getTokenPricePortfolio(token, provider, network);
|
|
1325
|
+
if (typeof price === 'string')
|
|
1326
|
+
pricesFromChainlink[token] = price;
|
|
1327
|
+
else if (typeof price === 'bigint')
|
|
1328
|
+
pricesFromChainlink[token] = new decimal_js_1.default(price).div(1e8).toString();
|
|
1329
|
+
else
|
|
1330
|
+
pricesFromChainlink[token] = new decimal_js_1.default(price[1].toString()).div(1e8).toString();
|
|
1331
|
+
}
|
|
1332
|
+
catch (error) {
|
|
1333
|
+
console.error(`Error occured while fetching price for ${token}: ${error.message}`);
|
|
1334
|
+
}
|
|
1323
1335
|
})));
|
|
1324
1336
|
tokens.forEach((token) => {
|
|
1325
1337
|
if (tokensWithoutChainlinkPrices.includes(token)) {
|
|
@@ -1347,11 +1359,11 @@ const _getUserPositionsPortfolio = (provider, network, user) => __awaiter(void 0
|
|
|
1347
1359
|
if (!tokens.includes('WBTC'))
|
|
1348
1360
|
tokens.push('WBTC');
|
|
1349
1361
|
const tokenPrices = yield getTokensPricesForPortfolio(tokens, provider, network);
|
|
1350
|
-
const parsedMarketData = yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network, tokenPrices); })));
|
|
1351
|
-
const userData = data[0].map((position, i) => (Object.assign({}, parseUserData(position, parsedMarketData[i]))));
|
|
1362
|
+
const parsedMarketData = (yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network, tokenPrices); }))));
|
|
1363
|
+
const userData = data[0].map((position, i) => (parsedMarketData[i] && Object.assign({}, parseUserData(position, parsedMarketData[i]))));
|
|
1352
1364
|
return parsedMarketData.map((market, i) => ({
|
|
1353
1365
|
marketData: market,
|
|
1354
1366
|
userData: userData[i],
|
|
1355
|
-
}));
|
|
1367
|
+
})).filter(md => md.marketData !== undefined && md.userData !== undefined);
|
|
1356
1368
|
});
|
|
1357
1369
|
exports._getUserPositionsPortfolio = _getUserPositionsPortfolio;
|
package/cjs/portfolio/index.js
CHANGED
|
@@ -196,9 +196,9 @@ function getPortfolioData(provider, network, defaultProvider, addresses, summerF
|
|
|
196
196
|
try {
|
|
197
197
|
if (!isFluidSupported)
|
|
198
198
|
return; // Fluid is not available on Optimism
|
|
199
|
-
const userPositions = yield (0, fluid_1._getUserPositionsPortfolio)(client, network, address);
|
|
199
|
+
const userPositions = (yield (0, fluid_1._getUserPositionsPortfolio)(client, network, address));
|
|
200
200
|
for (const position of userPositions) {
|
|
201
|
-
if (new decimal_js_1.default(position.userData.suppliedUsd).gt(0)) {
|
|
201
|
+
if (position.userData && new decimal_js_1.default(position.userData.suppliedUsd).gt(0)) {
|
|
202
202
|
positions[address.toLowerCase()].fluid.data[position.userData.nftId] = position.userData;
|
|
203
203
|
}
|
|
204
204
|
}
|
package/esm/fluid/index.d.ts
CHANGED
|
@@ -26,8 +26,8 @@ export declare const EMPTY_FLUID_DATA: {
|
|
|
26
26
|
automationResubscribeRequired: boolean;
|
|
27
27
|
lastUpdated: number;
|
|
28
28
|
};
|
|
29
|
-
export declare const _getFluidMarketData: (provider: PublicClient, network: NetworkNumber, market: FluidMarketInfo) => Promise<FluidMarketData>;
|
|
30
|
-
export declare const getFluidMarketData: (provider: EthereumProvider, network: NetworkNumber, market: FluidMarketInfo) => Promise<FluidMarketData>;
|
|
29
|
+
export declare const _getFluidMarketData: (provider: PublicClient, network: NetworkNumber, market: FluidMarketInfo) => Promise<FluidMarketData | undefined>;
|
|
30
|
+
export declare const getFluidMarketData: (provider: EthereumProvider, network: NetworkNumber, market: FluidMarketInfo) => Promise<FluidMarketData | undefined>;
|
|
31
31
|
export declare const _getFluidVaultIdsForUser: (provider: Client, network: NetworkNumber, user: EthAddress) => Promise<string[]>;
|
|
32
32
|
export declare const getFluidVaultIdsForUser: (provider: EthereumProvider, network: NetworkNumber, user: EthAddress) => Promise<string[]>;
|
|
33
33
|
export declare const _getFluidPosition: (provider: Client, network: NetworkNumber, vaultId: string, extractedState: {
|
|
@@ -41,13 +41,13 @@ export declare const getFluidPosition: (provider: EthereumProvider, network: Net
|
|
|
41
41
|
export declare const _getFluidPositionWithMarket: (provider: PublicClient, network: NetworkNumber, vaultId: string) => Promise<{
|
|
42
42
|
userData: FluidVaultData;
|
|
43
43
|
marketData: FluidMarketData;
|
|
44
|
-
}>;
|
|
44
|
+
} | undefined>;
|
|
45
45
|
export declare const getFluidPositionWithMarket: (provider: EthereumProvider, network: NetworkNumber, vaultId: string) => Promise<{
|
|
46
46
|
userData: FluidVaultData;
|
|
47
47
|
marketData: FluidMarketData;
|
|
48
|
-
}>;
|
|
49
|
-
export declare const _getAllFluidMarketDataChunked: (network: NetworkNumber, provider: PublicClient) => Promise<FluidMarketData[]>;
|
|
50
|
-
export declare const getAllFluidMarketDataChunked: (network: NetworkNumber, provider: EthereumProvider) => Promise<FluidMarketData[]>;
|
|
48
|
+
} | undefined>;
|
|
49
|
+
export declare const _getAllFluidMarketDataChunked: (network: NetworkNumber, provider: PublicClient) => Promise<(FluidMarketData | undefined)[]>;
|
|
50
|
+
export declare const getAllFluidMarketDataChunked: (network: NetworkNumber, provider: EthereumProvider) => Promise<(FluidMarketData | undefined)[]>;
|
|
51
51
|
export declare const _getFluidTokenData: (provider: Client, network: NetworkNumber, token: string) => Promise<{
|
|
52
52
|
fTokenAddress: any;
|
|
53
53
|
fTokenSymbol: string;
|
|
@@ -117,7 +117,7 @@ export declare const getAllUserEarnPositionsWithFTokens: (provider: EthereumProv
|
|
|
117
117
|
depositedShares: string;
|
|
118
118
|
}[]>;
|
|
119
119
|
export declare const _getUserPositions: (provider: PublicClient, network: NetworkNumber, user: EthAddress) => Promise<{
|
|
120
|
-
marketData: FluidMarketData;
|
|
120
|
+
marketData: FluidMarketData | undefined;
|
|
121
121
|
userData: {
|
|
122
122
|
suppliedUsd: string;
|
|
123
123
|
borrowedUsd: string;
|
|
@@ -145,10 +145,10 @@ export declare const _getUserPositions: (provider: PublicClient, network: Networ
|
|
|
145
145
|
supplyShares?: string;
|
|
146
146
|
borrowShares?: string;
|
|
147
147
|
nftId: string;
|
|
148
|
-
};
|
|
148
|
+
} | undefined;
|
|
149
149
|
}[]>;
|
|
150
150
|
export declare const getUserPositions: (provider: EthereumProvider, network: NetworkNumber, user: EthAddress) => Promise<{
|
|
151
|
-
marketData: FluidMarketData;
|
|
151
|
+
marketData: FluidMarketData | undefined;
|
|
152
152
|
userData: {
|
|
153
153
|
suppliedUsd: string;
|
|
154
154
|
borrowedUsd: string;
|
|
@@ -176,10 +176,10 @@ export declare const getUserPositions: (provider: EthereumProvider, network: Net
|
|
|
176
176
|
supplyShares?: string;
|
|
177
177
|
borrowShares?: string;
|
|
178
178
|
nftId: string;
|
|
179
|
-
};
|
|
179
|
+
} | undefined;
|
|
180
180
|
}[]>;
|
|
181
181
|
export declare const _getUserPositionsPortfolio: (provider: PublicClient, network: NetworkNumber, user: EthAddress) => Promise<{
|
|
182
|
-
marketData: FluidMarketData;
|
|
182
|
+
marketData: FluidMarketData | undefined;
|
|
183
183
|
userData: {
|
|
184
184
|
suppliedUsd: string;
|
|
185
185
|
borrowedUsd: string;
|
|
@@ -207,5 +207,5 @@ export declare const _getUserPositionsPortfolio: (provider: PublicClient, networ
|
|
|
207
207
|
supplyShares?: string;
|
|
208
208
|
borrowShares?: string;
|
|
209
209
|
nftId: string;
|
|
210
|
-
};
|
|
210
|
+
} | undefined;
|
|
211
211
|
}[]>;
|
package/esm/fluid/index.js
CHANGED
|
@@ -45,7 +45,7 @@ const getChainLinkPricesForTokens = (tokens, network, client) => __awaiter(void
|
|
|
45
45
|
const ethFeedContract = ETHPriceFeedContractViem(client, network);
|
|
46
46
|
const staticCalls = [
|
|
47
47
|
{
|
|
48
|
-
address: ethFeedContract.address,
|
|
48
|
+
address: ethFeedContract.address, //
|
|
49
49
|
abi: ethFeedContract.abi,
|
|
50
50
|
functionName: 'latestAnswer',
|
|
51
51
|
args: [],
|
|
@@ -881,6 +881,10 @@ const parseT4MarketData = (provider_1, data_1, network_1, ...args_1) => __awaite
|
|
|
881
881
|
};
|
|
882
882
|
});
|
|
883
883
|
const parseMarketData = (provider_1, data_1, network_1, ...args_1) => __awaiter(void 0, [provider_1, data_1, network_1, ...args_1], void 0, function* (provider, data, network, tokenPrices = null) {
|
|
884
|
+
const marketInfo = getFluidMarketInfoById(+(data.vaultId.toString()), network);
|
|
885
|
+
if (!marketInfo) {
|
|
886
|
+
return; // skip unsupported market
|
|
887
|
+
}
|
|
884
888
|
const vaultType = parseVaultType(+(data.vaultType.toString()));
|
|
885
889
|
switch (vaultType) {
|
|
886
890
|
case FluidVaultType.T1:
|
|
@@ -1115,6 +1119,9 @@ export const _getFluidPositionWithMarket = (provider, network, vaultId) => __awa
|
|
|
1115
1119
|
const view = FluidViewContractViem(provider, network);
|
|
1116
1120
|
const data = yield view.read.getPositionByNftId([BigInt(vaultId)]);
|
|
1117
1121
|
const marketData = yield parseMarketData(provider, data[1], network);
|
|
1122
|
+
if (!marketData) {
|
|
1123
|
+
return;
|
|
1124
|
+
}
|
|
1118
1125
|
const userData = parseUserData(data[0], marketData);
|
|
1119
1126
|
return {
|
|
1120
1127
|
userData,
|
|
@@ -1219,12 +1226,12 @@ export const getAllUserEarnPositionsWithFTokens = (provider, network, user) => _
|
|
|
1219
1226
|
export const _getUserPositions = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1220
1227
|
const view = FluidViewContractViem(provider, network);
|
|
1221
1228
|
const data = yield view.read.getUserPositions([user]);
|
|
1222
|
-
const parsedMarketData = yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network); })));
|
|
1223
|
-
const userData = data[0].map((position, i) => (Object.assign({}, parseUserData(position, parsedMarketData[i]))));
|
|
1229
|
+
const parsedMarketData = (yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network); }))));
|
|
1230
|
+
const userData = data[0].map((position, i) => (parsedMarketData[i] && Object.assign({}, parseUserData(position, parsedMarketData[i]))));
|
|
1224
1231
|
return parsedMarketData.map((market, i) => ({
|
|
1225
1232
|
marketData: market,
|
|
1226
1233
|
userData: userData[i],
|
|
1227
|
-
}));
|
|
1234
|
+
})).filter(md => md.marketData !== undefined);
|
|
1228
1235
|
});
|
|
1229
1236
|
export const getUserPositions = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () { return _getUserPositions(getViemProvider(provider, network), network, user); });
|
|
1230
1237
|
const getTokenPricePortfolio = (token, provider, network) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -1289,13 +1296,18 @@ const getTokensPricesForPortfolio = (tokens, provider, network) => __awaiter(voi
|
|
|
1289
1296
|
const tokensWithChainlinkPrices = tokens.filter((token) => !tokensWithoutChainlinkPrices.includes(token));
|
|
1290
1297
|
const pricesFromChainlink = {};
|
|
1291
1298
|
yield Promise.all(tokensWithChainlinkPrices.map((token) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
+
try {
|
|
1300
|
+
const price = yield getTokenPricePortfolio(token, provider, network);
|
|
1301
|
+
if (typeof price === 'string')
|
|
1302
|
+
pricesFromChainlink[token] = price;
|
|
1303
|
+
else if (typeof price === 'bigint')
|
|
1304
|
+
pricesFromChainlink[token] = new Dec(price).div(1e8).toString();
|
|
1305
|
+
else
|
|
1306
|
+
pricesFromChainlink[token] = new Dec(price[1].toString()).div(1e8).toString();
|
|
1307
|
+
}
|
|
1308
|
+
catch (error) {
|
|
1309
|
+
console.error(`Error occured while fetching price for ${token}: ${error.message}`);
|
|
1310
|
+
}
|
|
1299
1311
|
})));
|
|
1300
1312
|
tokens.forEach((token) => {
|
|
1301
1313
|
if (tokensWithoutChainlinkPrices.includes(token)) {
|
|
@@ -1323,10 +1335,10 @@ export const _getUserPositionsPortfolio = (provider, network, user) => __awaiter
|
|
|
1323
1335
|
if (!tokens.includes('WBTC'))
|
|
1324
1336
|
tokens.push('WBTC');
|
|
1325
1337
|
const tokenPrices = yield getTokensPricesForPortfolio(tokens, provider, network);
|
|
1326
|
-
const parsedMarketData = yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network, tokenPrices); })));
|
|
1327
|
-
const userData = data[0].map((position, i) => (Object.assign({}, parseUserData(position, parsedMarketData[i]))));
|
|
1338
|
+
const parsedMarketData = (yield Promise.all(data[1].map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network, tokenPrices); }))));
|
|
1339
|
+
const userData = data[0].map((position, i) => (parsedMarketData[i] && Object.assign({}, parseUserData(position, parsedMarketData[i]))));
|
|
1328
1340
|
return parsedMarketData.map((market, i) => ({
|
|
1329
1341
|
marketData: market,
|
|
1330
1342
|
userData: userData[i],
|
|
1331
|
-
}));
|
|
1343
|
+
})).filter(md => md.marketData !== undefined && md.userData !== undefined);
|
|
1332
1344
|
});
|
package/esm/portfolio/index.js
CHANGED
|
@@ -190,9 +190,9 @@ export function getPortfolioData(provider, network, defaultProvider, addresses,
|
|
|
190
190
|
try {
|
|
191
191
|
if (!isFluidSupported)
|
|
192
192
|
return; // Fluid is not available on Optimism
|
|
193
|
-
const userPositions = yield _getUserPositionsPortfolio(client, network, address);
|
|
193
|
+
const userPositions = (yield _getUserPositionsPortfolio(client, network, address));
|
|
194
194
|
for (const position of userPositions) {
|
|
195
|
-
if (new Dec(position.userData.suppliedUsd).gt(0)) {
|
|
195
|
+
if (position.userData && new Dec(position.userData.suppliedUsd).gt(0)) {
|
|
196
196
|
positions[address.toLowerCase()].fluid.data[position.userData.nftId] = position.userData;
|
|
197
197
|
}
|
|
198
198
|
}
|
package/package.json
CHANGED
package/src/fluid/index.ts
CHANGED
|
@@ -102,7 +102,7 @@ const getChainLinkPricesForTokens = async (
|
|
|
102
102
|
|
|
103
103
|
const staticCalls = [
|
|
104
104
|
{
|
|
105
|
-
address: ethFeedContract.address,
|
|
105
|
+
address: ethFeedContract.address, //
|
|
106
106
|
abi: ethFeedContract.abi,
|
|
107
107
|
functionName: 'latestAnswer',
|
|
108
108
|
args: [],
|
|
@@ -1116,6 +1116,10 @@ const parseT4MarketData = async (provider: PublicClient, data: FluidVaultDataStr
|
|
|
1116
1116
|
};
|
|
1117
1117
|
|
|
1118
1118
|
const parseMarketData = async (provider: PublicClient, data: FluidVaultDataStructOutputStruct, network: NetworkNumber, tokenPrices: Record<string, string> | null = null) => {
|
|
1119
|
+
const marketInfo = getFluidMarketInfoById(+(data.vaultId.toString()), network);
|
|
1120
|
+
if (!marketInfo) {
|
|
1121
|
+
return; // skip unsupported market
|
|
1122
|
+
}
|
|
1119
1123
|
const vaultType = parseVaultType(+(data.vaultType.toString()));
|
|
1120
1124
|
switch (vaultType) {
|
|
1121
1125
|
case FluidVaultType.T1:
|
|
@@ -1497,6 +1501,9 @@ export const _getFluidPositionWithMarket = async (provider: PublicClient, networ
|
|
|
1497
1501
|
const view = FluidViewContractViem(provider, network);
|
|
1498
1502
|
const data = await view.read.getPositionByNftId([BigInt(vaultId)]);
|
|
1499
1503
|
const marketData = await parseMarketData(provider, data[1], network);
|
|
1504
|
+
if (!marketData) {
|
|
1505
|
+
return;
|
|
1506
|
+
}
|
|
1500
1507
|
const userData = parseUserData(data[0], marketData);
|
|
1501
1508
|
|
|
1502
1509
|
return {
|
|
@@ -1646,14 +1653,14 @@ export const _getUserPositions = async (provider: PublicClient, network: Network
|
|
|
1646
1653
|
|
|
1647
1654
|
const data = await view.read.getUserPositions([user]);
|
|
1648
1655
|
|
|
1649
|
-
const parsedMarketData = await Promise.all(data[1].map(async (vaultData) => parseMarketData(provider, vaultData, network)));
|
|
1656
|
+
const parsedMarketData = (await Promise.all(data[1].map(async (vaultData) => parseMarketData(provider, vaultData, network))));
|
|
1650
1657
|
|
|
1651
|
-
const userData = data[0].map((position, i) => ({ ...parseUserData(position, parsedMarketData[i]) }));
|
|
1658
|
+
const userData = data[0].map((position, i) => (parsedMarketData[i] && { ...parseUserData(position, parsedMarketData[i]) }));
|
|
1652
1659
|
|
|
1653
1660
|
return parsedMarketData.map((market, i) => ({
|
|
1654
1661
|
marketData: market,
|
|
1655
1662
|
userData: userData[i],
|
|
1656
|
-
}));
|
|
1663
|
+
})).filter(md => md.marketData !== undefined);
|
|
1657
1664
|
};
|
|
1658
1665
|
|
|
1659
1666
|
export const getUserPositions = async (
|
|
@@ -1732,10 +1739,14 @@ const getTokensPricesForPortfolio = async (tokens: string[], provider: PublicCli
|
|
|
1732
1739
|
const tokensWithChainlinkPrices = tokens.filter((token) => !tokensWithoutChainlinkPrices.includes(token));
|
|
1733
1740
|
const pricesFromChainlink: Record<string, string> = {};
|
|
1734
1741
|
await Promise.all(tokensWithChainlinkPrices.map(async (token) => {
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1742
|
+
try {
|
|
1743
|
+
const price = await getTokenPricePortfolio(token, provider, network);
|
|
1744
|
+
if (typeof price === 'string') pricesFromChainlink[token] = price;
|
|
1745
|
+
else if (typeof price === 'bigint') pricesFromChainlink[token] = new Dec(price).div(1e8).toString();
|
|
1746
|
+
else pricesFromChainlink[token] = new Dec(price[1]!.toString() as string).div(1e8).toString();
|
|
1747
|
+
} catch (error: any) {
|
|
1748
|
+
console.error(`Error occured while fetching price for ${token}: ${error.message}`);
|
|
1749
|
+
}
|
|
1739
1750
|
}));
|
|
1740
1751
|
tokens.forEach((token) => {
|
|
1741
1752
|
if (tokensWithoutChainlinkPrices.includes(token)) {
|
|
@@ -1764,12 +1775,12 @@ export const _getUserPositionsPortfolio = async (provider: PublicClient, network
|
|
|
1764
1775
|
|
|
1765
1776
|
const tokenPrices = await getTokensPricesForPortfolio(tokens, provider, network);
|
|
1766
1777
|
|
|
1767
|
-
const parsedMarketData = await Promise.all(data[1].map(async (vaultData) => parseMarketData(provider, vaultData, network, tokenPrices)));
|
|
1778
|
+
const parsedMarketData = (await Promise.all(data[1].map(async (vaultData) => parseMarketData(provider, vaultData, network, tokenPrices))));
|
|
1768
1779
|
|
|
1769
|
-
const userData = data[0].map((position, i) => ({ ...parseUserData(position, parsedMarketData[i]) }));
|
|
1780
|
+
const userData = data[0].map((position, i) => (parsedMarketData[i] && { ...parseUserData(position, parsedMarketData[i]) }));
|
|
1770
1781
|
|
|
1771
1782
|
return parsedMarketData.map((market, i) => ({
|
|
1772
1783
|
marketData: market,
|
|
1773
1784
|
userData: userData[i],
|
|
1774
|
-
}));
|
|
1775
|
-
};
|
|
1785
|
+
})).filter(md => md.marketData !== undefined && md.userData !== undefined);
|
|
1786
|
+
};
|
package/src/portfolio/index.ts
CHANGED
|
@@ -218,9 +218,9 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
|
|
|
218
218
|
...addresses.map(async (address) => {
|
|
219
219
|
try {
|
|
220
220
|
if (!isFluidSupported) return; // Fluid is not available on Optimism
|
|
221
|
-
const userPositions = await _getUserPositionsPortfolio(client, network, address);
|
|
221
|
+
const userPositions = (await _getUserPositionsPortfolio(client, network, address));
|
|
222
222
|
for (const position of userPositions) {
|
|
223
|
-
if (new Dec(position.userData.suppliedUsd).gt(0)) {
|
|
223
|
+
if (position.userData && new Dec(position.userData.suppliedUsd).gt(0)) {
|
|
224
224
|
positions[address.toLowerCase() as EthAddress].fluid.data[position.userData.nftId] = position.userData;
|
|
225
225
|
}
|
|
226
226
|
}
|