/// <reference types="bn.js" />
import { AddressLookupTableAccount, Connection, PublicKey, TransactionInstruction, TransactionMessage, VersionedTransaction } from '@solana/web3.js';
import { BN } from '../isomorphic/anchor';
import { SwapMode } from '../swap/UnifiedSwapClient';
export interface MarketInfo {
    id: string;
    inAmount: number;
    inputMint: string;
    label: string;
    lpFee: Fee;
    notEnoughLiquidity: boolean;
    outAmount: number;
    outputMint: string;
    platformFee: Fee;
    priceImpactPct: number;
}
export interface Fee {
    amount: number;
    mint: string;
    pct: number;
}
export interface Route {
    amount: number;
    inAmount: number;
    marketInfos: MarketInfo[];
    otherAmountThreshold: number;
    outAmount: number;
    priceImpactPct: number;
    slippageBps: number;
    swapMode: SwapMode;
}
/**
 *
 * @export
 * @interface RoutePlanStep
 */
export interface RoutePlanStep {
    /**
     *
     * @type {SwapInfo}
     * @memberof RoutePlanStep
     */
    swapInfo: SwapInfo;
    /**
     *
     * @type {number}
     * @memberof RoutePlanStep
     */
    percent: number;
}
export interface SwapInfo {
    /**
     *
     * @type {string}
     * @memberof SwapInfo
     */
    ammKey: string;
    /**
     *
     * @type {string}
     * @memberof SwapInfo
     */
    label?: string;
    /**
     *
     * @type {string}
     * @memberof SwapInfo
     */
    inputMint: string;
    /**
     *
     * @type {string}
     * @memberof SwapInfo
     */
    outputMint: string;
    /**
     *
     * @type {string}
     * @memberof SwapInfo
     */
    inAmount: string;
    /**
     *
     * @type {string}
     * @memberof SwapInfo
     */
    outAmount: string;
    /**
     *
     * @type {string}
     * @memberof SwapInfo
     */
    feeAmount: string;
    /**
     *
     * @type {string}
     * @memberof SwapInfo
     */
    feeMint: string;
}
/**
 *
 * @export
 * @interface PlatformFee
 */
export interface PlatformFee {
    /**
     *
     * @type {string}
     * @memberof PlatformFee
     */
    amount?: string;
    /**
     *
     * @type {number}
     * @memberof PlatformFee
     */
    feeBps?: number;
}
/**
 *
 * @export
 * @interface QuoteResponse
 */
export interface QuoteResponse {
    /**
     *
     * @type {string}
     * @memberof QuoteResponse
     */
    inputMint: string;
    /**
     *
     * @type {string}
     * @memberof QuoteResponse
     */
    inAmount: string;
    /**
     *
     * @type {string}
     * @memberof QuoteResponse
     */
    outputMint: string;
    /**
     *
     * @type {string}
     * @memberof QuoteResponse
     */
    outAmount: string;
    /**
     *
     * @type {string}
     * @memberof QuoteResponse
     */
    otherAmountThreshold: string;
    /**
     *
     * @type {SwapMode}
     * @memberof QuoteResponse
     */
    swapMode: SwapMode;
    /**
     *
     * @type {number}
     * @memberof QuoteResponse
     */
    slippageBps: number;
    /**
     *
     * @type {PlatformFee}
     * @memberof QuoteResponse
     */
    platformFee?: PlatformFee;
    /**
     *
     * @type {string}
     * @memberof QuoteResponse
     */
    priceImpactPct: string;
    /**
     *
     * @type {Array<RoutePlanStep>}
     * @memberof QuoteResponse
     */
    routePlan: Array<RoutePlanStep>;
    /**
     *
     * @type {number}
     * @memberof QuoteResponse
     */
    contextSlot?: number;
    /**
     *
     * @type {number}
     * @memberof QuoteResponse
     */
    timeTaken?: number;
    /**
     *
     * @type {string}
     * @memberof QuoteResponse
     */
    error?: string;
    /**
     *
     * @type {string}
     * @memberof QuoteResponse
     */
    errorCode?: string;
}
export declare const RECOMMENDED_JUPITER_API_VERSION = "/v1";
/** @deprecated Use RECOMMENDED_JUPITER_API instead. lite-api.jup.ag requires migration to api.jup.ag with API key. */
export declare const LEGACY_JUPITER_API = "https://lite-api.jup.ag/swap";
export declare const RECOMMENDED_JUPITER_API = "https://api.jup.ag/swap";
export declare class JupiterClient {
    url: string;
    connection: Connection;
    lookupTableCahce: Map<string, AddressLookupTableAccount>;
    private apiKey?;
    /**
     * Create a Jupiter client
     * @param connection - Solana connection
     * @param url - Optional custom API URL. Defaults to https://api.jup.ag/swap
     * @param apiKey - API key for Jupiter API. Required for api.jup.ag (free tier available at https://portal.jup.ag)
     */
    constructor({ connection, url, apiKey, }: {
        connection: Connection;
        url?: string;
        apiKey?: string;
    });
    /**
     * Get the headers for API requests, including API key if configured
     */
    private getHeaders;
    /**
     * Get routes for a swap
     * @param inputMint the mint of the input token
     * @param outputMint the mint of the output token
     * @param amount the amount of the input token
     * @param slippageBps the slippage tolerance in basis points
     * @param swapMode the swap mode (ExactIn or ExactOut)
     * @param onlyDirectRoutes whether to only return direct routes
     */
    getQuote({ inputMint, outputMint, amount, maxAccounts, // 50 is an estimated amount with buffer
    slippageBps, swapMode, onlyDirectRoutes, excludeDexes, autoSlippage, maxAutoSlippageBps, usdEstimate, }: {
        inputMint: PublicKey;
        outputMint: PublicKey;
        amount: BN;
        maxAccounts?: number;
        slippageBps?: number;
        swapMode?: SwapMode;
        onlyDirectRoutes?: boolean;
        excludeDexes?: string[];
        autoSlippage?: boolean;
        maxAutoSlippageBps?: number;
        usdEstimate?: number;
    }): Promise<QuoteResponse>;
    /**
     * Get a swap transaction for quote
     * @param quoteResponse quote to perform swap
     * @param userPublicKey the signer's wallet public key
     * @param slippageBps the slippage tolerance in basis points
     */
    getSwap({ quote, userPublicKey, slippageBps, }: {
        quote: QuoteResponse;
        userPublicKey: PublicKey;
        slippageBps?: number;
    }): Promise<VersionedTransaction>;
    /**
     * Get the transaction message and lookup tables for a transaction
     * @param transaction
     */
    getTransactionMessageAndLookupTables({ transaction, }: {
        transaction: VersionedTransaction;
    }): Promise<{
        transactionMessage: TransactionMessage;
        lookupTables: AddressLookupTableAccount[];
    }>;
    getLookupTable(accountKey: PublicKey): Promise<AddressLookupTableAccount>;
    /**
     * Get the jupiter instructions from transaction by filtering out instructions to compute budget and associated token programs
     * @param transactionMessage the transaction message
     * @param inputMint the input mint
     * @param outputMint the output mint
     */
    getJupiterInstructions({ transactionMessage, inputMint, outputMint, }: {
        transactionMessage: TransactionMessage;
        inputMint: PublicKey;
        outputMint: PublicKey;
    }): TransactionInstruction[];
}
