@1delta/margin-fetcher 0.0.312 → 0.0.314

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
@@ -24668,9 +24668,9 @@ var MULTICALL_ADDRESS = {
24668
24668
  // src/utils/multicall.ts
24669
24669
  var { isArray } = lodash;
24670
24670
  var maxRetries = 3;
24671
- var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient16, retry = true, providerId = 0, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false) => {
24671
+ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient17, retry = true, providerId = 0, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false) => {
24672
24672
  try {
24673
- const provider = getEvmClient16(chainId, providerId);
24673
+ const provider = getEvmClient17(chainId, providerId);
24674
24674
  const abiIsArray = isArray(abi[0]);
24675
24675
  const returnData = await provider.multicall({
24676
24676
  allowFailure,
@@ -24696,7 +24696,7 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient16, retry =
24696
24696
  chainId,
24697
24697
  abi,
24698
24698
  calls,
24699
- getEvmClient16,
24699
+ getEvmClient17,
24700
24700
  retry,
24701
24701
  providerId,
24702
24702
  retries,
@@ -24706,13 +24706,13 @@ var multicallViemAbiArray = async (chainId, abi, calls, getEvmClient16, retry =
24706
24706
  );
24707
24707
  }
24708
24708
  };
24709
- var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient16, poolSize, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false) => {
24709
+ var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient17, poolSize, retries = maxRetries, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, logs = false) => {
24710
24710
  if (poolSize <= 1) {
24711
24711
  return multicallViemAbiArray(
24712
24712
  chainId,
24713
24713
  abi,
24714
24714
  calls,
24715
- getEvmClient16,
24715
+ getEvmClient17,
24716
24716
  true,
24717
24717
  0,
24718
24718
  retries,
@@ -24735,7 +24735,7 @@ var multicallShardedAbiArray = async (chainId, abi, calls, getEvmClient16, poolS
24735
24735
  const results = new Array(contracts.length);
24736
24736
  const runBatch = async (batch, rpcId, attemptsLeft, size) => {
24737
24737
  try {
24738
- const provider = getEvmClient16(chainId, rpcId);
24738
+ const provider = getEvmClient17(chainId, rpcId);
24739
24739
  const returnData = await provider.multicall({
24740
24740
  allowFailure,
24741
24741
  batchSize: size,
@@ -29362,7 +29362,7 @@ function unflattenLenderData(pools) {
29362
29362
  }
29363
29363
  return result;
29364
29364
  }
29365
- var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient16, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false, concurrency = 1) => {
29365
+ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient17, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false, concurrency = 1) => {
29366
29366
  const queries = organizeUserQueries(queriesRaw);
29367
29367
  const builtCalls = await Promise.all(
29368
29368
  queries.map(async (query3) => {
@@ -29372,7 +29372,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient16, allowF
29372
29372
  query3.lender,
29373
29373
  query3.account,
29374
29374
  query3.params,
29375
- getEvmClient16
29375
+ getEvmClient17
29376
29376
  );
29377
29377
  return callData.map((call) => ({ call, abi: call.abi ?? abi }));
29378
29378
  })
@@ -29382,7 +29382,7 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient16, allowF
29382
29382
  chainId,
29383
29383
  calls.map((call) => call.abi),
29384
29384
  calls.map((call) => call.call),
29385
- getEvmClient16,
29385
+ getEvmClient17,
29386
29386
  concurrency,
29387
29387
  retries,
29388
29388
  allowFailure,
@@ -38372,15 +38372,15 @@ async function getJson(url) {
38372
38372
  clearTimeout(timer);
38373
38373
  }
38374
38374
  }
38375
- function mapApiDetail(d, chainId, prices, tokenList) {
38375
+ function mapApiDetail(d, chainId, prices, tokenList, shareDecimalsByVault) {
38376
38376
  const address = (d.address ?? "").toLowerCase();
38377
38377
  const underlying = (d.asset?.address ?? "").toLowerCase();
38378
38378
  if (!address || !underlying) return null;
38379
38379
  const assetMeta = tokenList[underlying];
38380
- const decimals = Number(d.decimals ?? d.asset?.decimals ?? 18);
38381
38380
  const assetDecimals = Number(
38382
- d.asset?.decimals ?? assetMeta?.decimals ?? decimals
38381
+ d.asset?.decimals ?? assetMeta?.decimals ?? 18
38383
38382
  );
38383
+ const decimals = shareDecimalsByVault.get(address) ?? assetDecimals;
38384
38384
  const totalAssetsRaw = String(d.totalAssets ?? "0");
38385
38385
  const totalSupplyRaw = String(d.totalShares ?? "0");
38386
38386
  const convertToAssets = d.exchangeRate != null ? rescaleExchangeRate(d.exchangeRate, decimals) : deriveConvertToAssets(totalAssetsRaw, totalSupplyRaw, decimals);
@@ -38447,7 +38447,7 @@ async function mapWithConcurrency(items, limit, fn) {
38447
38447
  );
38448
38448
  return out;
38449
38449
  }
38450
- async function fetchEulerEarnVaultsFromApi(chainId, prices = {}, tokenList = {}) {
38450
+ async function fetchEulerEarnVaultsFromApi(chainId, prices = {}, tokenList = {}, multicallRetry) {
38451
38451
  const list = await getJson(
38452
38452
  `${EULER_DATA_API_BASE2}/earn/vaults?chainId=${chainId}&limit=200`
38453
38453
  );
@@ -38461,10 +38461,16 @@ async function fetchEulerEarnVaultsFromApi(chainId, prices = {}, tokenList = {})
38461
38461
  `${EULER_DATA_API_BASE2}/earn/vaults/${chainId}/${row.address}?include=strategies`
38462
38462
  ).then((d) => d?.data)
38463
38463
  );
38464
+ const vaultAddrs = details.map((d) => d?.address).filter((a) => !!a);
38465
+ const shareDecimalsByVault = await fetchShareDecimals(
38466
+ chainId,
38467
+ vaultAddrs,
38468
+ multicallRetry
38469
+ );
38464
38470
  const out = {};
38465
38471
  for (const d of details) {
38466
38472
  if (!d) continue;
38467
- const v = mapApiDetail(d, chainId, prices, tokenList);
38473
+ const v = mapApiDetail(d, chainId, prices, tokenList, shareDecimalsByVault);
38468
38474
  if (v) out[v.address] = v;
38469
38475
  }
38470
38476
  return out;
@@ -38476,7 +38482,8 @@ var fetchEulerEarnVaults = async (chainId, prices = {}, tokenList = {}, multical
38476
38482
  const fromApi = await fetchEulerEarnVaultsFromApi(
38477
38483
  chainId,
38478
38484
  prices,
38479
- tokenList
38485
+ tokenList,
38486
+ multicallRetry
38480
38487
  ).catch(() => void 0);
38481
38488
  if (isNonEmpty(fromApi)) return fromApi;
38482
38489
  const subgraphUrl = getEulerEarnSubgraphUrl(chainId);
@@ -44939,6 +44946,67 @@ var readerErc46262 = (entry) => {
44939
44946
 
44940
44947
  // src/vaults/savings/readers/index.ts
44941
44948
  var buildReader2 = (entry) => readerErc46262(entry);
44949
+ var CHAIN_ID7 = "4663";
44950
+ var VAULT2 = "0xde770c84fe66e063336b31737cfe9790f18c4087";
44951
+ var SPARK_SAVINGS_USDG_KEY = "SPUSDG";
44952
+ var RAY3 = 10n ** 27n;
44953
+ var YEAR_SECONDS9 = 365 * 24 * 60 * 60;
44954
+ var WINDOW_BLOCKS6 = 400000n;
44955
+ var MAX_RPC_TRIES6 = 3;
44956
+ var CHI_ABI = [
44957
+ {
44958
+ name: "chi",
44959
+ type: "function",
44960
+ stateMutability: "view",
44961
+ inputs: [],
44962
+ outputs: [{ type: "uint256" }]
44963
+ }
44964
+ ];
44965
+ var readChiAt = (client, blockNumber) => client.readContract({
44966
+ address: VAULT2,
44967
+ abi: CHI_ABI,
44968
+ functionName: "chi",
44969
+ ...blockNumber !== void 0 ? { blockNumber } : {}
44970
+ });
44971
+ var computeApr7 = async () => {
44972
+ let lastErr;
44973
+ for (let rpcId = 0; rpcId < MAX_RPC_TRIES6; rpcId++) {
44974
+ try {
44975
+ const client = getEvmClient(CHAIN_ID7, rpcId);
44976
+ const head = await client.getBlockNumber();
44977
+ const pastBlock = head > WINDOW_BLOCKS6 ? head - WINDOW_BLOCKS6 : 0n;
44978
+ const [chiNow, chiThen, headBlock, thenBlock] = await Promise.all([
44979
+ readChiAt(client),
44980
+ readChiAt(client, pastBlock),
44981
+ client.getBlock({ blockNumber: head }),
44982
+ client.getBlock({ blockNumber: pastBlock })
44983
+ ]);
44984
+ if (chiNow < RAY3 || chiThen < RAY3 || chiNow < chiThen) {
44985
+ throw new Error(
44986
+ `non-archival or invalid chi (now=${chiNow}, then=${chiThen})`
44987
+ );
44988
+ }
44989
+ const elapsed = Number(headBlock.timestamp - thenBlock.timestamp);
44990
+ if (elapsed <= 0) throw new Error("non-positive elapsed window");
44991
+ const growth = Number(chiNow - chiThen) / Number(chiThen);
44992
+ const apr = growth * (YEAR_SECONDS9 / elapsed) * 100;
44993
+ if (!Number.isFinite(apr) || apr < 0) throw new Error(`bad apr ${apr}`);
44994
+ return apr;
44995
+ } catch (e) {
44996
+ lastErr = e;
44997
+ }
44998
+ }
44999
+ throw new Error(
45000
+ `spUSDG APR: no Robinhood RPC returned valid historical chi (${String(lastErr)})`
45001
+ );
45002
+ };
45003
+ var sparkSavingsUsdgFetcher = {
45004
+ label: "SPARK_SAVINGS_USDG",
45005
+ fetch: async () => {
45006
+ const apr = await computeApr7();
45007
+ return { [SPARK_SAVINGS_USDG_KEY]: apr };
45008
+ }
45009
+ };
44942
45010
 
44943
45011
  // src/vaults/savings/registry.ts
44944
45012
  var stUsdGroup = {
@@ -45266,6 +45334,25 @@ var SINGLE_CHAIN_ENTRIES = {
45266
45334
  yieldFetcher: savbtcFetcher,
45267
45335
  yieldKey: "Staked avBTC::savBTC"
45268
45336
  }
45337
+ ],
45338
+ "4663": [
45339
+ {
45340
+ // Spark Savings USDG on Robinhood Chain — Sky/Spark savings token
45341
+ // over USDG. ERC-4626 share price accrues via a `chi()` rate
45342
+ // accumulator; `ssr()` is not readable so APR comes from the
45343
+ // chi-delta fetcher. Standard permissionless 4626 redeem.
45344
+ address: "0xde770c84fe66e063336b31737cfe9790f18c4087",
45345
+ underlying: "0x5fc5360d0400a0fd4f2af552add042d716f1d168",
45346
+ // USDG
45347
+ symbol: "spUSDG",
45348
+ brand: "Spark",
45349
+ decimals: 6,
45350
+ isRebasing: false,
45351
+ isMintable: true,
45352
+ withdrawalMode: "instant",
45353
+ yieldFetcher: sparkSavingsUsdgFetcher,
45354
+ yieldKey: SPARK_SAVINGS_USDG_KEY
45355
+ }
45269
45356
  ]
45270
45357
  };
45271
45358
  var SAVINGS_REGISTRY = (() => {
@@ -47743,7 +47830,7 @@ var readVaultSharePrices = async (chainId, addresses, multicallRetry) => {
47743
47830
  };
47744
47831
 
47745
47832
  // src/vaults/yield/annualize.ts
47746
- var YEAR_SECONDS9 = 365 * 24 * 60 * 60;
47833
+ var YEAR_SECONDS10 = 365 * 24 * 60 * 60;
47747
47834
  var SCALE = 10n ** 18n;
47748
47835
  var appendSnapshot = (points, snap, options) => {
47749
47836
  const maxPoints = options?.maxPoints ?? 90;
@@ -47772,7 +47859,7 @@ var computeVaultApr = (points, options) => {
47772
47859
  if (pThen === 0n) return void 0;
47773
47860
  const ratioScaled = BigInt(now.p) * SCALE / pThen;
47774
47861
  const ratio = Number(ratioScaled) / 1e18;
47775
- const apr = (ratio - 1) * (YEAR_SECONDS9 / windowSeconds);
47862
+ const apr = (ratio - 1) * (YEAR_SECONDS10 / windowSeconds);
47776
47863
  return {
47777
47864
  apr,
47778
47865
  sharePriceNow: now.p,