import { Balance, Event, Object, ObjectId, Percentage, Slippage, SuiAddress, Timestamp, Url } from "../../general/types/generalTypes";
import { ManipulateType } from "dayjs";
import { CoinDecimal, CoinsToBalance, CoinType } from "../coin/coinTypes";
import { UniqueId } from "../router/routerTypes";
/**
 * Name or label used to identify a pool. e.g., "My Stable Pool" or "SUI-COIN LP".
 */
export type PoolName = string;
/**
 * Represents a coin's weight in a weighted pool, stored as a bigint for
 * 1e9 or 1e18 style scaling.
 */
export type PoolWeight = bigint;
/**
 * Represents the trade fee for a coin in the pool, stored as a bigint
 * in a scaled format (e.g. 1 = 1e9).
 */
export type PoolTradeFee = bigint;
/**
 * Represents the deposit fee for a coin in the pool, stored as a bigint
 * in a scaled format.
 */
export type PoolDepositFee = bigint;
/**
 * Represents the withdrawal fee for a coin in the pool, stored as a bigint
 * in a scaled format.
 */
export type PoolWithdrawFee = bigint;
/**
 * Represents "flatness" in a pool, used for certain advanced pool calculations
 * or invariants. Often 0 or 1, depending on stable vs. uncorrelated logic.
 */
export type PoolFlatness = bigint;
/**
 * Represents a normalized balance in the pool, often used for
 * internal calculations to standardize coin decimals.
 */
export type NormalizedBalance = bigint;
/**
 * A big integer scalar used for decimals conversion (1e9 or 1e18, etc.).
 */
export type DecimalsScalar = bigint;
/**
 * A record mapping `CoinType` => a `PoolCoin` structure, describing
 * each coin's weight, balance, fees, and decimal scaling within a pool.
 */
export type PoolCoins = Record<CoinType, PoolCoin>;
/**
 * Details about a coin in the pool, including the on-chain balance,
 * trade fees (in/out), deposit/withdraw fees, and decimal scaling factors.
 */
export interface PoolCoin {
    /**
     * The coin's weight in the pool (e.g., for a weight-based AMM).
     */
    weight: PoolWeight;
    /**
     * The on-chain balance of this coin in the pool.
     */
    balance: Balance;
    /**
     * The inbound trade fee (scaled) for this coin.
     */
    tradeFeeIn: PoolTradeFee;
    /**
     * The outbound trade fee (scaled) for this coin.
     */
    tradeFeeOut: PoolTradeFee;
    /**
     * The deposit fee (scaled) for adding this coin into the pool.
     */
    depositFee: PoolDepositFee;
    /**
     * The withdrawal fee (scaled) for removing this coin from the pool.
     */
    withdrawFee: PoolWithdrawFee;
    /**
     * A scaling factor (like 1e9 or 1e18) used to unify coin decimals
     * for internal math.
     */
    decimalsScalar: DecimalsScalar;
    /**
     * The "normalized" balance, factoring in `decimalsScalar`.
     */
    normalizedBalance: NormalizedBalance;
    /**
     * The displayed decimals for user-facing reference (e.g., 6, 9, 18).
     */
    decimals?: CoinDecimal;
}
/**
 * The primary pool object structure stored on-chain.
 * `lpCoinType` is the minted LP token, `coins` is a record of coin data.
 */
export interface PoolObject extends Object {
    /**
     * The human-readable name of the pool (e.g., "My Weighted Pool").
     */
    name: PoolName;
    /**
     * The address of the pool's creator.
     */
    creator: SuiAddress;
    /**
     * The LP coin type for this pool, e.g., "0x<...>::af_lp::AF_LP_xyz".
     */
    lpCoinType: CoinType;
    /**
     * The total supply of LP tokens currently minted.
     */
    lpCoinSupply: Balance;
    /**
     * The amount of LP tokens that are illiquid (locked for some reason).
     */
    illiquidLpCoinSupply: Balance;
    /**
     * A "flatness" parameter used for stable vs. uncorrelated logic. 0 or 1 typically.
     */
    flatness: PoolFlatness;
    /**
     * A record of coin data for each coin type in the pool.
     */
    coins: PoolCoins;
    /**
     * The decimals used by the LP coin.
     */
    lpCoinDecimals: CoinDecimal;
    /**
     * An optional DAO fee object, if the pool is configured to support a fee for a DAO or treasury.
     */
    daoFeePoolObject?: DaoFeePoolObject;
}
/**
 * Minimal information about a user's LP coin in a specific pool,
 * including the pool ID and balance of that LP coin type.
 */
export interface PoolLpInfo {
    lpCoinType: CoinType;
    poolId: ObjectId;
    balance: Balance;
}
/**
 * An on-chain object representing DAO fee configuration for a pool:
 * it stores the fee basis points and the fee recipient address.
 */
export interface DaoFeePoolObject extends Object {
    /**
     * The fee in basis points, e.g., 100 => 1%.
     */
    feeBps: bigint;
    /**
     * The Sui address receiving the fee portion from trades or other actions.
     */
    feeRecipient: SuiAddress;
}
/**
 * A capability object indicating ownership of a `DaoFeePoolObject`.
 * Whomever holds this can update the fee parameters or recipient.
 */
export interface DaoFeePoolOwnerCapObject extends Object {
    /**
     * The `DaoFeePoolObject` ID this cap is associated with.
     */
    daoFeePoolId: ObjectId;
}
/**
 * Represents a trade event within a pool, indicating coins in/out,
 * final amounts, etc.
 */
export interface PoolTradeEvent extends Event {
    poolId: ObjectId;
    trader: SuiAddress;
    /**
     * The array of coin types that were spent in the trade.
     */
    typesIn: CoinType[];
    /**
     * The amounts of each coin type that were spent.
     */
    amountsIn: Balance[];
    /**
     * The coin types that were received.
     */
    typesOut: CoinType[];
    /**
     * The amounts of each output coin.
     */
    amountsOut: Balance[];
}
/**
 * Represents a deposit event where a user adds liquidity to a pool,
 * receiving minted LP tokens in return.
 */
export interface PoolDepositEvent extends Event {
    poolId: ObjectId;
    /**
     * The address that deposited into the pool.
     */
    depositor: SuiAddress;
    /**
     * The coin types that were deposited.
     */
    types: CoinType[];
    /**
     * The amounts for each deposited coin type.
     */
    deposits: Balance[];
    /**
     * The amount of LP minted for the depositor.
     */
    lpMinted: Balance;
}
/**
 * Represents a withdrawal event where a user removes liquidity from a pool,
 * burning LP tokens and receiving coin amounts in return.
 */
export interface PoolWithdrawEvent extends Event {
    poolId: ObjectId;
    /**
     * The user who withdrew from the pool.
     */
    withdrawer: SuiAddress;
    /**
     * The coin types that were returned upon withdrawal.
     */
    types: CoinType[];
    /**
     * The amounts for each returned coin type.
     */
    withdrawn: Balance[];
    /**
     * The amount of LP burned in exchange for these outputs.
     */
    lpBurned: Balance;
}
/**
 * Fired when a new DAO fee pool is created for a specific internal pool.
 */
export interface CreatedDaoFeePoolEvent extends Event {
    daoFeePoolId: ObjectId;
    innerPoolId: ObjectId;
    feeBps: bigint;
    feeRecipient: SuiAddress;
}
/**
 * Fired when the fee basis points in a `DaoFeePoolObject` are updated.
 */
export interface UpdatedFeeBpsEvent extends Event {
    daoFeePoolId: ObjectId;
    oldFeeBps: bigint;
    newFeeBps: bigint;
}
/**
 * Fired when the fee recipient address in a `DaoFeePoolObject` changes.
 */
export interface UpdatedFeeRecipientEvent extends Event {
    daoFeePoolId: ObjectId;
    oldFeeAddress: SuiAddress;
    newFeeAddress: SuiAddress;
}
/**
 * Basic statistical data about a pool, including volume, TVL, supply per LPS,
 * fees, and APR.
 */
export interface PoolStats {
    /**
     * The 24-hour volume or some aggregated volume metric for the pool.
     */
    volume: number;
    /**
     * The total value locked in the pool, often in USD or stablecoin value.
     */
    tvl: number;
    /**
     * A representation of the distribution of supply among liquidity providers,
     * e.g., how many tokens each user holds. May be used for advanced UI.
     */
    supplyPerLps: number[];
    /**
     * The price of 1 LP token in reference to a stable baseline (USD).
     */
    lpPrice: number;
    /**
     * The total fees generated by the pool in a given period (often 24h or 7d).
     */
    fees: number;
    /**
     * The approximate annual percentage rate (yield) derived from fees, volume, or
     * other data. This can be used to estimate LP profits or compare pools.
     */
    apr: number;
}
/**
 * Represents a data point for pool analytics, including a Unix timestamp (in ms)
 * and a numeric value (e.g., volume or fee data).
 */
export interface PoolDataPoint {
    time: Timestamp;
    value: number;
}
/**
 * Supported timeframes for graphing or fetching historical data:
 * 1 day, 1 week, 1 month, 3 months, 6 months, or 1 year.
 */
export type PoolGraphDataTimeframeKey = "1D" | "1W" | "1M" | "3M" | "6M" | "1Y";
/**
 * An optional object or approach to define timeframe windows, using
 * dayjs manipulation. Not always used directly.
 */
export interface PoolGraphDataTimeframe {
    time: Timestamp;
    timeUnit: ManipulateType;
}
/**
 * An object describing how each coin in a newly created pool is configured,
 * including initial deposit, weight, and fees.
 */
export interface PoolCreationCoinInfo {
    coinType: CoinType;
    weight: PoolWeight;
    decimals?: CoinDecimal;
    tradeFeeIn: PoolTradeFee;
    tradeFeeOut: PoolTradeFee;
    depositFee: PoolDepositFee;
    withdrawFee: PoolWithdrawFee;
    initialDeposit: Balance;
}
/**
 * Metadata for the newly published LP coin, specifying name, symbol, and optional icon URL.
 */
export interface PoolCreationLpCoinMetadata {
    name: string;
    symbol: string;
    iconUrl?: Url;
}
/**
 * A data structure used for integration with CoinGecko, representing
 * an aggregated ticker ID, base/target coins, price, volumes, and liquidity.
 */
export interface CoinGeckoTickerData {
    ticker_id: UniqueId;
    base_currency: CoinType;
    target_currency: CoinType;
    pool_id: ObjectId;
    last_price: number;
    base_volume: number;
    target_volume: number;
    liquidity_in_usd: number;
}
/**
 * Represents a historical trade record for integration with CoinGecko,
 * storing a trade ID, price, volumes, timestamp, and buy/sell type.
 */
export interface CoinGeckoHistoricalTradeData {
    trade_id: UniqueId;
    price: number;
    base_volume: number;
    target_volume: number;
    trade_timestamp: Timestamp;
    type: "buy" | "sell";
}
/**
 * Request body for a user trade, specifying which coin to send in and how much,
 * which coin to receive, plus slippage and optional referral info.
 */
export interface ApiPoolTradeBody {
    walletAddress: SuiAddress;
    coinInType: CoinType;
    coinInAmount: Balance;
    coinOutType: CoinType;
    slippage: Slippage;
    referrer?: SuiAddress;
    isSponsoredTx?: boolean;
}
/**
 * Request body for depositing liquidity into a pool, specifying the amounts in,
 * slippage, and optional referral or sponsorship data.
 */
export interface ApiPoolDepositBody {
    walletAddress: SuiAddress;
    amountsIn: CoinsToBalance;
    slippage: Slippage;
    referrer?: SuiAddress;
    isSponsoredTx?: boolean;
}
/**
 * Request body for withdrawing specific amounts from the pool, specifying
 * which coins to remove, how much LP is burned, slippage, etc.
 */
export interface ApiPoolWithdrawBody {
    walletAddress: SuiAddress;
    amountsOutDirection: CoinsToBalance;
    lpCoinAmount: Balance;
    slippage: Slippage;
    referrer?: SuiAddress;
}
/**
 * Request body for withdrawing all coin types from a pool using a single
 * ratio or entire LP amount, simplifying the multi-coin approach.
 */
export interface ApiPoolAllCoinWithdrawBody {
    walletAddress: SuiAddress;
    lpCoinAmount: Balance;
    referrer?: SuiAddress;
}
/**
 * Request body for publishing a new LP coin on-chain,
 * typically specifying the coin's decimals.
 */
export interface ApiPublishLpCoinBody {
    walletAddress: SuiAddress;
    lpCoinDecimals: number;
}
/**
 * Request body for creating a new pool, specifying coin information,
 * the LP coin metadata, and optional DAO fee info.
 */
export interface ApiCreatePoolBody {
    walletAddress: SuiAddress;
    lpCoinType: CoinType;
    lpCoinMetadata: PoolCreationLpCoinMetadata;
    coinsInfo: {
        coinType: CoinType;
        weight: Percentage;
        decimals?: number;
        tradeFeeIn: Percentage;
        initialDeposit: Balance;
    }[];
    poolName: PoolName;
    poolFlatness: 0 | 1;
    createPoolCapId: ObjectId;
    respectDecimals: boolean;
    forceLpDecimals?: CoinDecimal;
    isSponsoredTx?: boolean;
    burnLpCoin?: boolean;
    daoFeeInfo?: {
        feePercentage: Percentage;
        feeRecipient: SuiAddress;
    };
}
/**
 * For retrieving the spot price of a pool, specifying coin in/out.
 * Not always used directly, but present in certain route building contexts.
 */
export interface ApiPoolSpotPriceBody {
    coinInType: CoinType;
    coinOutType: CoinType;
}
/**
 * Request body for obtaining a pool object ID from an LP coin type.
 * Useful to confirm if a coin is indeed an LP token and which pool it references.
 */
export interface ApiPoolObjectIdForLpCoinTypeBody {
    lpCoinTypes: CoinType[];
}
/**
 * Request body for fetching statistics about one or more pools.
 */
export interface ApiPoolsStatsBody {
    poolIds: ObjectId[];
}
/**
 * Request body for listing the owned DAO fee pool owner caps,
 * letting a user see if they can update fees/recipients in certain pools.
 */
export interface ApiPoolsOwnedDaoFeePoolOwnerCapsBody {
    walletAddress: SuiAddress;
}
//# sourceMappingURL=poolsTypes.d.ts.map