import type { IAddress } from '../../types'; export interface IOVaultSdkDependency { OVaultSyncMessageBuilder: { generateOVaultInputs: (input: unknown) => Promise; [key: string]: unknown; }; OVaultSyncOperations: { DEPOSIT: string; REDEEM: string; }; } export interface ICrossChainVaultConfig { vaultName: string; vaultSymbol: string; hubChainId: number; vaultAddress: IAddress; spokeChainIds: number[]; contracts: { assetToken: Record; assetOFT: Record; shareOFTAdapter: IAddress; composerSync: IAddress; shareOFT: Record; }; layerZeroEids: { hub: number; spokes: Record; }; multiAsset?: { hubAssetAddress: IAddress; }; } export type CrossChainOperation = 'DEPOSIT' | 'REDEEM'; export interface ICrossChainBuildRequest { ovaultSdk: IOVaultSdkDependency; config: ICrossChainVaultConfig; operation: CrossChainOperation; amount: string | number | bigint; decimals: number; userChainId: number; walletAddress: IAddress; destinationChainId?: number; recipientAddress?: IAddress; slippageBps?: number; hubChain: unknown; sourceChain: unknown; feeBufferPercent?: number; hubLzComposeGasLimit?: bigint; } export interface ICrossChainBuildResult { success: boolean; data?: { contractAddress: IAddress; contractFunctionName: string; abi: readonly unknown[]; txArgs: readonly unknown[]; messageValue: bigint; messageFee: { nativeFee: bigint; lzTokenFee: bigint; }; dstAmount: bigint; minDstAmount: bigint; approval?: { tokenAddress: IAddress; spender: IAddress; amount: bigint; }; }; error?: string; } export interface ICrossChainDepositRequest { ovaultSdk: IOVaultSdkDependency; config: ICrossChainVaultConfig; amount: string; decimals: number; userChainId: number; walletAddress: IAddress; walletClient: unknown; publicClient: unknown; hubChain: unknown; sourceChain: unknown; destinationChainId?: number; skipApprovalCheck?: boolean; slippageBps?: number; feeBufferPercent?: number; gasBufferPercent?: number; } export interface ICrossChainDepositResult { transactionHash: string; success: boolean; } export interface ICrossChainRedeemRequest { ovaultSdk: IOVaultSdkDependency; config: ICrossChainVaultConfig; amount: string; decimals: number; userChainId: number; walletAddress: IAddress; walletClient: unknown; publicClient: unknown; hubChain: unknown; sourceChain: unknown; destinationChainId?: number; skipApprovalCheck?: boolean; slippageBps?: number; feeBufferPercent?: number; gasBufferPercent?: number; minGasLimit?: bigint; } export interface ICrossChainRedeemResult { transactionHash: string; success: boolean; } export interface IQuoteCrossChainDepositRequest { ovaultSdk: IOVaultSdkDependency; config: ICrossChainVaultConfig; amount: string; decimals: number; userChainId: number; walletAddress: IAddress; hubChain: unknown; sourceChain: unknown; destinationChainId?: number; slippageBps?: number; feeBufferPercent?: number; } export interface IQuoteCrossChainRedeemRequest { ovaultSdk: IOVaultSdkDependency; config: ICrossChainVaultConfig; amount: string; decimals: number; walletAddress: IAddress; hubChain: unknown; sourceChain: unknown; destinationChainId?: number; slippageBps?: number; feeBufferPercent?: number; } export interface IQuoteCrossChainResult { nativeFee: bigint; dstAmount: bigint; minDstAmount: bigint; } export interface ICrossChainOperationStatus { srcTxHash: string; status: 'PENDING' | 'INFLIGHT' | 'DELIVERED' | 'FAILED'; srcChainId: number; dstChainId: number; } export interface IRefundStatus { refunded: boolean; refundTxHash?: string; refundAmount?: bigint; refundChainId?: number; } export type CrossChainErrorType = 'max-deposit' | 'nonce' | 'no-peer' | 'bridge-fee' | 'insufficient-balance' | 'user-rejected' | 'gas' | 'network' | 'unknown';