@oydual31/more-vaults-sdk 0.1.2 → 0.1.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/viem/abis.ts","../../src/viem/types.ts","../../src/viem/errors.ts","../../src/viem/utils.ts","../../src/viem/preflight.ts","../../src/viem/chainValidation.ts","../../src/viem/depositFlows.ts","../../src/viem/redeemFlows.ts","../../src/viem/userHelpers.ts","../../src/viem/wagmiCompat.ts","../../src/react/useVaultStatus.ts","../../src/react/useVaultMetadata.ts","../../src/react/useUserPosition.ts","../../src/react/useLzFee.ts","../../src/react/useAsyncRequestStatus.ts","../../src/react/useOmniDeposit.ts","../../src/react/useOmniRedeem.ts","../../src/react/useDepositSimple.ts","../../src/react/useRedeemShares.ts","../../src/react/useSmartDeposit.ts"],"names":["getAddress","zeroAddress","encodeAbiParameters","usePublicClient","useQuery","useWalletClient","useChainId","useState","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ABI fragments for MoreVaults SDK.\n * Extracted from compiled contract artifacts — only the selectors used by SDK flows.\n */\n\nexport const VAULT_ABI = [\n {\n type: 'function',\n name: 'deposit',\n inputs: [\n { name: 'assets', type: 'uint256' },\n { name: 'receiver', type: 'address' },\n ],\n outputs: [{ name: 'shares', type: 'uint256' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'deposit',\n inputs: [\n { name: 'tokens', type: 'address[]' },\n { name: 'assets', type: 'uint256[]' },\n { name: 'receiver', type: 'address' },\n { name: 'minAmountOut', type: 'uint256' },\n ],\n outputs: [{ name: 'shares', type: 'uint256' }],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'mint',\n inputs: [\n { name: 'shares', type: 'uint256' },\n { name: 'receiver', type: 'address' },\n ],\n outputs: [{ name: 'assets', type: 'uint256' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'withdraw',\n inputs: [\n { name: 'assets', type: 'uint256' },\n { name: 'receiver', type: 'address' },\n { name: 'owner', type: 'address' },\n ],\n outputs: [{ name: 'shares', type: 'uint256' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'redeem',\n inputs: [\n { name: 'shares', type: 'uint256' },\n { name: 'receiver', type: 'address' },\n { name: 'owner', type: 'address' },\n ],\n outputs: [{ name: 'assets', type: 'uint256' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'requestRedeem',\n inputs: [\n { name: '_shares', type: 'uint256' },\n { name: '_onBehalfOf', type: 'address' },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'requestWithdraw',\n inputs: [\n { name: '_assets', type: 'uint256' },\n { name: '_onBehalfOf', type: 'address' },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'getWithdrawalRequest',\n inputs: [{ name: '_owner', type: 'address' }],\n outputs: [\n { name: 'shares', type: 'uint256' },\n { name: 'timelockEndsAt', type: 'uint256' },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'totalAssets',\n inputs: [],\n outputs: [{ name: '_totalAssets', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'totalSupply',\n inputs: [],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'asset',\n inputs: [],\n outputs: [{ name: '', type: 'address' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'convertToShares',\n inputs: [{ name: 'assets', type: 'uint256' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'convertToAssets',\n inputs: [{ name: 'shares', type: 'uint256' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'previewDeposit',\n inputs: [{ name: 'assets', type: 'uint256' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'previewRedeem',\n inputs: [{ name: 'shares', type: 'uint256' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n] as const\n\nexport const BRIDGE_ABI = [\n {\n type: 'function',\n name: 'initVaultActionRequest',\n inputs: [\n { name: 'actionType', type: 'uint8' },\n { name: 'actionCallData', type: 'bytes' },\n { name: 'amountLimit', type: 'uint256' },\n { name: 'extraOptions', type: 'bytes' },\n ],\n outputs: [{ name: 'guid', type: 'bytes32' }],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'getRequestInfo',\n inputs: [{ name: 'guid', type: 'bytes32' }],\n outputs: [\n {\n name: '',\n type: 'tuple',\n components: [\n { name: 'initiator', type: 'address' },\n { name: 'timestamp', type: 'uint64' },\n { name: 'actionType', type: 'uint8' },\n { name: 'actionCallData', type: 'bytes' },\n { name: 'fulfilled', type: 'bool' },\n { name: 'finalized', type: 'bool' },\n { name: 'refunded', type: 'bool' },\n { name: 'totalAssets', type: 'uint256' },\n { name: 'finalizationResult', type: 'uint256' },\n { name: 'amountLimit', type: 'uint256' },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getFinalizationResult',\n inputs: [{ name: 'guid', type: 'bytes32' }],\n outputs: [{ name: 'result', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'quoteAccountingFee',\n inputs: [{ name: 'extraOptions', type: 'bytes' }],\n outputs: [{ name: 'nativeFee', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'oraclesCrossChainAccounting',\n inputs: [],\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'view',\n },\n] as const\n\nexport const CONFIG_ABI = [\n {\n type: 'function',\n name: 'getEscrow',\n inputs: [],\n outputs: [{ name: 'escrow', type: 'address' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getCrossChainAccountingManager',\n inputs: [],\n outputs: [{ name: '', type: 'address' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'isHub',\n inputs: [],\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getWithdrawalQueueStatus',\n inputs: [],\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getWithdrawalTimelock',\n inputs: [],\n outputs: [{ name: '', type: 'uint64' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'paused',\n inputs: [],\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'maxDeposit',\n inputs: [{ name: 'receiver', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n] as const\n\nexport const ERC20_ABI = [\n {\n type: 'function',\n name: 'approve',\n inputs: [\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n ],\n outputs: [{ name: '', type: 'bool' }],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'allowance',\n inputs: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n ],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n] as const\n\n/**\n * Minimal ABI for reading ERC-20 / ERC-4626 token metadata.\n * Used to read name, symbol, and decimals from any token or vault.\n */\nexport const METADATA_ABI = [\n { type: 'function', name: 'name', inputs: [], outputs: [{ name: '', type: 'string' }], stateMutability: 'view' },\n { type: 'function', name: 'symbol', inputs: [], outputs: [{ name: '', type: 'string' }], stateMutability: 'view' },\n { type: 'function', name: 'decimals', inputs: [], outputs: [{ name: '', type: 'uint8' }], stateMutability: 'view' },\n] as const\n\n/**\n * Minimal OFT ABI for cross-chain bridging (LayerZero OFT standard).\n * Used by D6/D7 spoke-to-hub flows and R6 share bridging.\n */\nexport const OFT_ABI = [\n {\n type: 'function',\n name: 'send',\n inputs: [\n {\n name: '_sendParam',\n type: 'tuple',\n components: [\n { name: 'dstEid', type: 'uint32' },\n { name: 'to', type: 'bytes32' },\n { name: 'amountLD', type: 'uint256' },\n { name: 'minAmountLD', type: 'uint256' },\n { name: 'extraOptions', type: 'bytes' },\n { name: 'composeMsg', type: 'bytes' },\n { name: 'oftCmd', type: 'bytes' },\n ],\n },\n {\n name: '_fee',\n type: 'tuple',\n components: [\n { name: 'nativeFee', type: 'uint256' },\n { name: 'lzTokenFee', type: 'uint256' },\n ],\n },\n { name: '_refundAddress', type: 'address' },\n ],\n outputs: [\n {\n name: 'msgReceipt',\n type: 'tuple',\n components: [\n { name: 'guid', type: 'bytes32' },\n { name: 'nonce', type: 'uint64' },\n {\n name: 'fee',\n type: 'tuple',\n components: [\n { name: 'nativeFee', type: 'uint256' },\n { name: 'lzTokenFee', type: 'uint256' },\n ],\n },\n ],\n },\n {\n name: 'oftReceipt',\n type: 'tuple',\n components: [\n { name: 'amountSentLD', type: 'uint256' },\n { name: 'amountReceivedLD', type: 'uint256' },\n ],\n },\n ],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'quoteSend',\n inputs: [\n {\n name: '_sendParam',\n type: 'tuple',\n components: [\n { name: 'dstEid', type: 'uint32' },\n { name: 'to', type: 'bytes32' },\n { name: 'amountLD', type: 'uint256' },\n { name: 'minAmountLD', type: 'uint256' },\n { name: 'extraOptions', type: 'bytes' },\n { name: 'composeMsg', type: 'bytes' },\n { name: 'oftCmd', type: 'bytes' },\n ],\n },\n { name: '_payInLzToken', type: 'bool' },\n ],\n outputs: [\n {\n name: 'msgFee',\n type: 'tuple',\n components: [\n { name: 'nativeFee', type: 'uint256' },\n { name: 'lzTokenFee', type: 'uint256' },\n ],\n },\n ],\n stateMutability: 'view',\n },\n] as const\n","import type { Address, Hash, PublicClient, WalletClient } from 'viem'\n\nexport interface VaultAddresses {\n /** Hub vault address (diamond proxy) */\n vault: Address\n /** MoreVaultsEscrow — holds locked tokens during async cross-chain flows */\n escrow?: Address\n /** OFTAdapter for vault shares (cross-chain redeem only) */\n shareOFT?: Address\n /** OFT for USDC bridging (cross-chain deposits from spoke) */\n usdcOFT?: Address\n /**\n * Expected EVM chain ID of the hub. When provided, SDK functions will\n * throw a clear WrongChainError if the walletClient is on a different chain.\n * Prevents silent failures when MetaMask is connected to the wrong network.\n */\n hubChainId?: number\n}\n\nexport interface DepositResult {\n txHash: Hash\n shares: bigint\n}\n\nexport interface RedeemResult {\n txHash: Hash\n assets: bigint\n}\n\nexport interface AsyncRequestResult {\n txHash: Hash\n /** Cross-chain request GUID to track via getRequestInfo / getFinalizationResult */\n guid: `0x${string}`\n}\n\n/**\n * ActionType enum values matching MoreVaultsLib.ActionType on-chain.\n * DEPOSIT=0, MINT=1, WITHDRAW=2, REDEEM=3, MULTI_ASSETS_DEPOSIT=4, ACCRUE_FEES=5\n */\nexport const ActionType = {\n DEPOSIT: 0,\n MINT: 1,\n WITHDRAW: 2,\n REDEEM: 3,\n MULTI_ASSETS_DEPOSIT: 4,\n ACCRUE_FEES: 5,\n} as const\n\nexport type ActionTypeValue = (typeof ActionType)[keyof typeof ActionType]\n\nexport interface CrossChainRequestInfo {\n initiator: Address\n timestamp: bigint\n actionType: number\n actionCallData: `0x${string}`\n fulfilled: boolean\n finalized: boolean\n refunded: boolean\n totalAssets: bigint\n finalizationResult: bigint\n amountLimit: bigint\n}\n","/**\n * Typed error classes for the MoreVaults SDK.\n *\n * Frontend code can use instanceof checks to handle errors programmatically:\n * catch (e) {\n * if (e instanceof InsufficientLiquidityError) { ... }\n * }\n */\n\nexport class MoreVaultsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MoreVaultsError'\n }\n}\n\nexport class VaultPausedError extends MoreVaultsError {\n constructor(vault: string) {\n super(`[MoreVaults] Vault ${vault} is paused. Cannot perform any actions.`)\n this.name = 'VaultPausedError'\n }\n}\n\nexport class CapacityFullError extends MoreVaultsError {\n constructor(vault: string) {\n super(`[MoreVaults] Vault ${vault} has reached deposit capacity. No more deposits accepted.`)\n this.name = 'CapacityFullError'\n }\n}\n\nexport class NotWhitelistedError extends MoreVaultsError {\n constructor(vault: string, user: string) {\n super(`[MoreVaults] Address ${user} is not whitelisted to deposit in vault ${vault}.`)\n this.name = 'NotWhitelistedError'\n }\n}\n\nexport class InsufficientLiquidityError extends MoreVaultsError {\n hubLiquid: bigint\n required: bigint\n constructor(vault: string, hubLiquid: bigint, required: bigint) {\n super(\n `[MoreVaults] Insufficient hub liquidity for redeem.\\n` +\n ` Hub liquid balance : ${hubLiquid}\\n` +\n ` Estimated required : ${required}\\n` +\n `Submitting this redeem will waste the LayerZero fee — the request will be auto-refunded.\\n` +\n `Ask the vault curator to repatriate liquidity from spoke chains first.`\n )\n this.name = 'InsufficientLiquidityError'\n this.hubLiquid = hubLiquid\n this.required = required\n }\n}\n\nexport class CCManagerNotConfiguredError extends MoreVaultsError {\n constructor(vault: string) {\n super(`[MoreVaults] CCManager not configured on vault ${vault}. Call setCrossChainAccountingManager(ccManagerAddress) as vault owner first.`)\n this.name = 'CCManagerNotConfiguredError'\n }\n}\n\nexport class EscrowNotConfiguredError extends MoreVaultsError {\n constructor(vault: string) {\n super(`[MoreVaults] Escrow not configured for vault ${vault}. The registry must have an escrow set for this vault.`)\n this.name = 'EscrowNotConfiguredError'\n }\n}\n\nexport class NotHubVaultError extends MoreVaultsError {\n constructor(vault: string) {\n super(`[MoreVaults] Vault ${vault} is not a hub vault. Async flows (D4/D5/R5) only work on hub vaults.`)\n this.name = 'NotHubVaultError'\n }\n}\n\nexport class MissingEscrowAddressError extends MoreVaultsError {\n constructor() {\n super(`[MoreVaults] This flow requires an escrow address. Set VaultAddresses.escrow before calling async deposit/redeem flows.`)\n this.name = 'MissingEscrowAddressError'\n }\n}\n\nexport class WrongChainError extends MoreVaultsError {\n constructor(currentChainId: number, expectedChainId: number) {\n super(\n `Wrong network: wallet is on chain ${currentChainId}, but the vault hub requires chain ${expectedChainId}. Switch networks before proceeding.`,\n )\n this.name = 'WrongChainError'\n }\n}\n","import {\n type Address,\n type PublicClient,\n type WalletClient,\n getAddress,\n zeroAddress,\n} from 'viem'\nimport { BRIDGE_ABI, CONFIG_ABI, ERC20_ABI, VAULT_ABI, METADATA_ABI } from './abis'\nimport type { CrossChainRequestInfo } from './types'\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type VaultMode =\n | 'local' // single-chain vault, no cross-chain\n | 'cross-chain-oracle' // hub with oracle-based accounting (sync)\n | 'cross-chain-async' // hub with off-chain accounting (async, D4/D5/R5)\n | 'paused' // vault is paused\n | 'full' // deposit capacity reached\n\nexport interface VaultStatus {\n /** Vault operating mode — determines which SDK flow to use */\n mode: VaultMode\n /** Which deposit function to call given the current configuration */\n recommendedDepositFlow: 'depositSimple' | 'depositAsync' | 'mintAsync' | 'none'\n /** Which redeem function to call given the current configuration */\n recommendedRedeemFlow: 'redeemShares' | 'redeemAsync' | 'none'\n\n // ── Configuration ────────────────────────────────────────────────────────\n isHub: boolean\n isPaused: boolean\n oracleAccountingEnabled: boolean\n\n /** address(0) means CCManager is not set — async flows will fail */\n ccManager: Address\n /** address(0) means escrow is not configured in the registry */\n escrow: Address\n\n // ── Withdrawal queue ─────────────────────────────────────────────────────\n withdrawalQueueEnabled: boolean\n /** Timelock duration in seconds (0 = no timelock) */\n withdrawalTimelockSeconds: bigint\n\n // ── Capacity ─────────────────────────────────────────────────────────────\n /**\n * Remaining deposit capacity in underlying token decimals.\n * `type(uint256).max` = no cap configured (unlimited).\n * `0n` = vault is full — no more deposits accepted.\n * If `depositAccessRestricted = true`, this value is `type(uint256).max` but\n * deposits are still gated by whitelist or other access control.\n */\n remainingDepositCapacity: bigint\n /**\n * True when `maxDeposit(address(0))` reverted, indicating the vault uses\n * whitelist or other access control to restrict who can deposit.\n * Deposit flows will succeed only for addresses the vault operator has approved.\n */\n depositAccessRestricted: boolean\n\n // ── Vault metrics ────────────────────────────────────────────────────────\n underlying: Address\n totalAssets: bigint\n totalSupply: bigint\n /** Vault share token decimals. Use this for display — never hardcode 18. */\n decimals: number\n /**\n * Price of 1 full share expressed in underlying token units.\n * = convertToAssets(10^decimals). Grows over time as the vault earns yield.\n */\n sharePrice: bigint\n /**\n * Underlying token balance held directly on the hub chain.\n * This is the only portion that can be paid out to redeeming users immediately.\n * (= ERC-20.balanceOf(vault) on the hub)\n */\n hubLiquidBalance: bigint\n /**\n * Approximate value deployed to spoke chains (totalAssets − hubLiquidBalance).\n * These funds are NOT immediately redeemable — the vault curator must\n * call executeBridging to repatriate them before large redeems can succeed.\n */\n spokesDeployedBalance: bigint\n /**\n * Maximum assets that can be redeemed right now without curator intervention.\n * - For hub vaults: equals `hubLiquidBalance` (only what the hub holds).\n * - For local/oracle vaults: equals `totalAssets` (all assets are local).\n * Attempting to redeem more than this will revert (R1) or be auto-refunded (R5).\n */\n maxImmediateRedeemAssets: bigint\n\n // ── Issues — empty when everything is correctly configured ───────────────\n /**\n * Human-readable list of configuration problems that would cause transactions\n * to fail. Empty array = vault is ready to use.\n */\n issues: string[]\n}\n\n/**\n * Read the full configuration and operational status of a vault in a single\n * multicall-friendly batch.\n *\n * Use this to:\n * - Determine which SDK flow to use (`recommendedDepositFlow`)\n * - Show a configuration checklist in an admin dashboard\n * - Surface `issues` to the developer before any transaction\n *\n * @param publicClient Public client for reads\n * @param vault Vault address (diamond proxy)\n * @returns Full vault status snapshot\n *\n * @example\n * ```ts\n * const status = await getVaultStatus(publicClient, VAULT)\n * if (status.issues.length) {\n * console.warn('Vault misconfigured:', status.issues)\n * }\n * // Use recommended flow:\n * if (status.recommendedDepositFlow === 'depositAsync') {\n * await depositAsync(walletClient, publicClient, { vault: VAULT, escrow: status.escrow }, ...)\n * }\n * ```\n */\nexport async function getVaultStatus(\n publicClient: PublicClient,\n vault: Address,\n): Promise<VaultStatus> {\n const v = getAddress(vault)\n\n // ── Batch 1: single multicall — 12 reads, 1 HTTP request ─────────────────\n // maxDeposit(address(0)) may revert on whitelisted vaults — allowFailure handles it.\n const b1 = await publicClient.multicall({\n contracts: [\n { address: v, abi: CONFIG_ABI, functionName: 'isHub' },\n { address: v, abi: CONFIG_ABI, functionName: 'paused' },\n { address: v, abi: BRIDGE_ABI, functionName: 'oraclesCrossChainAccounting' },\n { address: v, abi: CONFIG_ABI, functionName: 'getCrossChainAccountingManager' },\n { address: v, abi: CONFIG_ABI, functionName: 'getEscrow' },\n { address: v, abi: CONFIG_ABI, functionName: 'getWithdrawalQueueStatus' },\n { address: v, abi: CONFIG_ABI, functionName: 'getWithdrawalTimelock' },\n { address: v, abi: CONFIG_ABI, functionName: 'maxDeposit', args: [zeroAddress] },\n { address: v, abi: VAULT_ABI, functionName: 'asset' },\n { address: v, abi: VAULT_ABI, functionName: 'totalAssets' },\n { address: v, abi: VAULT_ABI, functionName: 'totalSupply' },\n { address: v, abi: METADATA_ABI, functionName: 'decimals' },\n ] as const,\n allowFailure: true,\n })\n\n const isHub = b1[0].status === 'success' ? b1[0].result as boolean : false\n const isPaused = b1[1].status === 'success' ? b1[1].result as boolean : false\n const oraclesEnabled = b1[2].status === 'success' ? b1[2].result as boolean : false\n const ccManager = b1[3].status === 'success' ? b1[3].result as Address : zeroAddress\n const escrow = b1[4].status === 'success' ? b1[4].result as Address : zeroAddress\n const withdrawalQueueEnabled = b1[5].status === 'success' ? b1[5].result as boolean : false\n const withdrawalTimelockSeconds = b1[6].status === 'success' ? b1[6].result as bigint : 0n\n // null = reverted (whitelist/ACL), bigint = normal return\n const maxDepositRaw = b1[7].status === 'success' ? b1[7].result as bigint : null\n const underlying = b1[8].status === 'success' ? b1[8].result as Address : zeroAddress\n const totalAssets = b1[9].status === 'success' ? b1[9].result as bigint : 0n\n const totalSupply = b1[10].status === 'success' ? b1[10].result as bigint : 0n\n const decimals = b1[11].status === 'success' ? Number(b1[11].result) : 18\n\n // ── Batch 2: depends on underlying + decimals from batch 1 ────────────────\n const oneShare = 10n ** BigInt(decimals)\n const b2 = await publicClient.multicall({\n contracts: [\n { address: getAddress(underlying), abi: ERC20_ABI, functionName: 'balanceOf', args: [v] },\n { address: v, abi: VAULT_ABI, functionName: 'convertToAssets', args: [oneShare] },\n ] as const,\n allowFailure: true,\n })\n\n const hubLiquidBalance = b2[0].status === 'success' ? b2[0].result as bigint : 0n\n const sharePrice = b2[1].status === 'success' ? b2[1].result as bigint : 0n\n\n const spokesDeployedBalance = totalAssets > hubLiquidBalance ? totalAssets - hubLiquidBalance : 0n\n\n // null = maxDeposit reverted → whitelist/ACL vault\n const MAX_UINT256 = BigInt('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff')\n const depositAccessRestricted = maxDepositRaw === null\n const effectiveCapacity: bigint = depositAccessRestricted ? MAX_UINT256 : maxDepositRaw\n\n // ── Derive mode ────────────────────────────────────────────────────────────\n let mode: VaultMode\n if (isPaused) {\n mode = 'paused'\n } else if (effectiveCapacity === 0n) {\n mode = 'full'\n } else if (!isHub) {\n mode = 'local'\n } else if (oraclesEnabled) {\n mode = 'cross-chain-oracle'\n } else {\n mode = 'cross-chain-async'\n }\n\n // ── Recommended flows ──────────────────────────────────────────────────────\n let recommendedDepositFlow: VaultStatus['recommendedDepositFlow']\n let recommendedRedeemFlow: VaultStatus['recommendedRedeemFlow']\n\n if (mode === 'paused' || mode === 'full') {\n recommendedDepositFlow = 'none'\n recommendedRedeemFlow = mode === 'paused' ? 'none' : 'redeemShares'\n } else if (mode === 'cross-chain-async') {\n recommendedDepositFlow = 'depositAsync'\n recommendedRedeemFlow = 'redeemAsync'\n } else {\n // local or cross-chain-oracle\n recommendedDepositFlow = 'depositSimple'\n recommendedRedeemFlow = 'redeemShares'\n }\n\n // ── maxImmediateRedeemAssets ───────────────────────────────────────────────\n const maxImmediateRedeemAssets = isHub && !oraclesEnabled ? hubLiquidBalance : totalAssets\n\n // ── Issues ─────────────────────────────────────────────────────────────────\n const issues: string[] = []\n\n if (isPaused) {\n issues.push('Vault is paused — no deposits or redeems are possible.')\n }\n if (effectiveCapacity === 0n && !isPaused) {\n issues.push('Deposit capacity is full — increase depositCapacity via setDepositCapacity().')\n }\n if (depositAccessRestricted) {\n issues.push('Deposit access is restricted (whitelist or other access control). Only approved addresses can deposit.')\n }\n if (isHub && !oraclesEnabled && ccManager === zeroAddress) {\n issues.push(\n 'CCManager not configured — async flows will revert. Call setCrossChainAccountingManager(address) as vault owner.',\n )\n }\n if (isHub && !oraclesEnabled && escrow === zeroAddress) {\n issues.push(\n 'Escrow not configured in registry — async flows will revert. Set the escrow via the MoreVaultsRegistry.',\n )\n }\n if (isHub) {\n if (hubLiquidBalance === 0n) {\n issues.push(\n `Hub has no liquid assets (hubLiquidBalance = 0). All redeems will be auto-refunded until the curator repatriates funds from spokes via executeBridging().`,\n )\n } else if (totalAssets > 0n && hubLiquidBalance * 10n < totalAssets) {\n const pct = Number((hubLiquidBalance * 10000n) / totalAssets) / 100\n issues.push(\n `Low hub liquidity: ${hubLiquidBalance} units liquid on hub (${pct.toFixed(1)}% of TVL). ` +\n `Redeems above ${hubLiquidBalance} underlying units will be auto-refunded. ` +\n `Curator must call executeBridging() to repatriate from spokes.`,\n )\n }\n if (spokesDeployedBalance > 0n) {\n const pct = ((Number(spokesDeployedBalance) / Number(totalAssets || 1n)) * 100).toFixed(1)\n issues.push(\n `${spokesDeployedBalance} units (~${pct}% of TVL) are deployed on spoke chains earning yield. ` +\n `These are NOT immediately redeemable — they require a curator repatriation (executeBridging) before users can withdraw them.`,\n )\n }\n }\n\n return {\n mode,\n recommendedDepositFlow,\n recommendedRedeemFlow,\n isHub,\n isPaused,\n oracleAccountingEnabled: oraclesEnabled,\n ccManager,\n escrow,\n withdrawalQueueEnabled,\n withdrawalTimelockSeconds: BigInt(withdrawalTimelockSeconds),\n remainingDepositCapacity: effectiveCapacity,\n depositAccessRestricted,\n underlying,\n totalAssets,\n totalSupply,\n decimals,\n sharePrice,\n hubLiquidBalance,\n spokesDeployedBalance,\n maxImmediateRedeemAssets,\n issues,\n }\n}\n\n/**\n * Ensure the spender has sufficient ERC-20 allowance; approve if not.\n *\n * Checks the current allowance and only sends an approve transaction if\n * the existing allowance is less than the required amount.\n *\n * @param walletClient Wallet client with account attached\n * @param publicClient Public client for reads\n * @param token ERC-20 token address\n * @param spender Address to approve\n * @param amount Minimum required allowance\n */\nexport async function ensureAllowance(\n walletClient: WalletClient,\n publicClient: PublicClient,\n token: Address,\n spender: Address,\n amount: bigint,\n): Promise<void> {\n const account = walletClient.account!\n\n const allowance = await publicClient.readContract({\n address: getAddress(token),\n abi: ERC20_ABI,\n functionName: 'allowance',\n args: [account.address, getAddress(spender)],\n })\n\n if (allowance < amount) {\n const hash = await walletClient.writeContract({\n address: getAddress(token),\n abi: ERC20_ABI,\n functionName: 'approve',\n args: [getAddress(spender), amount],\n account,\n chain: walletClient.chain,\n })\n await publicClient.waitForTransactionReceipt({ hash })\n }\n}\n\n/**\n * Quote the LayerZero native fee required for async vault actions.\n *\n * Call this before `depositAsync`, `mintAsync`, or `redeemAsync` to get the\n * exact `lzFee` (msg.value) needed.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address (diamond proxy)\n * @param extraOptions Optional LZ extra options bytes (default 0x)\n * @returns Required native fee in wei\n */\nexport async function quoteLzFee(\n publicClient: PublicClient,\n vault: Address,\n extraOptions: `0x${string}` = '0x',\n): Promise<bigint> {\n return publicClient.readContract({\n address: getAddress(vault),\n abi: BRIDGE_ABI,\n functionName: 'quoteAccountingFee',\n args: [extraOptions],\n })\n}\n\n/**\n * Check if a vault is operating in async mode (cross-chain hub with oracle OFF).\n *\n * When this returns `true`, deposits and redeems must use the async flows\n * (D4/D5/R5) which go through `initVaultActionRequest`.\n * When `false`, the vault either uses oracle-based accounting (sync) or is\n * a single-chain vault.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address\n * @returns `true` if the vault requires async cross-chain flows\n */\nexport async function isAsyncMode(\n publicClient: PublicClient,\n vault: Address,\n): Promise<boolean> {\n const v = getAddress(vault)\n\n // A vault is async if it's a hub AND oracle accounting is OFF\n const isHub = await publicClient.readContract({\n address: v,\n abi: CONFIG_ABI,\n functionName: 'isHub',\n })\n\n if (!isHub) return false\n\n const oraclesEnabled = await publicClient.readContract({\n address: v,\n abi: BRIDGE_ABI,\n functionName: 'oraclesCrossChainAccounting',\n })\n\n return !oraclesEnabled\n}\n\n/**\n * Poll for async request completion status.\n *\n * After calling an async flow (D4/D5/R5), use this to check whether the\n * LZ callback has resolved and `executeRequest` has been called.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address\n * @param guid Request GUID returned by the async flow\n * @returns Whether the request is fulfilled and the finalization result\n */\nexport async function getAsyncRequestStatus(\n publicClient: PublicClient,\n vault: Address,\n guid: `0x${string}`,\n): Promise<{ fulfilled: boolean; finalized: boolean; result: bigint }> {\n const info = (await publicClient.readContract({\n address: getAddress(vault),\n abi: BRIDGE_ABI,\n functionName: 'getRequestInfo',\n args: [guid],\n })) as unknown as CrossChainRequestInfo\n\n const finalizationResult = await publicClient.readContract({\n address: getAddress(vault),\n abi: BRIDGE_ABI,\n functionName: 'getFinalizationResult',\n args: [guid],\n })\n\n return {\n fulfilled: info.fulfilled,\n finalized: info.finalized,\n result: finalizationResult,\n }\n}\n","/**\n * Pre-flight validation helpers for MoreVaults SDK flows.\n *\n * Each function reads on-chain state and throws a descriptive error BEFORE\n * the actual contract call, so developers see a clear, actionable message\n * instead of a raw VM revert.\n */\n\nimport { type Address, type PublicClient, getAddress, zeroAddress } from 'viem'\nimport { CONFIG_ABI, BRIDGE_ABI, VAULT_ABI, ERC20_ABI } from './abis'\n\n/**\n * Pre-flight checks for async cross-chain flows (D4 / D5 / R5).\n *\n * Validates that:\n * 1. The CCManager is configured on the vault.\n * 2. An escrow is registered in the vault's registry.\n * 3. The vault is a hub (required for async flows).\n * 4. The vault does NOT have oracle-based cross-chain accounting enabled\n * (oracle-on vaults should use depositSimple / depositCrossChainOracleOn).\n * 5. The vault is not paused.\n *\n * All reads that are independent of each other are executed in parallel via\n * Promise.all to minimise latency.\n *\n * @param publicClient Public client for contract reads\n * @param vault Vault address (diamond proxy)\n * @param escrow Escrow address from VaultAddresses\n */\nexport async function preflightAsync(\n publicClient: PublicClient,\n vault: Address,\n escrow: Address,\n): Promise<void> {\n const v = getAddress(vault)\n\n // Parallel read: ccManager, escrow, isHub, oraclesCrossChainAccounting, paused\n const [ccManager, registeredEscrow, isHub, oraclesEnabled, isPaused] =\n await Promise.all([\n publicClient.readContract({\n address: v,\n abi: CONFIG_ABI,\n functionName: 'getCrossChainAccountingManager',\n }),\n publicClient.readContract({\n address: v,\n abi: CONFIG_ABI,\n functionName: 'getEscrow',\n }),\n publicClient.readContract({\n address: v,\n abi: CONFIG_ABI,\n functionName: 'isHub',\n }),\n publicClient.readContract({\n address: v,\n abi: BRIDGE_ABI,\n functionName: 'oraclesCrossChainAccounting',\n }),\n publicClient.readContract({\n address: v,\n abi: CONFIG_ABI,\n functionName: 'paused',\n }),\n ])\n\n if (ccManager === zeroAddress) {\n throw new Error(\n `[MoreVaults] CCManager not configured on vault ${vault}. Call setCrossChainAccountingManager(ccManagerAddress) as vault owner first.`,\n )\n }\n\n if (registeredEscrow === zeroAddress) {\n throw new Error(\n `[MoreVaults] Escrow not configured for vault ${vault}. The registry must have an escrow set for this vault.`,\n )\n }\n\n if (!isHub) {\n throw new Error(\n `[MoreVaults] Vault ${vault} is not a hub vault. Async flows (D4/D5/R5) only work on hub vaults.`,\n )\n }\n\n if (oraclesEnabled) {\n throw new Error(\n `[MoreVaults] Vault ${vault} has oracle-based cross-chain accounting enabled. Use depositSimple/depositCrossChainOracleOn instead of async flows.`,\n )\n }\n\n if (isPaused) {\n throw new Error(\n `[MoreVaults] Vault ${vault} is paused. Cannot perform any actions.`,\n )\n }\n}\n\n/**\n * Pre-flight liquidity check for async redeem (R5).\n *\n * Reads the hub's liquid balance of the underlying token and compares it\n * against the assets the user expects to receive. If the hub does not hold\n * enough liquid assets the redeem will be auto-refunded after the LZ round-trip,\n * wasting the LayerZero fee.\n *\n * This check is best-effort: liquidity could change in the 1-5 minutes between\n * submission and execution. But it catches the common case where the hub is\n * already under-funded at the time of submission.\n *\n * @param publicClient Public client for contract reads\n * @param vault Vault address (diamond proxy)\n * @param shares Shares the user intends to redeem\n */\nexport async function preflightRedeemLiquidity(\n publicClient: PublicClient,\n vault: Address,\n shares: bigint,\n): Promise<void> {\n const v = getAddress(vault)\n\n // Need underlying address first\n const underlying = await publicClient.readContract({\n address: v,\n abi: VAULT_ABI,\n functionName: 'asset',\n })\n\n // Parallel: hub liquid balance + estimated assets for these shares\n const [hubLiquid, assetsNeeded] = await Promise.all([\n publicClient.readContract({\n address: getAddress(underlying as Address),\n abi: ERC20_ABI,\n functionName: 'balanceOf',\n args: [v],\n }),\n publicClient.readContract({\n address: v,\n abi: VAULT_ABI,\n functionName: 'convertToAssets',\n args: [shares],\n }),\n ])\n\n if ((hubLiquid as bigint) < (assetsNeeded as bigint)) {\n throw new Error(\n `[MoreVaults] Insufficient hub liquidity for redeem.\\n` +\n ` Hub liquid balance : ${hubLiquid}\\n` +\n ` Estimated required : ${assetsNeeded}\\n` +\n `Submitting this redeem will waste the LayerZero fee — the request will be auto-refunded.\\n` +\n `Ask the vault curator to repatriate liquidity from spoke chains first.`,\n )\n }\n}\n\n/**\n * Pre-flight checks for synchronous deposit flows (D1 / D3).\n *\n * Validates that:\n * 1. The vault is not paused.\n * 2. The vault still has deposit capacity (maxDeposit > 0).\n *\n * Both reads are executed in parallel.\n *\n * @param publicClient Public client for contract reads\n * @param vault Vault address (diamond proxy)\n */\nexport async function preflightSync(\n publicClient: PublicClient,\n vault: Address,\n): Promise<void> {\n const v = getAddress(vault)\n\n // Run paused and maxDeposit in parallel.\n // maxDeposit(address(0)) may REVERT on whitelisted vaults — catch separately.\n const [isPaused, depositCapResult] = await Promise.all([\n publicClient.readContract({\n address: v,\n abi: CONFIG_ABI,\n functionName: 'paused',\n }),\n publicClient\n .readContract({\n address: v,\n abi: CONFIG_ABI,\n functionName: 'maxDeposit',\n args: [zeroAddress],\n })\n .catch(() => null as null),\n ])\n\n if (isPaused) {\n throw new Error(\n `[MoreVaults] Vault ${vault} is paused. Cannot perform any actions.`,\n )\n }\n\n // null means maxDeposit reverted → whitelist vault — skip capacity check\n // (the user may still be whitelisted; canDeposit will do user-specific check)\n if (depositCapResult !== null && depositCapResult === 0n) {\n throw new Error(\n `[MoreVaults] Vault ${vault} has reached deposit capacity. No more deposits accepted.`,\n )\n }\n}\n","import type { WalletClient } from 'viem'\nimport { WrongChainError } from './errors'\n\n/**\n * Validate that the walletClient is connected to the expected chain.\n * Only validates if hubChainId is provided — opt-in, non-breaking.\n */\nexport function validateWalletChain(walletClient: WalletClient, hubChainId?: number): void {\n if (!hubChainId) return\n const current = walletClient.chain?.id\n if (current !== undefined && current !== hubChainId) {\n throw new WrongChainError(current, hubChainId)\n }\n}\n","import {\n type Address,\n type PublicClient,\n type WalletClient,\n encodeAbiParameters,\n getAddress,\n} from 'viem'\nimport { VAULT_ABI, BRIDGE_ABI, ERC20_ABI } from './abis'\nimport type {\n VaultAddresses,\n DepositResult,\n AsyncRequestResult,\n} from './types'\nimport { ActionType } from './types'\nimport { ensureAllowance, getVaultStatus, quoteLzFee } from './utils'\nimport { preflightSync, preflightAsync } from './preflight'\nimport { MissingEscrowAddressError, VaultPausedError, CapacityFullError } from './errors'\nimport { validateWalletChain } from './chainValidation'\n\n/**\n * D1 / D3 — Simple deposit (ERC-4626 standard).\n *\n * Works for both local vaults and cross-chain hubs with oracle accounting ON.\n * When oracle accounting is enabled the cross-chain accounting is transparent\n * to the caller — the vault resolves totalAssets synchronously.\n *\n * **User transactions**: 1 approve (skipped if allowance sufficient) + 1 deposit.\n *\n * @param walletClient Wallet client with account attached\n * @param publicClient Public client for reads and simulation\n * @param addresses Vault address set (only `vault` is used)\n * @param assets Amount of underlying token to deposit (in token decimals)\n * @param receiver Address that will receive the minted vault shares\n * @returns Transaction hash and amount of shares minted\n */\nexport async function depositSimple(\n walletClient: WalletClient,\n publicClient: PublicClient,\n addresses: VaultAddresses,\n assets: bigint,\n receiver: Address,\n): Promise<DepositResult> {\n const account = walletClient.account!\n const vault = getAddress(addresses.vault)\n\n // Validate wallet is on the correct chain (opt-in via hubChainId)\n validateWalletChain(walletClient, addresses.hubChainId)\n\n // Pre-flight: validate vault is operational and accepting deposits\n await preflightSync(publicClient, vault)\n\n // Resolve underlying asset\n const underlying = await publicClient.readContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'asset',\n })\n\n // Approve vault if needed\n await ensureAllowance(walletClient, publicClient, underlying, vault, assets)\n\n // Simulate then send\n const { result: shares } = await publicClient.simulateContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'deposit',\n args: [assets, getAddress(receiver)],\n account: account.address,\n })\n\n const txHash = await walletClient.writeContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'deposit',\n args: [assets, getAddress(receiver)],\n account,\n chain: walletClient.chain,\n })\n\n return { txHash, shares }\n}\n\n/**\n * Alias: D3 — Cross-chain hub deposit when oracle accounting is ON.\n * Exactly the same UX as depositSimple because the vault resolves accounting synchronously.\n */\nexport { depositSimple as depositCrossChainOracleOn }\n\n/**\n * D2 — Multi-asset deposit.\n *\n * Deposits multiple ERC-20 tokens into the vault in a single vault call.\n * The vault converts each token to the underlying via oracle pricing.\n *\n * **User transactions**: N approves (one per token, skipped if sufficient) + 1 deposit.\n *\n * @param walletClient Wallet client with account attached\n * @param publicClient Public client for reads and simulation\n * @param addresses Vault address set (only `vault` is used)\n * @param tokens Array of token addresses to deposit\n * @param amounts Array of amounts (one per token, in each token's decimals)\n * @param receiver Address that will receive the minted vault shares\n * @param minShares Minimum shares to accept (slippage protection)\n * @returns Transaction hash and amount of shares minted\n */\nexport async function depositMultiAsset(\n walletClient: WalletClient,\n publicClient: PublicClient,\n addresses: VaultAddresses,\n tokens: Address[],\n amounts: bigint[],\n receiver: Address,\n minShares: bigint,\n): Promise<DepositResult> {\n const account = walletClient.account!\n const vault = getAddress(addresses.vault)\n\n // Validate wallet is on the correct chain (opt-in via hubChainId)\n validateWalletChain(walletClient, addresses.hubChainId)\n\n // Approve each token\n for (let i = 0; i < tokens.length; i++) {\n await ensureAllowance(walletClient, publicClient, tokens[i], vault, amounts[i])\n }\n\n const { result: shares } = await publicClient.simulateContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'deposit',\n args: [tokens, amounts, getAddress(receiver), minShares],\n account: account.address,\n })\n\n const txHash = await walletClient.writeContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'deposit',\n args: [tokens, amounts, getAddress(receiver), minShares],\n account,\n chain: walletClient.chain,\n })\n\n return { txHash, shares }\n}\n\n/**\n * D4 — Async deposit (cross-chain hub, oracle OFF).\n *\n * Sends assets to the escrow and initiates a cross-chain accounting request via\n * `initVaultActionRequest(DEPOSIT, ...)`. The LZ Read callback will resolve\n * accounting and `executeRequest` will mint shares.\n *\n * **User transactions**: 1 approve (to ESCROW, not vault!) + 1 initVaultActionRequest.\n * **Wait**: Shares arrive after the LZ callback + executeRequest (automated by keeper).\n *\n * @param walletClient Wallet client with account attached\n * @param publicClient Public client for reads and simulation\n * @param addresses Vault address set (`vault` + `escrow` required)\n * @param assets Amount of underlying to deposit\n * @param receiver Address that will receive shares after resolution\n * @param lzFee msg.value for LZ Read fee (quote first with `quoteLzFee`)\n * @param extraOptions Optional LZ extra options bytes (default 0x)\n * @returns Transaction hash and GUID for tracking\n */\nexport async function depositAsync(\n walletClient: WalletClient,\n publicClient: PublicClient,\n addresses: VaultAddresses,\n assets: bigint,\n receiver: Address,\n lzFee: bigint,\n extraOptions: `0x${string}` = '0x',\n): Promise<AsyncRequestResult> {\n const account = walletClient.account!\n const vault = getAddress(addresses.vault)\n if (!addresses.escrow) throw new MissingEscrowAddressError()\n const escrow = getAddress(addresses.escrow)\n\n // Validate wallet is on the correct chain (opt-in via hubChainId)\n validateWalletChain(walletClient, addresses.hubChainId)\n\n // Pre-flight: validate async cross-chain setup before sending any transaction\n await preflightAsync(publicClient, vault, escrow)\n\n // Resolve underlying asset\n const underlying = await publicClient.readContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'asset',\n })\n\n // Approve ESCROW (not vault!) for the deposit amount\n await ensureAllowance(walletClient, publicClient, underlying, escrow, assets)\n\n // Encode parameters only (no selector) — contracts use abi.decode on these bytes\n const actionCallData = encodeAbiParameters(\n [{ type: 'uint256', name: 'assets' }, { type: 'address', name: 'receiver' }],\n [assets, getAddress(receiver)],\n ) as `0x${string}`\n\n const { result: guid } = await publicClient.simulateContract({\n address: vault,\n abi: BRIDGE_ABI,\n functionName: 'initVaultActionRequest',\n args: [ActionType.DEPOSIT, actionCallData, 0n, extraOptions],\n value: lzFee,\n account: account.address,\n })\n\n const txHash = await walletClient.writeContract({\n address: vault,\n abi: BRIDGE_ABI,\n functionName: 'initVaultActionRequest',\n args: [ActionType.DEPOSIT, actionCallData, 0n, extraOptions],\n value: lzFee,\n account,\n chain: walletClient.chain,\n })\n\n return { txHash, guid: guid as `0x${string}` }\n}\n\n/**\n * D5 — Async mint (cross-chain hub, oracle OFF).\n *\n * Mints an exact amount of shares by depositing up to `maxAssets` of underlying.\n * Similar flow to D4 but uses MINT action type.\n *\n * **User transactions**: 1 approve (to ESCROW for maxAssets) + 1 initVaultActionRequest.\n * **Wait**: Shares arrive after the LZ callback + executeRequest.\n *\n * @param walletClient Wallet client with account attached\n * @param publicClient Public client for reads and simulation\n * @param addresses Vault address set (`vault` + `escrow` required)\n * @param shares Exact number of shares to mint\n * @param maxAssets Maximum assets to spend (slippage protection)\n * @param receiver Address that will receive the minted shares\n * @param lzFee msg.value for LZ Read fee\n * @param extraOptions Optional LZ extra options bytes\n * @returns Transaction hash and GUID for tracking\n */\nexport async function mintAsync(\n walletClient: WalletClient,\n publicClient: PublicClient,\n addresses: VaultAddresses,\n shares: bigint,\n maxAssets: bigint,\n receiver: Address,\n lzFee: bigint,\n extraOptions: `0x${string}` = '0x',\n): Promise<AsyncRequestResult> {\n const account = walletClient.account!\n const vault = getAddress(addresses.vault)\n if (!addresses.escrow) throw new MissingEscrowAddressError()\n const escrow = getAddress(addresses.escrow)\n\n // Validate wallet is on the correct chain (opt-in via hubChainId)\n validateWalletChain(walletClient, addresses.hubChainId)\n\n // Pre-flight: validate async cross-chain setup before sending any transaction\n await preflightAsync(publicClient, vault, escrow)\n\n const underlying = await publicClient.readContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'asset',\n })\n\n // Approve ESCROW for maxAssets\n await ensureAllowance(walletClient, publicClient, underlying, escrow, maxAssets)\n\n // Encode parameters only (no selector) — contracts use abi.decode on these bytes\n const actionCallData = encodeAbiParameters(\n [{ type: 'uint256', name: 'shares' }, { type: 'address', name: 'receiver' }],\n [shares, getAddress(receiver)],\n ) as `0x${string}`\n\n // amountLimit = maxAssets (slippage check: actual assets spent must be <= maxAssets)\n const { result: guid } = await publicClient.simulateContract({\n address: vault,\n abi: BRIDGE_ABI,\n functionName: 'initVaultActionRequest',\n args: [ActionType.MINT, actionCallData, maxAssets, extraOptions],\n value: lzFee,\n account: account.address,\n })\n\n const txHash = await walletClient.writeContract({\n address: vault,\n abi: BRIDGE_ABI,\n functionName: 'initVaultActionRequest',\n args: [ActionType.MINT, actionCallData, maxAssets, extraOptions],\n value: lzFee,\n account,\n chain: walletClient.chain,\n })\n\n return { txHash, guid: guid as `0x${string}` }\n}\n\n/**\n * Smart deposit — auto-selects the correct flow based on vault configuration.\n *\n * Calls getVaultStatus internally to determine the vault mode, then dispatches\n * to the appropriate flow:\n * - local / cross-chain-oracle → depositSimple\n * - cross-chain-async → depositAsync (quotes LZ fee automatically)\n *\n * @param walletClient Wallet client with account attached\n * @param publicClient Public client for reads\n * @param addresses Vault address set (`escrow` required for async vaults)\n * @param assets Amount of underlying to deposit\n * @param receiver Address that will receive shares\n * @param extraOptions Optional LZ extra options (only used for async vaults)\n * @returns DepositResult or AsyncRequestResult depending on vault mode\n * @throws VaultPausedError if vault is paused\n * @throws CapacityFullError if vault is full\n */\nexport async function smartDeposit(\n walletClient: WalletClient,\n publicClient: PublicClient,\n addresses: VaultAddresses,\n assets: bigint,\n receiver: Address,\n extraOptions: `0x${string}` = '0x',\n): Promise<DepositResult | AsyncRequestResult> {\n const vault = getAddress(addresses.vault)\n const status = await getVaultStatus(publicClient, vault)\n\n if (status.mode === 'paused') {\n throw new VaultPausedError(vault)\n }\n if (status.mode === 'full') {\n throw new CapacityFullError(vault)\n }\n\n if (status.recommendedDepositFlow === 'depositAsync') {\n const lzFee = await quoteLzFee(publicClient, vault, extraOptions)\n return depositAsync(walletClient, publicClient, addresses, assets, receiver, lzFee, extraOptions)\n }\n\n // local or cross-chain-oracle\n return depositSimple(walletClient, publicClient, addresses, assets, receiver)\n}\n","import {\n type Address,\n type Hash,\n type PublicClient,\n type WalletClient,\n encodeAbiParameters,\n getAddress,\n pad,\n} from 'viem'\nimport { VAULT_ABI, BRIDGE_ABI, OFT_ABI } from './abis'\nimport type {\n VaultAddresses,\n RedeemResult,\n AsyncRequestResult,\n} from './types'\nimport { ActionType } from './types'\nimport { ensureAllowance } from './utils'\nimport { preflightAsync, preflightRedeemLiquidity } from './preflight'\nimport { MissingEscrowAddressError } from './errors'\nimport { validateWalletChain } from './chainValidation'\n\n/**\n * R1 — Simple share redemption (ERC-4626 standard).\n *\n * Burns `shares` and returns the proportional amount of underlying assets.\n * If a withdrawal queue is enabled, the caller must have previously called\n * `requestRedeem` and waited for the timelock to expire.\n *\n * **User transactions**: 1 redeem call.\n *\n * @param walletClient Wallet client with account attached\n * @param publicClient Public client for reads and simulation\n * @param addresses Vault address set (only `vault` is used)\n * @param shares Amount of vault shares to redeem\n * @param receiver Address that will receive the underlying assets\n * @param owner Owner of the shares being redeemed\n * @returns Transaction hash and amount of assets received\n */\nexport async function redeemShares(\n walletClient: WalletClient,\n publicClient: PublicClient,\n addresses: VaultAddresses,\n shares: bigint,\n receiver: Address,\n owner: Address,\n): Promise<RedeemResult> {\n const account = walletClient.account!\n const vault = getAddress(addresses.vault)\n\n // Validate wallet is on the correct chain (opt-in via hubChainId)\n validateWalletChain(walletClient, addresses.hubChainId)\n\n const { result: assets } = await publicClient.simulateContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'redeem',\n args: [shares, getAddress(receiver), getAddress(owner)],\n account: account.address,\n })\n\n const txHash = await walletClient.writeContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'redeem',\n args: [shares, getAddress(receiver), getAddress(owner)],\n account,\n chain: walletClient.chain,\n })\n\n return { txHash, assets }\n}\n\n/**\n * R2 — Withdraw by specifying the exact assets amount.\n *\n * Burns the necessary shares to withdraw exactly `assets` amount of underlying.\n * If a withdrawal queue is enabled, the caller must have previously called\n * `requestWithdraw` and waited for the timelock.\n *\n * **User transactions**: 1 withdraw call.\n *\n * @param walletClient Wallet client with account attached\n * @param publicClient Public client for reads and simulation\n * @param addresses Vault address set (only `vault` is used)\n * @param assets Exact amount of underlying assets to withdraw\n * @param receiver Address that will receive the assets\n * @param owner Owner of the shares being burned\n * @returns Transaction hash and the actual assets withdrawn\n */\nexport async function withdrawAssets(\n walletClient: WalletClient,\n publicClient: PublicClient,\n addresses: VaultAddresses,\n assets: bigint,\n receiver: Address,\n owner: Address,\n): Promise<RedeemResult> {\n const account = walletClient.account!\n const vault = getAddress(addresses.vault)\n\n // Validate wallet is on the correct chain (opt-in via hubChainId)\n validateWalletChain(walletClient, addresses.hubChainId)\n\n const { result: sharesBurned } = await publicClient.simulateContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'withdraw',\n args: [assets, getAddress(receiver), getAddress(owner)],\n account: account.address,\n })\n\n const txHash = await walletClient.writeContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'withdraw',\n args: [assets, getAddress(receiver), getAddress(owner)],\n account,\n chain: walletClient.chain,\n })\n\n // For withdraw, the return is shares burned; assets is what was requested\n return { txHash, assets }\n}\n\n/**\n * R3 / R4 — Request redeem (queue shares for withdrawal).\n *\n * Places `shares` into the withdrawal queue. If a timelock is configured (R4),\n * the user must wait until `timelockEndsAt` before calling `redeemShares`.\n * If no timelock (R3), `redeemShares` can be called immediately after.\n *\n * Use `getWithdrawalRequest` to check the timelock status.\n *\n * **User transactions**: 1 requestRedeem call, then later 1 redeemShares call.\n *\n * @param walletClient Wallet client with account attached\n * @param publicClient Public client for simulation\n * @param addresses Vault address set (only `vault` is used)\n * @param shares Amount of shares to queue for redemption\n * @param owner The address on behalf of which the request is made\n * @returns Transaction hash of the request\n */\nexport async function requestRedeem(\n walletClient: WalletClient,\n publicClient: PublicClient,\n addresses: VaultAddresses,\n shares: bigint,\n owner: Address,\n): Promise<{ txHash: Hash }> {\n const account = walletClient.account!\n const vault = getAddress(addresses.vault)\n\n // Validate wallet is on the correct chain (opt-in via hubChainId)\n validateWalletChain(walletClient, addresses.hubChainId)\n\n await publicClient.simulateContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'requestRedeem',\n args: [shares, getAddress(owner)],\n account: account.address,\n })\n\n const txHash = await walletClient.writeContract({\n address: vault,\n abi: VAULT_ABI,\n functionName: 'requestRedeem',\n args: [shares, getAddress(owner)],\n account,\n chain: walletClient.chain,\n })\n\n return { txHash }\n}\n\n/**\n * Helper — Get the current withdrawal request for an owner.\n *\n * Returns the queued shares and timelock end timestamp.\n * Useful for showing a countdown timer in the UI (R4 flow).\n *\n * @param publicClient Public client for reading state\n * @param vault Vault address\n * @param owner Owner whose request to query\n * @returns Request info or null if no active request\n */\nexport async function getWithdrawalRequest(\n publicClient: PublicClient,\n vault: Address,\n owner: Address,\n): Promise<{ shares: bigint; timelockEndsAt: bigint } | null> {\n const [shares, timelockEndsAt] = await publicClient.readContract({\n address: getAddress(vault),\n abi: VAULT_ABI,\n functionName: 'getWithdrawalRequest',\n args: [getAddress(owner)],\n })\n\n if (shares === 0n) return null\n\n return { shares, timelockEndsAt }\n}\n\n/**\n * R5 — Async redeem (cross-chain hub, oracle OFF).\n *\n * Initiates an async redeem via `initVaultActionRequest(REDEEM, ...)`.\n * Shares are locked in the escrow while the LZ Read resolves accounting.\n * After `executeRequest`, assets are sent to the receiver.\n *\n * **IMPORTANT**: `amountLimit` MUST be 0 for REDEEM actions (not shares).\n * The shares amount is encoded in the actionCallData. Setting amountLimit to\n * a non-zero value would be interpreted as \"max assets to receive\" (inverted\n * slippage check), which is almost never what the user wants.\n *\n * **User transactions**: 1 approve (shares to ESCROW) + 1 initVaultActionRequest.\n * **Wait**: Assets arrive after LZ callback + executeRequest.\n *\n * @param walletClient Wallet client with account attached\n * @param publicClient Public client for reads and simulation\n * @param addresses Vault address set (`vault` + `escrow` required)\n * @param shares Amount of shares to redeem\n * @param receiver Address that will receive the underlying assets\n * @param owner Owner of the shares (must match the initiator)\n * @param lzFee msg.value for LZ Read fee\n * @param extraOptions Optional LZ extra options bytes\n * @returns Transaction hash and GUID for tracking\n */\nexport async function redeemAsync(\n walletClient: WalletClient,\n publicClient: PublicClient,\n addresses: VaultAddresses,\n shares: bigint,\n receiver: Address,\n owner: Address,\n lzFee: bigint,\n extraOptions: `0x${string}` = '0x',\n): Promise<AsyncRequestResult> {\n const account = walletClient.account!\n const vault = getAddress(addresses.vault)\n if (!addresses.escrow) throw new MissingEscrowAddressError()\n const escrow = getAddress(addresses.escrow)\n\n // Validate wallet is on the correct chain (opt-in via hubChainId)\n validateWalletChain(walletClient, addresses.hubChainId)\n\n // Pre-flight: validate async cross-chain setup before sending any transaction\n await preflightAsync(publicClient, vault, escrow)\n\n // Pre-flight: check hub has enough liquid assets — avoids wasting LZ fee on a guaranteed refund\n await preflightRedeemLiquidity(publicClient, vault, shares)\n\n // Approve ESCROW for shares (vault share token is the vault itself for ERC-4626)\n await ensureAllowance(walletClient, publicClient, vault, escrow, shares)\n\n // Encode parameters only (no selector) — contracts use abi.decode on these bytes\n const actionCallData = encodeAbiParameters(\n [{ type: 'uint256', name: 'shares' }, { type: 'address', name: 'receiver' }, { type: 'address', name: 'owner' }],\n [shares, getAddress(receiver), getAddress(owner)],\n ) as `0x${string}`\n\n // amountLimit MUST be 0 for REDEEM — see JSDoc above\n const { result: guid } = await publicClient.simulateContract({\n address: vault,\n abi: BRIDGE_ABI,\n functionName: 'initVaultActionRequest',\n args: [ActionType.REDEEM, actionCallData, 0n, extraOptions],\n value: lzFee,\n account: account.address,\n })\n\n const txHash = await walletClient.writeContract({\n address: vault,\n abi: BRIDGE_ABI,\n functionName: 'initVaultActionRequest',\n args: [ActionType.REDEEM, actionCallData, 0n, extraOptions],\n value: lzFee,\n account,\n chain: walletClient.chain,\n })\n\n return { txHash, guid: guid as `0x${string}` }\n}\n\n/**\n * R6 — Bridge shares from spoke to hub chain via OFT.\n *\n * This is step 1 of a 2-step spoke redeem flow:\n * 1. `bridgeSharesToHub()` — send shares from spoke to hub via OFT\n * 2. `redeemShares()` — call redeem on the hub vault (after shares arrive)\n *\n * The two steps happen on different chains and cannot be combined into a single\n * SDK call. The frontend must switch chains between steps.\n *\n * **User transactions on spoke chain**: 1 approve (shares to shareOFT) + 1 OFT.send().\n * **Gas**: Requires native token on spoke for LZ fees, and gas on hub for step 2.\n *\n * @param walletClient Wallet client on the SPOKE chain\n * @param publicClient Public client on the SPOKE chain\n * @param shareOFT OFTAdapter address for vault shares on the spoke chain\n * @param hubChainEid LayerZero Endpoint ID for the hub chain (Flow EVM = 30332)\n * @param shares Amount of vault shares to bridge\n * @param receiver Receiver address on the HUB chain\n * @param lzFee msg.value for OFT send (quote via OFT.quoteSend)\n * @returns Transaction hash of the OFT.send() call\n */\nexport async function bridgeSharesToHub(\n walletClient: WalletClient,\n publicClient: PublicClient,\n shareOFT: Address,\n hubChainEid: number,\n shares: bigint,\n receiver: Address,\n lzFee: bigint,\n): Promise<{ txHash: Hash }> {\n const account = walletClient.account!\n const oft = getAddress(shareOFT)\n\n // Approve OFT for share transfer\n await ensureAllowance(walletClient, publicClient, oft, oft, shares)\n\n const toBytes32 = pad(getAddress(receiver), { size: 32 })\n\n const sendParam = {\n dstEid: hubChainEid,\n to: toBytes32,\n amountLD: shares,\n minAmountLD: shares, // shares should bridge 1:1\n extraOptions: '0x' as `0x${string}`,\n composeMsg: '0x' as `0x${string}`,\n oftCmd: '0x' as `0x${string}`,\n }\n\n const fee = {\n nativeFee: lzFee,\n lzTokenFee: 0n,\n }\n\n const txHash = await walletClient.writeContract({\n address: oft,\n abi: OFT_ABI,\n functionName: 'send',\n args: [sendParam, fee, account.address],\n value: lzFee,\n account,\n chain: walletClient.chain,\n })\n\n return { txHash }\n}\n","import { type Address, type PublicClient, getAddress } from 'viem'\nimport { BRIDGE_ABI, CONFIG_ABI, ERC20_ABI, VAULT_ABI, METADATA_ABI } from './abis'\nimport type { CrossChainRequestInfo } from './types'\nimport { getVaultStatus } from './utils'\nimport type { VaultStatus } from './utils'\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface UserPosition {\n /** Vault share balance */\n shares: bigint\n /** convertToAssets(shares) — what they'd get if they redeemed now */\n estimatedAssets: bigint\n /** Price of 1 full share in underlying (convertToAssets(10n ** decimals)) */\n sharePrice: bigint\n /** Vault decimals (for display) */\n decimals: number\n pendingWithdrawal: {\n shares: bigint\n timelockEndsAt: bigint\n /** block.timestamp >= timelockEndsAt (or timelockEndsAt === 0n) */\n canRedeemNow: boolean\n } | null // null if no pending withdrawal request\n}\n\n/**\n * Read the user's current position in the vault.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address (diamond proxy)\n * @param user User wallet address\n * @returns Full user position snapshot\n */\nexport async function getUserPosition(\n publicClient: PublicClient,\n vault: Address,\n user: Address,\n): Promise<UserPosition> {\n const v = getAddress(vault)\n const u = getAddress(user)\n\n // First batch: balance, decimals, withdrawal request — via multicall\n const [sharesResult, decimalsResult, withdrawalRequestResult] = await publicClient.multicall({\n contracts: [\n { address: v, abi: VAULT_ABI, functionName: 'balanceOf', args: [u] },\n { address: v, abi: METADATA_ABI, functionName: 'decimals' },\n { address: v, abi: VAULT_ABI, functionName: 'getWithdrawalRequest', args: [u] },\n ],\n allowFailure: false,\n })\n const block = await publicClient.getBlock()\n const shares = sharesResult\n const decimals = decimalsResult\n const withdrawalRequest = withdrawalRequestResult\n\n const [withdrawShares, timelockEndsAt] = withdrawalRequest as unknown as [bigint, bigint]\n\n // Second batch: convertToAssets calls (need shares and decimals from first batch)\n const oneShare = 10n ** BigInt(decimals)\n const [estimatedAssets, sharePrice] = await Promise.all([\n shares === 0n\n ? Promise.resolve(0n)\n : publicClient.readContract({ address: v, abi: VAULT_ABI, functionName: 'convertToAssets', args: [shares] }),\n publicClient.readContract({ address: v, abi: VAULT_ABI, functionName: 'convertToAssets', args: [oneShare] }),\n ])\n\n const currentTimestamp = block.timestamp\n\n const pendingWithdrawal =\n withdrawShares === 0n\n ? null\n : {\n shares: withdrawShares,\n timelockEndsAt,\n canRedeemNow: timelockEndsAt === 0n || currentTimestamp >= timelockEndsAt,\n }\n\n return {\n shares,\n estimatedAssets,\n sharePrice,\n decimals,\n pendingWithdrawal,\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Preview how many shares a given asset amount would mint.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address\n * @param assets Amount of underlying tokens to deposit\n * @returns Estimated shares to be minted\n */\nexport async function previewDeposit(\n publicClient: PublicClient,\n vault: Address,\n assets: bigint,\n): Promise<bigint> {\n return publicClient.readContract({\n address: getAddress(vault),\n abi: VAULT_ABI,\n functionName: 'previewDeposit',\n args: [assets],\n })\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Preview how many underlying assets a given share amount would redeem.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address\n * @param shares Amount of vault shares to redeem\n * @returns Estimated assets to be returned\n */\nexport async function previewRedeem(\n publicClient: PublicClient,\n vault: Address,\n shares: bigint,\n): Promise<bigint> {\n return publicClient.readContract({\n address: getAddress(vault),\n abi: VAULT_ABI,\n functionName: 'previewRedeem',\n args: [shares],\n })\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type DepositBlockReason = 'paused' | 'capacity-full' | 'not-whitelisted' | 'ok'\n\nexport interface DepositEligibility {\n allowed: boolean\n reason: DepositBlockReason\n}\n\n/**\n * Check whether a user is eligible to deposit into the vault right now.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address\n * @param user User wallet address\n * @returns Eligibility result with reason\n */\nexport async function canDeposit(\n publicClient: PublicClient,\n vault: Address,\n user: Address,\n): Promise<DepositEligibility> {\n const v = getAddress(vault)\n\n const isPaused = await publicClient.readContract({\n address: v,\n abi: CONFIG_ABI,\n functionName: 'paused',\n })\n\n if (isPaused) {\n return { allowed: false, reason: 'paused' }\n }\n\n // maxDeposit(user) can REVERT on vaults with whitelist/ACL\n let maxDepositAmount: bigint\n try {\n maxDepositAmount = await publicClient.readContract({\n address: v,\n abi: CONFIG_ABI,\n functionName: 'maxDeposit',\n args: [getAddress(user)],\n })\n } catch {\n // Revert means the vault has whitelist/ACL and this user is not approved\n return { allowed: false, reason: 'not-whitelisted' }\n }\n\n if (maxDepositAmount === 0n) {\n return { allowed: false, reason: 'capacity-full' }\n }\n return { allowed: true, reason: 'ok' }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface VaultMetadata {\n name: string\n symbol: string\n decimals: number\n underlying: Address\n underlyingSymbol: string\n underlyingDecimals: number\n}\n\n/**\n * Read display metadata for a vault and its underlying token.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address\n * @returns Vault and underlying token metadata\n */\nexport async function getVaultMetadata(\n publicClient: PublicClient,\n vault: Address,\n): Promise<VaultMetadata> {\n const v = getAddress(vault)\n\n // Batch 1: vault name, symbol, decimals, underlying — 1 eth_call via multicall\n const b1 = await publicClient.multicall({\n contracts: [\n { address: v, abi: METADATA_ABI, functionName: 'name' },\n { address: v, abi: METADATA_ABI, functionName: 'symbol' },\n { address: v, abi: METADATA_ABI, functionName: 'decimals' },\n { address: v, abi: VAULT_ABI, functionName: 'asset' },\n ] as const,\n allowFailure: false,\n })\n\n const [name, symbol, decimals, underlying] = b1\n const underlyingAddr = getAddress(underlying as Address)\n\n // Batch 2: underlying symbol + decimals — 1 eth_call via multicall\n const b2 = await publicClient.multicall({\n contracts: [\n { address: underlyingAddr, abi: METADATA_ABI, functionName: 'symbol' },\n { address: underlyingAddr, abi: METADATA_ABI, functionName: 'decimals' },\n ] as const,\n allowFailure: false,\n })\n\n const [underlyingSymbol, underlyingDecimals] = b2\n\n return {\n name,\n symbol,\n decimals,\n underlying: underlyingAddr,\n underlyingSymbol,\n underlyingDecimals,\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type AsyncRequestStatus = 'pending' | 'ready-to-execute' | 'completed' | 'refunded'\n\nexport interface AsyncRequestStatusInfo {\n status: AsyncRequestStatus\n /** Human-readable description */\n label: string\n /** Shares minted or assets returned (0 if still pending) */\n result: bigint\n}\n\n/**\n * Get the human-readable status of an async cross-chain request.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address\n * @param guid Request GUID returned by depositAsync / mintAsync / redeemAsync\n * @returns Status info with label and result\n */\nexport async function getAsyncRequestStatusLabel(\n publicClient: PublicClient,\n vault: Address,\n guid: `0x${string}`,\n): Promise<AsyncRequestStatusInfo> {\n const v = getAddress(vault)\n\n const [info, finalizationResult] = await Promise.all([\n publicClient.readContract({\n address: v,\n abi: BRIDGE_ABI,\n functionName: 'getRequestInfo',\n args: [guid],\n }) as Promise<CrossChainRequestInfo>,\n publicClient.readContract({\n address: v,\n abi: BRIDGE_ABI,\n functionName: 'getFinalizationResult',\n args: [guid],\n }),\n ])\n\n if (info.refunded) {\n return {\n status: 'refunded',\n label: 'Request refunded — tokens returned to initiator',\n result: 0n,\n }\n }\n if (info.finalized) {\n return {\n status: 'completed',\n label: 'Completed',\n result: finalizationResult,\n }\n }\n if (info.fulfilled) {\n return {\n status: 'ready-to-execute',\n label: 'Oracle responded — ready to execute',\n result: 0n,\n }\n }\n return {\n status: 'pending',\n label: 'Waiting for cross-chain oracle response...',\n result: 0n,\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface UserBalances {\n /** Vault shares the user holds */\n shareBalance: bigint\n /** Underlying token balance in wallet (for deposit input) */\n underlyingBalance: bigint\n /** convertToAssets(shareBalance) — vault position value */\n estimatedAssets: bigint\n}\n\n/**\n * Read the user's token balances relevant to a vault.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address\n * @param user User wallet address\n * @returns Share balance, underlying wallet balance, and estimated assets\n */\nexport async function getUserBalances(\n publicClient: PublicClient,\n vault: Address,\n user: Address,\n): Promise<UserBalances> {\n const v = getAddress(vault)\n const u = getAddress(user)\n\n // Batch 1: get underlying address, share balance, decimals\n const [shareBalance, , underlying] = await publicClient.multicall({\n contracts: [\n { address: v, abi: VAULT_ABI, functionName: 'balanceOf', args: [u] },\n { address: v, abi: METADATA_ABI, functionName: 'decimals' },\n { address: v, abi: VAULT_ABI, functionName: 'asset' },\n ],\n allowFailure: false,\n })\n\n const underlyingAddr = getAddress(underlying)\n\n // Batch 2: underlying balance + estimated assets (skip convertToAssets if no shares)\n const [underlyingBalance, estimatedAssets] = await Promise.all([\n publicClient.readContract({\n address: underlyingAddr,\n abi: ERC20_ABI,\n functionName: 'balanceOf',\n args: [u],\n }),\n shareBalance === 0n\n ? Promise.resolve(0n)\n : publicClient.readContract({\n address: v,\n abi: VAULT_ABI,\n functionName: 'convertToAssets',\n args: [shareBalance],\n }),\n ])\n\n return {\n shareBalance,\n underlyingBalance,\n estimatedAssets,\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface MaxWithdrawable {\n /** How many shares can be redeemed right now */\n shares: bigint\n /** How many underlying assets that corresponds to */\n assets: bigint\n}\n\n/**\n * Calculate the maximum amount a user can withdraw from a vault right now.\n *\n * For hub vaults without oracle accounting, this is limited by hub liquidity.\n * For local and oracle vaults, all assets are immediately redeemable.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address\n * @param user User wallet address\n * @returns Maximum withdrawable shares and assets\n */\nexport async function getMaxWithdrawable(\n publicClient: PublicClient,\n vault: Address,\n user: Address,\n): Promise<MaxWithdrawable> {\n const v = getAddress(vault)\n const u = getAddress(user)\n\n // Batch 1: isHub, oraclesCrossChainAccounting, user share balance, underlying address\n const [isHub, oraclesEnabled, userShares, underlying] = await publicClient.multicall({\n contracts: [\n { address: v, abi: CONFIG_ABI, functionName: 'isHub' },\n { address: v, abi: BRIDGE_ABI, functionName: 'oraclesCrossChainAccounting' },\n { address: v, abi: VAULT_ABI, functionName: 'balanceOf', args: [u] },\n { address: v, abi: VAULT_ABI, functionName: 'asset' },\n ],\n allowFailure: false,\n })\n\n if (userShares === 0n) {\n return { shares: 0n, assets: 0n }\n }\n\n const underlyingAddr = getAddress(underlying)\n\n // Batch 2: estimated assets for user shares + hub liquid balance\n const [estimatedAssets, hubLiquidBalance] = await Promise.all([\n publicClient.readContract({\n address: v,\n abi: VAULT_ABI,\n functionName: 'convertToAssets',\n args: [userShares],\n }),\n publicClient.readContract({\n address: underlyingAddr,\n abi: ERC20_ABI,\n functionName: 'balanceOf',\n args: [v],\n }),\n ])\n\n let maxAssets: bigint\n if (isHub && !oraclesEnabled) {\n // Hub vault: limited by hub liquidity\n maxAssets = estimatedAssets < hubLiquidBalance ? estimatedAssets : hubLiquidBalance\n } else {\n // Local or oracle vault: all assets redeemable\n maxAssets = estimatedAssets\n }\n\n // Convert back to shares if limited by hub liquidity\n let maxShares: bigint\n if (maxAssets < estimatedAssets) {\n maxShares = await publicClient.readContract({\n address: v,\n abi: VAULT_ABI,\n functionName: 'convertToShares',\n args: [maxAssets],\n })\n } else {\n maxShares = userShares\n }\n\n return {\n shares: maxShares,\n assets: maxAssets,\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type VaultSummary = VaultStatus & VaultMetadata\n\n/**\n * Get a combined snapshot of vault status and metadata in one call.\n *\n * @param publicClient Public client for reads\n * @param vault Vault address\n * @returns Merged VaultStatus and VaultMetadata\n */\nexport async function getVaultSummary(\n publicClient: PublicClient,\n vault: Address,\n): Promise<VaultSummary> {\n const [status, metadata] = await Promise.all([\n getVaultStatus(publicClient, vault),\n getVaultMetadata(publicClient, vault),\n ])\n return { ...status, ...metadata }\n}\n","import type { PublicClient } from 'viem'\n\n/**\n * Cast a wagmi PublicClient to the SDK's expected type.\n * Use this in React components to avoid `as any` casts:\n * ```ts\n * import { usePublicClient } from 'wagmi'\n * import { asSdkClient } from '@oydual31/more-vaults-sdk/viem'\n * const pc = asSdkClient(usePublicClient())\n * ```\n * wagmi v2 uses viem as a peer dependency, so the types are structurally\n * identical — this function validates the client is non-null and applies\n * a documented cast instead of an opaque `as any`.\n */\nexport function asSdkClient(client: unknown): PublicClient {\n if (!client) throw new Error('[MoreVaults] No public client available. Make sure wagmi is configured correctly.')\n return client as PublicClient\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { usePublicClient } from 'wagmi'\nimport { asSdkClient, getVaultStatus } from '../viem/index.js'\nimport type { VaultStatus } from '../viem/index.js'\n\nexport type { VaultStatus }\n\ninterface UseVaultStatusOptions {\n /** Refetch interval in ms. Default: 30_000 (30s) */\n refetchInterval?: number\n}\n\n/**\n * Read the full vault status snapshot.\n * Automatically refetches on a configurable interval.\n *\n * @example\n * const { data: status, isLoading } = useVaultStatus('0xVAULT', 747)\n * if (status?.mode === 'cross-chain-async') { ... }\n */\nexport function useVaultStatus(\n vault: `0x${string}` | undefined,\n chainId: number,\n options?: UseVaultStatusOptions,\n) {\n const publicClient = usePublicClient({ chainId })\n return useQuery({\n queryKey: ['vaultStatus', vault, chainId],\n queryFn: () => getVaultStatus(asSdkClient(publicClient), vault!),\n enabled: !!vault && !!publicClient,\n refetchInterval: options?.refetchInterval ?? 30_000,\n staleTime: 15_000,\n })\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { usePublicClient } from 'wagmi'\nimport { asSdkClient, getVaultMetadata } from '../viem/index.js'\nimport type { VaultMetadata } from '../viem/index.js'\n\nexport type { VaultMetadata }\n\n/**\n * Read display metadata for a vault and its underlying token.\n * Uses a long stale time (5 min) because metadata rarely changes.\n *\n * @example\n * const { data: meta } = useVaultMetadata('0xVAULT', 747)\n * // meta.name, meta.symbol, meta.underlying, meta.underlyingSymbol\n */\nexport function useVaultMetadata(\n vault: `0x${string}` | undefined,\n chainId: number,\n) {\n const publicClient = usePublicClient({ chainId })\n return useQuery({\n queryKey: ['vaultMetadata', vault, chainId],\n queryFn: () => getVaultMetadata(asSdkClient(publicClient), vault!),\n enabled: !!vault && !!publicClient,\n // Metadata (name, symbol, underlying) changes very rarely — 5 min stale time\n staleTime: 5 * 60_000,\n refetchInterval: 5 * 60_000,\n })\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { usePublicClient } from 'wagmi'\nimport { asSdkClient, getUserPosition } from '../viem/index.js'\nimport type { UserPosition } from '../viem/index.js'\n\nexport type { UserPosition }\n\n/**\n * Read the user's current position in a vault.\n * Refetches every 15s to keep the balance display current.\n *\n * @example\n * const { data: position } = useUserPosition('0xVAULT', '0xUSER', 747)\n * // position.shares, position.estimatedAssets, position.pendingWithdrawal\n */\nexport function useUserPosition(\n vault: `0x${string}` | undefined,\n user: `0x${string}` | undefined,\n chainId: number,\n) {\n const publicClient = usePublicClient({ chainId })\n return useQuery({\n queryKey: ['userPosition', vault, user, chainId],\n queryFn: () => getUserPosition(asSdkClient(publicClient), vault!, user!),\n enabled: !!vault && !!user && !!publicClient,\n refetchInterval: 15_000,\n staleTime: 10_000,\n })\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { usePublicClient } from 'wagmi'\nimport { asSdkClient, quoteLzFee } from '../viem/index.js'\n\n/**\n * Quote the LayerZero fee required for async operations (D4, D5, R5).\n * Refreshes every 60s — fees change with network congestion.\n *\n * @example\n * const { fee, feeWithBuffer } = useLzFee('0xVAULT', 747)\n * // feeWithBuffer adds 1% buffer automatically (fee * 101 / 100)\n */\nexport function useLzFee(vault: `0x${string}` | undefined, chainId: number) {\n const publicClient = usePublicClient({ chainId })\n const query = useQuery({\n queryKey: ['lzFee', vault, chainId],\n queryFn: () => quoteLzFee(asSdkClient(publicClient), vault!),\n enabled: !!vault && !!publicClient,\n refetchInterval: 60_000,\n staleTime: 30_000,\n })\n return {\n ...query,\n fee: query.data,\n feeWithBuffer: query.data ? (query.data * 101n) / 100n : undefined,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { usePublicClient } from 'wagmi'\nimport { asSdkClient, getAsyncRequestStatusLabel } from '../viem/index.js'\nimport type { AsyncRequestStatusInfo } from '../viem/index.js'\n\nexport type { AsyncRequestStatusInfo }\n\n/**\n * Poll the status of an async cross-chain request (D4/D5/R5) by GUID.\n *\n * Automatically stops polling when status reaches 'completed' or 'refunded'.\n * Polls every 10s while the request is still pending or ready-to-execute.\n *\n * @example\n * const { data } = useAsyncRequestStatus('0xVAULT', guid, 747)\n * // data.status: 'pending' | 'ready-to-execute' | 'completed' | 'refunded'\n * // data.label: human-readable description\n * // data.result: shares minted or assets returned (0n while pending)\n */\nexport function useAsyncRequestStatus(\n vault: `0x${string}` | undefined,\n guid: `0x${string}` | undefined,\n chainId: number,\n) {\n const publicClient = usePublicClient({ chainId })\n return useQuery<AsyncRequestStatusInfo>({\n queryKey: ['asyncRequestStatus', vault, guid, chainId],\n queryFn: () => getAsyncRequestStatusLabel(asSdkClient(publicClient), vault!, guid!),\n enabled: !!vault && !!guid && !!publicClient,\n refetchInterval: (query) => {\n const status = query.state.data?.status\n if (status === 'completed' || status === 'refunded') return false\n return 10_000\n },\n })\n}\n","import { useState, useCallback } from 'react'\nimport { usePublicClient, useWalletClient, useChainId } from 'wagmi'\nimport {\n asSdkClient,\n depositAsync,\n getVaultStatus,\n} from '../viem/index.js'\nimport type { AsyncRequestStatusInfo } from '../viem/index.js'\nimport { useLzFee } from './useLzFee.js'\nimport { useAsyncRequestStatus } from './useAsyncRequestStatus.js'\n\ninterface UseOmniDepositReturn {\n /** Execute approve + depositAsync. Handles everything internally. */\n deposit: (amountInWei: bigint, receiver: `0x${string}`) => Promise<void>\n isLoading: boolean\n txHash: `0x${string}` | undefined\n /** GUID for cross-chain tracking. Available after tx confirmation. */\n guid: `0x${string}` | undefined\n /** Cross-chain request status. undefined until a guid is available. */\n requestStatus: AsyncRequestStatusInfo | undefined\n /** true when the wallet is connected to the wrong chain */\n wrongChain: boolean\n error: Error | undefined\n reset: () => void\n}\n\n/**\n * Complete hook for async deposits on hub vaults (D4 flow).\n *\n * Handles: fee quote, chain validation, approve, depositAsync, and GUID polling.\n * The deposit function wraps the entire flow — callers only pass amount + receiver.\n *\n * @example\n * const { deposit, isLoading, guid, requestStatus, wrongChain } = useOmniDeposit('0xVAULT', 747)\n *\n * if (wrongChain) return <SwitchNetworkButton chainId={747} />\n *\n * await deposit(parseUnits('100', 6), userAddress)\n * // requestStatus.status goes: 'pending' → 'completed' | 'refunded'\n */\nexport function useOmniDeposit(\n vault: `0x${string}` | undefined,\n hubChainId: number,\n): UseOmniDepositReturn {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { data: walletClient } = useWalletClient({ chainId: hubChainId })\n const publicClient = usePublicClient({ chainId: hubChainId })\n const currentChainId = useChainId()\n\n const [isLoading, setIsLoading] = useState(false)\n const [txHash, setTxHash] = useState<`0x${string}` | undefined>()\n const [guid, setGuid] = useState<`0x${string}` | undefined>()\n const [error, setError] = useState<Error | undefined>()\n\n const { feeWithBuffer } = useLzFee(vault, hubChainId)\n const { data: requestStatus } = useAsyncRequestStatus(vault, guid, hubChainId)\n\n const wrongChain = currentChainId !== hubChainId\n\n const deposit = useCallback(\n async (amountInWei: bigint, receiver: `0x${string}`) => {\n if (!vault || !walletClient || !publicClient || !feeWithBuffer) return\n setIsLoading(true)\n setError(undefined)\n try {\n const pc = asSdkClient(publicClient)\n const status = await getVaultStatus(pc, vault)\n // walletClient from wagmi is structurally compatible with viem WalletClient\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await depositAsync(\n walletClient as any,\n pc,\n { vault, escrow: status.escrow, hubChainId },\n amountInWei,\n receiver,\n feeWithBuffer,\n )\n setTxHash(result.txHash)\n setGuid(result.guid)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n } finally {\n setIsLoading(false)\n }\n },\n [vault, walletClient, publicClient, feeWithBuffer, hubChainId],\n )\n\n const reset = useCallback(() => {\n setTxHash(undefined)\n setGuid(undefined)\n setError(undefined)\n setIsLoading(false)\n }, [])\n\n return { deposit, isLoading, txHash, guid, requestStatus, wrongChain, error, reset }\n}\n","import { useState, useCallback } from 'react'\nimport { usePublicClient, useWalletClient, useChainId } from 'wagmi'\nimport {\n asSdkClient,\n redeemAsync,\n getVaultStatus,\n} from '../viem/index.js'\nimport type { AsyncRequestStatusInfo } from '../viem/index.js'\nimport { useLzFee } from './useLzFee.js'\nimport { useAsyncRequestStatus } from './useAsyncRequestStatus.js'\n\ninterface UseOmniRedeemReturn {\n /** Execute approve + redeemAsync. Handles everything internally. */\n redeem: (sharesInWei: bigint, receiver: `0x${string}`, owner: `0x${string}`) => Promise<void>\n isLoading: boolean\n txHash: `0x${string}` | undefined\n /** GUID for cross-chain tracking. Available after tx confirmation. */\n guid: `0x${string}` | undefined\n /** Cross-chain request status. undefined until a guid is available. */\n requestStatus: AsyncRequestStatusInfo | undefined\n /** true when the wallet is connected to the wrong chain */\n wrongChain: boolean\n error: Error | undefined\n reset: () => void\n}\n\n/**\n * Complete hook for async redeems on hub vaults (R5 flow).\n *\n * Handles: fee quote, chain validation, share approve, redeemAsync, and GUID polling.\n *\n * @example\n * const { redeem, isLoading, guid, requestStatus, wrongChain } = useOmniRedeem('0xVAULT', 747)\n *\n * if (wrongChain) return <SwitchNetworkButton chainId={747} />\n *\n * await redeem(sharesInWei, userAddress, userAddress)\n * // requestStatus.status goes: 'pending' → 'completed' | 'refunded'\n */\nexport function useOmniRedeem(\n vault: `0x${string}` | undefined,\n hubChainId: number,\n): UseOmniRedeemReturn {\n const { data: walletClient } = useWalletClient({ chainId: hubChainId })\n const publicClient = usePublicClient({ chainId: hubChainId })\n const currentChainId = useChainId()\n\n const [isLoading, setIsLoading] = useState(false)\n const [txHash, setTxHash] = useState<`0x${string}` | undefined>()\n const [guid, setGuid] = useState<`0x${string}` | undefined>()\n const [error, setError] = useState<Error | undefined>()\n\n const { feeWithBuffer } = useLzFee(vault, hubChainId)\n const { data: requestStatus } = useAsyncRequestStatus(vault, guid, hubChainId)\n\n const wrongChain = currentChainId !== hubChainId\n\n const redeem = useCallback(\n async (sharesInWei: bigint, receiver: `0x${string}`, owner: `0x${string}`) => {\n if (!vault || !walletClient || !publicClient || !feeWithBuffer) return\n setIsLoading(true)\n setError(undefined)\n try {\n const pc = asSdkClient(publicClient)\n const status = await getVaultStatus(pc, vault)\n // walletClient from wagmi is structurally compatible with viem WalletClient\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await redeemAsync(\n walletClient as any,\n pc,\n { vault, escrow: status.escrow, hubChainId },\n sharesInWei,\n receiver,\n owner,\n feeWithBuffer,\n )\n setTxHash(result.txHash)\n setGuid(result.guid)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n } finally {\n setIsLoading(false)\n }\n },\n [vault, walletClient, publicClient, feeWithBuffer, hubChainId],\n )\n\n const reset = useCallback(() => {\n setTxHash(undefined)\n setGuid(undefined)\n setError(undefined)\n setIsLoading(false)\n }, [])\n\n return { redeem, isLoading, txHash, guid, requestStatus, wrongChain, error, reset }\n}\n","import { useState, useCallback } from 'react'\nimport { usePublicClient, useWalletClient } from 'wagmi'\nimport { asSdkClient, depositSimple } from '../viem/index.js'\nimport type { DepositResult } from '../viem/index.js'\n\ninterface UseDepositSimpleReturn {\n /** Execute approve + depositSimple (D1/D3 flows). */\n deposit: (amountInWei: bigint, receiver: `0x${string}`) => Promise<void>\n isLoading: boolean\n txHash: `0x${string}` | undefined\n /** Shares minted. Available after tx confirmation. */\n shares: bigint | undefined\n error: Error | undefined\n reset: () => void\n}\n\n/**\n * Hook for local and oracle-on cross-chain vaults (D1/D3 flows).\n *\n * Simpler than useOmniDeposit — no LZ fee, no GUID, no polling.\n * One approve + one deposit transaction.\n *\n * @example\n * const { deposit, isLoading, txHash, shares } = useDepositSimple('0xVAULT', 747)\n * await deposit(parseUnits('100', 6), userAddress)\n */\nexport function useDepositSimple(\n vault: `0x${string}` | undefined,\n chainId: number,\n): UseDepositSimpleReturn {\n const { data: walletClient } = useWalletClient({ chainId })\n const publicClient = usePublicClient({ chainId })\n\n const [isLoading, setIsLoading] = useState(false)\n const [result, setResult] = useState<DepositResult | undefined>()\n const [error, setError] = useState<Error | undefined>()\n\n const deposit = useCallback(\n async (amountInWei: bigint, receiver: `0x${string}`) => {\n if (!vault || !walletClient || !publicClient) return\n setIsLoading(true)\n setError(undefined)\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const res = await depositSimple(\n walletClient as any,\n asSdkClient(publicClient),\n { vault, hubChainId: chainId },\n amountInWei,\n receiver,\n )\n setResult(res)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n } finally {\n setIsLoading(false)\n }\n },\n [vault, walletClient, publicClient, chainId],\n )\n\n const reset = useCallback(() => {\n setResult(undefined)\n setError(undefined)\n setIsLoading(false)\n }, [])\n\n return {\n deposit,\n isLoading,\n txHash: result?.txHash,\n shares: result?.shares,\n error,\n reset,\n }\n}\n","import { useState, useCallback } from 'react'\nimport { usePublicClient, useWalletClient } from 'wagmi'\nimport { asSdkClient, redeemShares } from '../viem/index.js'\nimport type { RedeemResult } from '../viem/index.js'\n\ninterface UseRedeemSharesReturn {\n /** Execute redeemShares (R1 flow). */\n redeem: (sharesInWei: bigint, receiver: `0x${string}`, owner: `0x${string}`) => Promise<void>\n isLoading: boolean\n txHash: `0x${string}` | undefined\n /** Assets received. Available after tx confirmation. */\n assets: bigint | undefined\n error: Error | undefined\n reset: () => void\n}\n\n/**\n * Hook for standard ERC-4626 share redemption (R1 flow).\n *\n * Used for local and oracle-on cross-chain vaults.\n * No LZ fee required — single transaction.\n *\n * @example\n * const { redeem, isLoading, txHash, assets } = useRedeemShares('0xVAULT', 747)\n * await redeem(sharesInWei, userAddress, userAddress)\n */\nexport function useRedeemShares(\n vault: `0x${string}` | undefined,\n chainId: number,\n): UseRedeemSharesReturn {\n const { data: walletClient } = useWalletClient({ chainId })\n const publicClient = usePublicClient({ chainId })\n\n const [isLoading, setIsLoading] = useState(false)\n const [result, setResult] = useState<RedeemResult | undefined>()\n const [error, setError] = useState<Error | undefined>()\n\n const redeem = useCallback(\n async (sharesInWei: bigint, receiver: `0x${string}`, owner: `0x${string}`) => {\n if (!vault || !walletClient || !publicClient) return\n setIsLoading(true)\n setError(undefined)\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const res = await redeemShares(\n walletClient as any,\n asSdkClient(publicClient),\n { vault, hubChainId: chainId },\n sharesInWei,\n receiver,\n owner,\n )\n setResult(res)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n } finally {\n setIsLoading(false)\n }\n },\n [vault, walletClient, publicClient, chainId],\n )\n\n const reset = useCallback(() => {\n setResult(undefined)\n setError(undefined)\n setIsLoading(false)\n }, [])\n\n return {\n redeem,\n isLoading,\n txHash: result?.txHash,\n assets: result?.assets,\n error,\n reset,\n }\n}\n","import type { DepositResult, AsyncRequestResult, AsyncRequestStatusInfo } from '../viem/index.js'\nimport { useVaultStatus } from './useVaultStatus.js'\nimport { useOmniDeposit } from './useOmniDeposit.js'\nimport { useDepositSimple } from './useDepositSimple.js'\n\ninterface UseSmartDepositReturn {\n /**\n * Execute deposit using the correct flow for this vault's mode.\n * For async vaults: wraps depositAsync (D4) — returns guid for tracking.\n * For local/oracle vaults: wraps depositSimple (D1/D3) — returns shares.\n */\n deposit: (amountInWei: bigint, receiver: `0x${string}`) => Promise<void>\n isLoading: boolean\n txHash: `0x${string}` | undefined\n /** Shares minted (available for D1/D3 vaults after confirmation, undefined for D4). */\n shares: bigint | undefined\n /** GUID for cross-chain tracking (D4 vaults only). */\n guid: `0x${string}` | undefined\n /** Cross-chain request status (D4 vaults only). */\n requestStatus: AsyncRequestStatusInfo | undefined\n /** true when the wallet is connected to the wrong chain (D4 vaults only). */\n wrongChain: boolean\n /** Vault mode loaded from getVaultStatus. undefined while loading. */\n vaultMode: 'local' | 'cross-chain-oracle' | 'cross-chain-async' | 'paused' | 'full' | undefined\n error: Error | undefined\n reset: () => void\n}\n\n/**\n * Auto-selects the correct deposit flow based on vault mode.\n * Best for frontends that support multiple vault types.\n *\n * Internally uses useVaultStatus to detect the mode, then delegates to:\n * - useOmniDeposit (D4) for 'cross-chain-async' vaults\n * - useDepositSimple (D1/D3) for 'local' and 'cross-chain-oracle' vaults\n *\n * @example\n * const { deposit, isLoading, guid, requestStatus, vaultMode } = useSmartDeposit('0xVAULT', 747)\n *\n * if (vaultMode === 'paused') return <PausedBadge />\n *\n * await deposit(parseUnits('100', 6), userAddress)\n * // For async vaults: poll requestStatus until 'completed'\n * // For sync vaults: txHash + shares are available immediately\n */\nexport function useSmartDeposit(\n vault: `0x${string}` | undefined,\n hubChainId: number,\n): UseSmartDepositReturn {\n const { data: status } = useVaultStatus(vault, hubChainId)\n const omni = useOmniDeposit(vault, hubChainId)\n const simple = useDepositSimple(vault, hubChainId)\n\n const isAsync = status?.mode === 'cross-chain-async'\n\n const deposit = isAsync ? omni.deposit : simple.deposit\n\n return {\n deposit,\n isLoading: isAsync ? omni.isLoading : simple.isLoading,\n txHash: isAsync ? omni.txHash : simple.txHash,\n shares: isAsync ? undefined : simple.shares,\n guid: isAsync ? omni.guid : undefined,\n requestStatus: isAsync ? omni.requestStatus : undefined,\n wrongChain: isAsync ? omni.wrongChain : false,\n vaultMode: status?.mode,\n error: isAsync ? omni.error : simple.error,\n reset: isAsync ? omni.reset : simple.reset,\n }\n}\n"]}
@@ -0,0 +1,286 @@
1
+ import { Address, WalletClient, PublicClient } from 'viem';
2
+
3
+ type VaultMode = 'local' | 'cross-chain-oracle' | 'cross-chain-async' | 'paused' | 'full';
4
+ interface VaultStatus {
5
+ /** Vault operating mode — determines which SDK flow to use */
6
+ mode: VaultMode;
7
+ /** Which deposit function to call given the current configuration */
8
+ recommendedDepositFlow: 'depositSimple' | 'depositAsync' | 'mintAsync' | 'none';
9
+ /** Which redeem function to call given the current configuration */
10
+ recommendedRedeemFlow: 'redeemShares' | 'redeemAsync' | 'none';
11
+ isHub: boolean;
12
+ isPaused: boolean;
13
+ oracleAccountingEnabled: boolean;
14
+ /** address(0) means CCManager is not set — async flows will fail */
15
+ ccManager: Address;
16
+ /** address(0) means escrow is not configured in the registry */
17
+ escrow: Address;
18
+ withdrawalQueueEnabled: boolean;
19
+ /** Timelock duration in seconds (0 = no timelock) */
20
+ withdrawalTimelockSeconds: bigint;
21
+ /**
22
+ * Remaining deposit capacity in underlying token decimals.
23
+ * `type(uint256).max` = no cap configured (unlimited).
24
+ * `0n` = vault is full — no more deposits accepted.
25
+ * If `depositAccessRestricted = true`, this value is `type(uint256).max` but
26
+ * deposits are still gated by whitelist or other access control.
27
+ */
28
+ remainingDepositCapacity: bigint;
29
+ /**
30
+ * True when `maxDeposit(address(0))` reverted, indicating the vault uses
31
+ * whitelist or other access control to restrict who can deposit.
32
+ * Deposit flows will succeed only for addresses the vault operator has approved.
33
+ */
34
+ depositAccessRestricted: boolean;
35
+ underlying: Address;
36
+ totalAssets: bigint;
37
+ totalSupply: bigint;
38
+ /** Vault share token decimals. Use this for display — never hardcode 18. */
39
+ decimals: number;
40
+ /**
41
+ * Price of 1 full share expressed in underlying token units.
42
+ * = convertToAssets(10^decimals). Grows over time as the vault earns yield.
43
+ */
44
+ sharePrice: bigint;
45
+ /**
46
+ * Underlying token balance held directly on the hub chain.
47
+ * This is the only portion that can be paid out to redeeming users immediately.
48
+ * (= ERC-20.balanceOf(vault) on the hub)
49
+ */
50
+ hubLiquidBalance: bigint;
51
+ /**
52
+ * Approximate value deployed to spoke chains (totalAssets − hubLiquidBalance).
53
+ * These funds are NOT immediately redeemable — the vault curator must
54
+ * call executeBridging to repatriate them before large redeems can succeed.
55
+ */
56
+ spokesDeployedBalance: bigint;
57
+ /**
58
+ * Maximum assets that can be redeemed right now without curator intervention.
59
+ * - For hub vaults: equals `hubLiquidBalance` (only what the hub holds).
60
+ * - For local/oracle vaults: equals `totalAssets` (all assets are local).
61
+ * Attempting to redeem more than this will revert (R1) or be auto-refunded (R5).
62
+ */
63
+ maxImmediateRedeemAssets: bigint;
64
+ /**
65
+ * Human-readable list of configuration problems that would cause transactions
66
+ * to fail. Empty array = vault is ready to use.
67
+ */
68
+ issues: string[];
69
+ }
70
+ /**
71
+ * Read the full configuration and operational status of a vault in a single
72
+ * multicall-friendly batch.
73
+ *
74
+ * Use this to:
75
+ * - Determine which SDK flow to use (`recommendedDepositFlow`)
76
+ * - Show a configuration checklist in an admin dashboard
77
+ * - Surface `issues` to the developer before any transaction
78
+ *
79
+ * @param publicClient Public client for reads
80
+ * @param vault Vault address (diamond proxy)
81
+ * @returns Full vault status snapshot
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * const status = await getVaultStatus(publicClient, VAULT)
86
+ * if (status.issues.length) {
87
+ * console.warn('Vault misconfigured:', status.issues)
88
+ * }
89
+ * // Use recommended flow:
90
+ * if (status.recommendedDepositFlow === 'depositAsync') {
91
+ * await depositAsync(walletClient, publicClient, { vault: VAULT, escrow: status.escrow }, ...)
92
+ * }
93
+ * ```
94
+ */
95
+ declare function getVaultStatus(publicClient: PublicClient, vault: Address): Promise<VaultStatus>;
96
+ /**
97
+ * Ensure the spender has sufficient ERC-20 allowance; approve if not.
98
+ *
99
+ * Checks the current allowance and only sends an approve transaction if
100
+ * the existing allowance is less than the required amount.
101
+ *
102
+ * @param walletClient Wallet client with account attached
103
+ * @param publicClient Public client for reads
104
+ * @param token ERC-20 token address
105
+ * @param spender Address to approve
106
+ * @param amount Minimum required allowance
107
+ */
108
+ declare function ensureAllowance(walletClient: WalletClient, publicClient: PublicClient, token: Address, spender: Address, amount: bigint): Promise<void>;
109
+ /**
110
+ * Quote the LayerZero native fee required for async vault actions.
111
+ *
112
+ * Call this before `depositAsync`, `mintAsync`, or `redeemAsync` to get the
113
+ * exact `lzFee` (msg.value) needed.
114
+ *
115
+ * @param publicClient Public client for reads
116
+ * @param vault Vault address (diamond proxy)
117
+ * @param extraOptions Optional LZ extra options bytes (default 0x)
118
+ * @returns Required native fee in wei
119
+ */
120
+ declare function quoteLzFee(publicClient: PublicClient, vault: Address, extraOptions?: `0x${string}`): Promise<bigint>;
121
+ /**
122
+ * Check if a vault is operating in async mode (cross-chain hub with oracle OFF).
123
+ *
124
+ * When this returns `true`, deposits and redeems must use the async flows
125
+ * (D4/D5/R5) which go through `initVaultActionRequest`.
126
+ * When `false`, the vault either uses oracle-based accounting (sync) or is
127
+ * a single-chain vault.
128
+ *
129
+ * @param publicClient Public client for reads
130
+ * @param vault Vault address
131
+ * @returns `true` if the vault requires async cross-chain flows
132
+ */
133
+ declare function isAsyncMode(publicClient: PublicClient, vault: Address): Promise<boolean>;
134
+ /**
135
+ * Poll for async request completion status.
136
+ *
137
+ * After calling an async flow (D4/D5/R5), use this to check whether the
138
+ * LZ callback has resolved and `executeRequest` has been called.
139
+ *
140
+ * @param publicClient Public client for reads
141
+ * @param vault Vault address
142
+ * @param guid Request GUID returned by the async flow
143
+ * @returns Whether the request is fulfilled and the finalization result
144
+ */
145
+ declare function getAsyncRequestStatus(publicClient: PublicClient, vault: Address, guid: `0x${string}`): Promise<{
146
+ fulfilled: boolean;
147
+ finalized: boolean;
148
+ result: bigint;
149
+ }>;
150
+
151
+ interface UserPosition {
152
+ /** Vault share balance */
153
+ shares: bigint;
154
+ /** convertToAssets(shares) — what they'd get if they redeemed now */
155
+ estimatedAssets: bigint;
156
+ /** Price of 1 full share in underlying (convertToAssets(10n ** decimals)) */
157
+ sharePrice: bigint;
158
+ /** Vault decimals (for display) */
159
+ decimals: number;
160
+ pendingWithdrawal: {
161
+ shares: bigint;
162
+ timelockEndsAt: bigint;
163
+ /** block.timestamp >= timelockEndsAt (or timelockEndsAt === 0n) */
164
+ canRedeemNow: boolean;
165
+ } | null;
166
+ }
167
+ /**
168
+ * Read the user's current position in the vault.
169
+ *
170
+ * @param publicClient Public client for reads
171
+ * @param vault Vault address (diamond proxy)
172
+ * @param user User wallet address
173
+ * @returns Full user position snapshot
174
+ */
175
+ declare function getUserPosition(publicClient: PublicClient, vault: Address, user: Address): Promise<UserPosition>;
176
+ /**
177
+ * Preview how many shares a given asset amount would mint.
178
+ *
179
+ * @param publicClient Public client for reads
180
+ * @param vault Vault address
181
+ * @param assets Amount of underlying tokens to deposit
182
+ * @returns Estimated shares to be minted
183
+ */
184
+ declare function previewDeposit(publicClient: PublicClient, vault: Address, assets: bigint): Promise<bigint>;
185
+ /**
186
+ * Preview how many underlying assets a given share amount would redeem.
187
+ *
188
+ * @param publicClient Public client for reads
189
+ * @param vault Vault address
190
+ * @param shares Amount of vault shares to redeem
191
+ * @returns Estimated assets to be returned
192
+ */
193
+ declare function previewRedeem(publicClient: PublicClient, vault: Address, shares: bigint): Promise<bigint>;
194
+ type DepositBlockReason = 'paused' | 'capacity-full' | 'not-whitelisted' | 'ok';
195
+ interface DepositEligibility {
196
+ allowed: boolean;
197
+ reason: DepositBlockReason;
198
+ }
199
+ /**
200
+ * Check whether a user is eligible to deposit into the vault right now.
201
+ *
202
+ * @param publicClient Public client for reads
203
+ * @param vault Vault address
204
+ * @param user User wallet address
205
+ * @returns Eligibility result with reason
206
+ */
207
+ declare function canDeposit(publicClient: PublicClient, vault: Address, user: Address): Promise<DepositEligibility>;
208
+ interface VaultMetadata {
209
+ name: string;
210
+ symbol: string;
211
+ decimals: number;
212
+ underlying: Address;
213
+ underlyingSymbol: string;
214
+ underlyingDecimals: number;
215
+ }
216
+ /**
217
+ * Read display metadata for a vault and its underlying token.
218
+ *
219
+ * @param publicClient Public client for reads
220
+ * @param vault Vault address
221
+ * @returns Vault and underlying token metadata
222
+ */
223
+ declare function getVaultMetadata(publicClient: PublicClient, vault: Address): Promise<VaultMetadata>;
224
+ type AsyncRequestStatus = 'pending' | 'ready-to-execute' | 'completed' | 'refunded';
225
+ interface AsyncRequestStatusInfo {
226
+ status: AsyncRequestStatus;
227
+ /** Human-readable description */
228
+ label: string;
229
+ /** Shares minted or assets returned (0 if still pending) */
230
+ result: bigint;
231
+ }
232
+ /**
233
+ * Get the human-readable status of an async cross-chain request.
234
+ *
235
+ * @param publicClient Public client for reads
236
+ * @param vault Vault address
237
+ * @param guid Request GUID returned by depositAsync / mintAsync / redeemAsync
238
+ * @returns Status info with label and result
239
+ */
240
+ declare function getAsyncRequestStatusLabel(publicClient: PublicClient, vault: Address, guid: `0x${string}`): Promise<AsyncRequestStatusInfo>;
241
+ interface UserBalances {
242
+ /** Vault shares the user holds */
243
+ shareBalance: bigint;
244
+ /** Underlying token balance in wallet (for deposit input) */
245
+ underlyingBalance: bigint;
246
+ /** convertToAssets(shareBalance) — vault position value */
247
+ estimatedAssets: bigint;
248
+ }
249
+ /**
250
+ * Read the user's token balances relevant to a vault.
251
+ *
252
+ * @param publicClient Public client for reads
253
+ * @param vault Vault address
254
+ * @param user User wallet address
255
+ * @returns Share balance, underlying wallet balance, and estimated assets
256
+ */
257
+ declare function getUserBalances(publicClient: PublicClient, vault: Address, user: Address): Promise<UserBalances>;
258
+ interface MaxWithdrawable {
259
+ /** How many shares can be redeemed right now */
260
+ shares: bigint;
261
+ /** How many underlying assets that corresponds to */
262
+ assets: bigint;
263
+ }
264
+ /**
265
+ * Calculate the maximum amount a user can withdraw from a vault right now.
266
+ *
267
+ * For hub vaults without oracle accounting, this is limited by hub liquidity.
268
+ * For local and oracle vaults, all assets are immediately redeemable.
269
+ *
270
+ * @param publicClient Public client for reads
271
+ * @param vault Vault address
272
+ * @param user User wallet address
273
+ * @returns Maximum withdrawable shares and assets
274
+ */
275
+ declare function getMaxWithdrawable(publicClient: PublicClient, vault: Address, user: Address): Promise<MaxWithdrawable>;
276
+ type VaultSummary = VaultStatus & VaultMetadata;
277
+ /**
278
+ * Get a combined snapshot of vault status and metadata in one call.
279
+ *
280
+ * @param publicClient Public client for reads
281
+ * @param vault Vault address
282
+ * @returns Merged VaultStatus and VaultMetadata
283
+ */
284
+ declare function getVaultSummary(publicClient: PublicClient, vault: Address): Promise<VaultSummary>;
285
+
286
+ export { type AsyncRequestStatus as A, type DepositBlockReason as D, type MaxWithdrawable as M, type UserBalances as U, type VaultMetadata as V, type AsyncRequestStatusInfo as a, type DepositEligibility as b, type UserPosition as c, type VaultMode as d, type VaultStatus as e, type VaultSummary as f, canDeposit as g, ensureAllowance as h, getAsyncRequestStatus as i, getAsyncRequestStatusLabel as j, getMaxWithdrawable as k, getUserBalances as l, getUserPosition as m, getVaultMetadata as n, getVaultStatus as o, getVaultSummary as p, isAsyncMode as q, previewDeposit as r, previewRedeem as s, quoteLzFee as t };