/**
 * @file mirror.ts
 * @author astra <astra@volare.com>
 * @date 2022
 */
import { Address, BigNumber, Hash, Sym } from '@volare.finance/utils.js';
import { INativeVault, INativeVToken } from './protocols';
export declare function getProductHash(vToken: Pick<INativeVToken, 'underlyingAsset' | 'strikeAsset' | 'collateralAsset' | 'isPut'>): Hash;
/**
 * @notice convert an amount in asset A to equivalent amount of asset B, based on an expiry price
 * @dev function includes the amount and apply .mul() first to increase the accuracy
 * @param _amount amount in asset A
 * @param _assetA asset A
 * @param _assetB asset B
 * @param _expiry
 * @param _prices
 * @return _amount in asset B
 */
export declare function _convertAmountOnExpiryPrice(_amount: BigNumber, _assetA: Address, _assetB: Address, _expiry: number, _prices?: {
    [key: Address]: BigNumber;
}): Promise<BigNumber>;
/**
 * @description return the cash value of an expired vToken, denominated in strike asset
 * @param vToken
 * @param underlyingPrice denominated in usd
 * @param strikePrice denominated in usd
 * @return cash value of an expired vToken, denominated in the strike asset
 */
export declare function getExpiredCashValue(vToken: Pick<INativeVToken, 'strikePrice' | 'isPut'>, underlyingPrice: BigNumber, strikePrice: BigNumber): BigNumber;
/**
 * @description return the cash value of an expired vToken, denominated in collateral
 * @param vToken
 * @param collateralPrice denominated in usd
 * @param underlyingPrice denominated in usd
 * @param strikePrice denominated in usd
 */
export declare function getExpiredPayoutRate(vToken: Pick<INativeVToken, 'strikePrice' | 'isPut'>, collateralPrice: BigNumber, underlyingPrice: BigNumber, strikePrice: BigNumber): BigNumber;
/**
 * @description get an vToken's payout/cash value after expiry, in the collateral asset
 * @param vToken
 * @param collateralPrice denominated in usd
 * @param underlyingPrice denominated in usd
 * @param strikePrice denominated in usd
 * @param amount
 */
export declare function getPayout(vToken: Pick<INativeVToken, 'strikePrice' | 'isPut'>, collateralPrice: BigNumber, underlyingPrice: BigNumber, strikePrice: BigNumber, amount: BigNumber): BigNumber;
/**
 * @notice get required collateral for naked margin position
 * if put:
 * a = min(strike price, spot shock * underlying price)
 * b = max(strike price - spot shock * underlying price, 0)
 * marginRequired = ( option upper bound value * a + b) * short amount
 * if call:
 * a = min(1, strike price / (underlying price / spot shock value))
 * b = max(1- (strike price / (underlying price / spot shock value)), 0)
 * marginRequired = (option upper bound value * a + b) * short amount
 * @param vToken
 * @param shortAmount short amount in vault, in FixedPointInt type
 * @param underlyingPrice underlying price of short vToken underlying asset, in FixedPointInt type
 * @return required margin for this naked vault, in FixedPointInt type (scaled by 1e27)
 */
export declare function getNakedMarginRequired(vToken: Pick<INativeVToken, 'underlyingAsset' | 'strikeAsset' | 'collateralAsset' | 'isPut' | 'strikePrice' | 'expiry'>, shortAmount: BigNumber, underlyingPrice: BigNumber): BigNumber;
export declare function getLiquidatablePrice(vToken: Pick<INativeVToken, 'underlyingAsset' | 'strikeAsset' | 'collateralAsset' | 'isPut' | 'strikePrice' | 'expiry'>, shortAmount: BigNumber, collateralAmount: BigNumber): BigNumber;
/**
 * @description returns the amount of collateral that can be removed from an actual or a theoretical vault
 * @param vault
 * @param prices denominated in usd
 */
export declare function getMarginRequired(vault: INativeVault, prices: {
    [key: Sym]: BigNumber;
}): Promise<{
    shortPayouts: BigNumber[];
    longPayouts: BigNumber[];
    marginRequired: BigNumber[];
}>;
export declare function getCollateralDetails(vault: INativeVault, prices: {
    [key: Sym]: BigNumber;
}): Promise<{
    collateralAssets: Address[];
    collateralAmounts: BigNumber[];
    fullCollateralAmounts: BigNumber[];
    collateralRates: string[];
    marginRequired: BigNumber[];
    liquidationRates: string[];
}>;
