import { IInitData, AccountInfo, NetworkInfo, UserResponse, EndlessSignMessageInput, EndlessSignMessageOutput, EndlessSignAndSubmitTransactionInput, EndlessWalletTransactionType } from './types.mjs';
import './utils/index.mjs';

interface IMetaData {
    gameId: string;
    userId: string;
    walletAddress: string;
}
interface IMessageData {
    uuid: string;
    methodName: string;
    from?: string | null;
    metadata: IMetaData;
    initData?: IInitData;
    data: unknown;
}
interface IResponseMessageData {
    uuid: string;
    status: string;
    data: any;
    methodName: string;
    errMsg?: string;
}
interface IRequestData {
    method: MethodName;
    data?: unknown;
    initData?: IInitData;
}
declare enum EndLessSDKEvent {
    CONNECT = "connect",
    GETACCOUNT = "getAccount",
    DISCONNECT = "disconnect",
    ACCOUNT_CHANGE = "accountChange",
    NETWORK_CHANGE = "networkChange"
}
type EndLessSDKEventType = (typeof EndLessSDKEvent)[keyof typeof EndLessSDKEvent];
interface EndLessSDKEventsMap {
    [EndLessSDKEvent.CONNECT]: AccountInfo;
    [EndLessSDKEvent.DISCONNECT]: void;
    [EndLessSDKEvent.ACCOUNT_CHANGE]: AccountInfo;
    [EndLessSDKEvent.GETACCOUNT]: AccountInfo[];
    [EndLessSDKEvent.GETACCOUNT]: AccountInfo[];
    [EndLessSDKEvent.NETWORK_CHANGE]: NetworkInfo;
}
type EndLessSDKEventPayload<T extends EndLessSDKEventType> = T extends keyof EndLessSDKEventsMap ? EndLessSDKEventsMap[T] : undefined;
type EndLessSDKEventListenersType = {
    [K in EndLessSDKEventType]?: Array<(payload: EndLessSDKEventPayload<K>) => void>;
};

interface Metadata {
    title: string;
    url: string;
    origin: string;
    icon: string;
    gameId: string;
    userId: string;
    walletAddress: string;
}

declare enum MethodName {
    CONNECT = "connect",
    GETACCOUNT = "getAccount",
    DISCONNECT = "disconnect",
    NETWORK_CHANGE = "switchNetwork",
    SIGN_MESSAGE = "signMessage",
    SEND_TRANSACTION = "sendTransaction",
    SIGN_AND_SUBMIT_TRANSACTION = "signAndSubmitTransaction",
    SIGN_BUILD_TRANSACTION = "signBuildTransaction",
    ACCOUNT_CHANGE = "accountChange"
}
declare class EndlessLuffaSdk {
    static readonly version: string;
    private static _instance;
    private message;
    private _metadata;
    private _initData;
    private _endless;
    private _endlessConfig;
    private accountAddress;
    static getIninData: () => IInitData;
    static getAccountAddress: () => string | null;
    static setAccountAddress: (accountAddress: string | null) => void;
    constructor(initData: IInitData);
    private initConfig;
    private initWalletEvent;
    changeNetwork(initData: IInitData): void;
    private getMetadata;
    request: (data: IRequestData, callback?: (data: unknown) => void) => void;
    getAccount: () => Promise<UserResponse<AccountInfo>>;
    connect: (callback?: (data: AccountInfo) => void) => Promise<UserResponse<AccountInfo>>;
    disconnect: (callback?: (data: unknown) => void) => Promise<void>;
    signMessage: (data: EndlessSignMessageInput, callback?: (data: unknown) => void) => Promise<UserResponse<EndlessSignMessageOutput>>;
    on: <K extends EndLessSDKEventType>(methodName: K, callback: (payload: EndLessSDKEventPayload<K>) => void) => void;
    off: <K extends EndLessSDKEventType>(methodName: K, callback?: (payload: EndLessSDKEventPayload<K>) => void) => void;
    signAndSubmitTransaction: (data: EndlessSignAndSubmitTransactionInput) => Promise<UserResponse<{
        hash: string;
    }>>;
    signTransaction: (transactionHex: string, transactionType?: EndlessWalletTransactionType) => Promise<UserResponse<{
        data: string;
    }>>;
    onAccountChange: (callback: (data: AccountInfo) => void) => void;
    onNetworkChange: (callback: (data: NetworkInfo) => void) => void;
}

export { type EndLessSDKEventType as E, type IMessageData as I, type Metadata as M, type EndLessSDKEventPayload as a, type IMetaData as b, type IResponseMessageData as c, type IRequestData as d, EndLessSDKEvent as e, type EndLessSDKEventsMap as f, type EndLessSDKEventListenersType as g, MethodName as h, EndlessLuffaSdk as i };
