import { AccountId } from "@polkadot/types/interfaces";
import { Currency, MonetaryAmount } from "@interlay/monetary-js";
import { ApiPromise } from "@polkadot/api/promise";
import Big from "big.js";
import { AssetRegistryAPI, InterbtcPrimitivesVaultId } from "../parachain";
import { TransactionAPI } from "../parachain/transaction";
import { WrappedCurrency, GovernanceCurrency, CollateralCurrencyExt, CurrencyExt } from "../types";
export interface RewardsAPI {
    /**
     * @param vaultId The account ID of the staking pool nominee
     * @param nominatorId The account ID of the staking pool nominator
     * @param collateralCurrency Collateral currency used by the vault
     * @returns A Monetary.js amount object, representing the reward in the given currency
     */
    computeRewardInStakingPool(vaultAccountId: AccountId, nominatorId: AccountId, collateralCurrenc: CollateralCurrencyExt, rewardCurrency?: CurrencyExt, nonce?: number): Promise<MonetaryAmount<CurrencyExt>>;
    /**
     * @param collateralCurrency The staked currency
     * @param vaultId The account ID of the staking pool nominee
     * @param nominatorId The account ID of the staking pool nominator
     * @returns The stake, as a Big object
     */
    getStakingPoolStake(collateralCurrency: CollateralCurrencyExt, vaultId: AccountId, nominatorId: AccountId): Promise<Big>;
    /**
     * Total stake for a vault
     * @param collateralCurrency The vault's collateral
     * @param vaultAccountId The vault's accountID
     * @param nonce The nonce of the rewards pool
     * @returns The stake, as a Big object
     */
    getStakingPoolTotalStake(collateralCurrencyIdLiteral: CollateralCurrencyExt, vaultAccountId: AccountId, nonce?: number): Promise<Big>;
    /**
     * @param rewardCurrency The reward currency, e.g. kBTC, KINT, interBTC, INTR
     * @param vaultId The account ID of the staking pool nominee
     * @param nominatorId The account ID of the staking pool nominator
     * @param collateralCurrency Collateral currency used by the vault
     * @param nonce Nonce of the rewards pool
     * @returns The reward tally, as a Big object
     */
    getStakingPoolRewardTally(rewardCurrency: Currency, vaultId: AccountId, nominatorId: AccountId, collateralCurrency: CollateralCurrencyExt, nonce?: number): Promise<Big>;
    /**
     * @param rewardCurrency The reward currency, e.g. kBTC, KINT, interBTC, INTR
     * @param vaultId The account ID of the staking pool nominee
     * @param collateralCurrency Collateral currency used by the vault
     * @param nonce Nonce of the rewards pool
     * @returns The reward per token, as a Big object
     */
    getStakingPoolRewardPerToken(rewardCurrency: Currency, vaultId: AccountId, collateralCurrency: CollateralCurrencyExt, nonce?: number): Promise<Big>;
    /**
     * @param currency The staked currency
     * @param vaultId The account ID of the staking pool nominee
     * @returns The current nonce of the staking pool
     */
    getStakingPoolNonce(currency: CurrencyExt, vaultId: AccountId): Promise<number>;
    /**
     * @param rewardCurrency The reward currency
     * @param vaultCollateral Collateral used by the vault
     * @param vaultAccountId The vault ID whose reward to compute
     * @returns A Monetary.js amount object, representing the reward in the given currency
     */
    computeRewardInRewardsPool(rewardCurrencyIdLiteral: Currency, vaultCollateralIdLiteral: CollateralCurrencyExt, vaultAccountId: AccountId): Promise<MonetaryAmount<Currency>>;
    /**
     * @param vaultId The account ID of the staking pool nominee
     * @param nominatorId The account ID of the staking pool nominator
     * @returns A Monetary.js amount object, representing the collateral in the given currency
     */
    computeCollateralInStakingPool(vaultId: InterbtcPrimitivesVaultId, nominatorId: AccountId): Promise<MonetaryAmount<CollateralCurrencyExt>>;
    /**
     * @param currency The reward currency
     * @param accountId An account ID string
     * @returns The stake, as a Big object
     */
    getRewardsPoolStake(currency: Currency, accountId: AccountId): Promise<Big>;
    /**
     * @param rewardCurrency The reward currency
     * @param vaultCollateral Collateral used by the vault
     * @param vaultAccountId The vault ID whose reward pool to check
     * @returns The reward tally, as a Big object
     */
    getRewardsPoolRewardTally(rewardCurrencyIdLiteral: Currency, vaultCollateralIdLiteral: CollateralCurrencyExt, vaultAccountId: AccountId): Promise<Big>;
    /**
     * @param currency The reward currency
     * @returns The reward per token, as a Big object
     */
    getRewardsPoolRewardPerToken(currencyId: Currency): Promise<Big>;
    /**
     * @param vaultId VaultId object
     * @param nonce Staking pool nonce
     * @remarks Withdraw all rewards from the current account in the `vaultId` staking pool.
     */
    withdrawRewards(vaultId: InterbtcPrimitivesVaultId, nonce?: number): Promise<void>;
    /**
     * Gets the vault annuity systemwide per-block reward.
     * @param governanceCurrency The ID of the currency the reward is paid out in.
     */
    getRewardPerBlock(governanceCurrency: GovernanceCurrency): Promise<MonetaryAmount<GovernanceCurrency>>;
}
export declare class DefaultRewardsAPI implements RewardsAPI {
    api: ApiPromise;
    private wrappedCurrency;
    private transactionAPI;
    private assetRegistry;
    constructor(api: ApiPromise, wrappedCurrency: WrappedCurrency, transactionAPI: TransactionAPI, assetRegistry: AssetRegistryAPI);
    withdrawRewards(vaultId: InterbtcPrimitivesVaultId, nonce?: number): Promise<void>;
    computeRewardInStakingPool(vaultAccountId: AccountId, nominatorId: AccountId, collateralCurrency: CollateralCurrencyExt, rewardCurrency?: Currency, nonce?: number): Promise<MonetaryAmount<Currency>>;
    getStakingPoolNonce(collateralCurrency: CollateralCurrencyExt, vaultAccountId: AccountId): Promise<number>;
    getStakingPoolStake(collateralCurrency: CollateralCurrencyExt, vaultAccountId: AccountId, nominatorId: AccountId, nonce?: number): Promise<Big>;
    getStakingPoolTotalStake(collateralCurrency: CollateralCurrencyExt, vaultAccountId: AccountId, nonce?: number): Promise<Big>;
    getStakingPoolRewardTally(rewardCurrency: Currency, vaultAccountId: AccountId, nominatorId: AccountId, collateralCurrency: CollateralCurrencyExt, nonce?: number): Promise<Big>;
    getStakingPoolRewardPerToken(wrappedCurrency: Currency, vaultAccountId: AccountId, collateralCurrency: CollateralCurrencyExt, nonce?: number): Promise<Big>;
    computeCollateralInStakingPool(vaultId: InterbtcPrimitivesVaultId, nominatorId: AccountId): Promise<MonetaryAmount<CollateralCurrencyExt>>;
    getStakingPoolSlashPerToken(vaultCollateral: CollateralCurrencyExt, vaultAccountId: AccountId, nonce?: number): Promise<Big>;
    getStakingPoolSlashTally(collateralCurrency: CollateralCurrencyExt, vaultAccountId: AccountId, nominatorId: AccountId, nonce?: number): Promise<Big>;
    computeRewardInRewardsPool(rewardCurrency: Currency, vaultCollateral: CollateralCurrencyExt, vaultAccountId: AccountId): Promise<MonetaryAmount<Currency>>;
    getRewardsPoolStake(vaultCollateral: CollateralCurrencyExt, vaultAccountId: AccountId): Promise<Big>;
    getRewardsPoolRewardTally(rewardCurrency: Currency, vaultCollateral: CollateralCurrencyExt, vaultAccountId: AccountId): Promise<Big>;
    getRewardsPoolRewardPerToken(currency: Currency): Promise<Big>;
    getRewardPerBlock(governanceCurrency: GovernanceCurrency): Promise<MonetaryAmount<GovernanceCurrency>>;
}
