import { GearApi, HexString } from '@gear-js/api';
import { KeyringPair } from '@polkadot/keyring/types';
import { ActorId, Signer, TransactionWrapper, InvariantEventCallback } from './utils.js';
import { InvariantContract } from './invariant-contract.js';
import { CalculateSwapResult, FeeTier, Liquidity, Position, Pool, Percentage, PoolKey, SqrtPrice, Tick, TokenAmount, QuoteResult, LiquidityTick, Tickmap, PositionTick, SwapHop } from './schema.js';
export type Page = {
    index: number;
    entries: [Position, Pool][];
};
export declare class Invariant {
    readonly contract: InvariantContract;
    private readonly gasLimit;
    eventListenerStarted: boolean;
    private eventListeners;
    private constructor();
    static deploy(api: GearApi, deployer: KeyringPair, protocolFee: Percentage, gasLimit?: bigint): Promise<Invariant>;
    static load(api: GearApi, programId: HexString, gasLimit?: bigint): Promise<Invariant>;
    programId(): HexString;
    on(callback: InvariantEventCallback): void;
    private listen;
    off(callback: InvariantEventCallback): void;
    feeTierExists(feeTier: FeeTier): Promise<boolean>;
    getFeeTiers(): Promise<FeeTier[]>;
    getPool(token0: ActorId, token1: ActorId, feeTier: FeeTier): Promise<Pool>;
    getPoolKeys(size: bigint, offset: bigint): Promise<[PoolKey[], bigint]>;
    getAllPoolKeys(): Promise<PoolKey[]>;
    getAllPoolsForPair(token0: ActorId, token1: ActorId): Promise<[FeeTier, Pool][]>;
    getPosition(ownerId: ActorId, index: bigint): Promise<Position>;
    getAllPositions(owner: ActorId, positionsCount?: bigint, skipPages?: number[], positionsPerPage?: bigint): Promise<Page[]>;
    getPositionWithAssociates(owner: ActorId, index: bigint): Promise<[Position, Pool, Tick, Tick]>;
    getPositions(ownerId: ActorId, size: bigint, offset: bigint): Promise<[[Position, Pool][], bigint]>;
    _getAllPositions(ownerId: ActorId): Promise<Position[]>;
    getProtocolFee(): Promise<Percentage>;
    getTick(key: PoolKey, index: bigint): Promise<Tick>;
    getTickmap(key: PoolKey): Promise<Tickmap>;
    getLiquidityTicks(key: PoolKey, tickmap: bigint[]): Promise<LiquidityTick[]>;
    getLiquidityTicksAmount(key: PoolKey): Promise<TokenAmount>;
    getAllLiquidityTicks(key: PoolKey, tickmap: Tickmap): Promise<LiquidityTick[]>;
    isTickInitialized(key: PoolKey, index: bigint): Promise<boolean>;
    getUserBalances(user: ActorId): Promise<Map<string, TokenAmount>>;
    getUserPositionAmount(key: PoolKey, owner: ActorId): Promise<TokenAmount>;
    getPositionTicks(owner: ActorId, offset: bigint): Promise<PositionTick[]>;
    quote(poolKey: PoolKey, xToY: boolean, amount: TokenAmount, byAmountIn: boolean): Promise<QuoteResult>;
    changeProtocolFeeTx(fee: Percentage, gasLimit?: bigint): Promise<TransactionWrapper<Percentage>>;
    changeProtocolFee(signer: Signer, fee: Percentage, gasLimit?: bigint): Promise<Percentage>;
    addFeeTierTx(feeTier: FeeTier, gasLimit?: bigint): Promise<TransactionWrapper<FeeTier>>;
    addFeeTier(signer: Signer, feeTier: FeeTier, gasLimit?: bigint): Promise<FeeTier>;
    changeFeeReceiverTx(poolKey: PoolKey, feeReceiver: ActorId, gasLimit?: bigint): Promise<TransactionWrapper<null>>;
    changeFeeReceiver(signer: Signer, poolKey: PoolKey, feeReceiver: ActorId, gasLimit?: bigint): Promise<null>;
    claimFeeTx(index: bigint, gasLimit?: bigint): Promise<TransactionWrapper<[TokenAmount, TokenAmount]>>;
    claimFee(signer: Signer, index: bigint, gasLimit?: bigint): Promise<[TokenAmount, TokenAmount]>;
    createPoolTx(key: PoolKey, initSqrtPrice: bigint, gasLimit?: bigint): Promise<TransactionWrapper<null>>;
    createPool(signer: Signer, key: PoolKey, initSqrtPrice: bigint, gasLimit?: bigint): Promise<null>;
    createPositionTx(key: PoolKey, lowerTick: bigint, upperTick: bigint, liquidityDelta: Liquidity, spotSqrtPrice: SqrtPrice, slippageTolerance: SqrtPrice, gasLimit?: bigint): Promise<TransactionWrapper<Position>>;
    createPosition(signer: Signer, key: PoolKey, lowerTick: bigint, upperTick: bigint, liquidityDelta: Liquidity, spotSqrtPrice: SqrtPrice, slippageTolerance: SqrtPrice, gasLimit?: bigint): Promise<Position>;
    depositSingleTokenTx(token: ActorId, amount: bigint, gasLimit?: bigint): Promise<TransactionWrapper<TokenAmount>>;
    depositSingleToken(signer: Signer, token: ActorId, amount: bigint, gasLimit?: bigint): Promise<TokenAmount>;
    depositTokenPairTx(tokenX: [ActorId, TokenAmount], tokenY: [ActorId, TokenAmount], gasLimit?: bigint): Promise<TransactionWrapper<[TokenAmount, TokenAmount]>>;
    depositTokenPair(signer: Signer, tokenX: [ActorId, TokenAmount], tokenY: [ActorId, TokenAmount], gasLimit?: bigint): Promise<[TokenAmount, TokenAmount]>;
    depositVaraTx(amount: bigint, gasLimit?: bigint): Promise<TransactionWrapper<TokenAmount>>;
    depositVara(account: Signer, amount: bigint, gasLimit?: bigint): Promise<TokenAmount>;
    removeFeeTierTx(feeTier: FeeTier, gasLimit?: bigint): Promise<TransactionWrapper<FeeTier>>;
    removeFeeTier(signer: Signer, feeTier: FeeTier, gasLimit?: bigint): Promise<FeeTier>;
    removePositionTx(index: bigint, gasLimit?: bigint): Promise<TransactionWrapper<[TokenAmount, TokenAmount]>>;
    removePosition(signer: Signer, index: bigint, gasLimit?: bigint): Promise<[TokenAmount, TokenAmount]>;
    transferPositionTx(index: bigint, receiver: ActorId, gasLimit?: bigint): Promise<TransactionWrapper<null>>;
    transferPosition(signer: Signer, index: bigint, receiver: ActorId, gasLimit?: bigint): Promise<null>;
    swapTx(poolKey: PoolKey, xToY: boolean, amount: TokenAmount, byAmountIn: boolean, sqrtPriceLimit: SqrtPrice, gasLimit?: bigint): Promise<TransactionWrapper<CalculateSwapResult>>;
    swap(signer: Signer, poolKey: PoolKey, xToY: boolean, amount: TokenAmount, byAmountIn: boolean, sqrtPriceLimit: SqrtPrice, gasLimit?: bigint): Promise<CalculateSwapResult>;
    swapWithSlippageTx(poolKey: PoolKey, xToY: boolean, amount: TokenAmount, byAmountIn: boolean, estimatedSqrtPrice: SqrtPrice, slippage: Percentage, gasLimit?: bigint): Promise<TransactionWrapper<CalculateSwapResult>>;
    swapWithSlippage(signer: Signer, poolKey: PoolKey, xToY: boolean, amount: TokenAmount, byAmountIn: boolean, estimatedSqrtPrice: SqrtPrice, slippage: Percentage, gasLimit?: bigint): Promise<CalculateSwapResult>;
    swapRouteTx(amountIn: TokenAmount, expectedAmountOut: TokenAmount, slippage: Percentage, swaps: SwapHop[], gasLimit?: bigint): Promise<TransactionWrapper<TokenAmount>>;
    swapRoute(signer: Signer, amountIn: TokenAmount, expectedAmountOut: TokenAmount, slippage: Percentage, swaps: SwapHop[], gasLimit?: bigint): Promise<TokenAmount>;
    withdrawProtocolFeeTx(poolKey: PoolKey, gasLimit?: bigint): Promise<TransactionWrapper<[TokenAmount, TokenAmount]>>;
    withdrawProtocolFee(signer: Signer, poolKey: PoolKey, gasLimit?: bigint): Promise<[TokenAmount, TokenAmount]>;
    withdrawSingleTokenTx(token: ActorId, amount?: TokenAmount | null, gasLimit?: bigint): Promise<TransactionWrapper<TokenAmount>>;
    withdrawSingleToken(signer: Signer, token: ActorId, amount?: TokenAmount | null, gasLimit?: bigint): Promise<TokenAmount>;
    withdrawVaraTx(amount: bigint | null, gasLimit?: bigint): Promise<TransactionWrapper<TokenAmount>>;
    withdrawVara(account: Signer, amount: bigint | null, gasLimit?: bigint): Promise<TokenAmount>;
    withdrawTokenPairTx(tokenX: [ActorId, TokenAmount | null], tokenY: [ActorId, TokenAmount | null], gasLimit?: bigint): Promise<TransactionWrapper<[TokenAmount, TokenAmount]>>;
    withdrawTokenPair(signer: Signer, tokenX: [ActorId, TokenAmount | null], tokenY: [ActorId, TokenAmount | null], gasLimit?: bigint): Promise<[TokenAmount, TokenAmount]>;
}
