import { IInitData, AccountInfo, NetworkInfo } from '../types.mjs';

interface IMetaData {
    gameId: string;
    userId: string;
    walletAddress: string;
}
interface IMessageData {
    uuid: string;
    methodName: string;
    from?: string | null;
    metadata: IMetaData;
    initData?: IInitData;
    data: any;
}
interface IResponseMessageData {
    uuid: string;
    status: string;
    data: any;
    methodName: string;
    errMsg?: string;
}
interface IRequestData {
    initData?: IInitData;
    method: string;
    params: any;
}
declare enum EvmSDKEvent {
    CONNECT = "connect",
    GETACCOUNT = "getAccount",
    DISCONNECT = "disconnect",
    ACCOUNT_CHANGE = "accountChange",
    ACCOUNTS_CHANGE = "accountsChanged",
    NETWORK_CHANGE = "luffa_switchChain",
    CHAIN_CHANGED = "chainChanged"
}
type EvmSDKEventType = (typeof EvmSDKEvent)[keyof typeof EvmSDKEvent];
interface EvmSDKEventsMap {
    [EvmSDKEvent.CONNECT]: string[];
    [EvmSDKEvent.DISCONNECT]: void;
    [EvmSDKEvent.ACCOUNT_CHANGE]: AccountInfo;
    [EvmSDKEvent.ACCOUNTS_CHANGE]: string[];
    [EvmSDKEvent.GETACCOUNT]: AccountInfo[];
    [EvmSDKEvent.NETWORK_CHANGE]: NetworkInfo;
    [EvmSDKEvent.CHAIN_CHANGED]: string;
}
type EvmSDKEventPayload<T extends EvmSDKEventType> = T extends keyof EvmSDKEventsMap ? EvmSDKEventsMap[T] : undefined;
type EvmSDKEventListenersType = {
    [K in EvmSDKEventType]?: Array<(payload: EvmSDKEventPayload<K>) => void>;
};

export { EvmSDKEvent, type EvmSDKEventListenersType, type EvmSDKEventPayload, type EvmSDKEventType, type EvmSDKEventsMap, type IMessageData, type IMetaData, type IRequestData, type IResponseMessageData };
