import { PublicKey, Connection } from '@solana/web3.js';
import BN__default from 'bn.js';
import Decimal from 'decimal.js';
import { PoolInfoLayout, TickArrayBitmapExtensionLayout, TickArrayLayout, TickLayout } from '../layout.js';
import '../../../marshmallow/index.js';
import '../../../marshmallow/buffer-layout.js';

interface LimitOrderMatchResult {
    amountIn: BN__default;
    amountOut: BN__default;
    ammFeeAmount: BN__default;
}
declare class TickArrayBitmapUtil {
    private static scanLinearBitmap;
    private static findPoolBitmap;
    private static findPositiveTickArrayBitmap;
    private static findNegativeTickArrayBitmap;
    static findTickArrayStartIndex({ tickSpacing, poolBitmap, tickArrayBitmap, findInfo, }: {
        tickSpacing: number;
        poolBitmap: ReturnType<typeof PoolInfoLayout.decode>["tickArrayBitmap"];
        tickArrayBitmap: ReturnType<typeof TickArrayBitmapExtensionLayout.decode>;
        findInfo: {
            type: "zeroForOne" | "oneForZero";
            count?: number;
            tickArrayCurrent: number;
        } | {
            type: "all";
        };
    }): number[];
    private static collectUntil;
    static findTickArrayAddress(params: {
        programId: PublicKey;
        poolId: PublicKey;
        tickSpacing: number;
        poolBitmap: ReturnType<typeof PoolInfoLayout.decode>["tickArrayBitmap"];
        tickArrayBitmap: ReturnType<typeof TickArrayBitmapExtensionLayout.decode>;
        findInfo: {
            type: "zeroForOne" | "oneForZero";
            count?: number;
            tickArrayCurrent: number;
        } | {
            type: "all";
        };
    }): PublicKey[];
    static maxTickInTickarrayBitmap(tickSpacing: number): number;
}
declare class TickArrayUtil {
    static firstinitializedTick({ data, zeroForOne, }: {
        data: ReturnType<typeof TickArrayLayout.decode>;
        zeroForOne: boolean;
    }): {
        tick: number;
        liquidityNet: BN__default;
        liquidityGross: BN__default;
        feeGrowthOutsideX64A: BN__default;
        feeGrowthOutsideX64B: BN__default;
        rewardGrowthsOutsideX64: BN__default[];
        orderPhase: BN__default;
        ordersAmount: BN__default;
        partFilledOrdersRemaining: BN__default;
        unfilledRatioX64: BN__default;
    } | undefined;
    static nextInitalizedTick({ data, currentTickIndex, tickSpacing, zeroForOne, }: {
        data: ReturnType<typeof TickArrayLayout.decode>;
        currentTickIndex: number;
        tickSpacing: number;
        zeroForOne: boolean;
    }): {
        tick: number;
        liquidityNet: BN__default;
        liquidityGross: BN__default;
        feeGrowthOutsideX64A: BN__default;
        feeGrowthOutsideX64B: BN__default;
        rewardGrowthsOutsideX64: BN__default[];
        orderPhase: BN__default;
        ordersAmount: BN__default;
        partFilledOrdersRemaining: BN__default;
        unfilledRatioX64: BN__default;
    } | undefined;
    static getTickArrayStartIndex(tickIndex: number, tickSpacing: number): number;
    static getTickOffsetInArray(tick: number, tickSpacing: number): number;
    static tickCount(tickSpacing: number): number;
    static getMinTick(tickSpacing: number): number;
    static getMaxTick(tickSpacing: number): number;
}
declare class TickUtil {
    static isInitialized({ data }: {
        data: ReturnType<typeof TickLayout.decode>;
    }): boolean;
    static hasLimitOrders({ data }: {
        data: ReturnType<typeof TickLayout.decode>;
    }): boolean;
    static hasLiquidity({ data }: {
        data: ReturnType<typeof TickLayout.decode>;
    }): boolean;
    static isValidTick(tick: number): boolean;
    static checkTick(tick: number): void;
    static getSqrtPriceAtTick(tick: number): BN__default;
    static getLimitOrderOutput({ amountIn, tick, zeroForOne }: {
        amountIn: BN__default;
        tick: number;
        zeroForOne: boolean;
    }): BN__default;
    static getLimitOrderInput({ amountOut, tick, zeroForOne }: {
        amountOut: BN__default;
        tick: number;
        zeroForOne: boolean;
    }): BN__default;
    static limitOrderUnfilledAmount({ tick }: {
        tick: ReturnType<typeof TickLayout.decode>;
    }): BN__default;
    static matchLimitOrder({ tick, swapAmount, swapDirectionZeroForOne, isBaseInput, feeRate, isFeeOnInput, }: {
        tick: ReturnType<typeof TickLayout.decode>;
        swapAmount: BN__default;
        swapDirectionZeroForOne: boolean;
        isBaseInput: boolean;
        feeRate: number;
        isFeeOnInput: boolean;
    }): LimitOrderMatchResult;
    private static getPriceAtTick;
    static getTickAtSqrtPrice(sqrtPriceX64: BN__default): number;
    private static signedShrn64;
    static sqrtPriceX64ToPrice(sqrtPriceX64: BN__default, decimalsA: number, decimalsB: number): Decimal;
    static tickToPrice(tick: number, decimalsA: number, decimalsB: number): Decimal;
    static priceToTick(price: Decimal, decimalsA: number, decimalsB: number): number;
    static priceToSqrtPriceX64(price: Decimal, decimalsA: number, decimalsB: number): BN__default;
    static toTickIndex(tick: number, tickSpacing: number): number;
    static getPriceAndTick({ price, mintADecimals, mintBDecimals, zeroForOne, tickSpacing, }: {
        price: Decimal;
        mintADecimals: number;
        mintBDecimals: number;
        zeroForOne: boolean;
        tickSpacing: number;
    }): {
        tick: number;
        price: Decimal;
    };
}
/**
 * Fetch tick arrays for swap simulation
 */
declare function fetchTickArrays(programId: PublicKey, connection: Connection, poolId: PublicKey, currentTick: number, tickSpacing: number, tickArrayBitmap: Buffer, zeroForOne?: boolean): Promise<{
    address: PublicKey;
    value: ReturnType<typeof TickArrayLayout.decode>;
}[]>;

export { LimitOrderMatchResult, TickArrayBitmapUtil, TickArrayUtil, TickUtil, fetchTickArrays };
