import { AnyObjectType, Balance, Percentage, Event, Slippage, ObjectId, SuiAddress, TxBytes, BigIntAsString, SerializedTransaction, ExternalFee, IFixed, ApiIndexerEventsBody } from "../../general/types/generalTypes";
import { CoinType, ServiceCoinData } from "../coin/coinTypes";
import { TransactionObjectArgument } from "@mysten/sui/transactions";
import { TransactionObjectArgument as TransactionObjectArgumentV0 } from "@mysten/sui.js/transactions";
export type UniqueId = string;
/**
 * Fee info for third party packages wanting to fee route transactions
 * @deprecated please use `ExternalFee` instead
 */
export type RouterExternalFee = ExternalFee;
export type RouterProtocolName = "Aftermath" | "BlueMove" | "Cetus" | "DeepBook" | "DeepBookV3" | "DoubleUpPump" | "FlowX" | "FlowXClmm" | "HopFun" | "Kriya" | "KriyaClmm" | "Magma" | "Metastable" | "MovePump" | "Obric" | "SuiSwap" | "Turbos" | "SpringSui" | "Steamm" | "Bluefin" | "TurbosFun";
export type RouterCompleteTradeRoute = RouterTradeInfo & {
    routes: RouterTradeRoute[];
    netTradeFeePercentage: Percentage;
    referrer?: SuiAddress;
    externalFee?: ExternalFee;
    slippage?: Slippage;
};
/**
 * @deprecated please use `RouterCompleteTradeRoute` instead
 */
export type RouterCompleteTradeRouteWithFee = RouterCompleteTradeRoute;
export type RouterTradeRoute = RouterTradeInfo & {
    paths: RouterTradePath[];
    portion: IFixed;
};
export type RouterTradePath = RouterTradeInfo & {
    protocolName: RouterProtocolName;
    poolId: ObjectId;
    poolMetadata: any;
};
export interface RouterTradeInfo {
    coinIn: RouterTradeCoin;
    coinOut: RouterTradeCoin;
    spotPrice: number;
}
export interface RouterTradeCoin {
    type: CoinType;
    amount: Balance;
    tradeFee: Balance;
}
export interface RouterTradeEvent extends Event {
    trader: SuiAddress;
    coinInType: AnyObjectType;
    coinInAmount: Balance;
    coinOutType: AnyObjectType;
    coinOutAmount: Balance;
}
export type ApiRouterPartialCompleteTradeRouteBody = {
    /**
     * Coin type of coin being given away
     */
    coinInType: CoinType;
    /**
     * Coin type of coin being received
     */
    coinOutType: CoinType;
    /**
     * Optional address for referrer of the route creator
     */
    referrer?: SuiAddress;
    /**
     * Fee info for third party packages wanting to fee route transactions
     */
    externalFee?: ExternalFee;
} & ({
    protocolBlacklist?: RouterProtocolName[];
} | {
    protocolWhitelist?: RouterProtocolName[];
});
/**
 * Details for router to construct trade route
 */
export type ApiRouterCompleteTradeRouteBody = ApiRouterPartialCompleteTradeRouteBody & ({
    /**
     * Amount of coin being given away
     */
    coinInAmount: Balance;
} | {
    /**
     * Amount of coin expected to receive
     */
    coinOutAmount: Balance;
    slippage: Slippage;
});
/**
 * Info to construct router trade transaction from complete route
 */
export interface ApiRouterTransactionForCompleteTradeRouteBody {
    /**
     * Sender address (trader)
     */
    walletAddress: SuiAddress;
    /**
     * Complete route followed by `coinIn` to get to `coinOut`
     */
    completeRoute: RouterCompleteTradeRoute;
    /**
     * Allowable percent loss for trade
     */
    slippage: Slippage;
    isSponsoredTx?: boolean;
    customRecipient?: SuiAddress;
}
export type ApiRouterAddTransactionForCompleteTradeRouteBody = ApiRouterTransactionForCompleteTradeRouteBody & {
    serializedTx: SerializedTransaction;
    coinInId?: TransactionObjectArgument;
};
export type ApiRouterAddTransactionForCompleteTradeRouteV0Body = ApiRouterTransactionForCompleteTradeRouteBody & {
    serializedTx: SerializedTransaction;
    coinInId?: TransactionObjectArgumentV0;
};
export interface ApiRouterAddTransactionForCompleteTradeRouteResponse {
    tx: SerializedTransaction;
    coinOutId: TransactionObjectArgument | undefined;
}
export interface ApiRouterAddTransactionForCompleteTradeRouteV0Response {
    tx: SerializedTransaction;
    coinOutId: TransactionObjectArgumentV0 | undefined;
}
export type ApiRouterTradeEventsBody = ApiIndexerEventsBody & {
    walletAddress: SuiAddress;
};
export interface ApiRouterDynamicGasBody {
    txKindBytes: TxBytes;
    gasCoinType: CoinType;
    gasCoinData: ServiceCoinData;
    coinOutAmount: BigIntAsString;
    senderAddress: SuiAddress;
    sponsorAddress: SuiAddress;
    referrer?: SuiAddress;
}
//# sourceMappingURL=routerTypes.d.ts.map