// ABI type definitions that are framework-agnostic
export interface ABIFunction {
    type: 'function';
    name: string;
    inputs: ABIInput[];
    outputs: ABIOutput[];
    stateMutability: 'pure' | 'view' | 'nonpayable' | 'payable';
}

export interface ABIEvent {
    type: 'event';
    name: string;
    inputs: ABIInput[];
    anonymous: boolean;
}

export interface ABIError {
    type: 'error';
    name: string;
    inputs: ABIInput[];
}

export interface ABIConstructor {
    type: 'constructor';
    inputs: ABIInput[];
    stateMutability: 'nonpayable' | 'payable';
}

export interface ABIFallback {
    type: 'fallback';
    stateMutability: 'nonpayable' | 'payable';
}

export interface ABIReceive {
    type: 'receive';
    stateMutability: 'payable';
}

export interface ABIInput {
    name: string;
    type: string;
    indexed?: boolean;
    components?: ABIInput[];
    internalType?: string;
}

export interface ABIOutput {
    name: string;
    type: string;
    components?: ABIOutput[];
    internalType?: string;
}

export type ABIEntry =
    | ABIFunction
    | ABIEvent
    | ABIError
    | ABIConstructor
    | ABIFallback
    | ABIReceive;

export type ContractABI = ABIEntry[];

export interface ABICollection {
    [contractName: string]: ContractABI;
} 