import { type AccrualVault, type AccrualVaultV2 } from "@morpho-org/blue-sdk"; import { fetchAccrualVault } from "@morpho-org/blue-sdk-viem"; import { type Address } from "viem"; import { type DepositAmountArgs, type ERC20ApprovalAction, type MorphoClientType, type Requirement, type RequirementSignature, type Transaction, type VaultV1DepositAction, type VaultV1MigrateToV2Action, type VaultV1RedeemAction, type VaultV1WithdrawAction } from "../../types"; import type { FetchParameters } from "../../types/data"; export interface VaultV1Actions { /** * Fetches the latest vault data with accrued interest. * * @param {FetchParameters} [parameters] - Optional fetch parameters (block number, state overrides, etc.). * @returns {Promise>>} The latest accrued vault data. */ getData: (parameters?: FetchParameters) => Promise>>; /** * Prepares a deposit into a VaultV1 (MetaMorpho) contract. * * Uses pre-fetched accrual vault data to compute `maxSharePrice` with slippage tolerance, * then returns `buildTx` and `getRequirements` for lazy evaluation. * * @param {Object} params - The deposit parameters. * @param {bigint} params.amount - Amount of assets to deposit. * @param {Address} params.userAddress - User address initiating the deposit. * @param {AccrualVault} params.accrualVault - Pre-fetched vault data with asset address and share conversion. * @param {bigint} [params.slippageTolerance=DEFAULT_SLIPPAGE_TOLERANCE] - Slippage tolerance (default 0.03%, max 10%). * @param {bigint} [params.nativeAmount] - Amount of native ETH to wrap into WETH. Vault asset must be wNative. * @returns {Object} Object with `buildTx` and `getRequirements`. */ deposit: (params: { userAddress: Address; accrualVault: AccrualVault; slippageTolerance?: bigint; } & DepositAmountArgs) => { buildTx: (requirementSignature?: RequirementSignature) => Readonly>; getRequirements: (params?: { useSimplePermit?: boolean; }) => Promise<(Readonly> | Requirement)[]>; }; /** * Prepares a withdraw from a VaultV1 (MetaMorpho) contract. * * @param {Object} params - The withdraw parameters. * @param {bigint} params.amount - Amount of assets to withdraw. * @param {Address} params.userAddress - User address initiating the withdraw. * @returns {Object} Object with `buildTx`. */ withdraw: (params: { amount: bigint; userAddress: Address; }) => { buildTx: () => Readonly>; }; /** * Prepares a redeem from a VaultV1 (MetaMorpho) contract. * * @param {Object} params - The redeem parameters. * @param {bigint} params.shares - Amount of shares to redeem. * @param {Address} params.userAddress - User address initiating the redeem. * @returns {Object} Object with `buildTx`. */ redeem: (params: { shares: bigint; userAddress: Address; }) => { buildTx: () => Readonly>; }; /** * Prepares a full migration from VaultV1 to VaultV2. * * Redeems all V1 shares and atomically deposits the resulting assets into V2 * via bundler3. Computes slippage-protected share prices for both legs. * * @param {Object} params - The migration parameters. * @param {Address} params.userAddress - User address initiating the migration. * @param {AccrualVault} params.sourceVault - Pre-fetched V1 vault data. * @param {AccrualVaultV2} params.targetVault - Pre-fetched V2 vault data. * @param {bigint} params.shares - User's V1 share balance to migrate. * @param {bigint} [params.slippageTolerance=DEFAULT_SLIPPAGE_TOLERANCE] - Slippage tolerance (default 0.03%, max 10%). * @returns {Object} Object with `buildTx` and `getRequirements`. */ migrateToV2: (params: { userAddress: Address; sourceVault: AccrualVault; targetVault: AccrualVaultV2; shares: bigint; slippageTolerance?: bigint; }) => { buildTx: (requirementSignature?: RequirementSignature) => Readonly>; getRequirements: (params?: { useSimplePermit?: boolean; }) => Promise<(Readonly> | Requirement)[]>; }; } export declare class MorphoVaultV1 implements VaultV1Actions { private readonly client; private readonly vault; private readonly chainId; constructor(client: MorphoClientType, vault: Address, chainId: number); getData(parameters?: FetchParameters): Promise; deposit({ amount, userAddress, accrualVault, slippageTolerance, nativeAmount, }: { userAddress: Address; accrualVault: AccrualVault; slippageTolerance?: bigint; } & DepositAmountArgs): { getRequirements: (params?: { useSimplePermit?: boolean; }) => Promise<(Requirement | Readonly>)[]>; buildTx: (requirementSignature?: RequirementSignature) => Readonly>; }; withdraw({ amount, userAddress }: { amount: bigint; userAddress: Address; }): { buildTx: () => Readonly>; }; redeem({ shares, userAddress }: { shares: bigint; userAddress: Address; }): { buildTx: () => Readonly>; }; migrateToV2({ userAddress, sourceVault, targetVault, shares, slippageTolerance, }: { userAddress: Address; sourceVault: AccrualVault; targetVault: AccrualVaultV2; shares: bigint; slippageTolerance?: bigint; }): { getRequirements: (params?: { useSimplePermit?: boolean; }) => Promise<(Requirement | Readonly>)[]>; buildTx: (requirementSignature?: RequirementSignature) => Readonly>; }; }