export interface WithdrawFlowOption {
    id: string;
    title: string;
    description: string;
    highlighted?: boolean;
}
export interface WithdrawSelectOption {
    value: string;
    label: string;
    iconUrl?: string;
    /** When true, the option is shown but not selectable (e.g. a chain that can't receive the entered address). */
    disabled?: boolean;
}
export interface WithdrawProviderOption {
    id: string;
    name: string;
    quote: string;
    fee: string;
    badge?: "best" | "low-kyc";
    highlighted?: boolean;
}
export interface WithdrawSummary {
    amountReceived: string;
    network: string;
    toWallet: string;
    fees: string;
}
export interface WithdrawFeeEstimate {
    estimatedFees: string;
    networkReserve: string;
    youReceive: string;
}
export interface WithdrawFlowData {
    /** Top-level balance shown in the entry step (numeric, e.g. 179.9). */
    balance: number;
    /** Display string for the balance shown in the amount step, e.g. "179.9 USDC". */
    balanceDisplay: string;
    amount: string;
    destinationWallet: string;
    tokenOptions: WithdrawSelectOption[];
    networkOptions: WithdrawSelectOption[];
    selectedToken: string;
    selectedNetwork: string;
    purchaseSummary: WithdrawSummary;
    /**
     * The submitted withdrawal id, populated once the API call succeeds.
     * `null` until then. Used by the success step to subscribe to
     * `withdrawal_lifecycle` WS events.
     */
    withdrawalId: string | null;
    /**
     * True when the user clicked Max — the backend should apply its own cap
     * rather than rejecting an over-balance request. Reset to false when the
     * user manually edits the amount field afterward.
     */
    isMax: boolean;
}
export type WithdrawMethod = "wallet";
export interface WithdrawModalControlledProps {
    /** Whether the withdraw modal is currently open. */
    open: boolean;
    /** Called whenever the withdraw modal open state changes. */
    onOpenChange: (open: boolean) => void;
    /** Controlled state for the withdraw flow. */
    withdrawFlow: WithdrawFlowData;
    /** Called when the recipient address input changes. */
    onWithdrawDestinationChange: (address: string) => void;
    /** Called when the withdraw amount changes. */
    onWithdrawAmountChange: (amount: string) => void;
    /** Called when the withdraw token changes. */
    onWithdrawTokenChange: (token: string) => void;
    /** Called when the withdraw network changes. */
    onWithdrawNetworkChange: (network: string) => void;
    /** Called when the user clicks Max to fill the maximum withdrawable amount. */
    onMaxClick?: () => void;
    /** Called when the user confirms the withdrawal (triggers API call). Must return a promise so the modal can lock duplicate submissions and surface request errors. */
    onSelectWithdrawProvider: (providerId: string) => Promise<void>;
    /** Called after the withdraw flow completes and the user clicks Done. */
    onDoneWithdraw: () => void;
}
export interface WithdrawModalSelfDrivenProps {
    /** Whether the withdraw modal is currently open. */
    open: boolean;
    /** Called whenever the withdraw modal open state changes. */
    onOpenChange: (open: boolean) => void;
}
export type WithdrawModalProps = WithdrawModalControlledProps | WithdrawModalSelfDrivenProps;
