import { BigNumberish, Contract } from 'ethers';
import { IAppToolkit } from '../../../app-toolkit/app-toolkit.interface';
import { ContractFactory, Erc20 } from '../../../contract/contracts';
import { IMulticallWrapper } from '../../../multicall';
import { AppTokenTemplatePositionFetcher } from '../../../position/template/app-token.template.position-fetcher';
import { GetAddressesParams, DefaultAppTokenDefinition, GetUnderlyingTokensParams, GetPricePerShareParams, GetDataPropsParams, GetDisplayPropsParams } from '../../../position/template/app-token.template.types';
export declare type CurvePoolTokenDataProps = {
    swapAddress: string;
    liquidity: number;
    reserves: number[];
    apy: number;
    volume: number;
    fee: number;
};
export declare type CurvePoolDefinition = {
    address: string;
    swapAddress: string;
    isLegacy?: boolean;
};
export declare type ResolvePoolCoinAddressParams<T extends Contract> = {
    contract: T;
    multicall: IMulticallWrapper;
    index: number;
};
export declare type ResolvePoolReserveParams<T extends Contract> = {
    contract: T;
    multicall: IMulticallWrapper;
    index: number;
};
export declare type ResolvePoolFeeParams<T extends Contract> = {
    contract: T;
    multicall: IMulticallWrapper;
};
export declare abstract class CurvePoolStaticTokenFetcher<T extends Contract> extends AppTokenTemplatePositionFetcher<Erc20, CurvePoolTokenDataProps, CurvePoolDefinition> {
    protected readonly appToolkit: IAppToolkit;
    protected readonly contractFactory: ContractFactory;
    abstract poolDefinitions: CurvePoolDefinition[];
    abstract resolvePoolContract(definition: CurvePoolDefinition): T;
    abstract resolvePoolCoinAddress(opts: ResolvePoolCoinAddressParams<T>): Promise<string>;
    abstract resolvePoolReserve(opts: ResolvePoolReserveParams<T>): Promise<BigNumberish>;
    abstract resolvePoolFee(opts: ResolvePoolFeeParams<T>): Promise<BigNumberish>;
    constructor(appToolkit: IAppToolkit, contractFactory: ContractFactory);
    getContract(address: string): Erc20;
    getDefinitions(): Promise<CurvePoolDefinition[]>;
    getAddresses({ definitions }: GetAddressesParams<DefaultAppTokenDefinition>): Promise<string[]>;
    getUnderlyingTokenDefinitions({ multicall, definition, }: GetUnderlyingTokensParams<Erc20, CurvePoolDefinition>): Promise<{
        address: string;
        network: import("../../../types").Network;
    }[]>;
    getPricePerShare({ multicall, definition, appToken, }: GetPricePerShareParams<Erc20, CurvePoolTokenDataProps, CurvePoolDefinition>): Promise<number[]>;
    getDataProps(params: GetDataPropsParams<Erc20, CurvePoolTokenDataProps, CurvePoolDefinition>): Promise<{
        fee: number;
        volume: number;
        apy: number;
        swapAddress: string;
        liquidity: number;
        reserves: number[];
    }>;
    getLabel({ appToken }: GetDisplayPropsParams<Erc20, CurvePoolTokenDataProps, CurvePoolDefinition>): Promise<string>;
    getSecondaryLabel({ appToken }: GetDisplayPropsParams<Erc20, CurvePoolTokenDataProps, CurvePoolDefinition>): Promise<string>;
    getStatsItems({ appToken }: GetDisplayPropsParams<Erc20, CurvePoolTokenDataProps, CurvePoolDefinition>): Promise<({
        label: string;
        value: import("../../../position/display.interface").DollarDisplayItem;
    } | {
        label: string;
        value: import("../../../position/display.interface").PercentageDisplayItem;
    })[]>;
}
