Skip to content
This repository has been archived by the owner on Jul 2, 2024. It is now read-only.

Commit

Permalink
Resolve L-04 (2 of 2): Add minAssets to helper contract's redeem method
Browse files Browse the repository at this point in the history
  • Loading branch information
kphed committed Jan 12, 2024
1 parent cccdf19 commit 90d7adf
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 9 deletions.
13 changes: 10 additions & 3 deletions src/BrrETHRedeemHelper.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ contract BrrETHRedeemHelper {
IWETH(0x4200000000000000000000000000000000000006);
IBrrETH public immutable brrETH;

error InsufficientAssetsRedeemed();

receive() external payable {}

constructor(address _brrETH) {
Expand All @@ -23,17 +25,22 @@ contract BrrETHRedeemHelper {

/**
* @notice Redeem brrETH for ETH.
* @param shares uint256 Amount of shares to redeem.
* @param to address ETH recipient.
* @param shares uint256 Amount of shares to redeem.
* @param to address ETH recipient.
* @param minAssets uint256 The minimum amount of assets that must be redeemed.
*/
function redeem(uint256 shares, address to) external {
function redeem(uint256 shares, address to, uint256 minAssets) external {
// Requires approval from the caller to spend their brrETH balance.
brrETH.redeem(shares, address(this), msg.sender);

// Comet's alias for an "entire balance" is `type(uint256).max`.
_COMET.withdraw(address(_WETH), type(uint256).max);

_WETH.withdraw(_WETH.balanceOf(address(this)));

if (address(this).balance < minAssets)
revert InsufficientAssetsRedeemed();

to.safeTransferETH(address(this).balance);
}
}
26 changes: 20 additions & 6 deletions test/BrrETHRedeemHelper.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,31 @@ contract BrrETHRedeemHelperTest is Test, Helper {
redeem
//////////////////////////////////////////////////////////////*/

function testCannotRedeemInsufficientAssetsRedeemed() external {
uint256 shares = vault.deposit{value: 1 ether}(address(this), 1);

// An amount of assets which will be 1 wei greater than the actual amount of assets
// redeemed from brrETH shares (due to Comet rounding down).
uint256 assets = vault.convertToAssets(shares);

vm.expectRevert(BrrETHRedeemHelper.InsufficientAssetsRedeemed.selector);

redeemHelper.redeem(shares, address(this), assets);
}

function testRedeem() external {
uint256 shares = vault.deposit{value: 1 ether}(address(this), 1);

// The amount of cWETH that will be redeemed from brrETH.
uint256 assets = vault.convertToAssets(shares);
uint256 assets = vault.convertToAssets(shares) -
_COMET_ROUNDING_ERROR_MARGIN;

uint256 ethBalanceBefore = address(this).balance;

redeemHelper.redeem(shares, address(this));
redeemHelper.redeem(shares, address(this), assets);

// Account for Comet rounding down and compare against the ETH amount received.
assertEq(assets - 1, address(this).balance - ethBalanceBefore);
assertLe(assets, address(this).balance - ethBalanceBefore);

// The redeem helper should not maintain balances for any of the tokens it handles.
assertEq(0, vault.balanceOf(address(redeemHelper)));
Expand All @@ -49,14 +62,15 @@ contract BrrETHRedeemHelperTest is Test, Helper {
function testRedeemFuzz(uint8 ethMultiplier) external {
uint256 msgValue = 1 ether * (uint256(ethMultiplier) + 1);
uint256 shares = vault.deposit{value: msgValue}(address(this), 1);
uint256 assets = vault.convertToAssets(shares);
uint256 assets = vault.convertToAssets(shares) -
_COMET_ROUNDING_ERROR_MARGIN;

uint256 ethBalanceBefore = address(this).balance;

redeemHelper.redeem(shares, address(this));
redeemHelper.redeem(shares, address(this), assets);

// Account for Comet rounding down and compare against the ETH amount received.
assertLe(assets - 2, address(this).balance - ethBalanceBefore);
assertLe(assets, address(this).balance - ethBalanceBefore);

assertEq(0, vault.balanceOf(address(redeemHelper)));
assertEq(0, COMET.balanceOf(address(redeemHelper)));
Expand Down

0 comments on commit 90d7adf

Please sign in to comment.