import DataLoader from 'dataloader';
import { BigNumberish, Contract } from 'ethers';
import { IAppToolkit } from '../../../app-toolkit/app-toolkit.interface';
import { Erc20 } from '../../../contract/contracts';
import { IMulticallWrapper } from '../../../multicall';
import { AppTokenTemplatePositionFetcher } from '../../../position/template/app-token.template.position-fetcher';
import { GetAddressesParams, DefaultAppTokenDefinition, GetDefinitionsParams, GetUnderlyingTokensParams, GetPricePerShareParams, GetDataPropsParams, GetDisplayPropsParams } from '../../../position/template/app-token.template.types';
import { CurveContractFactory } from '../contracts';
import { CurveVolumeDataLoader } from './curve.volume.data-loader';
export declare type CurvePoolTokenDataProps = {
    swapAddress: string;
    liquidity: number;
    reserves: number[];
    apy: number;
    volume: number;
    fee: number;
};
export declare type CurvePoolDefinition = {
    address: string;
    swapAddress: string;
};
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 ResolveCoinAddressesParams<T extends Contract> = {
    contract: T;
    swapAddress: string;
    multicall: IMulticallWrapper;
};
export declare type ResolveReservesParams<T extends Contract> = {
    contract: T;
    swapAddress: string;
    multicall: IMulticallWrapper;
};
export declare type ResolveFeesParams<T extends Contract> = {
    contract: T;
    swapAddress: string;
    multicall: IMulticallWrapper;
};
export declare abstract class CurvePoolDynamicTokenFetcher<T extends Contract> extends AppTokenTemplatePositionFetcher<Erc20, CurvePoolTokenDataProps, CurvePoolDefinition> {
    protected readonly appToolkit: IAppToolkit;
    protected readonly contractFactory: CurveContractFactory;
    protected readonly curveVolumeDataLoader: CurveVolumeDataLoader;
    volumeDataLoader: DataLoader<string, number>;
    abstract registryAddress: string;
    blacklistedSwapAddresses: 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 resolveCoinAddresses(params: ResolveCoinAddressesParams<T>): Promise<string[]>;
    abstract resolveReserves(params: ResolveReservesParams<T>): Promise<BigNumberish[]>;
    abstract resolveFees(params: ResolveFeesParams<T>): Promise<BigNumberish[]>;
    constructor(appToolkit: IAppToolkit, contractFactory: CurveContractFactory, curveVolumeDataLoader: CurveVolumeDataLoader);
    getContract(address: string): Erc20;
    getDefinitions({ multicall }: GetDefinitionsParams): Promise<{
        address: string;
        swapAddress: string;
    }[]>;
    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;
    })[]>;
}
