@oydual31/more-vaults-sdk 0.4.2 → 0.6.0

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.
Files changed (38) hide show
  1. package/README.md +94 -0
  2. package/dist/{spokeRoutes-B8Lnk-t4.d.cts → curatorBridge-CNs59kT9.d.cts} +222 -1
  3. package/dist/{spokeRoutes-B8Lnk-t4.d.ts → curatorBridge-CNs59kT9.d.ts} +222 -1
  4. package/dist/ethers/index.cjs +328 -3
  5. package/dist/ethers/index.cjs.map +1 -1
  6. package/dist/ethers/index.d.cts +279 -1
  7. package/dist/ethers/index.d.ts +279 -1
  8. package/dist/ethers/index.js +318 -5
  9. package/dist/ethers/index.js.map +1 -1
  10. package/dist/react/index.cjs +375 -0
  11. package/dist/react/index.cjs.map +1 -1
  12. package/dist/react/index.d.cts +266 -2
  13. package/dist/react/index.d.ts +266 -2
  14. package/dist/react/index.js +372 -2
  15. package/dist/react/index.js.map +1 -1
  16. package/dist/viem/index.cjs +377 -0
  17. package/dist/viem/index.cjs.map +1 -1
  18. package/dist/viem/index.d.cts +261 -3
  19. package/dist/viem/index.d.ts +261 -3
  20. package/dist/viem/index.js +367 -2
  21. package/dist/viem/index.js.map +1 -1
  22. package/package.json +1 -1
  23. package/src/ethers/abis.ts +24 -0
  24. package/src/ethers/curatorBridge.ts +235 -0
  25. package/src/ethers/curatorSubVaults.ts +443 -0
  26. package/src/ethers/index.ts +26 -0
  27. package/src/ethers/types.ts +99 -0
  28. package/src/react/index.ts +14 -0
  29. package/src/react/useCuratorBridgeQuote.ts +43 -0
  30. package/src/react/useERC7540RequestStatus.ts +43 -0
  31. package/src/react/useExecuteBridge.ts +50 -0
  32. package/src/react/useSubVaultPositions.ts +35 -0
  33. package/src/react/useVaultPortfolio.ts +35 -0
  34. package/src/viem/abis.ts +24 -0
  35. package/src/viem/curatorBridge.ts +288 -0
  36. package/src/viem/curatorSubVaults.ts +514 -0
  37. package/src/viem/index.ts +23 -0
  38. package/src/viem/types.ts +100 -0
@@ -1,4 +1,4 @@
1
- import { Contract, Interface, ZeroAddress, zeroPadValue, AbiCoder, JsonRpcProvider } from 'ethers';
1
+ import { ethers, Contract, Interface, ZeroAddress, zeroPadValue, AbiCoder, getAddress, JsonRpcProvider } from 'ethers';
2
2
 
3
3
  // src/ethers/chains.ts
4
4
  var CHAIN_IDS = {
@@ -511,6 +511,23 @@ var REGISTRY_ABI = [
511
511
  "function isBridgeAllowed(address bridge) view returns (bool)",
512
512
  "function getAllowedFacets() view returns (address[])"
513
513
  ];
514
+ var SUB_VAULT_ABI = [
515
+ // ConfigurationFacet reads — called on the MoreVaults diamond proxy
516
+ "function tokensHeld(bytes32 id) view returns (address[])",
517
+ "function lockedTokensAmountOfAsset(address asset) view returns (uint256)",
518
+ // ERC4626 standard reads — called on the sub-vault contract
519
+ "function convertToAssets(uint256 shares) view returns (uint256)",
520
+ "function convertToShares(uint256 assets) view returns (uint256)",
521
+ "function previewDeposit(uint256 assets) view returns (uint256)",
522
+ "function previewRedeem(uint256 shares) view returns (uint256)",
523
+ "function maxDeposit(address receiver) view returns (uint256)",
524
+ "function maxRedeem(address owner) view returns (uint256)",
525
+ // ERC7540 async reads — called on the sub-vault contract
526
+ "function pendingDepositRequest(uint256 requestId, address controller) view returns (uint256)",
527
+ "function claimableDepositRequest(uint256 requestId, address controller) view returns (uint256)",
528
+ "function pendingRedeemRequest(uint256 requestId, address controller) view returns (uint256)",
529
+ "function claimableRedeemRequest(uint256 requestId, address controller) view returns (uint256)"
530
+ ];
514
531
 
515
532
  // src/ethers/errors.ts
516
533
  var MoreVaultsError = class extends Error {
@@ -1750,11 +1767,11 @@ async function canDeposit(provider, vault, user) {
1750
1767
  return { allowed: true, reason: "ok" };
1751
1768
  }
1752
1769
  async function getVaultMetadata(provider, vault) {
1753
- const MULTICALL3_ADDRESS4 = "0xcA11bde05977b3631167028862bE2a173976CA11";
1754
- const MULTICALL3_ABI4 = [
1770
+ const MULTICALL3_ADDRESS5 = "0xcA11bde05977b3631167028862bE2a173976CA11";
1771
+ const MULTICALL3_ABI5 = [
1755
1772
  "function aggregate3(tuple(address target, bool allowFailure, bytes callData)[] calls) payable returns (tuple(bool success, bytes returnData)[] returnData)"
1756
1773
  ];
1757
- const mc = new Contract(MULTICALL3_ADDRESS4, MULTICALL3_ABI4, provider);
1774
+ const mc = new Contract(MULTICALL3_ADDRESS5, MULTICALL3_ABI5, provider);
1758
1775
  const metaIface = new Interface(METADATA_ABI);
1759
1776
  const vaultIface = new Interface(VAULT_ABI);
1760
1777
  const b1Calls = [
@@ -2296,6 +2313,302 @@ function buildUniswapV3Swap(params) {
2296
2313
  }
2297
2314
  };
2298
2315
  }
2316
+ function encodeBridgeParams(params) {
2317
+ const coder = AbiCoder.defaultAbiCoder();
2318
+ return coder.encode(
2319
+ ["address", "uint32", "uint256", "address", "address"],
2320
+ [
2321
+ getAddress(params.oftToken),
2322
+ params.dstEid,
2323
+ params.amount,
2324
+ getAddress(params.dstVault),
2325
+ getAddress(params.refundAddress)
2326
+ ]
2327
+ );
2328
+ }
2329
+ function encodeBridgeParamsForQuote(params) {
2330
+ const coder = AbiCoder.defaultAbiCoder();
2331
+ return coder.encode(
2332
+ ["address", "uint32", "uint256", "address"],
2333
+ [
2334
+ getAddress(params.oftToken),
2335
+ params.dstEid,
2336
+ params.amount,
2337
+ getAddress(params.dstVault)
2338
+ ]
2339
+ );
2340
+ }
2341
+ function findBridgeRoute(srcChainId, dstChainId, tokenAddress) {
2342
+ const normalizedToken = getAddress(tokenAddress);
2343
+ for (const [symbol, chains] of Object.entries(OFT_ROUTES)) {
2344
+ const srcEntry = chains[srcChainId];
2345
+ const dstEntry = chains[dstChainId];
2346
+ if (!srcEntry || !dstEntry) continue;
2347
+ const srcToken = getAddress(srcEntry.token);
2348
+ const srcOft = getAddress(srcEntry.oft);
2349
+ if (srcToken === normalizedToken || srcOft === normalizedToken) {
2350
+ return {
2351
+ oftSrc: srcOft,
2352
+ oftDst: getAddress(dstEntry.oft),
2353
+ symbol
2354
+ };
2355
+ }
2356
+ }
2357
+ return null;
2358
+ }
2359
+ async function quoteCuratorBridgeFee(provider, vault, params) {
2360
+ const status = await getCuratorVaultStatus(provider, vault);
2361
+ const lzAdapter = status.lzAdapter;
2362
+ const bridgeSpecificParams = encodeBridgeParamsForQuote(params);
2363
+ const adapterContract = new Contract(lzAdapter, LZ_ADAPTER_ABI, provider);
2364
+ const nativeFee = await adapterContract.quoteBridgeFee.staticCall(
2365
+ bridgeSpecificParams
2366
+ );
2367
+ return nativeFee;
2368
+ }
2369
+ async function executeCuratorBridge(signer, vault, token, params) {
2370
+ const provider = signer.provider;
2371
+ const status = await getCuratorVaultStatus(provider, vault);
2372
+ const lzAdapter = status.lzAdapter;
2373
+ const fee = await quoteCuratorBridgeFee(provider, vault, params);
2374
+ const bridgeSpecificParams = encodeBridgeParams(params);
2375
+ const vaultContract = new Contract(vault, BRIDGE_FACET_ABI, signer);
2376
+ const tx = await vaultContract.executeBridging(
2377
+ getAddress(lzAdapter),
2378
+ getAddress(token),
2379
+ params.amount,
2380
+ bridgeSpecificParams,
2381
+ { value: fee }
2382
+ );
2383
+ return tx.wait();
2384
+ }
2385
+ var MULTICALL3_ADDRESS4 = "0xcA11bde05977b3631167028862bE2a173976CA11";
2386
+ var MULTICALL3_ABI4 = [
2387
+ "function aggregate3(tuple(address target, bool allowFailure, bytes callData)[] calls) payable returns (tuple(bool success, bytes returnData)[] returnData)"
2388
+ ];
2389
+ var ERC4626_ID = ethers.keccak256(ethers.toUtf8Bytes("ERC4626_ID"));
2390
+ var ERC7540_ID = ethers.keccak256(ethers.toUtf8Bytes("ERC7540_ID"));
2391
+ async function getSubVaultPositions(provider, vault) {
2392
+ const subVaultIface = new Interface(SUB_VAULT_ABI);
2393
+ const vaultContract = new Contract(vault, SUB_VAULT_ABI, provider);
2394
+ const [erc4626Raw, erc7540Raw] = await Promise.all([
2395
+ vaultContract.tokensHeld(ERC4626_ID).catch(() => []),
2396
+ vaultContract.tokensHeld(ERC7540_ID).catch(() => [])
2397
+ ]);
2398
+ const allSubVaults = [
2399
+ ...erc4626Raw.map((a) => ({ address: a, type: "erc4626" })),
2400
+ ...erc7540Raw.map((a) => ({ address: a, type: "erc7540" }))
2401
+ ];
2402
+ if (allSubVaults.length === 0) return [];
2403
+ const mc = new Contract(MULTICALL3_ADDRESS4, MULTICALL3_ABI4, provider);
2404
+ const erc20Iface = new Interface(ERC20_ABI);
2405
+ const metaIface = new Interface(METADATA_ABI);
2406
+ const vaultIface = new Interface(VAULT_ABI);
2407
+ const PER_SV = 5;
2408
+ const subVaultCalls = allSubVaults.flatMap(({ address: sv }) => [
2409
+ { target: sv, allowFailure: true, callData: erc20Iface.encodeFunctionData("balanceOf", [vault]) },
2410
+ { target: sv, allowFailure: true, callData: vaultIface.encodeFunctionData("asset") },
2411
+ { target: sv, allowFailure: true, callData: metaIface.encodeFunctionData("name") },
2412
+ { target: sv, allowFailure: true, callData: metaIface.encodeFunctionData("symbol") },
2413
+ { target: sv, allowFailure: true, callData: metaIface.encodeFunctionData("decimals") }
2414
+ ]);
2415
+ const subVaultResults = await mc.aggregate3.staticCall(subVaultCalls);
2416
+ const partials = allSubVaults.map(({ address: sv, type }, i) => {
2417
+ const base = i * PER_SV;
2418
+ const sharesBalance = subVaultResults[base].success ? erc20Iface.decodeFunctionResult("balanceOf", subVaultResults[base].returnData)[0] : 0n;
2419
+ const underlyingAsset = subVaultResults[base + 1].success ? vaultIface.decodeFunctionResult("asset", subVaultResults[base + 1].returnData)[0] : ethers.ZeroAddress;
2420
+ const name = subVaultResults[base + 2].success ? metaIface.decodeFunctionResult("name", subVaultResults[base + 2].returnData)[0] : "";
2421
+ const symbol = subVaultResults[base + 3].success ? metaIface.decodeFunctionResult("symbol", subVaultResults[base + 3].returnData)[0] : "";
2422
+ const decimals = subVaultResults[base + 4].success ? Number(metaIface.decodeFunctionResult("decimals", subVaultResults[base + 4].returnData)[0]) : 18;
2423
+ return { address: sv, type, sharesBalance, underlyingAsset, name, symbol, decimals };
2424
+ });
2425
+ const active = partials.filter((p) => p.sharesBalance > 0n);
2426
+ if (active.length === 0) return [];
2427
+ const PER_ACTIVE = 4;
2428
+ const activeCalls = active.flatMap(({ address: sv, sharesBalance, underlyingAsset }) => [
2429
+ { target: sv, allowFailure: true, callData: subVaultIface.encodeFunctionData("convertToAssets", [sharesBalance]) },
2430
+ { target: underlyingAsset, allowFailure: true, callData: metaIface.encodeFunctionData("name") },
2431
+ { target: underlyingAsset, allowFailure: true, callData: metaIface.encodeFunctionData("symbol") },
2432
+ { target: underlyingAsset, allowFailure: true, callData: metaIface.encodeFunctionData("decimals") }
2433
+ ]);
2434
+ const activeResults = await mc.aggregate3.staticCall(activeCalls);
2435
+ return active.map((p, i) => {
2436
+ const base = i * PER_ACTIVE;
2437
+ const underlyingValue = activeResults[base].success ? subVaultIface.decodeFunctionResult("convertToAssets", activeResults[base].returnData)[0] : 0n;
2438
+ const underlyingSymbol = activeResults[base + 2].success ? metaIface.decodeFunctionResult("symbol", activeResults[base + 2].returnData)[0] : "";
2439
+ const underlyingDecimals = activeResults[base + 3].success ? Number(metaIface.decodeFunctionResult("decimals", activeResults[base + 3].returnData)[0]) : 18;
2440
+ return {
2441
+ address: p.address,
2442
+ type: p.type,
2443
+ name: p.name,
2444
+ symbol: p.symbol,
2445
+ decimals: p.decimals,
2446
+ sharesBalance: p.sharesBalance,
2447
+ underlyingValue,
2448
+ underlyingAsset: p.underlyingAsset,
2449
+ underlyingSymbol,
2450
+ underlyingDecimals
2451
+ };
2452
+ });
2453
+ }
2454
+ async function detectSubVaultType(provider, subVault) {
2455
+ const mc = new Contract(MULTICALL3_ADDRESS4, MULTICALL3_ABI4, provider);
2456
+ const subVaultIface = new Interface(SUB_VAULT_ABI);
2457
+ const calls = [
2458
+ {
2459
+ target: subVault,
2460
+ allowFailure: true,
2461
+ callData: subVaultIface.encodeFunctionData("pendingDepositRequest", [0n, ethers.ZeroAddress])
2462
+ },
2463
+ {
2464
+ target: subVault,
2465
+ allowFailure: true,
2466
+ callData: subVaultIface.encodeFunctionData("convertToAssets", [0n])
2467
+ }
2468
+ ];
2469
+ const results = await mc.aggregate3.staticCall(calls);
2470
+ if (results[0].success) return "erc7540";
2471
+ if (results[1].success) return "erc4626";
2472
+ return null;
2473
+ }
2474
+ async function getSubVaultInfo(provider, vault, subVault) {
2475
+ const mc = new Contract(MULTICALL3_ADDRESS4, MULTICALL3_ABI4, provider);
2476
+ const subVaultIface = new Interface(SUB_VAULT_ABI);
2477
+ const metaIface = new Interface(METADATA_ABI);
2478
+ const vaultIface = new Interface(VAULT_ABI);
2479
+ new Interface(REGISTRY_ABI);
2480
+ new Interface(VAULT_ANALYSIS_ABI);
2481
+ const [type, basicResults] = await Promise.all([
2482
+ detectSubVaultType(provider, subVault),
2483
+ mc.aggregate3.staticCall([
2484
+ { target: subVault, allowFailure: true, callData: metaIface.encodeFunctionData("name") },
2485
+ { target: subVault, allowFailure: true, callData: metaIface.encodeFunctionData("symbol") },
2486
+ { target: subVault, allowFailure: true, callData: metaIface.encodeFunctionData("decimals") },
2487
+ { target: subVault, allowFailure: true, callData: vaultIface.encodeFunctionData("asset") },
2488
+ { target: subVault, allowFailure: true, callData: subVaultIface.encodeFunctionData("maxDeposit", [vault]) }
2489
+ ])
2490
+ ]);
2491
+ const name = basicResults[0].success ? metaIface.decodeFunctionResult("name", basicResults[0].returnData)[0] : "";
2492
+ const symbol = basicResults[1].success ? metaIface.decodeFunctionResult("symbol", basicResults[1].returnData)[0] : "";
2493
+ const decimals = basicResults[2].success ? Number(metaIface.decodeFunctionResult("decimals", basicResults[2].returnData)[0]) : 18;
2494
+ const underlying = basicResults[3].success ? vaultIface.decodeFunctionResult("asset", basicResults[3].returnData)[0] : ethers.ZeroAddress;
2495
+ const maxDeposit = basicResults[4].success ? subVaultIface.decodeFunctionResult("maxDeposit", basicResults[4].returnData)[0] : 0n;
2496
+ const [underlyingResults, registryRaw] = await Promise.all([
2497
+ mc.aggregate3.staticCall([
2498
+ { target: underlying, allowFailure: true, callData: metaIface.encodeFunctionData("symbol") },
2499
+ { target: underlying, allowFailure: true, callData: metaIface.encodeFunctionData("decimals") }
2500
+ ]),
2501
+ new Contract(vault, VAULT_ANALYSIS_ABI, provider).moreVaultsRegistry().catch(() => null)
2502
+ ]);
2503
+ const underlyingSymbol = underlyingResults[0].success ? metaIface.decodeFunctionResult("symbol", underlyingResults[0].returnData)[0] : "";
2504
+ const underlyingDecimals = underlyingResults[1].success ? Number(metaIface.decodeFunctionResult("decimals", underlyingResults[1].returnData)[0]) : 18;
2505
+ let isWhitelisted = false;
2506
+ if (registryRaw) {
2507
+ const whitelistResult = await new Contract(registryRaw, REGISTRY_ABI, provider).isWhitelisted(subVault).catch(() => false);
2508
+ isWhitelisted = whitelistResult;
2509
+ }
2510
+ return {
2511
+ address: subVault,
2512
+ type: type ?? "erc4626",
2513
+ name,
2514
+ symbol,
2515
+ decimals,
2516
+ underlyingAsset: underlying,
2517
+ underlyingSymbol,
2518
+ underlyingDecimals,
2519
+ maxDeposit,
2520
+ isWhitelisted
2521
+ };
2522
+ }
2523
+ async function getERC7540RequestStatus(provider, vault, subVault) {
2524
+ const mc = new Contract(MULTICALL3_ADDRESS4, MULTICALL3_ABI4, provider);
2525
+ const subVaultIface = new Interface(SUB_VAULT_ABI);
2526
+ const calls = [
2527
+ { target: subVault, allowFailure: true, callData: subVaultIface.encodeFunctionData("pendingDepositRequest", [0n, vault]) },
2528
+ { target: subVault, allowFailure: true, callData: subVaultIface.encodeFunctionData("claimableDepositRequest", [0n, vault]) },
2529
+ { target: subVault, allowFailure: true, callData: subVaultIface.encodeFunctionData("pendingRedeemRequest", [0n, vault]) },
2530
+ { target: subVault, allowFailure: true, callData: subVaultIface.encodeFunctionData("claimableRedeemRequest", [0n, vault]) }
2531
+ ];
2532
+ const results = await mc.aggregate3.staticCall(calls);
2533
+ const pendingDeposit = results[0].success ? subVaultIface.decodeFunctionResult("pendingDepositRequest", results[0].returnData)[0] : 0n;
2534
+ const claimableDeposit = results[1].success ? subVaultIface.decodeFunctionResult("claimableDepositRequest", results[1].returnData)[0] : 0n;
2535
+ const pendingRedeem = results[2].success ? subVaultIface.decodeFunctionResult("pendingRedeemRequest", results[2].returnData)[0] : 0n;
2536
+ const claimableRedeem = results[3].success ? subVaultIface.decodeFunctionResult("claimableRedeemRequest", results[3].returnData)[0] : 0n;
2537
+ return {
2538
+ subVault,
2539
+ pendingDeposit,
2540
+ claimableDeposit,
2541
+ pendingRedeem,
2542
+ claimableRedeem,
2543
+ canFinalizeDeposit: claimableDeposit > 0n,
2544
+ canFinalizeRedeem: claimableRedeem > 0n
2545
+ };
2546
+ }
2547
+ async function previewSubVaultDeposit(provider, subVault, assets) {
2548
+ const contract = new Contract(subVault, SUB_VAULT_ABI, provider);
2549
+ return await contract.previewDeposit(assets);
2550
+ }
2551
+ async function previewSubVaultRedeem(provider, subVault, shares) {
2552
+ const contract = new Contract(subVault, SUB_VAULT_ABI, provider);
2553
+ return await contract.previewRedeem(shares);
2554
+ }
2555
+ async function getVaultPortfolio(provider, vault) {
2556
+ const mc = new Contract(MULTICALL3_ADDRESS4, MULTICALL3_ABI4, provider);
2557
+ new Interface(SUB_VAULT_ABI);
2558
+ new Interface(VAULT_ANALYSIS_ABI);
2559
+ const vaultIface = new Interface(VAULT_ABI);
2560
+ const erc20Iface = new Interface(ERC20_ABI);
2561
+ const metaIface = new Interface(METADATA_ABI);
2562
+ const [availableRaw, subVaultPositions, vaultTotals] = await Promise.all([
2563
+ new Contract(vault, VAULT_ANALYSIS_ABI, provider).getAvailableAssets().catch(() => []),
2564
+ getSubVaultPositions(provider, vault),
2565
+ mc.aggregate3.staticCall([
2566
+ { target: vault, allowFailure: true, callData: vaultIface.encodeFunctionData("totalAssets") },
2567
+ { target: vault, allowFailure: true, callData: vaultIface.encodeFunctionData("totalSupply") },
2568
+ { target: vault, allowFailure: true, callData: vaultIface.encodeFunctionData("asset") }
2569
+ ])
2570
+ ]);
2571
+ const totalAssets = vaultTotals[0].success ? vaultIface.decodeFunctionResult("totalAssets", vaultTotals[0].returnData)[0] : 0n;
2572
+ const totalSupply = vaultTotals[1].success ? vaultIface.decodeFunctionResult("totalSupply", vaultTotals[1].returnData)[0] : 0n;
2573
+ const underlyingAsset = vaultTotals[2].success ? vaultIface.decodeFunctionResult("asset", vaultTotals[2].returnData)[0] : ethers.ZeroAddress;
2574
+ const subVaultAddressSet = new Set(subVaultPositions.map((p) => p.address.toLowerCase()));
2575
+ const liquidAddresses = availableRaw.filter(
2576
+ (addr) => !subVaultAddressSet.has(addr.toLowerCase())
2577
+ );
2578
+ const PER_ASSET = 4;
2579
+ let liquidAssets = [];
2580
+ if (liquidAddresses.length > 0) {
2581
+ const liquidCalls = liquidAddresses.flatMap((addr) => [
2582
+ { target: addr, allowFailure: true, callData: erc20Iface.encodeFunctionData("balanceOf", [vault]) },
2583
+ { target: addr, allowFailure: true, callData: metaIface.encodeFunctionData("name") },
2584
+ { target: addr, allowFailure: true, callData: metaIface.encodeFunctionData("symbol") },
2585
+ { target: addr, allowFailure: true, callData: metaIface.encodeFunctionData("decimals") }
2586
+ ]);
2587
+ const liquidResults = await mc.aggregate3.staticCall(liquidCalls);
2588
+ liquidAssets = liquidAddresses.map((addr, i) => {
2589
+ const base = i * PER_ASSET;
2590
+ const balance = liquidResults[base].success ? erc20Iface.decodeFunctionResult("balanceOf", liquidResults[base].returnData)[0] : 0n;
2591
+ const name = liquidResults[base + 1].success ? metaIface.decodeFunctionResult("name", liquidResults[base + 1].returnData)[0] : "";
2592
+ const symbol = liquidResults[base + 2].success ? metaIface.decodeFunctionResult("symbol", liquidResults[base + 2].returnData)[0] : "";
2593
+ const decimals = liquidResults[base + 3].success ? Number(metaIface.decodeFunctionResult("decimals", liquidResults[base + 3].returnData)[0]) : 18;
2594
+ return { address: addr, name, symbol, decimals, balance };
2595
+ });
2596
+ }
2597
+ const lockedAssets = await new Contract(vault, SUB_VAULT_ABI, provider).lockedTokensAmountOfAsset(underlyingAsset).catch(() => 0n);
2598
+ const subVaultTotal = subVaultPositions.reduce((sum, p) => sum + p.underlyingValue, 0n);
2599
+ const underlyingBalance = liquidAssets.find(
2600
+ (a) => a.address.toLowerCase() === underlyingAsset.toLowerCase()
2601
+ )?.balance ?? 0n;
2602
+ const totalValue = underlyingBalance + subVaultTotal;
2603
+ return {
2604
+ liquidAssets,
2605
+ subVaultPositions,
2606
+ totalValue,
2607
+ totalAssets,
2608
+ totalSupply,
2609
+ lockedAssets
2610
+ };
2611
+ }
2299
2612
 
2300
2613
  // src/ethers/distribution.ts
2301
2614
  async function getVaultDistribution(hubProvider, vault, spokeProviders) {
@@ -2536,6 +2849,6 @@ function asSdkSigner(signer) {
2536
2849
  return signer;
2537
2850
  }
2538
2851
 
2539
- export { ActionType, BRIDGE_ABI, BRIDGE_FACET_ABI, CCManagerNotConfiguredError, CHAIN_IDS, CHAIN_ID_TO_EID, CONFIG_ABI, CURATOR_CONFIG_ABI, CapacityFullError, DEX_ABI, EID_TO_CHAIN_ID, ERC20_ABI, ERC4626_FACET_ABI, ERC7540_FACET_ABI, EscrowNotConfiguredError, InsufficientLiquidityError, LZ_ADAPTER_ABI, LZ_EIDS, LZ_ENDPOINT_ABI, LZ_TIMEOUTS, METADATA_ABI, MULTICALL_ABI, MissingEscrowAddressError, MoreVaultsError, NATIVE_SYMBOL, NotHubVaultError, NotWhitelistedError, OFT_ABI, OFT_ROUTES, OMNI_FACTORY_ADDRESS, REGISTRY_ABI, UNISWAP_V3_ROUTERS, VAULT_ABI, VAULT_ANALYSIS_ABI, VaultPausedError, WrongChainError, asSdkSigner, bridgeAssetsToSpoke, bridgeSharesToHub, buildCuratorBatch, buildUniswapV3Swap, canDeposit, checkProtocolWhitelist, depositAsync, depositCrossChainOracleOn, depositFromSpoke, depositFromSpokeAsync, depositMultiAsset, depositSimple, detectStargateOft, discoverVaultTopology, encodeCuratorAction, encodeUniswapV3SwapCalldata, ensureAllowance, executeActions, executeCompose, getAllVaultChainIds, getAsyncRequestStatus, getAsyncRequestStatusLabel, getCuratorVaultStatus, getFullVaultTopology, getInboundRoutes, getMaxWithdrawable, getOutboundRoutes, getPendingActions, getUserBalances, getUserBalancesForRoutes, getUserPosition, getUserPositionMultiChain, getVaultAnalysis, getVaultAssetBreakdown, getVaultDistribution, getVaultDistributionWithTopology, getVaultMetadata, getVaultStatus, getVaultSummary, getVaultTopology, getWithdrawalRequest, isAsyncMode, isCurator, isOnHubChain, mintAsync, preflightAsync, preflightRedeemLiquidity, preflightSpokeDeposit, preflightSpokeRedeem, preflightSync, previewDeposit, previewRedeem, quoteComposeFee, quoteDepositFromSpokeFee, quoteLzFee, quoteRouteDepositFee, quoteShareBridgeFee, redeemAsync, redeemShares, requestRedeem, resolveRedeemAddresses, smartDeposit, smartRedeem, submitActions, vetoActions, waitForCompose, withdrawAssets };
2852
+ export { ActionType, BRIDGE_ABI, BRIDGE_FACET_ABI, CCManagerNotConfiguredError, CHAIN_IDS, CHAIN_ID_TO_EID, CONFIG_ABI, CURATOR_CONFIG_ABI, CapacityFullError, DEX_ABI, EID_TO_CHAIN_ID, ERC20_ABI, ERC4626_FACET_ABI, ERC7540_FACET_ABI, EscrowNotConfiguredError, InsufficientLiquidityError, LZ_ADAPTER_ABI, LZ_EIDS, LZ_ENDPOINT_ABI, LZ_TIMEOUTS, METADATA_ABI, MULTICALL_ABI, MissingEscrowAddressError, MoreVaultsError, NATIVE_SYMBOL, NotHubVaultError, NotWhitelistedError, OFT_ABI, OFT_ROUTES, OMNI_FACTORY_ADDRESS, REGISTRY_ABI, SUB_VAULT_ABI, UNISWAP_V3_ROUTERS, VAULT_ABI, VAULT_ANALYSIS_ABI, VaultPausedError, WrongChainError, asSdkSigner, bridgeAssetsToSpoke, bridgeSharesToHub, buildCuratorBatch, buildUniswapV3Swap, canDeposit, checkProtocolWhitelist, depositAsync, depositCrossChainOracleOn, depositFromSpoke, depositFromSpokeAsync, depositMultiAsset, depositSimple, detectStargateOft, detectSubVaultType, discoverVaultTopology, encodeBridgeParams, encodeCuratorAction, encodeUniswapV3SwapCalldata, ensureAllowance, executeActions, executeCompose, executeCuratorBridge, findBridgeRoute, getAllVaultChainIds, getAsyncRequestStatus, getAsyncRequestStatusLabel, getCuratorVaultStatus, getERC7540RequestStatus, getFullVaultTopology, getInboundRoutes, getMaxWithdrawable, getOutboundRoutes, getPendingActions, getSubVaultInfo, getSubVaultPositions, getUserBalances, getUserBalancesForRoutes, getUserPosition, getUserPositionMultiChain, getVaultAnalysis, getVaultAssetBreakdown, getVaultDistribution, getVaultDistributionWithTopology, getVaultMetadata, getVaultPortfolio, getVaultStatus, getVaultSummary, getVaultTopology, getWithdrawalRequest, isAsyncMode, isCurator, isOnHubChain, mintAsync, preflightAsync, preflightRedeemLiquidity, preflightSpokeDeposit, preflightSpokeRedeem, preflightSync, previewDeposit, previewRedeem, previewSubVaultDeposit, previewSubVaultRedeem, quoteComposeFee, quoteCuratorBridgeFee, quoteDepositFromSpokeFee, quoteLzFee, quoteRouteDepositFee, quoteShareBridgeFee, redeemAsync, redeemShares, requestRedeem, resolveRedeemAddresses, smartDeposit, smartRedeem, submitActions, vetoActions, waitForCompose, withdrawAssets };
2540
2853
  //# sourceMappingURL=index.js.map
2541
2854
  //# sourceMappingURL=index.js.map