import type { AccountInterface, ProviderInterface } from "starknet";
import type { AccountInterface as AccountInterfaceV4, ProviderInterface as ProviderInterfaceV4 } from "starknet4";
export declare type AccountChangeEventHandler = (accounts: string[]) => void;
export declare type NetworkChangeEventHandler = (network?: string) => void;
export declare type WalletEvents = {
    type: "accountsChanged";
    handler: AccountChangeEventHandler;
} | {
    type: "networkChanged";
    handler: NetworkChangeEventHandler;
};
export interface WatchAssetParameters {
    type: "ERC20";
    options: {
        address: string;
        symbol?: string;
        decimals?: number;
        image?: string;
        name?: string;
    };
}
export interface AddStarknetChainParameters {
    id: string;
    chainId: string;
    chainName: string;
    baseUrl: string;
    rpcUrls?: string[];
    blockExplorerUrls?: string[];
    nativeCurrency?: {
        address: string;
        name: string;
        symbol: string;
        decimals: number;
    };
    iconUrls?: string[];
}
export interface SwitchStarknetChainParameter {
    chainId: string;
}
export declare type RpcMessage = {
    type: "wallet_watchAsset";
    params: WatchAssetParameters;
    result: boolean;
} | {
    type: "wallet_addStarknetChain";
    params: AddStarknetChainParameters;
    result: boolean;
} | {
    type: "wallet_switchStarknetChain";
    params: SwitchStarknetChainParameter;
    result: boolean;
};
export interface IStarknetWindowObject {
    id: string;
    name: string;
    version: string;
    icon: string;
    request: <T extends RpcMessage>(call: Omit<T, "result">) => Promise<T["result"]>;
    enable: (options?: {
        starknetVersion?: "v4" | "v5";
    }) => Promise<string[]>;
    isPreauthorized: () => Promise<boolean>;
    on: <E extends WalletEvents>(event: E["type"], handleEvent: E["handler"]) => void;
    off: <E extends WalletEvents>(event: E["type"], handleEvent: E["handler"]) => void;
    account?: AccountInterface | AccountInterfaceV4;
    provider?: ProviderInterface | ProviderInterfaceV4;
    selectedAddress?: string;
    chainId?: string;
    isConnected: boolean;
}
export interface ConnectedStarknetWindowObject extends IStarknetWindowObject {
    isConnected: true;
    account: AccountInterface | AccountInterfaceV4;
    provider: ProviderInterface | ProviderInterfaceV4;
    selectedAddress: string;
    chainId: string;
}
export interface DisconnectedStarknetWindowObject extends IStarknetWindowObject {
    isConnected: false;
}
export declare type StarknetWindowObject = ConnectedStarknetWindowObject | DisconnectedStarknetWindowObject;
declare global {
    interface Window {
        starknet?: StarknetWindowObject;
        starknet_braavos?: StarknetWindowObject;
        starknet_argentX?: StarknetWindowObject;
        starknet_metamask?: StarknetWindowObject;
        [key: `starknet_${string}`]: StarknetWindowObject | undefined;
    }
}
