import { BigNumberish, Contract } from 'ethers';
import { IAppToolkit } from '../../../app-toolkit/app-toolkit.interface';
import { IMulticallWrapper } from '../../../multicall';
import { MetaType } from '../../../position/position.interface';
import { ContractPositionTemplatePositionFetcher } from '../../../position/template/contract-position.template.position-fetcher';
import { GetDataPropsParams, GetDefinitionsParams, GetDisplayPropsParams, GetTokenBalancesParams, GetTokenDefinitionsParams } from '../../../position/template/contract-position.template.types';
import { CurveContractFactory, CurveGauge } from '../contracts';
export declare enum GaugeType {
    SINGLE = "single",
    DOUBLE = "double",
    N_GAUGE = "n-gauge",
    GAUGE_V4 = "gauge-v4",
    CHILD = "child-chain",
    REWARDS_ONLY = "rewards-only"
}
export declare type CurvePoolGaugeDataProps = {
    liquidity: number;
    apy: number;
    isActive: boolean;
    gaugeType: GaugeType;
};
export declare type CurvePoolGaugeDefinition = {
    address: string;
    swapAddress: string;
    tokenAddress: string;
    gaugeType: GaugeType;
};
export declare type ResolvePoolCountParams<T extends Contract> = {
    contract: T;
    multicall: IMulticallWrapper;
};
export declare type ResolveSwapAddressParams<T extends Contract> = {
    contract: T;
    poolIndex: number;
    multicall: IMulticallWrapper;
};
export declare type ResolveTokenAddressParams<T extends Contract> = {
    contract: T;
    swapAddress: string;
    multicall: IMulticallWrapper;
};
export declare type ResolveGaugeAddressParams<T extends Contract> = {
    contract: T;
    swapAddress: string;
    multicall: IMulticallWrapper;
};
export declare abstract class CurvePoolGaugeContractPositionFetcher<T extends Contract> extends ContractPositionTemplatePositionFetcher<CurveGauge, CurvePoolGaugeDataProps, CurvePoolGaugeDefinition> {
    protected readonly appToolkit: IAppToolkit;
    protected readonly contractFactory: CurveContractFactory;
    abstract registryAddress: string;
    abstract crvTokenAddress: string;
    abstract controllerAddress: string;
    abstract resolveRegistry(address: string): T;
    abstract resolvePoolCount(params: ResolvePoolCountParams<T>): Promise<BigNumberish>;
    abstract resolveSwapAddress(params: ResolveSwapAddressParams<T>): Promise<string>;
    abstract resolveTokenAddress(params: ResolveTokenAddressParams<T>): Promise<string>;
    abstract resolveGaugeAddresses(params: ResolveGaugeAddressParams<T>): Promise<string[]>;
    constructor(appToolkit: IAppToolkit, contractFactory: CurveContractFactory);
    getContract(address: string): CurveGauge;
    getDefinitions({ multicall }: GetDefinitionsParams): Promise<CurvePoolGaugeDefinition[]>;
    private resolveGaugeType;
    getTokenDefinitions({ address, definition, multicall, }: GetTokenDefinitionsParams<CurveGauge, CurvePoolGaugeDefinition>): Promise<{
        metaType: MetaType;
        address: string;
        network: import("../../../types").Network;
    }[]>;
    getDataProps({ address, contract, multicall, contractPosition, definition, }: GetDataPropsParams<CurveGauge, CurvePoolGaugeDataProps, CurvePoolGaugeDefinition>): Promise<CurvePoolGaugeDataProps>;
    getLabel({ contractPosition, }: GetDisplayPropsParams<CurveGauge, CurvePoolGaugeDataProps, CurvePoolGaugeDefinition>): Promise<string>;
    getTokenBalancesPerPosition({ address, contractPosition, contract, multicall, }: GetTokenBalancesParams<CurveGauge, CurvePoolGaugeDataProps>): Promise<BigNumberish[]>;
}
