@1delta/margin-fetcher 0.0.176 → 0.0.178

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/dist/index.js CHANGED
@@ -7485,7 +7485,8 @@ var DISABLED_COMPOUNDS = {
7485
7485
  [Chain.ETHEREUM_MAINNET]: [Lender.CREAM_FINANCE]
7486
7486
  };
7487
7487
  var ENABLED_EULER_V2_CHAINS = [
7488
- Chain.BNB_SMART_CHAIN_MAINNET
7488
+ Chain.BNB_SMART_CHAIN_MAINNET,
7489
+ Chain.PLASMA_MAINNET
7489
7490
  ];
7490
7491
  var getLendersForChain = (c) => {
7491
7492
  let lenders = [];
@@ -17513,6 +17514,18 @@ function buildTokenConfig(vaultAddr, reverseLTV, borrowVaults, vaultData) {
17513
17514
  borrowFactor: 1
17514
17515
  };
17515
17516
  }
17517
+ if (borrowVaults.has(vaultAddr) && !config[vaultAddr]) {
17518
+ const selfInfo = findInfo(vaultAddr, vaultData);
17519
+ config[vaultAddr] = {
17520
+ category: vaultAddr,
17521
+ label: selfInfo?.vaultName ?? vaultAddr,
17522
+ borrowCollateralFactor: 0,
17523
+ collateralFactor: 0,
17524
+ borrowFactor: 1,
17525
+ debtDisabled: false,
17526
+ collateralDisabled: true
17527
+ };
17528
+ }
17516
17529
  return config;
17517
17530
  }
17518
17531
  function buildEModes(borrowVaults, cluster) {
@@ -18249,7 +18262,83 @@ function createCompoundV2Entry(i, data, key, assetsIn, vToken, meta, claimableRe
18249
18262
  }
18250
18263
 
18251
18264
  // src/lending/user-data/euler/userCallBuild.ts
18252
- var DEFAULT_MAX_SUB_ACCOUNTS = 255;
18265
+ Array.from(
18266
+ { length: 256 },
18267
+ (_2, i) => i
18268
+ );
18269
+ var EULER_SUBGRAPH_BASE = "https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs";
18270
+ var EULER_SUBGRAPH_URLS = {
18271
+ "1": `${EULER_SUBGRAPH_BASE}/euler-v2-mainnet/latest/gn`,
18272
+ "10": `${EULER_SUBGRAPH_BASE}/euler-v2-optimism/latest/gn`,
18273
+ "56": `${EULER_SUBGRAPH_BASE}/euler-v2-bsc/latest/gn`,
18274
+ "100": `${EULER_SUBGRAPH_BASE}/euler-v2-gnosis/latest/gn`,
18275
+ "130": `${EULER_SUBGRAPH_BASE}/euler-v2-unichain/latest/gn`,
18276
+ "146": `${EULER_SUBGRAPH_BASE}/euler-v2-sonic/latest/gn`,
18277
+ "239": `${EULER_SUBGRAPH_BASE}/euler-v2-tac/latest/gn`,
18278
+ "480": `${EULER_SUBGRAPH_BASE}/euler-v2-worldchain/latest/gn`,
18279
+ "999": `${EULER_SUBGRAPH_BASE}/euler-v2-hyperevm/latest/gn`,
18280
+ "1923": `${EULER_SUBGRAPH_BASE}/euler-v2-swell/latest/gn`,
18281
+ "5000": `${EULER_SUBGRAPH_BASE}/euler-v2-mantle/latest/gn`,
18282
+ "8453": `${EULER_SUBGRAPH_BASE}/euler-v2-base/latest/gn`,
18283
+ "9745": `${EULER_SUBGRAPH_BASE}/euler-v2-plasma/latest/gn`,
18284
+ "42161": `${EULER_SUBGRAPH_BASE}/euler-v2-arbitrum/latest/gn`,
18285
+ "43114": `${EULER_SUBGRAPH_BASE}/euler-v2-avalanche/latest/gn`,
18286
+ "57073": `${EULER_SUBGRAPH_BASE}/euler-v2-ink/latest/gn`,
18287
+ "60808": `${EULER_SUBGRAPH_BASE}/euler-v2-bob/latest/gn`,
18288
+ "80094": `${EULER_SUBGRAPH_BASE}/euler-v2-berachain/latest/gn`
18289
+ };
18290
+ var SUBGRAPH_CACHE_TTL_MS = 3e4;
18291
+ var subgraphCache = /* @__PURE__ */ new Map();
18292
+ function fetchEulerSubAccountIndexes(chainId, owner) {
18293
+ const key = `${chainId}:${owner.toLowerCase()}`;
18294
+ const cached = subgraphCache.get(key);
18295
+ if (cached) return cached.promise;
18296
+ const promise = fetchSubAccountsFromSubgraph(chainId, owner).then((idxs) => idxs.length > 0 ? idxs : [0]).catch(() => [0]);
18297
+ const timer = setTimeout(
18298
+ () => subgraphCache.delete(key),
18299
+ SUBGRAPH_CACHE_TTL_MS
18300
+ );
18301
+ subgraphCache.set(key, { promise, timer });
18302
+ return promise;
18303
+ }
18304
+ async function fetchSubAccountsFromSubgraph(chainId, owner) {
18305
+ const url = EULER_SUBGRAPH_URLS[chainId];
18306
+ if (!url) return [0];
18307
+ const query2 = `{
18308
+ accounts(first: 100, where: { owner: "${owner.toLowerCase()}" }) {
18309
+ id
18310
+ subAccount
18311
+ }
18312
+ }`;
18313
+ const response = await fetch(url, {
18314
+ method: "POST",
18315
+ headers: { "Content-Type": "application/json" },
18316
+ body: JSON.stringify({ query: query2 })
18317
+ });
18318
+ if (!response.ok) return [0];
18319
+ const data = await response.json();
18320
+ const accounts = data?.data?.accounts;
18321
+ if (!accounts || accounts.length === 0) return [0];
18322
+ return accounts.map((a) => {
18323
+ const addr = a.subAccount || a.id;
18324
+ return getSubAccountIndex(addr);
18325
+ });
18326
+ }
18327
+ var RESOLVED_STORE_TTL_MS = 6e4;
18328
+ var resolvedIndexesStore = /* @__PURE__ */ new Map();
18329
+ function getResolvedEulerSubAccountIndexes(chainId, account) {
18330
+ return resolvedIndexesStore.get(`${chainId}:${account.toLowerCase()}`)?.indexes;
18331
+ }
18332
+ function storeResolvedIndexes(chainId, account, indexes) {
18333
+ const key = `${chainId}:${account.toLowerCase()}`;
18334
+ const existing = resolvedIndexesStore.get(key);
18335
+ if (existing) clearTimeout(existing.timer);
18336
+ const timer = setTimeout(
18337
+ () => resolvedIndexesStore.delete(key),
18338
+ RESOLVED_STORE_TTL_MS
18339
+ );
18340
+ resolvedIndexesStore.set(key, { indexes, timer });
18341
+ }
18253
18342
  function getSubAccountAddress(owner, index) {
18254
18343
  const prefix = owner.slice(0, 40);
18255
18344
  const suffix = index.toString(16).padStart(2, "0");
@@ -18258,20 +18347,23 @@ function getSubAccountAddress(owner, index) {
18258
18347
  function getSubAccountIndex(addr) {
18259
18348
  return parseInt(addr.slice(40), 16);
18260
18349
  }
18261
- var buildEulerUserCall = (chainId, lender, account, maxSubAccounts = DEFAULT_MAX_SUB_ACCOUNTS) => {
18350
+ function resolveSubAccountIndexes(account, subAccountIndexes) {
18351
+ const ownerIndex = getSubAccountIndex(account);
18352
+ const indices = new Set(subAccountIndexes);
18353
+ indices.add(ownerIndex);
18354
+ return [...indices].sort((a, b) => a - b);
18355
+ }
18356
+ var buildEulerUserCall = async (chainId, lender, account, subAccountIndexes) => {
18357
+ console.log("subAccountIndexes", subAccountIndexes);
18262
18358
  if (!ENABLED_EULER_V2_CHAINS.includes(chainId)) return [];
18263
18359
  const config = eulerConfigs()?.[lender]?.[chainId];
18264
18360
  if (!config) return [];
18265
18361
  const accountLensAddress = config.accountLens;
18266
18362
  const evcAddress = config.evc;
18267
18363
  if (!accountLensAddress || !evcAddress) return [];
18268
- const ownerIndex = getSubAccountIndex(account);
18269
- const indices = /* @__PURE__ */ new Set();
18270
- indices.add(ownerIndex);
18271
- for (let i = 0; indices.size < maxSubAccounts && i < 256; i++) {
18272
- indices.add(i);
18273
- }
18274
- const sortedIndices = [...indices].sort((a, b) => a - b);
18364
+ const indexes = subAccountIndexes ?? await fetchEulerSubAccountIndexes(chainId, account);
18365
+ const sortedIndices = resolveSubAccountIndexes(account, indexes);
18366
+ storeResolvedIndexes(chainId, account, indexes);
18275
18367
  return sortedIndices.map((i) => ({
18276
18368
  address: accountLensAddress,
18277
18369
  name: "getAccountEnabledVaultsInfo",
@@ -18280,7 +18372,7 @@ var buildEulerUserCall = (chainId, lender, account, maxSubAccounts = DEFAULT_MAX
18280
18372
  };
18281
18373
 
18282
18374
  // src/lending/user-data/fetch-balances/prepare.ts
18283
- function buildUserCall(chainId, lender, account, params) {
18375
+ async function buildUserCall(chainId, lender, account, params) {
18284
18376
  if (isAaveV2Type(lender)) return buildAaveV2UserCall(chainId, lender, account);
18285
18377
  if (isAaveV3Type(lender)) return buildAaveV3UserCall(chainId, lender, account);
18286
18378
  if (isInit(lender)) return buildInitUserCall(chainId, lender, account);
@@ -18289,7 +18381,7 @@ function buildUserCall(chainId, lender, account, params) {
18289
18381
  if (isCompoundV3Type(lender))
18290
18382
  return buildCompoundV3UserCall(chainId, lender, account);
18291
18383
  if (isEulerType(lender))
18292
- return buildEulerUserCall(chainId, lender, account);
18384
+ return buildEulerUserCall(chainId, lender, account, params?.subAccountIndexes);
18293
18385
  return buildCompoundV2UserCall(chainId, lender, account);
18294
18386
  }
18295
18387
  function organizeUserQueries(queries) {
@@ -19172,16 +19264,16 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap, chainId, lend
19172
19264
 
19173
19265
  // src/lending/user-data/utils/createEulerMultiAccountTypeUserState.ts
19174
19266
  function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19175
- const subAccountKeys = Object.keys(payload.lendingPositions ?? {});
19267
+ const subAccountIndexes = Object.keys(payload.lendingPositions ?? {});
19176
19268
  const marketUids = getMarketUidsFromMeta(lenderData);
19177
19269
  const { chainId, account } = payload;
19178
19270
  const data = [];
19179
- for (let j = 0; j < subAccountKeys.length; j++) {
19180
- const subAccount = subAccountKeys[j];
19181
- const controller = payload.controllers?.[subAccount];
19271
+ for (let j = 0; j < subAccountIndexes.length; j++) {
19272
+ const subAccountIndex = subAccountIndexes[j];
19273
+ const controller = payload.controllers?.[subAccountIndex];
19182
19274
  const configKey = controller ?? String(LENDER_MODE_NO_MODE);
19183
19275
  const userConfig = {
19184
- id: subAccount,
19276
+ id: subAccountIndex,
19185
19277
  selectedMode: configKey,
19186
19278
  isWhitelisted: true
19187
19279
  };
@@ -19198,9 +19290,9 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19198
19290
  let adjustedDebt = 0;
19199
19291
  for (let i = 0; i < marketUids.length; i++) {
19200
19292
  const marketUid = marketUids[i];
19201
- if (!lenderData?.[marketUid] || !payload.lendingPositions[subAccount][marketUid])
19293
+ if (!lenderData?.[marketUid] || !payload.lendingPositions[subAccountIndex][marketUid])
19202
19294
  continue;
19203
- const pos = payload.lendingPositions[subAccount][marketUid];
19295
+ const pos = payload.lendingPositions[subAccountIndex][marketUid];
19204
19296
  const { depositsUSD, debtUSD } = pos;
19205
19297
  const depositsUSDOracle = pos.depositsUSDOracle ?? depositsUSD;
19206
19298
  const debtUSDOracle = pos.debtUSDOracle ?? debtUSD;
@@ -19236,9 +19328,9 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19236
19328
  debt,
19237
19329
  adjustedDebt,
19238
19330
  nav,
19239
- deposits24h: histData[subAccount]?.totalDeposits24h,
19240
- debt24h: histData[subAccount]?.totalDebt24h,
19241
- nav24h: histData[subAccount]?.totalDeposits24h - histData[subAccount]?.totalDebt24h
19331
+ deposits24h: histData[subAccountIndex]?.totalDeposits24h,
19332
+ debt24h: histData[subAccountIndex]?.totalDebt24h,
19333
+ nav24h: histData[subAccountIndex]?.totalDeposits24h - histData[subAccountIndex]?.totalDebt24h
19242
19334
  };
19243
19335
  const aprData2 = {
19244
19336
  apr: safeDivide(depositInterest - borrowInterest, nav),
@@ -19264,7 +19356,7 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19264
19356
  const price = getOraclePrice(lenderData[marketUid]);
19265
19357
  const bcf = config?.borrowCollateralFactor ?? 1;
19266
19358
  const bf = config?.borrowFactor ?? 1;
19267
- const pos = payload.lendingPositions[subAccount]?.[marketUid];
19359
+ const pos = payload.lendingPositions[subAccountIndex]?.[marketUid];
19268
19360
  if (pos) {
19269
19361
  let withdrawable;
19270
19362
  if (!pos.collateralEnabled || config?.collateralDisabled) {
@@ -19299,7 +19391,7 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19299
19391
  if (borrowLiquidity != null) {
19300
19392
  borrowable = String(Math.min(Number(borrowable), borrowLiquidity));
19301
19393
  }
19302
- payload.lendingPositions[subAccount][marketUid] = {
19394
+ payload.lendingPositions[subAccountIndex][marketUid] = {
19303
19395
  marketUid,
19304
19396
  underlying: lenderData[marketUid].underlying,
19305
19397
  deposits: "0",
@@ -19319,13 +19411,13 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19319
19411
  }
19320
19412
  }
19321
19413
  data.push({
19322
- accountId: subAccount,
19414
+ accountId: subAccountIndex,
19323
19415
  health: balanceData2.debt === 0 ? null : balanceData2.adjustedDebt > 0 ? balanceData2.borrowDiscountedCollateral / balanceData2.adjustedDebt : balanceData2.collateral / balanceData2.debt,
19324
19416
  borrowCapacityUSD: creditLine,
19325
19417
  userConfig,
19326
19418
  balanceData: balanceData2,
19327
19419
  aprData: aprData2,
19328
- positions: Object.values(payload.lendingPositions[subAccount])
19420
+ positions: Object.values(payload.lendingPositions[subAccountIndex])
19329
19421
  });
19330
19422
  }
19331
19423
  return {
@@ -19337,14 +19429,9 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19337
19429
  }
19338
19430
 
19339
19431
  // src/lending/user-data/euler/userCallParse.ts
19340
- var getEulerUserDataConverter = (lender, chainId, account, metaMap, maxSubAccounts = DEFAULT_MAX_SUB_ACCOUNTS) => {
19341
- const ownerIndex = getSubAccountIndex(account);
19342
- const indices = /* @__PURE__ */ new Set();
19343
- indices.add(ownerIndex);
19344
- for (let i = 0; indices.size < maxSubAccounts && i < 256; i++) {
19345
- indices.add(i);
19346
- }
19347
- const sortedIndices = [...indices].sort((a, b) => a - b);
19432
+ var getEulerUserDataConverter = (lender, chainId, account, metaMap, subAccountIndexes) => {
19433
+ const effectiveIndexes = subAccountIndexes ?? getResolvedEulerSubAccountIndexes(chainId, account) ?? [0];
19434
+ const sortedIndices = resolveSubAccountIndexes(account, effectiveIndexes);
19348
19435
  const expectedNumberOfCalls = sortedIndices.length;
19349
19436
  return [
19350
19437
  (_data) => {
@@ -19360,14 +19447,11 @@ var getEulerUserDataConverter = (lender, chainId, account, metaMap, maxSubAccoun
19360
19447
  const evcInfo = result.evcAccountInfo ?? result[0];
19361
19448
  const vaultAccounts = result.vaultAccountInfo ?? result[1] ?? [];
19362
19449
  if (vaultAccounts.length === 0) continue;
19363
- const subAccountAddr = getSubAccountAddress(
19364
- account,
19365
- sortedIndices[idx]
19366
- ).toLowerCase();
19450
+ const subAccountId = String(sortedIndices[idx]);
19367
19451
  const enabledControllers = (evcInfo?.enabledControllers ?? []).map((a) => a.toLowerCase());
19368
19452
  const controller = enabledControllers.length > 0 ? enabledControllers[0] : void 0;
19369
19453
  if (controller) {
19370
- controllers[subAccountAddr] = controller;
19454
+ controllers[subAccountId] = controller;
19371
19455
  }
19372
19456
  const positions = {};
19373
19457
  let totalDebt24h = 0;
@@ -19411,8 +19495,8 @@ var getEulerUserDataConverter = (lender, chainId, account, metaMap, maxSubAccoun
19411
19495
  };
19412
19496
  }
19413
19497
  if (Object.keys(positions).length > 0) {
19414
- lendingPositions[subAccountAddr] = positions;
19415
- histData[subAccountAddr] = { totalDebt24h, totalDeposits24h };
19498
+ lendingPositions[subAccountId] = positions;
19499
+ histData[subAccountId] = { totalDebt24h, totalDeposits24h };
19416
19500
  }
19417
19501
  }
19418
19502
  if (Object.keys(lendingPositions).length === 0) {
@@ -19456,7 +19540,7 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
19456
19540
  meta?.[lender]
19457
19541
  );
19458
19542
  if (isEulerType(lender))
19459
- return getEulerUserDataConverter(lender, chainId, account, meta?.[lender]);
19543
+ return getEulerUserDataConverter(lender, chainId, account, meta?.[lender], params?.subAccountIndexes);
19460
19544
  return getCompoundV2UserDataConverter(
19461
19545
  lender,
19462
19546
  chainId,
@@ -24244,7 +24328,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient3, allowFa
24244
24328
  const queries = organizeUserQueries(queriesRaw);
24245
24329
  for (const query2 of queries) {
24246
24330
  const abi = getAbi2(query2.lender);
24247
- const callData = buildUserCall(
24331
+ const callData = await buildUserCall(
24248
24332
  chainId,
24249
24333
  query2.lender,
24250
24334
  query2.account,
@@ -24266,13 +24350,13 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient3, allowFa
24266
24350
  logs
24267
24351
  );
24268
24352
  };
24269
- var prepareLenderUserDataRpcCalls = (chainId, queriesRaw, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, blockTag = "latest", meta, allowFailure = true) => {
24353
+ var prepareLenderUserDataRpcCalls = async (chainId, queriesRaw, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, blockTag = "latest", allowFailure = true) => {
24270
24354
  let calls = [];
24271
24355
  const multicallAddress = getEvmChain(chainId).contracts?.multicall3?.address;
24272
24356
  const queries = organizeUserQueries(queriesRaw);
24273
24357
  for (const query2 of queries) {
24274
24358
  const abi = getAbi2(query2.lender);
24275
- const callData = buildUserCall(
24359
+ const callData = await buildUserCall(
24276
24360
  chainId,
24277
24361
  query2.lender,
24278
24362
  query2.account,
@@ -24363,7 +24447,7 @@ var EMPTY_TOKEN_APPROVAL_META = {
24363
24447
  tokenAddresses: [],
24364
24448
  spenders: []
24365
24449
  };
24366
- function prepareMergedRpcCalls(chainId, balanceQueries, permissionParams, tokenApprovalParams, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, blockTag = "latest", allowFailure = true) {
24450
+ async function prepareMergedRpcCalls(chainId, balanceQueries, permissionParams, tokenApprovalParams, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, blockTag = "latest", allowFailure = true) {
24367
24451
  const multicallAddress = getEvmChain(chainId).contracts?.multicall3?.address;
24368
24452
  let tokenApprovalPreparedCalls = [];
24369
24453
  let tokenApprovalMeta = EMPTY_TOKEN_APPROVAL_META;
@@ -24388,7 +24472,7 @@ function prepareMergedRpcCalls(chainId, balanceQueries, permissionParams, tokenA
24388
24472
  const organizedQueries = organizeUserQueries(balanceQueries);
24389
24473
  for (const query2 of organizedQueries) {
24390
24474
  const abi = getAbi2(query2.lender);
24391
- const callData = buildUserCall(
24475
+ const callData = await buildUserCall(
24392
24476
  chainId,
24393
24477
  query2.lender,
24394
24478
  query2.account,
@@ -24424,7 +24508,7 @@ function prepareMergedRpcCalls(chainId, balanceQueries, permissionParams, tokenA
24424
24508
  balanceQueries
24425
24509
  };
24426
24510
  }
24427
- function prepareMergedMulticallParams(chainId, balanceQueries, permissionParams, tokenApprovalParams) {
24511
+ async function prepareMergedMulticallParams(chainId, balanceQueries, permissionParams, tokenApprovalParams) {
24428
24512
  let tokenApprovalCalls = [];
24429
24513
  let tokenApprovalAbis = [];
24430
24514
  let tokenApprovalMeta = EMPTY_TOKEN_APPROVAL_META;
@@ -24453,7 +24537,7 @@ function prepareMergedMulticallParams(chainId, balanceQueries, permissionParams,
24453
24537
  const organizedQueries = organizeUserQueries(balanceQueries);
24454
24538
  for (const query2 of organizedQueries) {
24455
24539
  const abi = getAbi2(query2.lender);
24456
- const callData = buildUserCall(
24540
+ const callData = await buildUserCall(
24457
24541
  chainId,
24458
24542
  query2.lender,
24459
24543
  query2.account,
@@ -24515,7 +24599,7 @@ function parseMergedResult(chainId, rawResults, prepared, lenderState) {
24515
24599
 
24516
24600
  // src/lending/user-data/with-permissions/e2e.ts
24517
24601
  async function getMergedUserData(chainId, balanceQueries, permissionParams, lenderState, multicallRetry3, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, maxRetries2 = 3, tokenApprovalParams) {
24518
- const prepared = prepareMergedMulticallParams(
24602
+ const prepared = await prepareMergedMulticallParams(
24519
24603
  chainId,
24520
24604
  balanceQueries,
24521
24605
  permissionParams,