interface ICompositeVault {
    function cap() external view returns (uint256);

    function getConverter() external view returns (address);

    function getVaultMaster() external view returns (address);

    function balance() external view returns (uint256);

    function tvl() external view returns (uint256); // total dollar value

    function token() external view returns (address);

    function available() external view returns (uint256);

    function accept(address _input) external view returns (bool);

    function earn() external;

    function harvest(address reserve, uint256 amount) external;

    function addNewCompound(uint256, uint256) external;

    function withdraw_fee(uint256 _shares) external view returns (uint256);

    function calc_token_amount_deposit(address _input, uint256 _amount) external view returns (uint256);

    function calc_add_liquidity(uint256 _amount0, uint256 _amount1) external view returns (uint256);

    function calc_token_amount_withdraw(uint256 _shares, address _output) external view returns (uint256);

    function calc_remove_liquidity(uint256 _shares) external view returns (uint256 _amount0, uint256 _amount1);

    function getPricePerFullShare() external view returns (uint256);

    function get_virtual_price() external view returns (uint256); // average dollar value of vault share token

    function deposit(
        address _input,
        uint256 _amount,
        uint256 _min_mint_amount
    ) external returns (uint256);

    function depositFor(
        address _account,
        address _to,
        address _input,
        uint256 _amount,
        uint256 _min_mint_amount
    ) external returns (uint256 _mint_amount);

    function addLiquidity(
        uint256 _amount0,
        uint256 _amount1,
        uint256 _min_mint_amount
    ) external returns (uint256);

    function addLiquidityFor(
        address _account,
        address _to,
        uint256 _amount0,
        uint256 _amount1,
        uint256 _min_mint_amount
    ) external returns (uint256 _mint_amount);

    function withdraw(
        uint256 _shares,
        address _output,
        uint256 _min_output_amount
    ) external returns (uint256);

    function withdrawFor(
        address _account,
        uint256 _shares,
        address _output,
        uint256 _min_output_amount
    ) external returns (uint256 _output_amount);

    function harvestStrategy(address _strategy) external;

    function harvestAllStrategies() external;
}
function deposit(
    address _input,
    uint256 _amount,
    uint256 _min_mint_amount
) external returns (uint256);

// average dollar value of vault share token