@1delta/margin-fetcher 0.0.176 → 0.0.177

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 = [];
@@ -18249,7 +18250,83 @@ function createCompoundV2Entry(i, data, key, assetsIn, vToken, meta, claimableRe
18249
18250
  }
18250
18251
 
18251
18252
  // src/lending/user-data/euler/userCallBuild.ts
18252
- var DEFAULT_MAX_SUB_ACCOUNTS = 255;
18253
+ Array.from(
18254
+ { length: 256 },
18255
+ (_2, i) => i
18256
+ );
18257
+ var EULER_SUBGRAPH_BASE = "https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs";
18258
+ var EULER_SUBGRAPH_URLS = {
18259
+ "1": `${EULER_SUBGRAPH_BASE}/euler-v2-mainnet/latest/gn`,
18260
+ "10": `${EULER_SUBGRAPH_BASE}/euler-v2-optimism/latest/gn`,
18261
+ "56": `${EULER_SUBGRAPH_BASE}/euler-v2-bsc/latest/gn`,
18262
+ "100": `${EULER_SUBGRAPH_BASE}/euler-v2-gnosis/latest/gn`,
18263
+ "130": `${EULER_SUBGRAPH_BASE}/euler-v2-unichain/latest/gn`,
18264
+ "146": `${EULER_SUBGRAPH_BASE}/euler-v2-sonic/latest/gn`,
18265
+ "239": `${EULER_SUBGRAPH_BASE}/euler-v2-tac/latest/gn`,
18266
+ "480": `${EULER_SUBGRAPH_BASE}/euler-v2-worldchain/latest/gn`,
18267
+ "999": `${EULER_SUBGRAPH_BASE}/euler-v2-hyperevm/latest/gn`,
18268
+ "1923": `${EULER_SUBGRAPH_BASE}/euler-v2-swell/latest/gn`,
18269
+ "5000": `${EULER_SUBGRAPH_BASE}/euler-v2-mantle/latest/gn`,
18270
+ "8453": `${EULER_SUBGRAPH_BASE}/euler-v2-base/latest/gn`,
18271
+ "9745": `${EULER_SUBGRAPH_BASE}/euler-v2-plasma/latest/gn`,
18272
+ "42161": `${EULER_SUBGRAPH_BASE}/euler-v2-arbitrum/latest/gn`,
18273
+ "43114": `${EULER_SUBGRAPH_BASE}/euler-v2-avalanche/latest/gn`,
18274
+ "57073": `${EULER_SUBGRAPH_BASE}/euler-v2-ink/latest/gn`,
18275
+ "60808": `${EULER_SUBGRAPH_BASE}/euler-v2-bob/latest/gn`,
18276
+ "80094": `${EULER_SUBGRAPH_BASE}/euler-v2-berachain/latest/gn`
18277
+ };
18278
+ var SUBGRAPH_CACHE_TTL_MS = 3e4;
18279
+ var subgraphCache = /* @__PURE__ */ new Map();
18280
+ function fetchEulerSubAccountIndexes(chainId, owner) {
18281
+ const key = `${chainId}:${owner.toLowerCase()}`;
18282
+ const cached = subgraphCache.get(key);
18283
+ if (cached) return cached.promise;
18284
+ const promise = fetchSubAccountsFromSubgraph(chainId, owner).then((idxs) => idxs.length > 0 ? idxs : [0]).catch(() => [0]);
18285
+ const timer = setTimeout(
18286
+ () => subgraphCache.delete(key),
18287
+ SUBGRAPH_CACHE_TTL_MS
18288
+ );
18289
+ subgraphCache.set(key, { promise, timer });
18290
+ return promise;
18291
+ }
18292
+ async function fetchSubAccountsFromSubgraph(chainId, owner) {
18293
+ const url = EULER_SUBGRAPH_URLS[chainId];
18294
+ if (!url) return [0];
18295
+ const query2 = `{
18296
+ accounts(first: 100, where: { owner: "${owner.toLowerCase()}" }) {
18297
+ id
18298
+ subAccount
18299
+ }
18300
+ }`;
18301
+ const response = await fetch(url, {
18302
+ method: "POST",
18303
+ headers: { "Content-Type": "application/json" },
18304
+ body: JSON.stringify({ query: query2 })
18305
+ });
18306
+ if (!response.ok) return [0];
18307
+ const data = await response.json();
18308
+ const accounts = data?.data?.accounts;
18309
+ if (!accounts || accounts.length === 0) return [0];
18310
+ return accounts.map((a) => {
18311
+ const addr = a.subAccount || a.id;
18312
+ return getSubAccountIndex(addr);
18313
+ });
18314
+ }
18315
+ var RESOLVED_STORE_TTL_MS = 6e4;
18316
+ var resolvedIndexesStore = /* @__PURE__ */ new Map();
18317
+ function getResolvedEulerSubAccountIndexes(chainId, account) {
18318
+ return resolvedIndexesStore.get(`${chainId}:${account.toLowerCase()}`)?.indexes;
18319
+ }
18320
+ function storeResolvedIndexes(chainId, account, indexes) {
18321
+ const key = `${chainId}:${account.toLowerCase()}`;
18322
+ const existing = resolvedIndexesStore.get(key);
18323
+ if (existing) clearTimeout(existing.timer);
18324
+ const timer = setTimeout(
18325
+ () => resolvedIndexesStore.delete(key),
18326
+ RESOLVED_STORE_TTL_MS
18327
+ );
18328
+ resolvedIndexesStore.set(key, { indexes, timer });
18329
+ }
18253
18330
  function getSubAccountAddress(owner, index) {
18254
18331
  const prefix = owner.slice(0, 40);
18255
18332
  const suffix = index.toString(16).padStart(2, "0");
@@ -18258,20 +18335,23 @@ function getSubAccountAddress(owner, index) {
18258
18335
  function getSubAccountIndex(addr) {
18259
18336
  return parseInt(addr.slice(40), 16);
18260
18337
  }
18261
- var buildEulerUserCall = (chainId, lender, account, maxSubAccounts = DEFAULT_MAX_SUB_ACCOUNTS) => {
18338
+ function resolveSubAccountIndexes(account, subAccountIndexes) {
18339
+ const ownerIndex = getSubAccountIndex(account);
18340
+ const indices = new Set(subAccountIndexes);
18341
+ indices.add(ownerIndex);
18342
+ return [...indices].sort((a, b) => a - b);
18343
+ }
18344
+ var buildEulerUserCall = async (chainId, lender, account, subAccountIndexes) => {
18345
+ console.log("subAccountIndexes", subAccountIndexes);
18262
18346
  if (!ENABLED_EULER_V2_CHAINS.includes(chainId)) return [];
18263
18347
  const config = eulerConfigs()?.[lender]?.[chainId];
18264
18348
  if (!config) return [];
18265
18349
  const accountLensAddress = config.accountLens;
18266
18350
  const evcAddress = config.evc;
18267
18351
  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);
18352
+ const indexes = subAccountIndexes ?? await fetchEulerSubAccountIndexes(chainId, account);
18353
+ const sortedIndices = resolveSubAccountIndexes(account, indexes);
18354
+ storeResolvedIndexes(chainId, account, indexes);
18275
18355
  return sortedIndices.map((i) => ({
18276
18356
  address: accountLensAddress,
18277
18357
  name: "getAccountEnabledVaultsInfo",
@@ -18280,7 +18360,7 @@ var buildEulerUserCall = (chainId, lender, account, maxSubAccounts = DEFAULT_MAX
18280
18360
  };
18281
18361
 
18282
18362
  // src/lending/user-data/fetch-balances/prepare.ts
18283
- function buildUserCall(chainId, lender, account, params) {
18363
+ async function buildUserCall(chainId, lender, account, params) {
18284
18364
  if (isAaveV2Type(lender)) return buildAaveV2UserCall(chainId, lender, account);
18285
18365
  if (isAaveV3Type(lender)) return buildAaveV3UserCall(chainId, lender, account);
18286
18366
  if (isInit(lender)) return buildInitUserCall(chainId, lender, account);
@@ -18289,7 +18369,7 @@ function buildUserCall(chainId, lender, account, params) {
18289
18369
  if (isCompoundV3Type(lender))
18290
18370
  return buildCompoundV3UserCall(chainId, lender, account);
18291
18371
  if (isEulerType(lender))
18292
- return buildEulerUserCall(chainId, lender, account);
18372
+ return buildEulerUserCall(chainId, lender, account, params?.subAccountIndexes);
18293
18373
  return buildCompoundV2UserCall(chainId, lender, account);
18294
18374
  }
18295
18375
  function organizeUserQueries(queries) {
@@ -19172,16 +19252,16 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap, chainId, lend
19172
19252
 
19173
19253
  // src/lending/user-data/utils/createEulerMultiAccountTypeUserState.ts
19174
19254
  function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19175
- const subAccountKeys = Object.keys(payload.lendingPositions ?? {});
19255
+ const subAccountIndexes = Object.keys(payload.lendingPositions ?? {});
19176
19256
  const marketUids = getMarketUidsFromMeta(lenderData);
19177
19257
  const { chainId, account } = payload;
19178
19258
  const data = [];
19179
- for (let j = 0; j < subAccountKeys.length; j++) {
19180
- const subAccount = subAccountKeys[j];
19181
- const controller = payload.controllers?.[subAccount];
19259
+ for (let j = 0; j < subAccountIndexes.length; j++) {
19260
+ const subAccountIndex = subAccountIndexes[j];
19261
+ const controller = payload.controllers?.[subAccountIndex];
19182
19262
  const configKey = controller ?? String(LENDER_MODE_NO_MODE);
19183
19263
  const userConfig = {
19184
- id: subAccount,
19264
+ id: subAccountIndex,
19185
19265
  selectedMode: configKey,
19186
19266
  isWhitelisted: true
19187
19267
  };
@@ -19198,9 +19278,9 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19198
19278
  let adjustedDebt = 0;
19199
19279
  for (let i = 0; i < marketUids.length; i++) {
19200
19280
  const marketUid = marketUids[i];
19201
- if (!lenderData?.[marketUid] || !payload.lendingPositions[subAccount][marketUid])
19281
+ if (!lenderData?.[marketUid] || !payload.lendingPositions[subAccountIndex][marketUid])
19202
19282
  continue;
19203
- const pos = payload.lendingPositions[subAccount][marketUid];
19283
+ const pos = payload.lendingPositions[subAccountIndex][marketUid];
19204
19284
  const { depositsUSD, debtUSD } = pos;
19205
19285
  const depositsUSDOracle = pos.depositsUSDOracle ?? depositsUSD;
19206
19286
  const debtUSDOracle = pos.debtUSDOracle ?? debtUSD;
@@ -19236,9 +19316,9 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19236
19316
  debt,
19237
19317
  adjustedDebt,
19238
19318
  nav,
19239
- deposits24h: histData[subAccount]?.totalDeposits24h,
19240
- debt24h: histData[subAccount]?.totalDebt24h,
19241
- nav24h: histData[subAccount]?.totalDeposits24h - histData[subAccount]?.totalDebt24h
19319
+ deposits24h: histData[subAccountIndex]?.totalDeposits24h,
19320
+ debt24h: histData[subAccountIndex]?.totalDebt24h,
19321
+ nav24h: histData[subAccountIndex]?.totalDeposits24h - histData[subAccountIndex]?.totalDebt24h
19242
19322
  };
19243
19323
  const aprData2 = {
19244
19324
  apr: safeDivide(depositInterest - borrowInterest, nav),
@@ -19264,7 +19344,7 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19264
19344
  const price = getOraclePrice(lenderData[marketUid]);
19265
19345
  const bcf = config?.borrowCollateralFactor ?? 1;
19266
19346
  const bf = config?.borrowFactor ?? 1;
19267
- const pos = payload.lendingPositions[subAccount]?.[marketUid];
19347
+ const pos = payload.lendingPositions[subAccountIndex]?.[marketUid];
19268
19348
  if (pos) {
19269
19349
  let withdrawable;
19270
19350
  if (!pos.collateralEnabled || config?.collateralDisabled) {
@@ -19299,7 +19379,7 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19299
19379
  if (borrowLiquidity != null) {
19300
19380
  borrowable = String(Math.min(Number(borrowable), borrowLiquidity));
19301
19381
  }
19302
- payload.lendingPositions[subAccount][marketUid] = {
19382
+ payload.lendingPositions[subAccountIndex][marketUid] = {
19303
19383
  marketUid,
19304
19384
  underlying: lenderData[marketUid].underlying,
19305
19385
  deposits: "0",
@@ -19319,13 +19399,13 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19319
19399
  }
19320
19400
  }
19321
19401
  data.push({
19322
- accountId: subAccount,
19402
+ accountId: subAccountIndex,
19323
19403
  health: balanceData2.debt === 0 ? null : balanceData2.adjustedDebt > 0 ? balanceData2.borrowDiscountedCollateral / balanceData2.adjustedDebt : balanceData2.collateral / balanceData2.debt,
19324
19404
  borrowCapacityUSD: creditLine,
19325
19405
  userConfig,
19326
19406
  balanceData: balanceData2,
19327
19407
  aprData: aprData2,
19328
- positions: Object.values(payload.lendingPositions[subAccount])
19408
+ positions: Object.values(payload.lendingPositions[subAccountIndex])
19329
19409
  });
19330
19410
  }
19331
19411
  return {
@@ -19337,14 +19417,9 @@ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19337
19417
  }
19338
19418
 
19339
19419
  // 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);
19420
+ var getEulerUserDataConverter = (lender, chainId, account, metaMap, subAccountIndexes) => {
19421
+ const effectiveIndexes = subAccountIndexes ?? getResolvedEulerSubAccountIndexes(chainId, account) ?? [0];
19422
+ const sortedIndices = resolveSubAccountIndexes(account, effectiveIndexes);
19348
19423
  const expectedNumberOfCalls = sortedIndices.length;
19349
19424
  return [
19350
19425
  (_data) => {
@@ -19360,14 +19435,11 @@ var getEulerUserDataConverter = (lender, chainId, account, metaMap, maxSubAccoun
19360
19435
  const evcInfo = result.evcAccountInfo ?? result[0];
19361
19436
  const vaultAccounts = result.vaultAccountInfo ?? result[1] ?? [];
19362
19437
  if (vaultAccounts.length === 0) continue;
19363
- const subAccountAddr = getSubAccountAddress(
19364
- account,
19365
- sortedIndices[idx]
19366
- ).toLowerCase();
19438
+ const subAccountId = String(sortedIndices[idx]);
19367
19439
  const enabledControllers = (evcInfo?.enabledControllers ?? []).map((a) => a.toLowerCase());
19368
19440
  const controller = enabledControllers.length > 0 ? enabledControllers[0] : void 0;
19369
19441
  if (controller) {
19370
- controllers[subAccountAddr] = controller;
19442
+ controllers[subAccountId] = controller;
19371
19443
  }
19372
19444
  const positions = {};
19373
19445
  let totalDebt24h = 0;
@@ -19411,8 +19483,8 @@ var getEulerUserDataConverter = (lender, chainId, account, metaMap, maxSubAccoun
19411
19483
  };
19412
19484
  }
19413
19485
  if (Object.keys(positions).length > 0) {
19414
- lendingPositions[subAccountAddr] = positions;
19415
- histData[subAccountAddr] = { totalDebt24h, totalDeposits24h };
19486
+ lendingPositions[subAccountId] = positions;
19487
+ histData[subAccountId] = { totalDebt24h, totalDeposits24h };
19416
19488
  }
19417
19489
  }
19418
19490
  if (Object.keys(lendingPositions).length === 0) {
@@ -19456,7 +19528,7 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
19456
19528
  meta?.[lender]
19457
19529
  );
19458
19530
  if (isEulerType(lender))
19459
- return getEulerUserDataConverter(lender, chainId, account, meta?.[lender]);
19531
+ return getEulerUserDataConverter(lender, chainId, account, meta?.[lender], params?.subAccountIndexes);
19460
19532
  return getCompoundV2UserDataConverter(
19461
19533
  lender,
19462
19534
  chainId,
@@ -24244,7 +24316,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient3, allowFa
24244
24316
  const queries = organizeUserQueries(queriesRaw);
24245
24317
  for (const query2 of queries) {
24246
24318
  const abi = getAbi2(query2.lender);
24247
- const callData = buildUserCall(
24319
+ const callData = await buildUserCall(
24248
24320
  chainId,
24249
24321
  query2.lender,
24250
24322
  query2.account,
@@ -24266,13 +24338,13 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient3, allowFa
24266
24338
  logs
24267
24339
  );
24268
24340
  };
24269
- var prepareLenderUserDataRpcCalls = (chainId, queriesRaw, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, blockTag = "latest", meta, allowFailure = true) => {
24341
+ var prepareLenderUserDataRpcCalls = async (chainId, queriesRaw, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, blockTag = "latest", allowFailure = true) => {
24270
24342
  let calls = [];
24271
24343
  const multicallAddress = getEvmChain(chainId).contracts?.multicall3?.address;
24272
24344
  const queries = organizeUserQueries(queriesRaw);
24273
24345
  for (const query2 of queries) {
24274
24346
  const abi = getAbi2(query2.lender);
24275
- const callData = buildUserCall(
24347
+ const callData = await buildUserCall(
24276
24348
  chainId,
24277
24349
  query2.lender,
24278
24350
  query2.account,
@@ -24363,7 +24435,7 @@ var EMPTY_TOKEN_APPROVAL_META = {
24363
24435
  tokenAddresses: [],
24364
24436
  spenders: []
24365
24437
  };
24366
- function prepareMergedRpcCalls(chainId, balanceQueries, permissionParams, tokenApprovalParams, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, blockTag = "latest", allowFailure = true) {
24438
+ async function prepareMergedRpcCalls(chainId, balanceQueries, permissionParams, tokenApprovalParams, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, blockTag = "latest", allowFailure = true) {
24367
24439
  const multicallAddress = getEvmChain(chainId).contracts?.multicall3?.address;
24368
24440
  let tokenApprovalPreparedCalls = [];
24369
24441
  let tokenApprovalMeta = EMPTY_TOKEN_APPROVAL_META;
@@ -24388,7 +24460,7 @@ function prepareMergedRpcCalls(chainId, balanceQueries, permissionParams, tokenA
24388
24460
  const organizedQueries = organizeUserQueries(balanceQueries);
24389
24461
  for (const query2 of organizedQueries) {
24390
24462
  const abi = getAbi2(query2.lender);
24391
- const callData = buildUserCall(
24463
+ const callData = await buildUserCall(
24392
24464
  chainId,
24393
24465
  query2.lender,
24394
24466
  query2.account,
@@ -24424,7 +24496,7 @@ function prepareMergedRpcCalls(chainId, balanceQueries, permissionParams, tokenA
24424
24496
  balanceQueries
24425
24497
  };
24426
24498
  }
24427
- function prepareMergedMulticallParams(chainId, balanceQueries, permissionParams, tokenApprovalParams) {
24499
+ async function prepareMergedMulticallParams(chainId, balanceQueries, permissionParams, tokenApprovalParams) {
24428
24500
  let tokenApprovalCalls = [];
24429
24501
  let tokenApprovalAbis = [];
24430
24502
  let tokenApprovalMeta = EMPTY_TOKEN_APPROVAL_META;
@@ -24453,7 +24525,7 @@ function prepareMergedMulticallParams(chainId, balanceQueries, permissionParams,
24453
24525
  const organizedQueries = organizeUserQueries(balanceQueries);
24454
24526
  for (const query2 of organizedQueries) {
24455
24527
  const abi = getAbi2(query2.lender);
24456
- const callData = buildUserCall(
24528
+ const callData = await buildUserCall(
24457
24529
  chainId,
24458
24530
  query2.lender,
24459
24531
  query2.account,
@@ -24515,7 +24587,7 @@ function parseMergedResult(chainId, rawResults, prepared, lenderState) {
24515
24587
 
24516
24588
  // src/lending/user-data/with-permissions/e2e.ts
24517
24589
  async function getMergedUserData(chainId, balanceQueries, permissionParams, lenderState, multicallRetry3, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, maxRetries2 = 3, tokenApprovalParams) {
24518
- const prepared = prepareMergedMulticallParams(
24590
+ const prepared = await prepareMergedMulticallParams(
24519
24591
  chainId,
24520
24592
  balanceQueries,
24521
24593
  permissionParams,