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

Commit

Permalink
Resolve L-02: enable harvest to be called before setting cometRewards
Browse files Browse the repository at this point in the history
  • Loading branch information
kphed committed Jan 12, 2024
1 parent 8dcd945 commit a9fecd6
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 11 deletions.
13 changes: 9 additions & 4 deletions src/BrrETH.sol
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ contract BrrETH is Ownable, ERC4626 {
uint256 supplyAssets,
uint256 fees
);
event SetCometRewards(address);
event SetCometRewards(address, bool);
event SetRouter(address);
event SetRewardFee(uint256);
event SetProtocolFeeReceiver(address);
Expand Down Expand Up @@ -196,7 +196,7 @@ contract BrrETH is Ownable, ERC4626 {
}

/// @notice Claim rewards and convert them into the vault asset.
function harvest() external {
function harvest() public {
cometRewards.claim(_COMET, address(this), true);

ICometRewards.RewardConfig memory rewardConfig = cometRewards
Expand Down Expand Up @@ -257,13 +257,18 @@ contract BrrETH is Ownable, ERC4626 {
/**
* @notice Set the Comet Rewards contract.
* @param _cometRewards address Comet Rewards contract address.
* @param shouldHarvest bool Whether to call `harvest` before setting `cometRewards`.
*/
function setCometRewards(address _cometRewards) external onlyOwner {
function setCometRewards(
address _cometRewards,
bool shouldHarvest
) external onlyOwner {
if (_cometRewards == address(0)) revert InvalidCometRewards();
if (shouldHarvest) harvest();

cometRewards = ICometRewards(_cometRewards);

emit SetCometRewards(_cometRewards);
emit SetCometRewards(_cometRewards, shouldHarvest);
}

/**
Expand Down
55 changes: 48 additions & 7 deletions test/BrrETH.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -499,50 +499,91 @@ contract BrrETHTest is Helper {
function testCannotSetCometRewardsUnauthorized() external {
address msgSender = address(0);
address cometRewards = address(0xbeef);
bool shouldHarvest = false;

assertTrue(msgSender != vault.owner());

vm.prank(msgSender);
vm.expectRevert(Ownable.Unauthorized.selector);

vault.setCometRewards(cometRewards);
vault.setCometRewards(cometRewards, shouldHarvest);
}

function testCannotSetCometRewardsInvalidCometRewards() external {
address cometRewards = address(0);
bool shouldHarvest = false;

vm.expectRevert(BrrETH.InvalidCometRewards.selector);

vault.setCometRewards(cometRewards);
vault.setCometRewards(cometRewards, shouldHarvest);
}

function testSetCometRewards() external {
address cometRewards = address(0xbeef);
bool shouldHarvest = false;

assertTrue(cometRewards != address(vault.cometRewards()));

vm.expectEmit(true, true, true, true, address(vault));

emit BrrETH.SetCometRewards(cometRewards);
emit BrrETH.SetCometRewards(cometRewards, shouldHarvest);

vault.setCometRewards(cometRewards);
vault.setCometRewards(cometRewards, shouldHarvest);

assertEq(cometRewards, address(vault.cometRewards()));
}

function testSetCometRewardsFuzz(address cometRewards) external {
function testSetCometRewardsShouldHarvest() external {
address cometRewards = address(0xbeef);
bool shouldHarvest = true;

assertTrue(cometRewards != address(vault.cometRewards()));

// Deposit and accrue enough time to ensure `harvest` is called (i.e. emits `Harvest` event).
vault.deposit{value: 1 ether}(address(this));

skip(1 days);

// Event members are unchecked, we just need to know that `harvest` was called.
vm.expectEmit(false, false, false, false, address(vault));

emit BrrETH.Harvest(_COMP, 0, 0, 0);

vm.expectEmit(true, true, true, true, address(vault));

emit BrrETH.SetCometRewards(cometRewards, shouldHarvest);

vault.setCometRewards(cometRewards, shouldHarvest);

assertEq(cometRewards, address(vault.cometRewards()));
}

function testSetCometRewardsFuzz(
address cometRewards,
bool shouldHarvest
) external {
vm.assume(
cometRewards != address(0) &&
cometRewards != address(vault.cometRewards())
);

assertTrue(cometRewards != address(vault.cometRewards()));

if (shouldHarvest) {
vault.deposit{value: 1 ether}(address(this));

skip(1 days);

vm.expectEmit(false, false, false, false, address(vault));

emit BrrETH.Harvest(_COMP, 0, 0, 0);
}

vm.expectEmit(true, true, true, true, address(vault));

emit BrrETH.SetCometRewards(cometRewards);
emit BrrETH.SetCometRewards(cometRewards, shouldHarvest);

vault.setCometRewards(cometRewards);
vault.setCometRewards(cometRewards, shouldHarvest);

assertEq(cometRewards, address(vault.cometRewards()));
}
Expand Down

0 comments on commit a9fecd6

Please sign in to comment.