@oydual31/more-vaults-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +283 -0
- package/dist/ethers/index.cjs +973 -0
- package/dist/ethers/index.cjs.map +1 -0
- package/dist/ethers/index.d.cts +671 -0
- package/dist/ethers/index.d.ts +671 -0
- package/dist/ethers/index.js +924 -0
- package/dist/ethers/index.js.map +1 -0
- package/dist/viem/index.cjs +1426 -0
- package/dist/viem/index.cjs.map +1 -0
- package/dist/viem/index.d.cts +1291 -0
- package/dist/viem/index.d.ts +1291 -0
- package/dist/viem/index.js +1377 -0
- package/dist/viem/index.js.map +1 -0
- package/package.json +46 -0
- package/src/ethers/abis.ts +82 -0
- package/src/ethers/crossChainFlows.ts +206 -0
- package/src/ethers/depositFlows.ts +347 -0
- package/src/ethers/errors.ts +81 -0
- package/src/ethers/index.ts +103 -0
- package/src/ethers/preflight.ts +156 -0
- package/src/ethers/redeemFlows.ts +286 -0
- package/src/ethers/types.ts +67 -0
- package/src/ethers/userHelpers.ts +480 -0
- package/src/ethers/utils.ts +377 -0
- package/src/viem/abis.ts +392 -0
- package/src/viem/crossChainFlows.ts +220 -0
- package/src/viem/depositFlows.ts +331 -0
- package/src/viem/errors.ts +81 -0
- package/src/viem/index.ts +100 -0
- package/src/viem/preflight.ts +204 -0
- package/src/viem/redeemFlows.ts +337 -0
- package/src/viem/types.ts +56 -0
- package/src/viem/userHelpers.ts +489 -0
- package/src/viem/utils.ts +421 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ethers/types.ts","../../src/ethers/abis.ts","../../src/ethers/errors.ts","../../src/ethers/preflight.ts","../../src/ethers/utils.ts","../../src/ethers/depositFlows.ts","../../src/ethers/crossChainFlows.ts","../../src/ethers/redeemFlows.ts","../../src/ethers/userHelpers.ts"],"names":["Contract","ZeroAddress","Interface","ensureAllowance","AbiCoder","zeroPadValue","MULTICALL3_ADDRESS","MULTICALL3_ABI"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Signer, Provider, ContractTransactionReceipt } from \"ethers\";\n\n/** Addresses involved in vault operations. */\nexport interface VaultAddresses {\n /** Hub vault (diamond proxy) address. */\n vault: string;\n /** MoreVaultsEscrow address for cross-chain locking. */\n escrow?: string;\n /** OFTAdapter address for share token bridging (cross-chain only). */\n shareOFT?: string;\n /** OFT address for USDC bridging (cross-chain only). */\n usdcOFT?: string;\n}\n\n/** Result of a synchronous deposit or mint. */\nexport interface DepositResult {\n receipt: ContractTransactionReceipt;\n /** Number of vault shares minted. */\n shares: bigint;\n}\n\n/** Result of a synchronous redeem or withdraw. */\nexport interface RedeemResult {\n receipt: ContractTransactionReceipt;\n /** Number of underlying assets returned. */\n assets: bigint;\n}\n\n/** Result of an asynchronous cross-chain request. */\nexport interface AsyncRequestResult {\n receipt: ContractTransactionReceipt;\n /** bytes32 request GUID for tracking fulfillment. */\n guid: string;\n}\n\n/**\n * ActionType enum matching MoreVaultsLib.ActionType on-chain values.\n *\n * DEPOSIT = 0, MINT = 1, WITHDRAW = 2, REDEEM = 3,\n * 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\n/** Cross-chain request info returned by getRequestInfo. */\nexport interface CrossChainRequestInfo {\n initiator: string;\n timestamp: bigint;\n actionType: number;\n actionCallData: string;\n fulfilled: boolean;\n finalized: boolean;\n refunded: boolean;\n totalAssets: bigint;\n finalizationResult: bigint;\n amountLimit: bigint;\n}\n\nexport type { Signer, Provider, ContractTransactionReceipt };\n","/**\n * Human-readable ABI fragments for MoreVaults diamond facets.\n * Extracted from compiled artifacts in out/.\n */\n\nexport const VAULT_ABI = [\n // ERC4626 core\n \"function deposit(uint256 assets, address receiver) returns (uint256 shares)\",\n \"function mint(uint256 shares, address receiver) returns (uint256 assets)\",\n \"function withdraw(uint256 assets, address receiver, address owner) returns (uint256 shares)\",\n \"function redeem(uint256 shares, address receiver, address owner) returns (uint256 assets)\",\n\n // Multi-asset deposit\n \"function deposit(address[] tokens, uint256[] assets, address receiver, uint256 minAmountOut) payable returns (uint256 shares)\",\n\n // Withdrawal queue\n \"function requestRedeem(uint256 shares, address onBehalfOf)\",\n \"function requestWithdraw(uint256 assets, address onBehalfOf)\",\n \"function clearRequest()\",\n \"function getWithdrawalRequest(address _owner) view returns (uint256 shares, uint256 timelockEndsAt)\",\n\n // Views\n \"function totalAssets() view returns (uint256)\",\n \"function totalSupply() view returns (uint256)\",\n \"function balanceOf(address account) view returns (uint256)\",\n \"function asset() view returns (address)\",\n \"function convertToShares(uint256 assets) view returns (uint256)\",\n \"function convertToAssets(uint256 shares) view returns (uint256)\",\n \"function previewDeposit(uint256 assets) view returns (uint256)\",\n \"function previewRedeem(uint256 shares) view returns (uint256)\",\n \"function paused() view returns (bool)\",\n\n // Events\n \"event Deposit(address indexed sender, address indexed owner, address[] tokens, uint256[] assets, uint256 shares)\",\n \"event Transfer(address indexed from, address indexed to, uint256 value)\",\n \"event WithdrawRequestCreated(address requester, uint256 sharesAmount, uint256 endsAt)\",\n \"event WithdrawRequestFulfilled(address requester, address receiver, uint256 sharesAmount, uint256 assetAmount)\",\n] as const;\n\nexport const BRIDGE_ABI = [\n \"function initVaultActionRequest(uint8 actionType, bytes actionCallData, uint256 amountLimit, bytes extraOptions) payable returns (bytes32 guid)\",\n \"function getRequestInfo(bytes32 guid) view returns (tuple(address initiator, uint64 timestamp, uint8 actionType, bytes actionCallData, bool fulfilled, bool finalized, bool refunded, uint256 totalAssets, uint256 finalizationResult, uint256 amountLimit))\",\n \"function getFinalizationResult(bytes32 guid) view returns (uint256 result)\",\n \"function oraclesCrossChainAccounting() view returns (bool)\",\n \"function quoteAccountingFee(bytes extraOptions) view returns (uint256 nativeFee)\",\n \"function accountingBridgeFacet() view returns (uint256 sum, bool isPositive)\",\n] as const;\n\nexport const CONFIG_ABI = [\n \"function getEscrow() view returns (address escrow)\",\n \"function getCrossChainAccountingManager() view returns (address)\",\n \"function isHub() view returns (bool)\",\n \"function getWithdrawalQueueStatus() view returns (bool)\",\n \"function getWithdrawalTimelock() view returns (uint64)\",\n \"function getWithdrawalFee() view returns (uint96)\",\n \"function getMaxWithdrawalDelay() view returns (uint32)\",\n \"function getAvailableAssets() view returns (address[])\",\n \"function getDepositableAssets() view returns (address[])\",\n \"function depositCapacity() view returns (uint256)\",\n \"function fee() view returns (uint96)\",\n \"function feeRecipient() view returns (address)\",\n \"function paused() view returns (bool)\",\n \"function maxDeposit(address receiver) view returns (uint256)\",\n] as const;\n\nexport const METADATA_ABI = [\n \"function name() view returns (string)\",\n \"function symbol() view returns (string)\",\n \"function decimals() view returns (uint8)\",\n] as const;\n\nexport const ERC20_ABI = [\n \"function approve(address spender, uint256 amount) returns (bool)\",\n \"function allowance(address owner, address spender) view returns (uint256)\",\n \"function balanceOf(address account) view returns (uint256)\",\n \"function transfer(address to, uint256 amount) returns (bool)\",\n] as const;\n\nexport const OFT_ABI = [\n \"function send(tuple(uint32 dstEid, bytes32 to, uint256 amountLD, uint256 minAmountLD, bytes extraOptions, bytes composeMsg, bytes oftCmd) sendParam, tuple(uint256 nativeFee, uint256 lzTokenFee) fee, address refundAddress) payable returns (tuple(bytes32 guid, uint64 nonce, uint256 amountSentLD, uint256 amountReceivedLD) receipt, tuple(uint256 nativeFee, uint256 lzTokenFee) fee)\",\n \"function quoteSend(tuple(uint32 dstEid, bytes32 to, uint256 amountLD, uint256 minAmountLD, bytes extraOptions, bytes composeMsg, bytes oftCmd) sendParam, bool payInLzToken) view returns (tuple(uint256 nativeFee, uint256 lzTokenFee))\",\n] as const;\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","/**\n * Pre-flight validation helpers for MoreVaults ethers.js v6 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 { Contract, ZeroAddress } from \"ethers\";\nimport type { Provider } from \"ethers\";\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 provider Read-only provider for contract reads\n * @param vault Vault address (diamond proxy)\n * @param escrow Escrow address from VaultAddresses\n */\nexport async function preflightAsync(\n provider: Provider,\n vault: string,\n escrow: string\n): Promise<void> {\n const config = new Contract(vault, CONFIG_ABI, provider);\n const bridge = new Contract(vault, BRIDGE_ABI, provider);\n\n // Parallel read: ccManager, escrow, isHub, oraclesCrossChainAccounting, paused\n const [ccManager, registeredEscrow, isHub, oraclesEnabled, isPaused] =\n await Promise.all([\n config.getCrossChainAccountingManager() as Promise<string>,\n config.getEscrow() as Promise<string>,\n config.isHub() as Promise<boolean>,\n bridge.oraclesCrossChainAccounting() as Promise<boolean>,\n config.paused() as Promise<boolean>,\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 * @param provider Read-only provider 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 provider: Provider,\n vault: string,\n shares: bigint\n): Promise<void> {\n const vaultContract = new Contract(vault, VAULT_ABI, provider);\n\n const underlying: string = await vaultContract.asset();\n\n const underlyingContract = new Contract(underlying, ERC20_ABI, provider);\n const [hubLiquid, assetsNeeded]: [bigint, bigint] = await Promise.all([\n underlyingContract.balanceOf(vault),\n vaultContract.convertToAssets(shares),\n ]);\n\n if (hubLiquid < assetsNeeded) {\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 provider Read-only provider for contract reads\n * @param vault Vault address (diamond proxy)\n */\nexport async function preflightSync(\n provider: Provider,\n vault: string\n): Promise<void> {\n const config = new Contract(vault, CONFIG_ABI, provider);\n\n // Run paused and maxDeposit in parallel.\n // maxDeposit(ZeroAddress) may REVERT on whitelisted vaults — catch separately.\n const [isPaused, depositCapResult] = await Promise.all([\n config.paused() as Promise<boolean>,\n (config.maxDeposit(ZeroAddress) as Promise<bigint>).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","/**\n * Utility helpers for the MoreVaults ethers.js v6 SDK.\n *\n * All reads use Provider (read-only). Writes use Signer.\n */\n\nimport { Contract, Interface, ZeroAddress } from \"ethers\";\nimport type { Provider, Signer } from \"ethers\";\nimport { BRIDGE_ABI, CONFIG_ABI, ERC20_ABI, VAULT_ABI } from \"./abis\";\n\n// Multicall3 — deployed at the same address on every EVM chain\nconst MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\";\nconst MULTICALL3_ABI = [\n \"function aggregate3(tuple(address target, bool allowFailure, bytes callData)[] calls) payable returns (tuple(bool success, bytes returnData)[] returnData)\",\n] as const;\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: string;\n /** address(0) means escrow is not configured in the registry */\n escrow: string;\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 */\n depositAccessRestricted: boolean;\n\n // ── Vault metrics ──────────────────────────────────────────────────────────\n underlying: string;\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`.\n * - For local/oracle vaults: equals `totalAssets`.\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 * Ensure the spender has sufficient ERC-20 allowance; approve if not.\n *\n * @param signer Wallet signer with account attached\n * @param provider Read-only provider for allowance checks\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 signer: Signer,\n provider: Provider,\n token: string,\n spender: string,\n amount: bigint\n): Promise<void> {\n const owner = await signer.getAddress();\n const erc20Read = new Contract(token, ERC20_ABI, provider);\n const current: bigint = await erc20Read.allowance(owner, spender);\n if (current < amount) {\n const erc20Write = new Contract(token, ERC20_ABI, signer);\n const tx = await erc20Write.approve(spender, amount);\n await tx.wait();\n }\n}\n\n/**\n * Quote the LayerZero native fee required for async vault actions.\n *\n * @param provider Read-only provider\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 provider: Provider,\n vault: string,\n extraOptions: string = \"0x\"\n): Promise<bigint> {\n const bridge = new Contract(vault, BRIDGE_ABI, provider);\n const fee: bigint = await bridge.quoteAccountingFee(extraOptions);\n return fee;\n}\n\n/**\n * Check if a vault is operating in async mode (cross-chain hub with oracle OFF).\n *\n * @param provider Read-only provider\n * @param vault Vault address\n * @returns true if the vault requires async cross-chain flows\n */\nexport async function isAsyncMode(\n provider: Provider,\n vault: string\n): Promise<boolean> {\n const config = new Contract(vault, CONFIG_ABI, provider);\n const bridge = new Contract(vault, BRIDGE_ABI, provider);\n\n const [isHub, oraclesEnabled]: [boolean, boolean] = await Promise.all([\n config.isHub(),\n bridge.oraclesCrossChainAccounting(),\n ]);\n\n if (!isHub) return false;\n return !oraclesEnabled;\n}\n\n/**\n * Poll for async request completion status.\n *\n * @param provider Read-only provider\n * @param vault Vault address\n * @param guid Request GUID returned by the async flow\n * @returns Whether the request is fulfilled, finalized, and the result\n */\nexport async function getAsyncRequestStatus(\n provider: Provider,\n vault: string,\n guid: string\n): Promise<{ fulfilled: boolean; finalized: boolean; result: bigint }> {\n const bridge = new Contract(vault, BRIDGE_ABI, provider);\n\n const [info, finalizationResult]: [CrossChainRequestInfo, bigint] =\n await Promise.all([\n bridge.getRequestInfo(guid),\n bridge.getFinalizationResult(guid),\n ]);\n\n return {\n fulfilled: info.fulfilled,\n finalized: info.finalized,\n result: finalizationResult,\n };\n}\n\n/**\n * Read the full configuration and operational status of a vault.\n *\n * All independent reads are fired in parallel.\n *\n * @param provider Read-only provider\n * @param vault Vault address (diamond proxy)\n * @returns Full vault status snapshot\n */\nexport async function getVaultStatus(\n provider: Provider,\n vault: string\n): Promise<VaultStatus> {\n const mc = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);\n const configIface = new Interface(CONFIG_ABI as unknown as string[]);\n const bridgeIface = new Interface(BRIDGE_ABI as unknown as string[]);\n const vaultIface = new Interface(VAULT_ABI as unknown as string[]);\n const decimalsIface = new Interface([\"function decimals() view returns (uint8)\"]);\n\n // ── Batch 1: 12 calls → 1 eth_call via Multicall3.aggregate3 ─────────────\n const b1Calls = [\n { target: vault, allowFailure: false, callData: configIface.encodeFunctionData(\"isHub\") },\n { target: vault, allowFailure: false, callData: configIface.encodeFunctionData(\"paused\") },\n { target: vault, allowFailure: false, callData: bridgeIface.encodeFunctionData(\"oraclesCrossChainAccounting\") },\n { target: vault, allowFailure: false, callData: configIface.encodeFunctionData(\"getCrossChainAccountingManager\") },\n { target: vault, allowFailure: false, callData: configIface.encodeFunctionData(\"getEscrow\") },\n { target: vault, allowFailure: false, callData: configIface.encodeFunctionData(\"getWithdrawalQueueStatus\") },\n { target: vault, allowFailure: false, callData: configIface.encodeFunctionData(\"getWithdrawalTimelock\") },\n // allowFailure=true: maxDeposit reverts on whitelisted vaults with address(0)\n { target: vault, allowFailure: true, callData: configIface.encodeFunctionData(\"maxDeposit\", [ZeroAddress]) },\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"asset\") },\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"totalAssets\") },\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"totalSupply\") },\n { target: vault, allowFailure: false, callData: decimalsIface.encodeFunctionData(\"decimals\") },\n ];\n\n const b1: { success: boolean; returnData: string }[] = await mc.aggregate3.staticCall(b1Calls);\n\n const isHub = configIface.decodeFunctionResult(\"isHub\", b1[0].returnData)[0] as boolean;\n const isPaused = configIface.decodeFunctionResult(\"paused\", b1[1].returnData)[0] as boolean;\n const oraclesEnabled = bridgeIface.decodeFunctionResult(\"oraclesCrossChainAccounting\", b1[2].returnData)[0] as boolean;\n const ccManager = configIface.decodeFunctionResult(\"getCrossChainAccountingManager\", b1[3].returnData)[0] as string;\n const escrow = configIface.decodeFunctionResult(\"getEscrow\", b1[4].returnData)[0] as string;\n const withdrawalQueueEnabled = configIface.decodeFunctionResult(\"getWithdrawalQueueStatus\", b1[5].returnData)[0] as boolean;\n const withdrawalTimelockSeconds = configIface.decodeFunctionResult(\"getWithdrawalTimelock\", b1[6].returnData)[0] as bigint;\n // null sentinel: reverted means whitelist/ACL\n const maxDepositRaw = b1[7].success\n ? configIface.decodeFunctionResult(\"maxDeposit\", b1[7].returnData)[0] as bigint\n : null;\n const underlying = vaultIface.decodeFunctionResult(\"asset\", b1[8].returnData)[0] as string;\n const totalAssets = vaultIface.decodeFunctionResult(\"totalAssets\", b1[9].returnData)[0] as bigint;\n const totalSupply = vaultIface.decodeFunctionResult(\"totalSupply\", b1[10].returnData)[0] as bigint;\n const decimalsRaw = decimalsIface.decodeFunctionResult(\"decimals\", b1[11].returnData)[0];\n const decimalsNum = Number(decimalsRaw);\n const oneShare = 10n ** BigInt(decimalsNum);\n\n // ── Batch 2: 2 calls → 1 eth_call (depends on underlying + decimals) ─────\n const erc20Iface = new Interface(ERC20_ABI as unknown as string[]);\n const b2Calls = [\n { target: underlying, allowFailure: false, callData: erc20Iface.encodeFunctionData(\"balanceOf\", [vault]) },\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"convertToAssets\", [oneShare]) },\n ];\n\n const b2: { success: boolean; returnData: string }[] = await mc.aggregate3.staticCall(b2Calls);\n\n const hubLiquidBalance = erc20Iface.decodeFunctionResult(\"balanceOf\", b2[0].returnData)[0] as bigint;\n const sharePrice = vaultIface.decodeFunctionResult(\"convertToAssets\", b2[1].returnData)[0] as bigint;\n\n const spokesDeployedBalance: bigint = 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 // ── 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(\n \"Deposit capacity is full — increase depositCapacity via setDepositCapacity().\"\n );\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 (depositAccessRestricted) {\n issues.push(\"Deposit access is restricted (whitelist or other access control). Only approved addresses can deposit.\");\n }\n\n // ── maxImmediateRedeemAssets ────────────────────────────────────────────────\n const maxImmediateRedeemAssets: bigint = isHub && !oraclesEnabled ? hubLiquidBalance : totalAssets;\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 total = totalAssets;\n issues.push(\n `${spokesDeployedBalance} units (~${((Number(spokesDeployedBalance) / Number(total || 1n)) * 100).toFixed(1)}% of TVL) ` +\n `are deployed on spoke chains earning yield. These are NOT immediately redeemable — ` +\n `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: decimalsNum,\n sharePrice,\n hubLiquidBalance,\n spokesDeployedBalance,\n maxImmediateRedeemAssets,\n issues,\n };\n}\n","import { Contract, AbiCoder, Signer } from \"ethers\";\nimport type { Provider } from \"ethers\";\nimport { VAULT_ABI, BRIDGE_ABI, ERC20_ABI } from \"./abis\";\nimport {\n VaultAddresses,\n DepositResult,\n AsyncRequestResult,\n ActionType,\n} from \"./types\";\nimport { preflightAsync, preflightSync } from \"./preflight\";\nimport { MissingEscrowAddressError, VaultPausedError, CapacityFullError } from \"./errors\";\nimport { getVaultStatus, quoteLzFee } from \"./utils\";\n\n/**\n * Ensure `spender` has at least `amount` allowance from `owner`.\n * Sends an approve TX only if current allowance is insufficient.\n */\nasync function ensureAllowance(\n signer: Signer,\n token: string,\n spender: string,\n amount: bigint\n): Promise<void> {\n const owner = await signer.getAddress();\n const erc20 = new Contract(token, ERC20_ABI, signer);\n const current: bigint = await erc20.allowance(owner, spender);\n if (current < amount) {\n const tx = await erc20.approve(spender, amount);\n await tx.wait();\n }\n}\n\n// ---------------------------------------------------------------------------\n// D1 -- Simple deposit (1 TX, sync)\n// ---------------------------------------------------------------------------\n\n/**\n * Deposit `assets` of the vault's underlying token and receive shares.\n *\n * TXs: 1 approve (if needed) + 1 deposit.\n *\n * @param signer - Wallet that holds the underlying tokens.\n * @param addresses - Vault addresses. Only `vault` is used.\n * @param assets - Amount of underlying tokens to deposit.\n * @param receiver - Address that will receive the minted shares.\n * @returns Shares minted and the transaction receipt.\n */\nexport async function depositSimple(\n signer: Signer,\n addresses: VaultAddresses,\n assets: bigint,\n receiver: string\n): Promise<DepositResult> {\n const provider = signer.provider!;\n\n // Pre-flight: validate vault is operational and accepting deposits\n await preflightSync(provider, addresses.vault);\n\n const vault = new Contract(addresses.vault, VAULT_ABI, signer);\n const underlying: string = await vault.asset();\n\n await ensureAllowance(signer, underlying, addresses.vault, assets);\n\n // Call the single-asset deposit overload: deposit(uint256, address)\n const tx = await vault[\"deposit(uint256,address)\"](assets, receiver);\n const receipt = await tx.wait();\n\n // Extract shares from the return value via Transfer event (from 0x0 = mint)\n let shares = 0n;\n for (const log of receipt.logs) {\n try {\n const parsed = vault.interface.parseLog({\n topics: log.topics as string[],\n data: log.data,\n });\n if (\n parsed &&\n parsed.name === \"Transfer\" &&\n parsed.args[0] === \"0x0000000000000000000000000000000000000000\"\n ) {\n shares = parsed.args[2];\n break;\n }\n } catch {\n // skip non-matching logs\n }\n }\n\n return { receipt, shares };\n}\n\n// ---------------------------------------------------------------------------\n// D2 -- Multi-asset deposit\n// ---------------------------------------------------------------------------\n\n/**\n * Deposit multiple tokens in a single transaction.\n *\n * TXs: N approves (if needed) + 1 deposit.\n *\n * @param signer - Wallet holding the tokens.\n * @param addresses - Vault addresses. Only `vault` is used.\n * @param tokens - Array of token addresses to deposit.\n * @param amounts - Corresponding amounts for each token.\n * @param receiver - Address that will receive the minted shares.\n * @param minShares - Minimum acceptable shares (slippage protection).\n * @returns Shares minted and the transaction receipt.\n */\nexport async function depositMultiAsset(\n signer: Signer,\n addresses: VaultAddresses,\n tokens: string[],\n amounts: bigint[],\n receiver: string,\n minShares: bigint\n): Promise<DepositResult> {\n // Approve each token\n for (let i = 0; i < tokens.length; i++) {\n await ensureAllowance(signer, tokens[i], addresses.vault, amounts[i]);\n }\n\n const vault = new Contract(addresses.vault, VAULT_ABI, signer);\n const tx = await vault[\n \"deposit(address[],uint256[],address,uint256)\"\n ](tokens, amounts, receiver, minShares);\n const receipt = await tx.wait();\n\n let shares = 0n;\n for (const log of receipt.logs) {\n try {\n const parsed = vault.interface.parseLog({\n topics: log.topics as string[],\n data: log.data,\n });\n if (parsed && parsed.name === \"Deposit\") {\n shares = parsed.args[4]; // 5th arg = shares\n break;\n }\n } catch {\n // skip\n }\n }\n\n return { receipt, shares };\n}\n\n// ---------------------------------------------------------------------------\n// D3 -- Cross-chain oracle ON (transparent, identical to D1)\n// ---------------------------------------------------------------------------\n\n/**\n * Deposit when cross-chain oracle accounting is ON.\n * Behaves identically to a simple deposit because oracle provides\n * synchronous pricing.\n *\n * TXs: 1 approve (if needed) + 1 deposit.\n */\nexport const depositCrossChainOracleOn = depositSimple;\n\n// ---------------------------------------------------------------------------\n// D4 -- Cross-chain oracle OFF, async DEPOSIT\n// ---------------------------------------------------------------------------\n\n/**\n * Initiate an asynchronous cross-chain deposit request.\n *\n * CRITICAL: tokens are approved to the **escrow** address, not the vault.\n *\n * TXs: 1 approve to escrow (if needed) + 1 initVaultActionRequest.\n * After this call, a LayerZero message is sent; the caller must wait for\n * cross-chain fulfillment before shares are minted.\n *\n * @param signer - Wallet holding the underlying tokens.\n * @param addresses - Must include `vault` and `escrow`.\n * @param assets - Amount of underlying tokens to deposit.\n * @param receiver - Address that will receive shares on fulfillment.\n * @param lzFee - Native fee for LayerZero message (use `quoteLzFee`).\n * @param extraOptions - Optional LZ adapter parameters (bytes).\n * @returns The request GUID for tracking and the transaction receipt.\n */\nexport async function depositAsync(\n signer: Signer,\n addresses: VaultAddresses,\n assets: bigint,\n receiver: string,\n lzFee: bigint,\n extraOptions: string = \"0x\"\n): Promise<AsyncRequestResult> {\n const provider = signer.provider!;\n if (!addresses.escrow) throw new MissingEscrowAddressError();\n const escrow = addresses.escrow;\n\n // Pre-flight: validate async cross-chain setup before sending any transaction\n await preflightAsync(provider, addresses.vault, escrow);\n\n const vault = new Contract(addresses.vault, VAULT_ABI, signer);\n const underlying: string = await vault.asset();\n\n // CRITICAL: approve ESCROW, not vault\n await ensureAllowance(signer, underlying, escrow, assets);\n\n // Encode parameters only (no selector) — contracts use abi.decode on these bytes\n const coder = AbiCoder.defaultAbiCoder();\n const actionCallData = coder.encode(\n [\"uint256\", \"address\"],\n [assets, receiver]\n );\n\n const bridge = new Contract(addresses.vault, BRIDGE_ABI, signer);\n\n // Static call first to capture the return value (guid) before broadcasting\n const guid: string = await bridge.initVaultActionRequest.staticCall(\n ActionType.DEPOSIT,\n actionCallData,\n 0,\n extraOptions,\n { value: lzFee }\n );\n\n const tx = await bridge.initVaultActionRequest(\n ActionType.DEPOSIT,\n actionCallData,\n 0, // amountLimit = 0 for deposits (minAmountOut handled by cross-chain manager)\n extraOptions,\n { value: lzFee }\n );\n const receipt = await tx.wait();\n\n return { receipt, guid };\n}\n\n// ---------------------------------------------------------------------------\n// D5 -- Cross-chain oracle OFF, async MINT\n// ---------------------------------------------------------------------------\n\n/**\n * Initiate an asynchronous cross-chain mint request (exact shares).\n *\n * CRITICAL: tokens are approved to the **escrow** address, not the vault.\n *\n * TXs: 1 approve to escrow for maxAssets (if needed) + 1 initVaultActionRequest.\n *\n * @param signer - Wallet holding the underlying tokens.\n * @param addresses - Must include `vault` and `escrow`.\n * @param shares - Exact number of shares to mint.\n * @param maxAssets - Maximum underlying tokens to spend (slippage cap).\n * @param receiver - Address that will receive shares on fulfillment.\n * @param lzFee - Native fee for LayerZero message.\n * @param extraOptions - Optional LZ adapter parameters (bytes).\n * @returns The request GUID for tracking and the transaction receipt.\n */\nexport async function mintAsync(\n signer: Signer,\n addresses: VaultAddresses,\n shares: bigint,\n maxAssets: bigint,\n receiver: string,\n lzFee: bigint,\n extraOptions: string = \"0x\"\n): Promise<AsyncRequestResult> {\n const provider = signer.provider!;\n if (!addresses.escrow) throw new MissingEscrowAddressError();\n const escrow = addresses.escrow;\n\n // Pre-flight: validate async cross-chain setup before sending any transaction\n await preflightAsync(provider, addresses.vault, escrow);\n\n const vault = new Contract(addresses.vault, VAULT_ABI, signer);\n const underlying: string = await vault.asset();\n\n // CRITICAL: approve ESCROW for maxAssets\n await ensureAllowance(signer, underlying, escrow, maxAssets);\n\n // Encode parameters only (no selector) — contracts use abi.decode on these bytes\n const coder = AbiCoder.defaultAbiCoder();\n const actionCallData = coder.encode(\n [\"uint256\", \"address\"],\n [shares, receiver]\n );\n\n const bridge = new Contract(addresses.vault, BRIDGE_ABI, signer);\n\n // Static call first to capture the return value (guid) before broadcasting\n const guid: string = await bridge.initVaultActionRequest.staticCall(\n ActionType.MINT,\n actionCallData,\n maxAssets,\n extraOptions,\n { value: lzFee }\n );\n\n const tx = await bridge.initVaultActionRequest(\n ActionType.MINT,\n actionCallData,\n maxAssets,\n extraOptions,\n { value: lzFee }\n );\n const receipt = await tx.wait();\n\n return { receipt, guid };\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 signer Wallet signer with account attached\n * @param provider Read-only provider for on-chain 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 signer: Signer,\n provider: Provider,\n addresses: VaultAddresses,\n assets: bigint,\n receiver: string,\n extraOptions: string = \"0x\"\n): Promise<DepositResult | AsyncRequestResult> {\n const vault = addresses.vault;\n const status = await getVaultStatus(provider, 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(provider, vault, extraOptions);\n return depositAsync(signer, addresses, assets, receiver, lzFee, extraOptions);\n }\n\n // local or cross-chain-oracle\n return depositSimple(signer, addresses, assets, receiver);\n}\n","import { Contract, AbiCoder, zeroPadValue, Signer, Provider } from \"ethers\";\nimport { ERC20_ABI, OFT_ABI } from \"./abis\";\nimport type { ContractTransactionReceipt } from \"ethers\";\n\n/**\n * Ensure `spender` has at least `amount` allowance from `owner`.\n */\nasync function ensureAllowance(\n signer: Signer,\n token: string,\n spender: string,\n amount: bigint\n): Promise<void> {\n const owner = await signer.getAddress();\n const erc20 = new Contract(token, ERC20_ABI, signer);\n const current: bigint = await erc20.allowance(owner, spender);\n if (current < amount) {\n const tx = await erc20.approve(spender, amount);\n await tx.wait();\n }\n}\n\n// ---------------------------------------------------------------------------\n// D6 / D7 — Spoke → Hub, OFT Compose deposit\n// ---------------------------------------------------------------------------\n\n/**\n * D6 / D7 — Deposit from a spoke chain to the hub vault via OFT Compose.\n *\n * Bridges tokens from the spoke chain to the hub via LayerZero OFT, attaching a\n * composeMsg that instructs the hub-side MoreVaultsComposer to deposit into the vault\n * and send the resulting shares back to the receiver on the spoke chain.\n *\n * - **D6 (oracle ON)**: composer calls `_depositAndSend` — shares arrive on spoke in ~1 LZ round-trip.\n * - **D7 (oracle OFF)**: composer calls `_initDeposit` — requires an additional LZ Read round-trip.\n *\n * From the user's perspective, both D6 and D7 have the same interface.\n *\n * TXs: 1 approve (if needed) + 1 OFT.send().\n * Wait: LayerZero cross-chain delivery (typically 1-5 minutes).\n *\n * @param signer - Wallet on the spoke chain.\n * @param spokeOFT - OFT/OFTAdapter address on the spoke chain.\n * @param hubEid - LayerZero EID for the hub chain (e.g. 30332 for Flow EVM).\n * @param spokeEid - LayerZero EID for the spoke chain — where shares are sent back.\n * @param amount - Amount of underlying tokens to bridge and deposit.\n * @param receiver - Address that will receive shares on the spoke chain.\n * @param lzFee - Native fee for the OFT.send() call. Must cover both hub-bound\n * and return (shares back) messages. Quote via OFT.quoteSend().\n * @param minMsgValue - Minimum msg.value the hub composer must receive to process\n * the compose and send shares back. Defaults to 0.\n * @param minSharesOut - Minimum shares to receive after deposit (slippage protection).\n * Defaults to 0.\n * @param minAmountLD - Minimum tokens received on hub after bridge. Defaults to `amount`.\n * @param extraOptions - LZ extra options bytes for the hub-bound message.\n * @returns Transaction receipt.\n */\nexport async function depositFromSpoke(\n signer: Signer,\n spokeOFT: string,\n hubEid: number,\n spokeEid: number,\n amount: bigint,\n receiver: string,\n lzFee: bigint,\n minMsgValue: bigint = 0n,\n minSharesOut: bigint = 0n,\n minAmountLD?: bigint,\n extraOptions: string = \"0x\",\n): Promise<{ receipt: ContractTransactionReceipt }> {\n await ensureAllowance(signer, spokeOFT, spokeOFT, amount);\n\n const oft = new Contract(spokeOFT, OFT_ABI, signer);\n const refundAddress = await signer.getAddress();\n\n // Pad receiver to bytes32 for LZ\n const receiverBytes32 = zeroPadValue(receiver, 32);\n\n // Build hopSendParam: tells the hub composer where to send shares back.\n // dstEid = spoke chain, receiver = shares recipient, amountLD = 0 (overwritten by composer).\n const hopSendParam = {\n dstEid: spokeEid,\n to: receiverBytes32,\n amountLD: 0n,\n minAmountLD: minSharesOut,\n extraOptions: \"0x\",\n composeMsg: \"0x\",\n oftCmd: \"0x\",\n };\n\n // composeMsg = abi.encode(SendParam hopSendParam, uint256 minMsgValue)\n // This is what MoreVaultsComposer.handleCompose() decodes.\n const coder = AbiCoder.defaultAbiCoder();\n const composeMsg = coder.encode(\n [\n \"tuple(uint32 dstEid, bytes32 to, uint256 amountLD, uint256 minAmountLD, bytes extraOptions, bytes composeMsg, bytes oftCmd)\",\n \"uint256\",\n ],\n [hopSendParam, minMsgValue],\n );\n\n const sendParam = {\n dstEid: hubEid,\n to: receiverBytes32,\n amountLD: amount,\n minAmountLD: minAmountLD ?? amount,\n extraOptions,\n composeMsg,\n oftCmd: \"0x\",\n };\n\n const msgFee = { nativeFee: lzFee, lzTokenFee: 0n };\n\n const tx = await oft.send(sendParam, msgFee, refundAddress, {\n value: lzFee,\n });\n const receipt = await tx.wait();\n\n return { receipt };\n}\n\n// ---------------------------------------------------------------------------\n// D7 -- Spoke -> Hub OFT Compose (oracle OFF, async)\n// ---------------------------------------------------------------------------\n\n/**\n * Alias: D7 — Spoke to hub deposit when oracle is OFF (async resolution).\n * Same interface as D6; the difference is handled server-side by the composer contract.\n * Shares may take longer to arrive due to the additional LZ Read round-trip.\n */\nexport const depositFromSpokeAsync = depositFromSpoke;\n\n// ---------------------------------------------------------------------------\n// Fee quote helper\n// ---------------------------------------------------------------------------\n\n/**\n * Quote the LayerZero fee required for depositFromSpoke / depositFromSpokeAsync.\n *\n * @param provider Read-only provider on the SPOKE chain\n * @param spokeOFT OFT contract address on spoke chain\n * @param hubEid LayerZero EID for the hub chain\n * @param spokeEid LayerZero EID for the spoke chain\n * @param amount Amount of tokens to bridge\n * @param receiver Address that will receive vault shares on the spoke chain\n * @param minMsgValue Same value you plan to pass to depositFromSpoke (default 0n)\n * @param minSharesOut Same value you plan to pass to depositFromSpoke (default 0n)\n * @param minAmountLD Minimum tokens on hub after bridge (default: amount)\n * @param extraOptions LZ extra options (default 0x)\n * @returns Native fee in wei to pass as lzFee to depositFromSpoke\n */\nexport async function quoteDepositFromSpokeFee(\n provider: Provider,\n spokeOFT: string,\n hubEid: number,\n spokeEid: number,\n amount: bigint,\n receiver: string,\n minMsgValue: bigint = 0n,\n minSharesOut: bigint = 0n,\n minAmountLD?: bigint,\n extraOptions: string = \"0x\"\n): Promise<bigint> {\n const receiverBytes32 = zeroPadValue(receiver, 32);\n\n const hopSendParam = {\n dstEid: spokeEid,\n to: receiverBytes32,\n amountLD: 0n,\n minAmountLD: minSharesOut,\n extraOptions: \"0x\",\n composeMsg: \"0x\",\n oftCmd: \"0x\",\n };\n\n const coder = AbiCoder.defaultAbiCoder();\n const composeMsgBytes = coder.encode(\n [\"tuple(uint32,bytes32,uint256,uint256,bytes,bytes,bytes)\", \"uint256\"],\n [\n [\n hopSendParam.dstEid,\n hopSendParam.to,\n hopSendParam.amountLD,\n hopSendParam.minAmountLD,\n hopSendParam.extraOptions,\n hopSendParam.composeMsg,\n hopSendParam.oftCmd,\n ],\n minMsgValue,\n ]\n );\n\n const sendParam = {\n dstEid: hubEid,\n to: receiverBytes32,\n amountLD: amount,\n minAmountLD: minAmountLD ?? amount,\n extraOptions,\n composeMsg: composeMsgBytes,\n oftCmd: \"0x\",\n };\n\n const oft = new Contract(spokeOFT, OFT_ABI, provider);\n const fee = await oft.quoteSend(sendParam, false);\n return fee.nativeFee as bigint;\n}\n","import { Contract, AbiCoder, zeroPadValue, Signer, Provider } from \"ethers\";\nimport {\n VAULT_ABI,\n BRIDGE_ABI,\n ERC20_ABI,\n OFT_ABI,\n} from \"./abis\";\nimport {\n VaultAddresses,\n RedeemResult,\n AsyncRequestResult,\n ActionType,\n} from \"./types\";\nimport type { ContractTransactionReceipt } from \"ethers\";\nimport { preflightAsync, preflightRedeemLiquidity } from \"./preflight\";\nimport { MissingEscrowAddressError } from \"./errors\";\n\n/**\n * Ensure `spender` has at least `amount` allowance from `owner`.\n */\nasync function ensureAllowance(\n signer: Signer,\n token: string,\n spender: string,\n amount: bigint\n): Promise<void> {\n const owner = await signer.getAddress();\n const erc20 = new Contract(token, ERC20_ABI, signer);\n const current: bigint = await erc20.allowance(owner, spender);\n if (current < amount) {\n const tx = await erc20.approve(spender, amount);\n await tx.wait();\n }\n}\n\n// ---------------------------------------------------------------------------\n// R1 -- Simple redeem\n// ---------------------------------------------------------------------------\n\n/**\n * Redeem `shares` for underlying assets.\n *\n * TXs: 1 redeem.\n * Pre-condition: if withdrawal queue is enabled, `requestRedeem` must have\n * been called and the timelock must have elapsed.\n *\n * @param signer - Wallet holding the shares.\n * @param addresses - Vault addresses. Only `vault` is used.\n * @param shares - Number of shares to redeem.\n * @param receiver - Address that will receive the underlying assets.\n * @param owner - Address that owns the shares.\n * @returns Assets received and the transaction receipt.\n */\nexport async function redeemShares(\n signer: Signer,\n addresses: VaultAddresses,\n shares: bigint,\n receiver: string,\n owner: string\n): Promise<RedeemResult> {\n const vault = new Contract(addresses.vault, VAULT_ABI, signer);\n\n // Static call to get the return value (assets) before broadcasting\n const assets: bigint = await vault.redeem.staticCall(shares, receiver, owner);\n\n const tx = await vault.redeem(shares, receiver, owner);\n const receipt = await tx.wait();\n\n return { receipt, assets };\n}\n\n// ---------------------------------------------------------------------------\n// R2 -- Simple withdraw\n// ---------------------------------------------------------------------------\n\n/**\n * Withdraw exact `assets` amount of underlying tokens by burning shares.\n *\n * TXs: 1 withdraw.\n *\n * @param signer - Wallet holding the shares.\n * @param addresses - Vault addresses. Only `vault` is used.\n * @param assets - Exact amount of underlying tokens to withdraw.\n * @param receiver - Address that will receive the tokens.\n * @param owner - Address that owns the shares.\n * @returns Assets received and the transaction receipt.\n */\nexport async function withdrawAssets(\n signer: Signer,\n addresses: VaultAddresses,\n assets: bigint,\n receiver: string,\n owner: string\n): Promise<RedeemResult> {\n const vault = new Contract(addresses.vault, VAULT_ABI, signer);\n const tx = await vault.withdraw(assets, receiver, owner);\n const receipt = await tx.wait();\n\n return { receipt, assets };\n}\n\n// ---------------------------------------------------------------------------\n// R3 -- Queue redeem, no timelock (2 TXs)\n// ---------------------------------------------------------------------------\n\n/**\n * Submit a withdrawal queue request for `shares`.\n *\n * TXs: 1 requestRedeem.\n * After this call and once any timelock elapses, call `redeemShares()` to\n * complete the withdrawal.\n *\n * @param signer - Wallet holding the shares.\n * @param addresses - Vault addresses. Only `vault` is used.\n * @param shares - Number of shares to queue for redemption.\n * @param owner - Address on whose behalf to request.\n * @returns Transaction receipt.\n */\nexport async function requestRedeem(\n signer: Signer,\n addresses: VaultAddresses,\n shares: bigint,\n owner: string\n): Promise<{ receipt: ContractTransactionReceipt }> {\n const vault = new Contract(addresses.vault, VAULT_ABI, signer);\n const tx = await vault.requestRedeem(shares, owner);\n const receipt = await tx.wait();\n return { receipt };\n}\n\n// ---------------------------------------------------------------------------\n// R4 -- Queue redeem with timelock (helper to check status)\n// ---------------------------------------------------------------------------\n\n/**\n * Get the current withdrawal request for an owner.\n * Returns null if no pending request exists.\n *\n * @param provider - JSON-RPC provider.\n * @param vault - Vault (diamond) address.\n * @param owner - Address of the shares owner.\n * @returns The request details or null.\n */\nexport async function getWithdrawalRequest(\n provider: Provider,\n vault: string,\n owner: string\n): Promise<{ shares: bigint; timelockEndsAt: bigint } | null> {\n const vaultContract = new Contract(vault, VAULT_ABI, provider);\n const [shares, timelockEndsAt]: [bigint, bigint] =\n await vaultContract.getWithdrawalRequest(owner);\n\n if (shares === 0n) {\n return null;\n }\n\n return { shares, timelockEndsAt };\n}\n\n// ---------------------------------------------------------------------------\n// R5 -- Cross-chain oracle OFF, async redeem\n// ---------------------------------------------------------------------------\n\n/**\n * Initiate an asynchronous cross-chain redeem request.\n *\n * CRITICAL: shares are approved to the **escrow** address (vault share token).\n * amountLimit MUST be 0 for redeems.\n *\n * TXs: 1 approve to escrow for shares (if needed) + 1 initVaultActionRequest.\n * Wait: LayerZero cross-chain fulfillment.\n *\n * @param signer - Wallet holding the shares.\n * @param addresses - Must include `vault` and `escrow`.\n * @param shares - Number of shares to redeem.\n * @param receiver - Address that will receive the underlying assets.\n * @param owner - Address that owns the shares.\n * @param lzFee - Native fee for LayerZero message.\n * @param extraOptions - Optional LZ adapter parameters (bytes).\n * @returns The request GUID for tracking and the transaction receipt.\n */\nexport async function redeemAsync(\n signer: Signer,\n addresses: VaultAddresses,\n shares: bigint,\n receiver: string,\n owner: string,\n lzFee: bigint,\n extraOptions: string = \"0x\"\n): Promise<AsyncRequestResult> {\n const provider = signer.provider!;\n if (!addresses.escrow) throw new MissingEscrowAddressError();\n const escrow = addresses.escrow;\n\n // Pre-flight: validate async cross-chain setup before sending any transaction\n await preflightAsync(provider, addresses.vault, escrow);\n\n // Pre-flight: check hub has enough liquid assets — avoids wasting LZ fee on a guaranteed refund\n await preflightRedeemLiquidity(provider, addresses.vault, shares);\n\n // CRITICAL: approve ESCROW for shares (the vault token itself)\n await ensureAllowance(signer, addresses.vault, escrow, shares);\n\n const coder = AbiCoder.defaultAbiCoder();\n const actionCallData = coder.encode(\n [\"uint256\", \"address\", \"address\"],\n [shares, receiver, owner]\n );\n\n const bridge = new Contract(addresses.vault, BRIDGE_ABI, signer);\n\n // Static call first to capture the return value (guid) before broadcasting\n const guid: string = await bridge.initVaultActionRequest.staticCall(\n ActionType.REDEEM,\n actionCallData,\n 0,\n extraOptions,\n { value: lzFee }\n );\n\n const tx = await bridge.initVaultActionRequest(\n ActionType.REDEEM,\n actionCallData,\n 0, // amountLimit MUST be 0 for redeems\n extraOptions,\n { value: lzFee }\n );\n const receipt = await tx.wait();\n\n return { receipt, guid };\n}\n\n// ---------------------------------------------------------------------------\n// R6 -- Spoke -> Hub redeem (step 1: bridge shares to hub)\n// ---------------------------------------------------------------------------\n\n/**\n * Bridge shares from a spoke chain to the hub chain (step 1 of 2).\n *\n * After the shares arrive on the hub chain, call `redeemShares()` on the\n * hub to complete the redemption.\n *\n * TXs: 1 approve (if needed) + 1 OFT.send().\n * Wait: LayerZero delivery (typically 1-5 minutes).\n *\n * @param signer - Wallet on the spoke chain holding shares.\n * @param shareOFT - OFTAdapter address for the share token on spoke.\n * @param hubChainEid - LayerZero endpoint ID for the hub chain (e.g. 30332 for Flow EVM).\n * @param shares - Number of shares to bridge.\n * @param receiver - Address on hub chain that will receive the shares.\n * @param lzFee - Native fee for LayerZero message.\n * @returns Transaction receipt.\n */\nexport async function bridgeSharesToHub(\n signer: Signer,\n shareOFT: string,\n hubChainEid: number,\n shares: bigint,\n receiver: string,\n lzFee: bigint\n): Promise<{ receipt: ContractTransactionReceipt }> {\n await ensureAllowance(signer, shareOFT, shareOFT, shares);\n\n const oft = new Contract(shareOFT, OFT_ABI, signer);\n const refundAddress = await signer.getAddress();\n const toBytes32 = zeroPadValue(receiver, 32);\n\n const sendParam = {\n dstEid: hubChainEid,\n to: toBytes32,\n amountLD: shares,\n minAmountLD: shares, // no slippage on share bridging\n extraOptions: \"0x\",\n composeMsg: \"0x\",\n oftCmd: \"0x\",\n };\n\n const msgFee = { nativeFee: lzFee, lzTokenFee: 0n };\n\n const tx = await oft.send(sendParam, msgFee, refundAddress, {\n value: lzFee,\n });\n const receipt = await tx.wait();\n\n return { receipt };\n}\n","/**\n * User-facing helper functions for the MoreVaults ethers.js v6 SDK.\n *\n * All functions use Provider (read-only). None send transactions.\n */\n\nimport { Contract, Interface } from \"ethers\";\nimport type { Provider } from \"ethers\";\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// Multicall3 — deployed at the same address on every EVM chain\nconst MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\";\nconst MULTICALL3_ABI = [\n \"function aggregate3(tuple(address target, bool allowFailure, bytes callData)[] calls) payable returns (tuple(bool success, bytes returnData)[] returnData)\",\n] as const;\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 provider Read-only provider 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 provider: Provider,\n vault: string,\n user: string\n): Promise<UserPosition> {\n const mc = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);\n const vaultIface = new Interface(VAULT_ABI as unknown as string[]);\n const decimalsIface = new Interface([\"function decimals() view returns (uint8)\"]);\n\n // First batch: balance, decimals, withdrawal request — via Multicall3\n const b1Calls = [\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"balanceOf\", [user]) },\n { target: vault, allowFailure: false, callData: decimalsIface.encodeFunctionData(\"decimals\") },\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"getWithdrawalRequest\", [user]) },\n ];\n\n const [b1Raw, block] = await Promise.all([\n mc.aggregate3.staticCall(b1Calls) as Promise<{ success: boolean; returnData: string }[]>,\n provider.getBlock(\"latest\"),\n ]);\n\n const shares = vaultIface.decodeFunctionResult(\"balanceOf\", b1Raw[0].returnData)[0] as bigint;\n const decimalsRaw = decimalsIface.decodeFunctionResult(\"decimals\", b1Raw[1].returnData)[0];\n const decimals = Number(decimalsRaw);\n const withdrawalResult = vaultIface.decodeFunctionResult(\"getWithdrawalRequest\", b1Raw[2].returnData);\n const withdrawalRequest: [bigint, bigint] = [withdrawalResult[0] as bigint, withdrawalResult[1] as bigint];\n\n const [withdrawShares, timelockEndsAt] = withdrawalRequest;\n\n // Second batch: convertToAssets calls (need shares and decimals from first batch)\n const vaultContract = new Contract(vault, VAULT_ABI, provider);\n const oneShare = 10n ** BigInt(decimals);\n const [estimatedAssets, sharePrice] = await Promise.all([\n shares === 0n\n ? Promise.resolve(0n)\n : (vaultContract.convertToAssets(shares) as Promise<bigint>),\n vaultContract.convertToAssets(oneShare) as Promise<bigint>,\n ]);\n\n const currentTimestamp = BigInt(block!.timestamp);\n\n const pendingWithdrawal =\n withdrawShares === 0n\n ? null\n : {\n shares: withdrawShares,\n timelockEndsAt,\n canRedeemNow:\n 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 provider Read-only provider\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 provider: Provider,\n vault: string,\n assets: bigint\n): Promise<bigint> {\n const vaultContract = new Contract(vault, VAULT_ABI, provider);\n return vaultContract.previewDeposit(assets) as Promise<bigint>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Preview how many underlying assets a given share amount would redeem.\n *\n * @param provider Read-only provider\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 provider: Provider,\n vault: string,\n shares: bigint\n): Promise<bigint> {\n const vaultContract = new Contract(vault, VAULT_ABI, provider);\n return vaultContract.previewRedeem(shares) as Promise<bigint>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type DepositBlockReason =\n | \"paused\"\n | \"capacity-full\"\n | \"not-whitelisted\"\n | \"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 provider Read-only provider\n * @param vault Vault address\n * @param user User wallet address\n * @returns Eligibility result with reason\n */\nexport async function canDeposit(\n provider: Provider,\n vault: string,\n user: string\n): Promise<DepositEligibility> {\n const config = new Contract(vault, CONFIG_ABI, provider);\n\n const isPaused = await (config.paused() as Promise<boolean>);\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 (config.maxDeposit(user) as Promise<bigint>);\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: string;\n underlyingSymbol: string;\n underlyingDecimals: number;\n}\n\n/**\n * Read display metadata for a vault and its underlying token.\n *\n * @param provider Read-only provider\n * @param vault Vault address\n * @returns Vault and underlying token metadata\n */\nexport async function getVaultMetadata(\n provider: Provider,\n vault: string\n): Promise<VaultMetadata> {\n const MULTICALL3_ADDRESS = \"0xcA11bde05977b3631167028862bE2a173976CA11\";\n const MULTICALL3_ABI = [\n \"function aggregate3(tuple(address target, bool allowFailure, bytes callData)[] calls) payable returns (tuple(bool success, bytes returnData)[] returnData)\",\n ] as const;\n const mc = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);\n const metaIface = new Interface(METADATA_ABI as unknown as string[]);\n const vaultIface = new Interface(VAULT_ABI as unknown as string[]);\n\n // Batch 1: name, symbol, decimals, asset — 1 eth_call via Multicall3\n const b1Calls = [\n { target: vault, allowFailure: false, callData: metaIface.encodeFunctionData(\"name\") },\n { target: vault, allowFailure: false, callData: metaIface.encodeFunctionData(\"symbol\") },\n { target: vault, allowFailure: false, callData: metaIface.encodeFunctionData(\"decimals\") },\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"asset\") },\n ];\n const b1: { success: boolean; returnData: string }[] = await mc.aggregate3.staticCall(b1Calls);\n\n const name = metaIface.decodeFunctionResult(\"name\", b1[0].returnData)[0] as string;\n const symbol = metaIface.decodeFunctionResult(\"symbol\", b1[1].returnData)[0] as string;\n const decimals = Number(metaIface.decodeFunctionResult(\"decimals\", b1[2].returnData)[0]);\n const underlying = vaultIface.decodeFunctionResult(\"asset\", b1[3].returnData)[0] as string;\n\n // Batch 2: underlying symbol + decimals — 1 eth_call via Multicall3\n const b2Calls = [\n { target: underlying, allowFailure: false, callData: metaIface.encodeFunctionData(\"symbol\") },\n { target: underlying, allowFailure: false, callData: metaIface.encodeFunctionData(\"decimals\") },\n ];\n const b2: { success: boolean; returnData: string }[] = await mc.aggregate3.staticCall(b2Calls);\n\n const underlyingSymbol = metaIface.decodeFunctionResult(\"symbol\", b2[0].returnData)[0] as string;\n const underlyingDecimals = Number(metaIface.decodeFunctionResult(\"decimals\", b2[1].returnData)[0]);\n\n return {\n name,\n symbol,\n decimals,\n underlying,\n underlyingSymbol,\n underlyingDecimals,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type AsyncRequestStatus =\n | \"pending\"\n | \"ready-to-execute\"\n | \"completed\"\n | \"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 provider Read-only provider\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 provider: Provider,\n vault: string,\n guid: string\n): Promise<AsyncRequestStatusInfo> {\n const bridge = new Contract(vault, BRIDGE_ABI, provider);\n\n const [info, finalizationResult]: [CrossChainRequestInfo, bigint] =\n await Promise.all([\n bridge.getRequestInfo(guid) as Promise<CrossChainRequestInfo>,\n bridge.getFinalizationResult(guid) as Promise<bigint>,\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 provider Read-only provider\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 provider: Provider,\n vault: string,\n user: string\n): Promise<UserBalances> {\n const mc = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);\n const vaultIface = new Interface(VAULT_ABI as unknown as string[]);\n const decimalsIface = new Interface([\"function decimals() view returns (uint8)\"]);\n\n // Batch 1: shareBalance, decimals, underlying address\n const b1Calls = [\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"balanceOf\", [user]) },\n { target: vault, allowFailure: false, callData: decimalsIface.encodeFunctionData(\"decimals\") },\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"asset\") },\n ];\n\n const b1: { success: boolean; returnData: string }[] = await mc.aggregate3.staticCall(b1Calls);\n\n const shareBalance = vaultIface.decodeFunctionResult(\"balanceOf\", b1[0].returnData)[0] as bigint;\n const underlying = vaultIface.decodeFunctionResult(\"asset\", b1[2].returnData)[0] as string;\n\n // Batch 2: underlying wallet balance + estimated assets (skip convertToAssets if no shares)\n const [underlyingBalance, estimatedAssets] = await Promise.all([\n (new Contract(underlying, ERC20_ABI, provider).balanceOf(user) as Promise<bigint>),\n shareBalance === 0n\n ? Promise.resolve(0n)\n : (new Contract(vault, VAULT_ABI, provider).convertToAssets(shareBalance) as Promise<bigint>),\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 provider Read-only provider\n * @param vault Vault address\n * @param user User wallet address\n * @returns Maximum withdrawable shares and assets\n */\nexport async function getMaxWithdrawable(\n provider: Provider,\n vault: string,\n user: string\n): Promise<MaxWithdrawable> {\n const mc = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);\n const configIface = new Interface(CONFIG_ABI as unknown as string[]);\n const bridgeIface = new Interface(BRIDGE_ABI as unknown as string[]);\n const vaultIface = new Interface(VAULT_ABI as unknown as string[]);\n const erc20Iface = new Interface(ERC20_ABI as unknown as string[]);\n\n // Batch 1: isHub, oraclesCrossChainAccounting, user share balance, underlying\n const b1Calls = [\n { target: vault, allowFailure: false, callData: configIface.encodeFunctionData(\"isHub\") },\n { target: vault, allowFailure: false, callData: bridgeIface.encodeFunctionData(\"oraclesCrossChainAccounting\") },\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"balanceOf\", [user]) },\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"asset\") },\n ];\n\n const b1: { success: boolean; returnData: string }[] = await mc.aggregate3.staticCall(b1Calls);\n\n const isHub = configIface.decodeFunctionResult(\"isHub\", b1[0].returnData)[0] as boolean;\n const oraclesEnabled = bridgeIface.decodeFunctionResult(\"oraclesCrossChainAccounting\", b1[1].returnData)[0] as boolean;\n const userShares = vaultIface.decodeFunctionResult(\"balanceOf\", b1[2].returnData)[0] as bigint;\n const underlying = vaultIface.decodeFunctionResult(\"asset\", b1[3].returnData)[0] as string;\n\n if (userShares === 0n) {\n return { shares: 0n, assets: 0n };\n }\n\n // Batch 2: estimated assets + hub liquid balance\n const b2Calls = [\n { target: vault, allowFailure: false, callData: vaultIface.encodeFunctionData(\"convertToAssets\", [userShares]) },\n { target: underlying, allowFailure: false, callData: erc20Iface.encodeFunctionData(\"balanceOf\", [vault]) },\n ];\n\n const b2: { success: boolean; returnData: string }[] = await mc.aggregate3.staticCall(b2Calls);\n\n const estimatedAssets = vaultIface.decodeFunctionResult(\"convertToAssets\", b2[0].returnData)[0] as bigint;\n const hubLiquidBalance = erc20Iface.decodeFunctionResult(\"balanceOf\", b2[1].returnData)[0] as bigint;\n\n let maxAssets: bigint;\n if (isHub && !oraclesEnabled) {\n maxAssets = estimatedAssets < hubLiquidBalance ? estimatedAssets : hubLiquidBalance;\n } else {\n maxAssets = estimatedAssets;\n }\n\n let maxShares: bigint;\n if (maxAssets < estimatedAssets) {\n const vaultContract = new Contract(vault, VAULT_ABI, provider);\n maxShares = await (vaultContract.convertToShares(maxAssets) as Promise<bigint>);\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 provider Read-only provider\n * @param vault Vault address\n * @returns Merged VaultStatus and VaultMetadata\n */\nexport async function getVaultSummary(\n provider: Provider,\n vault: string\n): Promise<VaultSummary> {\n const [status, metadata] = await Promise.all([\n getVaultStatus(provider, vault),\n getVaultMetadata(provider, vault),\n ]);\n return { ...status, ...metadata };\n}\n"]}
|