MEDIUM severity: The `TwoTokenPoolUtils._getMinExitAmounts` function is designed to calculate the minimum amounts of . The `TwoTokenPoolUtils._getMinExitAmounts` function is designed to calculate the minimum amounts of primary and secondary tokens that can be redeemed from a Curve pool when a proportionally redeemable amount is claimed. However, the function's calculation is based on the spot balance of the pool, wh...

Vulnerable code:
```\nFile: Curve2TokenConvexHelper.sol\n\nfunction _executeSettlement(\n    StrategyContext calldata strategyContext,\n    Curve2TokenPoolContext calldata poolContext,\n    uint256 maturity,\n    uint256 poolClaimToSettle,\n    uint256 redeemStrategyTokenAmount,\n    RedeemParams memory params\n) private {\n    (uint256 spotPrice, uint256 oraclePrice) = poolContext._getSpotPriceAndOraclePrice(strategyContext);\n\n    (params.minPrimary, params.minSecondary) = poolContext.basePool._getMinExitAmounts({\n        strategyContext: strategyContext,\n        oraclePrice: oraclePrice,\n        spotPrice: spotPrice,\n        poolClaim: poolClaimToSettle\n    });\n```\n```\nFile: TwoTokenPoolUtils.sol\n\n@notice calculates the expected primary and secondary amounts based on\nthe given spot price and oracle price\nfunction _getMinExitAmounts(\n    TwoTokenPoolContext calldata poolContext,\n    StrategyContext calldata strategyContext,\n    uint256 spotPrice,\n    uint256 oraclePrice,\n    uint256 poolClaim\n) internal view returns (uint256 minPrimary, uint256 minSecondary) {\n    strategyContext._checkPriceLimit(oraclePrice, spotPrice);\n\n    minPrimary = (poolContext.primaryBalance * poolClaim * \n        strategyContext.vaultSettings.poolSlippageLimitPercent) / \n        (poolContext.poolToken.totalSupply() * uint256(VaultConstants.VAULT_PERCENT_BASIS));\n\n    minSecondary = (poolContext.secondaryBalance * poolClaim * \n        strategyContext.vaultSettings.poolSlippageLimitPercent) / \n        (poolContext.poolToken.totalSupply() * uint256(VaultConstants.VAULT_PERCENT_BASIS));\n}\n```\n```\n@external\n@nonreentrant('lock')\ndef remove_liquidity(\n    _amount: uint256,\n    _min_amounts: uint256[N_COINS]\n) -> uint256[N_COINS]:\n    """\n    Withdraw coins from the pool\n    Withdrawal amounts are based on current deposit ratios\n    @param _amount Quantity of LP tokens to burn in the withdrawal\n    @param _min_amounts Minimum amounts of underlying coins to receive\n    @return List of amounts of coins that were withdrawn\n    """\n    amounts: uint256[N_COINS] = self._balances()\n    lp_token: address = self.lp_token\n    total_supply: uint256 = ERC20(lp_token).totalSupply()\n\n    CurveToken(lp_token).burnFrom(msg.sender, _amount)  # insufficient funds\n\n    for i in range(N_COINS):\n        value: uint256 = amounts[i] * _amount / total_supply\n        assert value >= _min_amounts[i], "Withdrawal resulted in fewer coins than expected"\n\n        amounts[i] = value\n        if i == 0:\n            raw_call(msg.sender, b"", value=value)\n        else:\n            assert ERC20(self.coins[1]).transfer(msg.sender, value)\n\n    log RemoveLiquidity(msg.sender, amounts, [], total_supply - _amount)\n\n    return amounts\n```\n```\nminPrimary = (poolContext.primaryBalance * poolClaim * strategyContext.vaultSettings.poolSlippageLimitPercent) / \n    (totalPoolSupply * uint256(VaultConstants.VAULT_PERCENT_BASIS))\n\nminPrimary = (100 DAI * (50 LP_TOKEN / 100 LP_TOKEN) * (99.75 / 100))\n```\n```\na = CurvePool's remove_liquidity => x DAI\nb = TwoTokenPoolUtils._getMinExitAmounts => (x DAI - 0.25% discount)\na > b\n```