import { AssetType } from '@collabland/chain';
import { BigNumber, providers } from 'ethers';
import { StakingAsset } from './models/staking.model.js';
export { StakingAsset, StakingContractMetadata } from './models/staking.model.js';
export interface EthersProviderService {
    getProvider(chainIdOrNetwork: string | number): providers.Provider;
}
/**
 * Interface to be implemented to support specific staking contracts
 */
export interface StackingContractAdapter {
    contractName?: string;
    /**
     * Chain id for the staking contract, default to `1` (Ethereum Mainnet)
     */
    chainId?: number;
    /**
     * Contract address
     */
    contractAddress: string;
    /**
     * Supported assets to be staked
     */
    supportedAssets: StakingAsset[];
    /**
     * Check if the given asset name is supported by this staking contract
     * @param asset - Asset name such as `ERC721:0x...`
     */
    isAssetSupported(assetName: string): Promise<boolean>;
    /**
     * Get asset type that can be staked to the contract
     * @param assetName - Name of the asset if the staking contract allows multiple
     * types of tokens to be staked
     */
    getStakingAssetType(assetName?: string): AssetType | undefined;
    /**
     * Get a list token ids staked by the owner
     * @param provider - Ethers provider
     * @param owner - Owner address
     * @param assetName - Asset name
     */
    getStakedTokenIds(owner: string, assetName?: string): Promise<BigNumber[]>;
    /**
     * Get number of token ids staked by the owner
     * @param provider - Ethers provider
     * @param owner - Owner address
     * @param assetName - Asset name
     */
    getStakedTokenBalance(owner: string, assetName?: string): Promise<BigNumber>;
}
/**
 * Base class for staking contract adapters
 */
export declare abstract class BaseStakingContractAdapter implements StackingContractAdapter {
    contractName?: string | undefined;
    providerService: EthersProviderService;
    chainId: number;
    contractAddress: string;
    abstract supportedAssets: StakingAsset[];
    private _provider;
    get provider(): providers.Provider;
    isAssetSupported(assetName: string): Promise<boolean>;
    getStakingAsset(nameOrAssetType?: string): StakingAsset;
    getStakingAssetType(name?: string): AssetType | undefined;
    getStakedTokenBalance(owner: string, assetName?: string): Promise<BigNumber>;
    getStakedTokenIds(owner: string, assetName?: string): Promise<BigNumber[]>;
}
