import type { BaseContract, BigNumber, BigNumberish, BytesLike, CallOverrides, PopulatedTransaction, Signer, utils } from "ethers";
import type { FunctionFragment, Result } from "@ethersproject/abi";
import type { Listener, Provider } from "@ethersproject/providers";
import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent, PromiseOrValue } from "../../../../../common";
export type RangeStruct = {
    lowerTick: PromiseOrValue<BigNumberish>;
    upperTick: PromiseOrValue<BigNumberish>;
    feeTier: PromiseOrValue<BigNumberish>;
};
export type RangeStructOutput = [number, number, number] & {
    lowerTick: number;
    upperTick: number;
    feeTier: number;
};
export type AmountStruct = {
    range: RangeStruct;
    amount: PromiseOrValue<BigNumberish>;
};
export type AmountStructOutput = [RangeStructOutput, BigNumber] & {
    range: RangeStructOutput;
    amount: BigNumber;
};
export type PositionLiquidityStruct = {
    liquidity: PromiseOrValue<BigNumberish>;
    range: RangeStruct;
};
export type PositionLiquidityStructOutput = [BigNumber, RangeStructOutput] & {
    liquidity: BigNumber;
    range: RangeStructOutput;
};
export type UnderlyingOutputStruct = {
    amount0: PromiseOrValue<BigNumberish>;
    amount1: PromiseOrValue<BigNumberish>;
    fee0: PromiseOrValue<BigNumberish>;
    fee1: PromiseOrValue<BigNumberish>;
    leftOver0: PromiseOrValue<BigNumberish>;
    leftOver1: PromiseOrValue<BigNumberish>;
};
export type UnderlyingOutputStructOutput = [
    BigNumber,
    BigNumber,
    BigNumber,
    BigNumber,
    BigNumber,
    BigNumber
] & {
    amount0: BigNumber;
    amount1: BigNumber;
    fee0: BigNumber;
    fee1: BigNumber;
    leftOver0: BigNumber;
    leftOver1: BigNumber;
};
export interface IArrakisV2HelperInterface extends utils.Interface {
    functions: {
        "token0AndToken1ByRange((int24,int24,uint24)[],address,address,address)": FunctionFragment;
        "token0AndToken1PlusFeesByRange((int24,int24,uint24)[],address,address,address)": FunctionFragment;
        "totalLiquidity(address)": FunctionFragment;
        "totalUnderlying(address)": FunctionFragment;
        "totalUnderlyingWithFees(address)": FunctionFragment;
        "totalUnderlyingWithFeesAndLeftOver(address)": FunctionFragment;
    };
    getFunction(nameOrSignatureOrTopic: "token0AndToken1ByRange" | "token0AndToken1PlusFeesByRange" | "totalLiquidity" | "totalUnderlying" | "totalUnderlyingWithFees" | "totalUnderlyingWithFeesAndLeftOver"): FunctionFragment;
    encodeFunctionData(functionFragment: "token0AndToken1ByRange", values: [
        RangeStruct[],
        PromiseOrValue<string>,
        PromiseOrValue<string>,
        PromiseOrValue<string>
    ]): string;
    encodeFunctionData(functionFragment: "token0AndToken1PlusFeesByRange", values: [
        RangeStruct[],
        PromiseOrValue<string>,
        PromiseOrValue<string>,
        PromiseOrValue<string>
    ]): string;
    encodeFunctionData(functionFragment: "totalLiquidity", values: [PromiseOrValue<string>]): string;
    encodeFunctionData(functionFragment: "totalUnderlying", values: [PromiseOrValue<string>]): string;
    encodeFunctionData(functionFragment: "totalUnderlyingWithFees", values: [PromiseOrValue<string>]): string;
    encodeFunctionData(functionFragment: "totalUnderlyingWithFeesAndLeftOver", values: [PromiseOrValue<string>]): string;
    decodeFunctionResult(functionFragment: "token0AndToken1ByRange", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "token0AndToken1PlusFeesByRange", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "totalLiquidity", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "totalUnderlying", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "totalUnderlyingWithFees", data: BytesLike): Result;
    decodeFunctionResult(functionFragment: "totalUnderlyingWithFeesAndLeftOver", data: BytesLike): Result;
    events: {};
}
export interface IArrakisV2Helper extends BaseContract {
    connect(signerOrProvider: Signer | Provider | string): this;
    attach(addressOrName: string): this;
    deployed(): Promise<this>;
    interface: IArrakisV2HelperInterface;
    queryFilter<TEvent extends TypedEvent>(event: TypedEventFilter<TEvent>, fromBlockOrBlockhash?: string | number | undefined, toBlock?: string | number | undefined): Promise<Array<TEvent>>;
    listeners<TEvent extends TypedEvent>(eventFilter?: TypedEventFilter<TEvent>): Array<TypedListener<TEvent>>;
    listeners(eventName?: string): Array<Listener>;
    removeAllListeners<TEvent extends TypedEvent>(eventFilter: TypedEventFilter<TEvent>): this;
    removeAllListeners(eventName?: string): this;
    off: OnEvent<this>;
    on: OnEvent<this>;
    once: OnEvent<this>;
    removeListener: OnEvent<this>;
    functions: {
        token0AndToken1ByRange(ranges_: RangeStruct[], token0_: PromiseOrValue<string>, token1_: PromiseOrValue<string>, vaultV2_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
            AmountStructOutput[],
            AmountStructOutput[]
        ] & {
            amount0s: AmountStructOutput[];
            amount1s: AmountStructOutput[];
        }>;
        token0AndToken1PlusFeesByRange(ranges_: RangeStruct[], token0_: PromiseOrValue<string>, token1_: PromiseOrValue<string>, vaultV2_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
            AmountStructOutput[],
            AmountStructOutput[],
            AmountStructOutput[],
            AmountStructOutput[]
        ] & {
            amount0s: AmountStructOutput[];
            amount1s: AmountStructOutput[];
            fee0s: AmountStructOutput[];
            fee1s: AmountStructOutput[];
        }>;
        totalLiquidity(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
            PositionLiquidityStructOutput[]
        ] & {
            liquidities: PositionLiquidityStructOutput[];
        }>;
        totalUnderlying(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
            BigNumber,
            BigNumber
        ] & {
            amount0: BigNumber;
            amount1: BigNumber;
        }>;
        totalUnderlyingWithFees(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
            BigNumber,
            BigNumber,
            BigNumber,
            BigNumber
        ] & {
            amount0: BigNumber;
            amount1: BigNumber;
            fee0: BigNumber;
            fee1: BigNumber;
        }>;
        totalUnderlyingWithFeesAndLeftOver(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
            UnderlyingOutputStructOutput
        ] & {
            underlying: UnderlyingOutputStructOutput;
        }>;
    };
    token0AndToken1ByRange(ranges_: RangeStruct[], token0_: PromiseOrValue<string>, token1_: PromiseOrValue<string>, vaultV2_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
        AmountStructOutput[],
        AmountStructOutput[]
    ] & {
        amount0s: AmountStructOutput[];
        amount1s: AmountStructOutput[];
    }>;
    token0AndToken1PlusFeesByRange(ranges_: RangeStruct[], token0_: PromiseOrValue<string>, token1_: PromiseOrValue<string>, vaultV2_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
        AmountStructOutput[],
        AmountStructOutput[],
        AmountStructOutput[],
        AmountStructOutput[]
    ] & {
        amount0s: AmountStructOutput[];
        amount1s: AmountStructOutput[];
        fee0s: AmountStructOutput[];
        fee1s: AmountStructOutput[];
    }>;
    totalLiquidity(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<PositionLiquidityStructOutput[]>;
    totalUnderlying(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
        BigNumber,
        BigNumber
    ] & {
        amount0: BigNumber;
        amount1: BigNumber;
    }>;
    totalUnderlyingWithFees(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
        BigNumber,
        BigNumber,
        BigNumber,
        BigNumber
    ] & {
        amount0: BigNumber;
        amount1: BigNumber;
        fee0: BigNumber;
        fee1: BigNumber;
    }>;
    totalUnderlyingWithFeesAndLeftOver(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<UnderlyingOutputStructOutput>;
    callStatic: {
        token0AndToken1ByRange(ranges_: RangeStruct[], token0_: PromiseOrValue<string>, token1_: PromiseOrValue<string>, vaultV2_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
            AmountStructOutput[],
            AmountStructOutput[]
        ] & {
            amount0s: AmountStructOutput[];
            amount1s: AmountStructOutput[];
        }>;
        token0AndToken1PlusFeesByRange(ranges_: RangeStruct[], token0_: PromiseOrValue<string>, token1_: PromiseOrValue<string>, vaultV2_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
            AmountStructOutput[],
            AmountStructOutput[],
            AmountStructOutput[],
            AmountStructOutput[]
        ] & {
            amount0s: AmountStructOutput[];
            amount1s: AmountStructOutput[];
            fee0s: AmountStructOutput[];
            fee1s: AmountStructOutput[];
        }>;
        totalLiquidity(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<PositionLiquidityStructOutput[]>;
        totalUnderlying(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
            BigNumber,
            BigNumber
        ] & {
            amount0: BigNumber;
            amount1: BigNumber;
        }>;
        totalUnderlyingWithFees(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<[
            BigNumber,
            BigNumber,
            BigNumber,
            BigNumber
        ] & {
            amount0: BigNumber;
            amount1: BigNumber;
            fee0: BigNumber;
            fee1: BigNumber;
        }>;
        totalUnderlyingWithFeesAndLeftOver(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<UnderlyingOutputStructOutput>;
    };
    filters: {};
    estimateGas: {
        token0AndToken1ByRange(ranges_: RangeStruct[], token0_: PromiseOrValue<string>, token1_: PromiseOrValue<string>, vaultV2_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<BigNumber>;
        token0AndToken1PlusFeesByRange(ranges_: RangeStruct[], token0_: PromiseOrValue<string>, token1_: PromiseOrValue<string>, vaultV2_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<BigNumber>;
        totalLiquidity(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<BigNumber>;
        totalUnderlying(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<BigNumber>;
        totalUnderlyingWithFees(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<BigNumber>;
        totalUnderlyingWithFeesAndLeftOver(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<BigNumber>;
    };
    populateTransaction: {
        token0AndToken1ByRange(ranges_: RangeStruct[], token0_: PromiseOrValue<string>, token1_: PromiseOrValue<string>, vaultV2_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<PopulatedTransaction>;
        token0AndToken1PlusFeesByRange(ranges_: RangeStruct[], token0_: PromiseOrValue<string>, token1_: PromiseOrValue<string>, vaultV2_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<PopulatedTransaction>;
        totalLiquidity(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<PopulatedTransaction>;
        totalUnderlying(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<PopulatedTransaction>;
        totalUnderlyingWithFees(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<PopulatedTransaction>;
        totalUnderlyingWithFeesAndLeftOver(vault_: PromiseOrValue<string>, overrides?: CallOverrides): Promise<PopulatedTransaction>;
    };
}
