import { Contract, Signer, providers } from 'ethers';
import { TransactionReceipt } from '@ethersproject/abstract-provider';
import { UniV3Range } from '../uniV3Range';
import { IChain } from '../../constants';
import { DbProvider } from '../db-provider';
export type TxSender = <T extends Contract, F extends (keyof T | keyof T['functions']) & string>(chain: IChain, contract: T, method: F, args: Parameters<T[F]>, opt?: any) => Promise<Partial<providers.TransactionReceipt> | null>;
export interface VaultProviderParams {
    chain: IChain;
    baseToken: string;
    feeTier?: number;
    wallet: Signer;
    enableRebalance?: boolean;
    price?: number;
    dbProvider?: DbProvider;
    txSender?: TxSender;
}
export declare abstract class VaultProvider<TVaultContract extends Contract, TRebalanceFunctionName extends string> {
    token0: string;
    token1: string;
    dec0: number;
    dec1: number;
    price: number;
    reverse: boolean;
    wallet: Signer;
    chain: IChain;
    tickSpacing: number;
    feeTier?: number;
    enableRebalance: boolean;
    ranges: UniV3Range[];
    vaultContract: TVaultContract;
    rebalanceFunctionName: TRebalanceFunctionName;
    vaultType: 'arrakis' | 'defiEdge';
    dbProvider?: DbProvider;
    txSender?: TxSender;
    constructor(vaultType: 'arrakis' | 'defiEdge', rebalanceFunctionName: TRebalanceFunctionName, vaultContract: TVaultContract, params: VaultProviderParams);
    executeRebalance(rebalanceParams: Parameters<TVaultContract[TRebalanceFunctionName]>): Promise<Partial<TransactionReceipt> | null>;
    abstract init(params: VaultProviderParams): Promise<void>;
    abstract updateRanges(): Promise<void>;
    abstract getBalances(): Promise<{
        totals: [number, number];
        allocated: [number, number];
    }>;
    abstract getRebalanceParams(burnRanges: UniV3Range[]): Promise<Parameters<TVaultContract[TRebalanceFunctionName]>>;
    abstract getPrice(twapInterval: number): Promise<number>;
}
