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 { InterbtcPrimitivesVaultId } from "../parachain";
import { TransactionAPI } from "../parachain/transaction";
import { CurrencyIdLiteral, CollateralUnit, CollateralIdLiteral, WrappedCurrency, CurrencyUnit, GovernanceUnit, GovernanceIdLiteral } 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 collateralCurrencyId Collateral currency used by the vault
     * @returns A Monetary.js amount object, representing the reward in the given currency
     */
    computeRewardInStakingPool(vaultAccountId: AccountId, nominatorId: AccountId, collateralCurrencyId: CollateralIdLiteral, rewardCurrencyId?: CurrencyIdLiteral, nonce?: number): Promise<MonetaryAmount<Currency<CurrencyUnit>, CurrencyUnit>>;
    /**
     * @param collateralCurrencyId 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(collateralCurrencyId: CollateralIdLiteral, vaultId: AccountId, nominatorId: AccountId): Promise<Big>;
    /**
     * Total stake for a vault
     * @param collateralCurrencyIdLiteral 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: CollateralIdLiteral, vaultAccountId: AccountId, nonce?: number): Promise<Big>;
    /**
     * @param rewardCurrencyId 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 collateralCurrencyId Collateral currency used by the vault
     * @param nonce Nonce of the rewards pool
     * @returns The reward tally, as a Big object
     */
    getStakingPoolRewardTally(rewardCurrencyId: CurrencyIdLiteral, vaultId: AccountId, nominatorId: AccountId, collateralCurrencyId: CollateralIdLiteral, nonce?: number): Promise<Big>;
    /**
     * @param rewardCurrencyId The reward currency, e.g. kBTC, KINT, interBTC, INTR
     * @param vaultId The account ID of the staking pool nominee
     * @param collateralCurrencyId Collateral currency used by the vault
     * @param nonce Nonce of the rewards pool
     * @returns The reward per token, as a Big object
     */
    getStakingPoolRewardPerToken(rewardCurrencyId: CurrencyIdLiteral, vaultId: AccountId, collateralCurrencyId: CollateralIdLiteral, nonce?: number): Promise<Big>;
    /**
     * @param currencyId The staked currency
     * @param vaultId The account ID of the staking pool nominee
     * @returns The current nonce of the staking pool
     */
    getStakingPoolNonce(currencyId: CollateralIdLiteral, vaultId: AccountId): Promise<number>;
    /**
     * @param rewardCurrencyIdLiteral The reward currency
     * @param vaultCollateralIdLiteral 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: CurrencyIdLiteral, vaultCollateralIdLiteral: CollateralIdLiteral, vaultAccountId: AccountId): Promise<MonetaryAmount<Currency<CurrencyUnit>, CurrencyUnit>>;
    /**
     * @param vaultId The account ID of the staking pool nominee
     * @param nominatorId The account ID of the staking pool nominator
     * @param collateralCurrencyIdLiteral Collateral used by the vault
     * @returns A Monetary.js amount object, representing the collateral in the given currency
     */
    computeCollateralInStakingPool(vaultId: InterbtcPrimitivesVaultId, nominatorId: AccountId): Promise<MonetaryAmount<Currency<CollateralUnit>, CollateralUnit>>;
    /**
     * @param currencyId The reward currency
     * @param accountId An account ID string
     * @returns The stake, as a Big object
     */
    getRewardsPoolStake(currencyId: CurrencyIdLiteral, accountId: AccountId): Promise<Big>;
    /**
     * @param rewardCurrencyIdLiteral The reward currency
     * @param vaultCollateralIdLiteral 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: CurrencyIdLiteral, vaultCollateralIdLiteral: CollateralIdLiteral, vaultAccountId: AccountId): Promise<Big>;
    /**
     * @param currencyId The reward currency
     * @returns The reward per token, as a Big object
     */
    getRewardsPoolRewardPerToken(currencyId: CurrencyIdLiteral): 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: GovernanceIdLiteral): Promise<MonetaryAmount<Currency<GovernanceUnit>, GovernanceUnit>>;
}
export declare class DefaultRewardsAPI implements RewardsAPI {
    api: ApiPromise;
    private wrappedCurrency;
    private transactionAPI;
    constructor(api: ApiPromise, wrappedCurrency: WrappedCurrency, transactionAPI: TransactionAPI);
    withdrawRewards(vaultId: InterbtcPrimitivesVaultId, nonce?: number): Promise<void>;
    computeRewardInStakingPool(vaultAccountId: AccountId, nominatorId: AccountId, collateralCurrencyId: CollateralIdLiteral, rewardCurrencyId?: CurrencyIdLiteral, nonce?: number): Promise<MonetaryAmount<Currency<CurrencyUnit>, CurrencyUnit>>;
    getStakingPoolNonce(collateralCurrencyIdLiteral: CollateralIdLiteral, vaultAccountId: AccountId): Promise<number>;
    getStakingPoolStake(collateralCurrencyIdLiteral: CollateralIdLiteral, vaultAccountId: AccountId, nominatorId: AccountId, nonce?: number): Promise<Big>;
    getStakingPoolTotalStake(collateralCurrencyIdLiteral: CollateralIdLiteral, vaultAccountId: AccountId, nonce?: number): Promise<Big>;
    getStakingPoolRewardTally(rewardCurrencyIdLiteral: CurrencyIdLiteral, vaultAccountId: AccountId, nominatorId: AccountId, collateralCurrencyIdLiteral: CollateralIdLiteral, nonce?: number): Promise<Big>;
    getStakingPoolRewardPerToken(wrappedCurrencyIdLiteral: CurrencyIdLiteral, vaultAccountId: AccountId, collateralCurrencyIdLiteral: CollateralIdLiteral, nonce?: number): Promise<Big>;
    computeCollateralInStakingPool(vaultId: InterbtcPrimitivesVaultId, nominatorId: AccountId): Promise<MonetaryAmount<Currency<CollateralUnit>, CollateralUnit>>;
    getStakingPoolSlashPerToken(vaultCollateralIdLiteral: CollateralIdLiteral, vaultAccountId: AccountId, nonce?: number): Promise<Big>;
    getStakingPoolSlashTally(collateralCurrencyIdLiteral: CollateralIdLiteral, vaultAccountId: AccountId, nominatorId: AccountId, nonce?: number): Promise<Big>;
    computeRewardInRewardsPool(rewardCurrencyIdLiteral: CurrencyIdLiteral, vaultCollateralIdLiteral: CollateralIdLiteral, vaultAccountId: AccountId): Promise<MonetaryAmount<Currency<CurrencyUnit>, CurrencyUnit>>;
    getRewardsPoolStake(vaultCollateralIdLiteral: CollateralIdLiteral, vaultAccountId: AccountId): Promise<Big>;
    getRewardsPoolRewardTally(rewardCurrencyIdLiteral: CurrencyIdLiteral, vaultCollateralIdLiteral: CollateralIdLiteral, vaultAccountId: AccountId): Promise<Big>;
    getRewardsPoolRewardPerToken(currencyId: CurrencyIdLiteral): Promise<Big>;
    getRewardPerBlock(governanceCurrency: GovernanceIdLiteral): Promise<MonetaryAmount<Currency<GovernanceUnit>, GovernanceUnit>>;
}
