/// <reference types="node" />
import type { XummSdk, XummSdkJwt, xAppOttData, Payload, JwtUserdata, Storage, Push } from "xumm-sdk";
import type { XummPkceEvent, ResolvedFlow, XummProfile } from "xumm-oauth2-pkce";
import type { xApp, xAppEvent } from "xumm-xapp-sdk";
import { EventEmitter } from "events";
export interface UniversalSdkEvent {
    logout: () => void;
    ready: () => void;
    retrieving: () => void;
}
/**
 * Development?
 *   npm run watch (tsc in watch mode)
 *   npm run browserify-watch (watch, browserify tsc output)
 *   npm run serve (webserver, :3001)
 *   npm run dev (watch, nodemon dist/samples/index.js)
 *   ngrok start dev (local :3001 to https:// dev URL)
 *     > https://.../sample/
 */
declare enum Runtimes {
    cli = "cli",
    browser = "browser",
    xapp = "xapp"
}
type Runtime = Record<Runtimes, boolean>;
export declare interface Xumm {
    on<U extends keyof UniversalSdkEvent>(event: U, listener: UniversalSdkEvent[U]): this;
    on<U extends keyof xAppEvent>(event: U, listener: xAppEvent[U]): this;
    on<U extends keyof XummPkceEvent>(event: U, listener: XummPkceEvent[U]): this;
    off<U extends keyof UniversalSdkEvent>(event: U, listener: UniversalSdkEvent[U]): this;
    off<U extends keyof xAppEvent>(event: U, listener: xAppEvent[U]): this;
    off<U extends keyof XummPkceEvent>(event: U, listener: XummPkceEvent[U]): this;
}
/**
 * The Promisified type takes an entire class and expects all methods
 * to return a Promise of their method's native return values
 */
type Promisified<T> = {
    [K in keyof T]: T[K] extends (...args: infer A) => infer R ? (...args: A) => Promise<R> : T[K];
};
interface Environment {
    ott?: Promise<xAppOttData | undefined>;
    jwt?: Promise<{
        client_id: string;
        scope?: string;
        state?: string;
        aud: string;
        sub: string;
        email?: string;
        app_uuidv4: string;
        app_name: string;
        payload_uuidv4?: string;
        usertoken_uuidv4?: string;
        network_type?: string;
        network_endpoint?: string;
        network_id?: number;
        iat: number;
        exp: number;
        iss: string;
        usr?: string;
        net?: string;
        [key: string]: any;
    } | undefined>;
    openid?: Promise<{
        sub: string;
        email: string;
        picture: string;
        account: string;
        name: string;
        domain?: string;
        blocked: boolean;
        source?: string;
        kycApproved: boolean;
        proSubscription: boolean;
        networkType: string;
        networkEndpoint: string;
        networkId?: number;
        profile?: XummProfile;
        [key: string]: any;
    } | undefined>;
    bearer?: Promise<string>;
    retrieving: Promise<void>;
    ready: Promise<void>;
    success: Promise<void>;
    retrieved: Promise<void>;
}
declare class UnifiedUserData {
    account: Promise<string | undefined>;
    picture: Promise<string | undefined>;
    name: Promise<string | undefined>;
    domain: Promise<string | undefined>;
    source: Promise<string | undefined>;
    networkType: Promise<string | undefined>;
    networkEndpoint: Promise<string | undefined>;
    networkId: Promise<number | undefined>;
    blocked: Promise<boolean | undefined>;
    kycApproved: Promise<boolean | undefined>;
    proSubscription: Promise<boolean | undefined>;
    profile: Promise<XummProfile | undefined>;
    token: Promise<string | null>;
}
/**
 * This is where the magic happens
 */
export declare class Xumm extends EventEmitter {
    private instance;
    private jwtCredential;
    runtime: Runtime;
    state: {
        account: string;
        signedIn: boolean;
    };
    user: UnifiedUserData;
    environment: Environment;
    payload?: Promisified<Payload>;
    xapp?: xApp;
    userstore?: Promisified<JwtUserdata>;
    backendstore?: Promisified<Storage>;
    helpers?: Promisified<Pick<XummSdkJwt, "ping" | "getCuratedAssets" | "getKycStatus" | "getTransaction" | "verifyUserTokens" | "getRates" | "getNftokenDetail">>;
    push?: Promisified<Push>;
    private apiKeyOrJwt;
    private apiSecretOrOtt?;
    constructor(apiKeyOrJwt: string, apiSecretOrOtt?: string);
    private initialize;
    /**
     * PKCE
     */
    authorize(): Promise<ResolvedFlow | undefined | Error>;
    /**
     * TODO: CHECK IF EVENTS ARE NOT REGISTERED AND FIRING TWICE
     */
    private handlePkceEvents;
    logout(): Promise<void>;
    /**
     * SDK
     */
    ping(): Promise<ReturnType<XummSdk["ping"]> | undefined>;
}
export {};
