From 42d8bee5393cae8d97afafd4ff0631f0587c0a11 Mon Sep 17 00:00:00 2001 From: kphed Date: Mon, 13 Nov 2023 09:00:01 -0500 Subject: [PATCH] Re-add BrrETHDepositor --- src/BrrETHDepositor.sol | 70 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/BrrETHDepositor.sol diff --git a/src/BrrETHDepositor.sol b/src/BrrETHDepositor.sol new file mode 100644 index 0000000..843d15c --- /dev/null +++ b/src/BrrETHDepositor.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Test.sol"; +import {SafeTransferLib} from "solady/utils/SafeTransferLib.sol"; +import {BrrETH} from "src/BrrETH.sol"; +import {IWETH} from "src/interfaces/IWETH.sol"; +import {IComet} from "src/interfaces/IComet.sol"; + +contract BrrETHDepositor { + using SafeTransferLib for address; + + address private constant _WETH_ADDR = + 0x4200000000000000000000000000000000000006; + address private constant _COMET_ADDR = + 0x46e6b214b524310239732D51387075E0e70970bf; + IWETH private constant _WETH = IWETH(_WETH_ADDR); + IComet private constant _COMET = IComet(_COMET_ADDR); + BrrETH public immutable brrETH; + + error InvalidAmount(); + error InvalidAddress(); + + constructor(address _brrETH) { + brrETH = BrrETH(_brrETH); + + _WETH_ADDR.safeApprove(_COMET_ADDR, type(uint256).max); + _COMET_ADDR.safeApprove(_brrETH, type(uint256).max); + } + + /** + * @notice Deposit ETH for brrETH. + * @param to address Shares recipient. + */ + function deposit(address to) external payable returns (uint256, uint256) { + if (msg.value == 0) revert InvalidAmount(); + if (to == address(0)) revert InvalidAddress(); + + _WETH.deposit{value: msg.value}(); + + return _supplyAndDeposit(msg.value, to); + } + + /** + * @notice Deposit WETH for brrETH. + * @param amount uint256 WETH amount. + * @param to address Shares recipient. + */ + function deposit( + uint256 amount, + address to + ) external returns (uint256, uint256) { + if (amount == 0) revert InvalidAmount(); + if (to == address(0)) revert InvalidAddress(); + + _WETH_ADDR.safeTransferFrom(msg.sender, address(this), amount); + + return _supplyAndDeposit(amount, to); + } + + function _supplyAndDeposit( + uint256 amount, + address to + ) private returns (uint256 assets, uint256 shares) { + _COMET.supply(_WETH_ADDR, amount); + + assets = _COMET_ADDR.balanceOf(address(this)); + shares = brrETH.deposit(assets, to); + } +}