From f117a64656e4deb944e78a56c3579f1ed9a4a5ad Mon Sep 17 00:00:00 2001 From: William Date: Wed, 30 Oct 2024 15:26:46 +1100 Subject: [PATCH 01/15] build: lge staking first pass and initial tests --- .../scripts/ozean/LGEStakingDeploy.s.sol | 38 +++ .../scripts/ozean/OzUSDPackage.s.sol | 3 +- .../contracts-bedrock/src/L1/LGEStaking.sol | 180 ++++++++++++ .../contracts-bedrock/src/L1/USDXBridge.sol | 5 +- .../src/L1/interface/ILGEMigration.sol | 19 ++ packages/contracts-bedrock/src/L2/OzUSD.sol | 6 +- packages/contracts-bedrock/src/L2/WozUSD.sol | 3 +- .../test/L1/LGEStaking.t.sol | 256 ++++++++++++++++++ 8 files changed, 505 insertions(+), 5 deletions(-) create mode 100644 packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol create mode 100644 packages/contracts-bedrock/src/L1/LGEStaking.sol create mode 100644 packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol create mode 100644 packages/contracts-bedrock/test/L1/LGEStaking.t.sol diff --git a/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol new file mode 100644 index 00000000000..9868a531704 --- /dev/null +++ b/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Script } from "forge-std/Script.sol"; +import { LGEStaking } from "src/L1/LGEStaking.sol"; + +contract LGEStakingDeploy is Script { + LGEStaking public lgeStaking; + address public lgeMigration; + address public hexTrust = makeAddr("HEX_TRUST"); + address[] public tokens; + uint256[] public depositCaps; + + /// @dev Used in testing environment, unnecessary for mainnet deployment + function setUp( + address _hexTrust, + address _lgeMigration, + address[] memory _tokens, + uint256[] memory _depositCaps + ) + external + { + hexTrust = _hexTrust; + lgeMigration = _lgeMigration; + tokens = _tokens; + depositCaps = _depositCaps; + } + + function run() external broadcast { + lgeStaking = new LGEStaking(hexTrust, lgeMigration, tokens, depositCaps); + } + + modifier broadcast() { + vm.startBroadcast(msg.sender); + _; + vm.stopBroadcast(); + } +} diff --git a/packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol b/packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol index e3649a86ce9..512240c14f7 100644 --- a/packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol @@ -10,7 +10,7 @@ contract OzUSDPackage is Script { address public admin = 0xa2ef4A5fB028b4543700AC83e87a0B8b4572202e; uint256 public initialSharesAmount = 1e18; - function run() external broadcast() { + function run() external broadcast { /// Deploy implementation OzUSD implementation = new OzUSD(); @@ -21,6 +21,7 @@ contract OzUSDPackage is Script { /// Deploy wozUSD WozUSD wozUSD = new WozUSD(OzUSD(payable(proxy))); + wozUSD; } modifier broadcast() { diff --git a/packages/contracts-bedrock/src/L1/LGEStaking.sol b/packages/contracts-bedrock/src/L1/LGEStaking.sol new file mode 100644 index 00000000000..457db498de2 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/LGEStaking.sol @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import { Pausable } from "@openzeppelin/contracts/security/Pausable.sol"; +import { ISemver } from "src/universal/ISemver.sol"; +import { ILGEMigration } from "src/L1/interface/ILGEMigration.sol"; + +/// @title LGE Staking +/// @notice This contract ... +/// @dev Inspired by https://vscode.blockscan.com/ethereum/0xf047ab4c75cebf0eb9ed34ae2c186f3611aeafa6 +contract LGEStaking is Ownable, ReentrancyGuard, Pausable { + using SafeERC20 for IERC20; + + /// @notice Semantic version. + /// @custom:semver 1.0.0 + string public constant version = "1.0.0"; + + /// @notice The migration contract that facilitates unstaking and deposits to the Ozean L2. + ILGEMigration public LGEMigration; + + /// @notice A switch used to gate migration of deposited assets to the Ozean L2. + bool public migrationActivated; + + /// @notice Addresses of allow-listed ERC20 tokens. + /// @dev token => allowlisted + mapping(address => bool) public allowlisted; + + /// @notice The total amount of tokens deposted via this contract per allowlisted token address. + /// @dev token => amount + mapping(address => uint256) public totalDeposited; + + /// @notice The limit to the amount that can be minted and bridged per token address. + /// @dev token => amount + mapping(address => uint256) public depositCap; + + /// @notice The amount of tokens each user deposited for each allowlisted token. + /// @dev token => user => amount + mapping(address => mapping(address => uint256)) public balance; + + /// EVENTS /// + + /// @notice An event emitted when a deposit is made by a user. + event Deposit(address indexed _token, uint256 _amount, address indexed _to); + + /// @notice An event emitted when is withdrawal is made by a user. + event Withdraw(address indexed _token, uint256 _amount, address indexed _to); + + /// @notice An event emitted when en ERC20 token is set as allowlisted or not (true if allowlisted, false if + /// removed). + event AllowlistSet(address indexed _coin, bool _set); + + /// @notice An event emitted when the deposit cap for an ERC20 token is modified. + event DepositCapSet(address indexed _coin, uint256 _newDepositCap); + + /// @notice An event emitted when a user migrates deposited assets to Ozean. + event TokensMigrated(address indexed _user, address indexed _l2Destination, address[] _tokens, uint256[] _amounts); + + /// @notice An event emitted when the migrationActivated boolean switch is modified. + event MigrationActivated(bool _set); + + /// @notice An event emitted when the migration contract is modified. + event MigrationContractSet(address _newContract); + + /// SETUP /// + + constructor(address _owner, address _lgeMigration, address[] memory _tokens, uint256[] memory _depositCaps) { + _transferOwnership(_owner); + LGEMigration = ILGEMigration(_lgeMigration); + uint256 length = _tokens.length; + require( + length == _depositCaps.length, "LGE Staking: Tokens array length must equal the Deposit Caps array length." + ); + for (uint256 i; i < length; ++i) { + allowlisted[_tokens[i]] = true; + emit AllowlistSet(_tokens[i], true); + depositCap[_tokens[i]] = _depositCaps[i]; + emit DepositCapSet(_tokens[i], _depositCaps[i]); + } + } + + /// DEPOSIT /// + + /// @dev Must grant approval for the contract to move tokens + function depositERC20(address _token, uint256 _amount) external nonReentrant whenNotPaused { + require(!migrationActivated, "LGE Staking: May not deposit once migration has been activated."); + require(_amount > 0, "LGE Staking: May not deposit nothing."); + require(allowlisted[_token], "LGE Staking: Token must be allowlisted."); + require( + totalDeposited[_token] + _amount < depositCap[_token], "LGE Staking: deposit amount exceeds deposit cap." + ); + balance[_token][msg.sender] += _amount; + totalDeposited[_token] += _amount; + IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount); + emit Deposit(_token, _amount, msg.sender); + } + + function depositETH() external payable nonReentrant whenNotPaused { + require(!migrationActivated, "LGE Staking: May not deposit once migration has been activated."); + require(msg.value > 0, "LGE Staking: May not deposit nothing."); + /// @dev some logic to move the ETH to wstETH + /// should be able to be disabled also if wstETH is removed from allowlist + } + + /// WITHDRAW /// + + function withdraw(address _token, uint256 _amount) external nonReentrant whenNotPaused { + require(_amount > 0, "LGE Staking: may not withdraw nothing."); + require(balance[_token][msg.sender] >= _amount, "LGE Staking: insufficient deposited balance."); + balance[_token][msg.sender] -= _amount; + totalDeposited[_token] -= _amount; + IERC20(_token).safeTransfer(msg.sender, _amount); + emit Withdraw(_token, _amount, msg.sender); + } + + /// MIGRATE /// + + /// @dev Sends assets to migration contract, and then calls `migrate` to move the assets to Ozean + function migrate(address _l2Destination, address[] calldata _tokens) external nonReentrant whenNotPaused { + require(migrationActivated, "LGE Staking: Migration not active."); + require(_l2Destination != address(0), "LGE Staking: May not send tokens to the zero address."); + uint256 length = _tokens.length; + require(length > 0, "LGE Staking: Must migrate some tokens."); + uint256[] memory amounts = new uint256[](length); + uint256 amount; + for (uint256 i; i < length; i++) { + amount = balance[_tokens[i]][msg.sender]; + require(amount > 0, "LGE Staking: No tokens to migrate."); + amounts[i] = amount; + IERC20(_tokens[i]).safeTransfer(address(LGEMigration), amount); + } + LGEMigration.migrate(msg.sender, _l2Destination, _tokens, amounts); + emit TokensMigrated(msg.sender, _l2Destination, _tokens, amounts); + } + + /// OWNER /// + + /// @notice This function allows the owner to either add or remove an allow-listed token for deposit. + /// @param _token The token address to add or remove. + /// @param _set A boolean for whether the token is allow-listed or not. True for allow-listed, false otherwise. + function setAllowlist(address _token, bool _set) external onlyOwner { + allowlisted[_token] = _set; + emit AllowlistSet(_token, _set); + } + + /// @notice This function allows the owner to modify the deposit cap for deposited tokens. + /// @param _token The token address to modify the deposit cap. + /// @param _newDepositCap The new deposit cap. + function setDepositCap(address _token, uint256 _newDepositCap) external onlyOwner { + depositCap[_token] = _newDepositCap; + emit DepositCapSet(_token, _newDepositCap); + } + + /// @notice This function allows the owner to pause or unpause this contract. + /// @param _set The boolean for whether the contract is to be paused or unpaused. True for paused, false otherwise. + function setPaused(bool _set) external onlyOwner { + _set ? _pause() : _unpause(); + } + + /// @notice This function allows the owner to set the migration boolean switch, which when true allows users to migrated + /// deposited assets to the Ozean L2. + /// @param _set The boolean for whether migration is activated. True is activated, false otherwise. + /// @dev Activating migration will disable new deposits. + function setMigrationActivation(bool _set) external onlyOwner { + migrationActivated = _set; + emit MigrationActivated(_set); + } + + /// @notice This function allows the owner to set the migration contract used to move deposited assets to the + /// Ozean L2. + /// @param _contract The new contract address for the LGE Migration logic. + /// @dev The new migration contract must conform to the ILGEMigration interface. + function setMigrationContract(address _contract) external onlyOwner { + LGEMigration = ILGEMigration(_contract); + emit MigrationContractSet(_contract); + } +} diff --git a/packages/contracts-bedrock/src/L1/USDXBridge.sol b/packages/contracts-bedrock/src/L1/USDXBridge.sol index 6530e6dfd4f..daebe668b76 100644 --- a/packages/contracts-bedrock/src/L1/USDXBridge.sol +++ b/packages/contracts-bedrock/src/L1/USDXBridge.sol @@ -41,13 +41,16 @@ contract USDXBridge is Ownable, ReentrancyGuard, ISemver { /// @dev stablecoin => amount mapping(address => uint256) public totalBridged; + /// EVENTS /// + /// @notice An event emitted when a bridge deposit is made by a user. event BridgeDeposit(address indexed _stablecoin, uint256 _amount, address indexed _to); /// @notice An event emitted when an ERC20 token is withdrawn from this contract. event WithdrawCoins(address indexed _coin, uint256 _amount, address indexed _to); - /// @notice An event emitted when en ERC20 stablecoin is set as allowlisted or not (true if allowlisted, false if removed). + /// @notice An event emitted when en ERC20 stablecoin is set as allowlisted or not (true if allowlisted, false if + /// removed). event AllowlistSet(address indexed _coin, bool _set); /// @notice An event emitted when the deposit cap for an ERC20 stablecoin is modified. diff --git a/packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol b/packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol new file mode 100644 index 00000000000..ad4f93cfbee --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +/// @title LGE Migration Interface +/// @notice Interface for the LGE Migrator contract to move LGE assets onto Ozean mainnet. +interface ILGEMigration { + /// @notice This function is called by the LGE Staking contract to facilitate migration of staked tokens from + /// the LGE Staking pool to the Ozean L2. + /// @param _user The address of the user whose staked funds are being migrated to Ozean. + /// @param _l2Destination The address which will be credited the tokens on Ozean. + /// @param _tokens The tokens being migrated to Ozean from the LGE Staking contract. + /// @param _amounts The amounts of each token to be migrated to Ozean for the _user + function migrate( + address _user, + address _l2Destination, + address[] calldata _tokens, + uint256[] calldata _amounts + ) external; +} diff --git a/packages/contracts-bedrock/src/L2/OzUSD.sol b/packages/contracts-bedrock/src/L2/OzUSD.sol index e400fdd119e..0a18965da36 100644 --- a/packages/contracts-bedrock/src/L2/OzUSD.sol +++ b/packages/contracts-bedrock/src/L2/OzUSD.sol @@ -10,8 +10,10 @@ import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable /// based on shares controlled by each account. The total pooled USDX (protocol-controlled USDX) determines the /// total balances; meaning that any USDX sent to this contract automatically rebases all user balances. /// 1 USDX == 1 ozUSD. -/// @dev This contract does not fully comply with the ERC20 standard as rebasing events do not emit `Transfer` events. -/// This contract is inspired by Lido's stETH contract: https://vscode.blockscan.com/ethereum/0x17144556fd3424edc8fc8a4c940b2d04936d17eb +/// @dev This contract does not fully comply with the ERC20 standard as rebasing events do not emit `Transfer` +/// events. +/// This contract is inspired by Lido's stETH contract: +/// https://vscode.blockscan.com/ethereum/0x17144556fd3424edc8fc8a4c940b2d04936d17eb contract OzUSD is IERC20, ReentrancyGuard, Initializable { string public constant name = "Ozean USD"; string public constant symbol = "ozUSD"; diff --git a/packages/contracts-bedrock/src/L2/WozUSD.sol b/packages/contracts-bedrock/src/L2/WozUSD.sol index 73e20558842..3e028ea620d 100644 --- a/packages/contracts-bedrock/src/L2/WozUSD.sol +++ b/packages/contracts-bedrock/src/L2/WozUSD.sol @@ -8,7 +8,8 @@ import { OzUSD } from "./OzUSD.sol"; /// @title Wrapped Ozean USD (WozUSD) /// @notice A wrapper contract for OzUSD, providing auto-compounding functionality. /// @dev The contract wraps ozUSD into wozUSD, which represents shares of ozUSD. -/// This contract is inspired by Lido's wstETH contract: https://vscode.blockscan.com/ethereum/0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0 +/// This contract is inspired by Lido's wstETH contract: +/// https://vscode.blockscan.com/ethereum/0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0 contract WozUSD is ERC20, ReentrancyGuard { /// @notice The instance of the ozUSD proxy contract. OzUSD public immutable ozUSD; diff --git a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol new file mode 100644 index 00000000000..c8402948283 --- /dev/null +++ b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol @@ -0,0 +1,256 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { console2 as console } from "forge-std/console2.sol"; +import { CommonTest } from "test/setup/CommonTest.sol"; +import { LGEStakingDeploy } from "scripts/ozean/LGEStakingDeploy.s.sol"; +import { LGEStaking } from "src/L1/LGEStaking.sol"; +import { TestERC20Decimals } from "test/mocks/TestERC20.sol"; + +/// @dev forge test --match-contract LGEStakingTest +contract LGEStakingTest is CommonTest { + LGEStaking public lgeStaking; + address public lgeMigration; + address public hexTrust; + + /// 18 decimals + TestERC20Decimals public wBTC; + TestERC20Decimals public solvBTC; + TestERC20Decimals public lombardBTC; + TestERC20Decimals public wSOL; + TestERC20Decimals public wstETH; + TestERC20Decimals public sUSDe; + TestERC20Decimals public USDe; + TestERC20Decimals public AUSD; + TestERC20Decimals public USDY; + TestERC20Decimals public USDM; + TestERC20Decimals public sDAI; + /// 6 decimals + TestERC20Decimals public USDC; + + address[] public tokens; + uint256[] public depositCaps; + + /// LGEStaking events + event Deposit(address indexed _token, uint256 _amount, address indexed _to); + event Withdraw(address indexed _token, uint256 _amount, address indexed _to); + event AllowlistSet(address indexed _coin, bool _set); + event DepositCapSet(address indexed _coin, uint256 _newDepositCap); + event TokensMigrated(address indexed _user, address indexed _l2Destination, address[] _tokens, uint256[] _amounts); + event MigrationActivated(bool _set); + event MigrationContractSet(address _newContract); + + function setUp() public override { + /// Set up environment + hexTrust = makeAddr("HEX_TRUST"); + wBTC = new TestERC20Decimals{ salt: bytes32("wBTC") }(18); + solvBTC = new TestERC20Decimals{ salt: bytes32("solvBTC") }(18); + lombardBTC = new TestERC20Decimals{ salt: bytes32("lombardBTC") }(18); + wSOL = new TestERC20Decimals{ salt: bytes32("wSOL") }(18); + wstETH = new TestERC20Decimals{ salt: bytes32("wstETH") }(18); + sUSDe = new TestERC20Decimals{ salt: bytes32("sUSDe") }(18); + USDe = new TestERC20Decimals{ salt: bytes32("USDe") }(18); + AUSD = new TestERC20Decimals{ salt: bytes32("AUSD") }(18); + USDY = new TestERC20Decimals{ salt: bytes32("USDY") }(18); + USDM = new TestERC20Decimals{ salt: bytes32("USDM") }(18); + sDAI = new TestERC20Decimals{ salt: bytes32("sDAI") }(18); + USDC = new TestERC20Decimals{ salt: bytes32("USDC") }(6); + + /// Deploy Ozean + super.setUp(); + + /// Deploy LGEStaking + tokens = new address[](13); + tokens[0] = address(wBTC); + tokens[1] = address(solvBTC); + tokens[2] = address(lombardBTC); + tokens[3] = address(wSOL); + tokens[4] = address(wstETH); + tokens[5] = address(sUSDe); + tokens[6] = address(USDe); + tokens[7] = address(AUSD); + tokens[8] = address(USDY); + tokens[9] = address(USDM); + tokens[10] = address(sDAI); + tokens[11] = address(USDC); + tokens[12] = address(usdx); + + depositCaps = new uint256[](13); + depositCaps[0] = 1e30; + depositCaps[1] = 1e30; + depositCaps[2] = 1e30; + depositCaps[3] = 1e30; + depositCaps[4] = 1e30; + depositCaps[5] = 1e30; + depositCaps[6] = 1e30; + depositCaps[7] = 1e30; + depositCaps[8] = 1e30; + depositCaps[9] = 1e30; + depositCaps[10] = 1e30; + depositCaps[11] = 1e30; + depositCaps[12] = 1e30; + + LGEStakingDeploy deployScript = new LGEStakingDeploy(); + deployScript.setUp(hexTrust, lgeMigration, tokens, depositCaps); + deployScript.run(); + lgeStaking = deployScript.lgeStaking(); + } + + /// SETUP /// + + function testInitialize() public view { + assertEq(lgeStaking.version(), "1.0.0"); + assertEq(address(lgeStaking.LGEMigration()), lgeMigration); + assertEq(lgeStaking.migrationActivated(), false); + + for (uint256 i; i < 13; i++) { + assertEq(lgeStaking.allowlisted(tokens[i]), true); + assertEq(lgeStaking.depositCap(tokens[i]), 1e30); + assertEq(lgeStaking.totalDeposited(tokens[i]), 0); + } + } + + /// DEPOSIT /// + + function testDepositERC20FailureConditions() public prank(alice) { + wBTC.mint(alice, 1e31); + + /// Amount zero + vm.expectRevert("LGE Staking: May not deposit nothing."); + lgeStaking.depositERC20(address(wBTC), 0); + + /// Not allowlisted + vm.expectRevert("LGE Staking: Token must be allowlisted."); + lgeStaking.depositERC20(address(88), 1); + + /// Exceeding deposit caps + vm.expectRevert("LGE Staking: deposit amount exceeds deposit cap."); + lgeStaking.depositERC20(address(wBTC), 1e31); + + /// Migration activated + vm.stopPrank(); + vm.startPrank(hexTrust); + lgeStaking.setMigrationActivation(true); + vm.stopPrank(); + vm.startPrank(alice); + + vm.expectRevert("LGE Staking: May not deposit once migration has been activated."); + lgeStaking.depositERC20(address(wBTC), 1); + } + + function testDepositERC20SuccessConditions(uint256 _amount) public prank(alice) { + _amount = bound(_amount, 1, 1e30 - 1); + wBTC.mint(alice, 1e31); + wBTC.approve(address(lgeStaking), _amount); + + assertEq(lgeStaking.balance(address(wBTC), alice), 0); + assertEq(lgeStaking.totalDeposited(address(wBTC)), 0); + assertEq(wBTC.balanceOf(address(lgeStaking)), 0); + + vm.expectEmit(true, true, true, true); + emit Deposit(address(wBTC), _amount, alice); + lgeStaking.depositERC20(address(wBTC), _amount); + + assertEq(lgeStaking.balance(address(wBTC), alice), _amount); + assertEq(lgeStaking.totalDeposited(address(wBTC)), _amount); + assertEq(wBTC.balanceOf(address(lgeStaking)), _amount); + } + + /// depositETH failure + /// depositETH success + + /// WITHDRAW /// + + function testWithdrawFailureConditions(uint256 _amount) public prank(alice) { + /// Setup + _amount = bound(_amount, 1, 1e30 - 1); + wBTC.mint(alice, 1e31); + wBTC.approve(address(lgeStaking), _amount); + lgeStaking.depositERC20(address(wBTC), _amount); + + /// Amount zero + vm.expectRevert("LGE Staking: may not withdraw nothing."); + lgeStaking.withdraw(address(wBTC), 0); + + /// Insufficient balance + vm.expectRevert("LGE Staking: insufficient deposited balance."); + lgeStaking.withdraw(address(wBTC), _amount + 1); + } + + function testWithdrawSuccessConditions(uint256 _amount0, uint256 _amount1) public prank(alice) { + /// Setup + _amount0 = bound(_amount0, 2, 1e30 - 1); + _amount1 = bound(_amount1, 1, _amount0); + wBTC.mint(alice, 1e31); + wBTC.approve(address(lgeStaking), _amount0); + lgeStaking.depositERC20(address(wBTC), _amount0); + + assertEq(lgeStaking.balance(address(wBTC), alice), _amount0); + assertEq(lgeStaking.totalDeposited(address(wBTC)), _amount0); + assertEq(wBTC.balanceOf(address(lgeStaking)), _amount0); + + vm.expectEmit(true, true, true, true); + emit Withdraw(address(wBTC), _amount1, alice); + lgeStaking.withdraw(address(wBTC), _amount1); + + assertEq(lgeStaking.balance(address(wBTC), alice), _amount0 - _amount1); + assertEq(lgeStaking.totalDeposited(address(wBTC)), _amount0 - _amount1); + assertEq(wBTC.balanceOf(address(lgeStaking)), _amount0 - _amount1); + } + + /// MIGRATE /// + + /// migrate failure + /// migrate success + + /// OWNER /// + + function testSetAllowlist() public { + TestERC20Decimals USDD = new TestERC20Decimals(18); + + /// Non-owner revert + vm.expectRevert("Ownable: caller is not the owner"); + lgeStaking.setAllowlist(address(USDD), true); + + /// Owner allowed to set new coin + vm.startPrank(hexTrust); + + /// Add USDD + vm.expectEmit(true, true, true, true); + emit AllowlistSet(address(USDD), true); + lgeStaking.setAllowlist(address(USDD), true); + + /// Remove USDC + vm.expectEmit(true, true, true, true); + emit AllowlistSet(address(USDC), false); + lgeStaking.setAllowlist(address(USDC), false); + + vm.stopPrank(); + + assertEq(lgeStaking.allowlisted(address(USDD)), true); + assertEq(lgeStaking.allowlisted(address(USDC)), false); + } + + function testSetDepositCap(uint256 _newCap) public { + /// Non-owner revert + vm.expectRevert("Ownable: caller is not the owner"); + lgeStaking.setDepositCap(address(USDC), _newCap); + + assertEq(lgeStaking.depositCap(address(USDC)), 1e30); + + /// Owner allowed + vm.startPrank(hexTrust); + + vm.expectEmit(true, true, true, true); + emit DepositCapSet(address(USDC), _newCap); + lgeStaking.setDepositCap(address(USDC), _newCap); + + vm.stopPrank(); + + assertEq(lgeStaking.depositCap(address(USDC)), _newCap); + } + + /// set paused + /// set migration + /// set migration contract +} From 0c0e18bca960cbeba3f70e432eab03c8b97b0c9d Mon Sep 17 00:00:00 2001 From: William Date: Thu, 31 Oct 2024 16:10:13 +1100 Subject: [PATCH 02/15] build: deposit ETH and more tests --- .../scripts/ozean/LGEStakingDeploy.s.sol | 8 +- .../src/L1/LGEMigrationV1.sol | 35 ++++ .../contracts-bedrock/src/L1/LGEStaking.sol | 45 ++++- .../src/L1/interface/ILGEMigration.sol | 3 +- .../test/L1/LGEStaking.t.sol | 173 +++++++++++++++++- .../contracts-bedrock/test/mocks/TestLido.sol | 34 ++++ 6 files changed, 283 insertions(+), 15 deletions(-) create mode 100644 packages/contracts-bedrock/src/L1/LGEMigrationV1.sol create mode 100644 packages/contracts-bedrock/test/mocks/TestLido.sol diff --git a/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol index 9868a531704..86cedf20d8e 100644 --- a/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol @@ -7,6 +7,8 @@ import { LGEStaking } from "src/L1/LGEStaking.sol"; contract LGEStakingDeploy is Script { LGEStaking public lgeStaking; address public lgeMigration; + address public stETH; + address public wstETH; address public hexTrust = makeAddr("HEX_TRUST"); address[] public tokens; uint256[] public depositCaps; @@ -15,6 +17,8 @@ contract LGEStakingDeploy is Script { function setUp( address _hexTrust, address _lgeMigration, + address _stETH, + address _wstETH, address[] memory _tokens, uint256[] memory _depositCaps ) @@ -22,12 +26,14 @@ contract LGEStakingDeploy is Script { { hexTrust = _hexTrust; lgeMigration = _lgeMigration; + stETH = _stETH; + wstETH = _wstETH; tokens = _tokens; depositCaps = _depositCaps; } function run() external broadcast { - lgeStaking = new LGEStaking(hexTrust, lgeMigration, tokens, depositCaps); + lgeStaking = new LGEStaking(hexTrust, lgeMigration, stETH, wstETH, tokens, depositCaps); } modifier broadcast() { diff --git a/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol new file mode 100644 index 00000000000..204d862cf71 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import { ILGEMigration } from "src/L1/interface/ILGEMigration.sol"; + +contract LGEMigrationV1 is ILGEMigration, ReentrancyGuard { + using SafeERC20 for IERC20; + + address public immutable lgeStaking; + + constructor(address _lgeStaking) { + lgeStaking = _lgeStaking; + } + + function migrate( + address _user, + address _l2Destination, + address[] calldata _tokens, + uint256[] calldata _amounts + ) + external + nonReentrant + { + require(msg.sender == lgeStaking, "LGE Migration: Only the staking contract can call this function."); + + _user; + _l2Destination; + _tokens; + _amounts; + /// @dev Some logic about handling each of the tokens + } +} diff --git a/packages/contracts-bedrock/src/L1/LGEStaking.sol b/packages/contracts-bedrock/src/L1/LGEStaking.sol index 457db498de2..c6df7ec66fd 100644 --- a/packages/contracts-bedrock/src/L1/LGEStaking.sol +++ b/packages/contracts-bedrock/src/L1/LGEStaking.sol @@ -9,6 +9,8 @@ import { Pausable } from "@openzeppelin/contracts/security/Pausable.sol"; import { ISemver } from "src/universal/ISemver.sol"; import { ILGEMigration } from "src/L1/interface/ILGEMigration.sol"; +/// TODO Migration contract V1, tests, nat spec + /// @title LGE Staking /// @notice This contract ... /// @dev Inspired by https://vscode.blockscan.com/ethereum/0xf047ab4c75cebf0eb9ed34ae2c186f3611aeafa6 @@ -19,6 +21,13 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { /// @custom:semver 1.0.0 string public constant version = "1.0.0"; + /// @notice The contract address for Lido's staked ether. + address public immutable stETH; + + /// @notice The contract address for Lido's wrapped staked ether. + /// @dev All ETH deposits are converted to wstETH on deposit. + address public immutable wstETH; + /// @notice The migration contract that facilitates unstaking and deposits to the Ozean L2. ILGEMigration public LGEMigration; @@ -67,9 +76,19 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { /// SETUP /// - constructor(address _owner, address _lgeMigration, address[] memory _tokens, uint256[] memory _depositCaps) { + constructor( + address _owner, + address _lgeMigration, + address _stETH, + address _wstETH, + address[] memory _tokens, + uint256[] memory _depositCaps + ) { _transferOwnership(_owner); LGEMigration = ILGEMigration(_lgeMigration); + stETH = _stETH; + wstETH = _wstETH; + IstETH(stETH).approve(wstETH, ~uint256(0)); uint256 length = _tokens.length; require( length == _depositCaps.length, "LGE Staking: Tokens array length must equal the Deposit Caps array length." @@ -98,11 +117,20 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { emit Deposit(_token, _amount, msg.sender); } + /// @dev All ETH is converted to wstETH function depositETH() external payable nonReentrant whenNotPaused { require(!migrationActivated, "LGE Staking: May not deposit once migration has been activated."); require(msg.value > 0, "LGE Staking: May not deposit nothing."); - /// @dev some logic to move the ETH to wstETH - /// should be able to be disabled also if wstETH is removed from allowlist + require(allowlisted[wstETH], "LGE Staking: Token must be allowlisted."); + uint256 stETHAmount = IstETH(stETH).submit{ value: msg.value }(address(0)); + uint256 wstETHAmount = IwstETH(wstETH).wrap(stETHAmount); + require( + totalDeposited[wstETH] + wstETHAmount < depositCap[wstETH], + "LGE Staking: deposit amount exceeds deposit cap." + ); + balance[wstETH][msg.sender] += wstETHAmount; + totalDeposited[wstETH] += wstETHAmount; + emit Deposit(wstETH, wstETHAmount, msg.sender); } /// WITHDRAW /// @@ -160,7 +188,8 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { _set ? _pause() : _unpause(); } - /// @notice This function allows the owner to set the migration boolean switch, which when true allows users to migrated + /// @notice This function allows the owner to set the migration boolean switch, which when true allows users to + /// migrated /// deposited assets to the Ozean L2. /// @param _set The boolean for whether migration is activated. True is activated, false otherwise. /// @dev Activating migration will disable new deposits. @@ -178,3 +207,11 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { emit MigrationContractSet(_contract); } } + +interface IstETH is IERC20 { + function submit(address _referral) external payable returns (uint256); +} + +interface IwstETH is IERC20 { + function wrap(uint256 _stETHAmount) external returns (uint256); +} diff --git a/packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol b/packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol index ad4f93cfbee..12901f628ab 100644 --- a/packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol +++ b/packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol @@ -15,5 +15,6 @@ interface ILGEMigration { address _l2Destination, address[] calldata _tokens, uint256[] calldata _amounts - ) external; + ) + external; } diff --git a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol index c8402948283..29ab48d792f 100644 --- a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol +++ b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol @@ -6,6 +6,7 @@ import { CommonTest } from "test/setup/CommonTest.sol"; import { LGEStakingDeploy } from "scripts/ozean/LGEStakingDeploy.s.sol"; import { LGEStaking } from "src/L1/LGEStaking.sol"; import { TestERC20Decimals } from "test/mocks/TestERC20.sol"; +import { TestStETH, TestWstETH } from "test/mocks/TestLido.sol"; /// @dev forge test --match-contract LGEStakingTest contract LGEStakingTest is CommonTest { @@ -18,7 +19,6 @@ contract LGEStakingTest is CommonTest { TestERC20Decimals public solvBTC; TestERC20Decimals public lombardBTC; TestERC20Decimals public wSOL; - TestERC20Decimals public wstETH; TestERC20Decimals public sUSDe; TestERC20Decimals public USDe; TestERC20Decimals public AUSD; @@ -28,6 +28,10 @@ contract LGEStakingTest is CommonTest { /// 6 decimals TestERC20Decimals public USDC; + /// Mock Lido contracts + TestStETH public stETH; + TestWstETH public wstETH; + address[] public tokens; uint256[] public depositCaps; @@ -39,6 +43,9 @@ contract LGEStakingTest is CommonTest { event TokensMigrated(address indexed _user, address indexed _l2Destination, address[] _tokens, uint256[] _amounts); event MigrationActivated(bool _set); event MigrationContractSet(address _newContract); + /// Pausable events + event Paused(address account); + event Unpaused(address account); function setUp() public override { /// Set up environment @@ -47,7 +54,6 @@ contract LGEStakingTest is CommonTest { solvBTC = new TestERC20Decimals{ salt: bytes32("solvBTC") }(18); lombardBTC = new TestERC20Decimals{ salt: bytes32("lombardBTC") }(18); wSOL = new TestERC20Decimals{ salt: bytes32("wSOL") }(18); - wstETH = new TestERC20Decimals{ salt: bytes32("wstETH") }(18); sUSDe = new TestERC20Decimals{ salt: bytes32("sUSDe") }(18); USDe = new TestERC20Decimals{ salt: bytes32("USDe") }(18); AUSD = new TestERC20Decimals{ salt: bytes32("AUSD") }(18); @@ -55,6 +61,8 @@ contract LGEStakingTest is CommonTest { USDM = new TestERC20Decimals{ salt: bytes32("USDM") }(18); sDAI = new TestERC20Decimals{ salt: bytes32("sDAI") }(18); USDC = new TestERC20Decimals{ salt: bytes32("USDC") }(6); + stETH = new TestStETH(); + wstETH = new TestWstETH(address(stETH)); /// Deploy Ozean super.setUp(); @@ -91,7 +99,7 @@ contract LGEStakingTest is CommonTest { depositCaps[12] = 1e30; LGEStakingDeploy deployScript = new LGEStakingDeploy(); - deployScript.setUp(hexTrust, lgeMigration, tokens, depositCaps); + deployScript.setUp(hexTrust, lgeMigration, address(stETH), address(wstETH), tokens, depositCaps); deployScript.run(); lgeStaking = deployScript.lgeStaking(); } @@ -110,7 +118,7 @@ contract LGEStakingTest is CommonTest { } } - /// DEPOSIT /// + /// DEPOSIT ERC20 /// function testDepositERC20FailureConditions() public prank(alice) { wBTC.mint(alice, 1e31); @@ -156,8 +164,53 @@ contract LGEStakingTest is CommonTest { assertEq(wBTC.balanceOf(address(lgeStaking)), _amount); } - /// depositETH failure - /// depositETH success + /// DEPOSIT ETH /// + + function testDepositETHFailureConditions() public prank(hexTrust) { + vm.deal(hexTrust, 10000 ether); + + /// Amount zero + vm.expectRevert("LGE Staking: May not deposit nothing."); + lgeStaking.depositETH{ value: 0 }(); + + /// Migration activated + lgeStaking.setMigrationActivation(true); + vm.expectRevert("LGE Staking: May not deposit once migration has been activated."); + lgeStaking.depositETH{ value: 1 ether }(); + + lgeStaking.setMigrationActivation(false); + + /// Not allowlisted + lgeStaking.setAllowlist(address(wstETH), false); + vm.expectRevert("LGE Staking: Token must be allowlisted."); + lgeStaking.depositETH{ value: 1 ether }(); + + lgeStaking.setAllowlist(address(wstETH), true); + + /// Exceeding deposit caps + lgeStaking.setDepositCap(address(wstETH), 1 ether); + vm.expectRevert("LGE Staking: deposit amount exceeds deposit cap."); + lgeStaking.depositETH{ value: 10 ether }(); + } + + function testDepositETHSuccessConditions(uint256 _amount) public prank(alice) { + _amount = bound(_amount, 1, 1e30 - 1); + vm.deal(alice, 1e31); + + assertEq(lgeStaking.balance(address(wstETH), alice), 0); + assertEq(lgeStaking.totalDeposited(address(wstETH)), 0); + assertEq(wstETH.balanceOf(address(lgeStaking)), 0); + + uint256 predictedWSTETHAmount = wstETH.getWstETHByStETH(_amount); + + vm.expectEmit(true, true, true, true); + emit Deposit(address(wstETH), predictedWSTETHAmount, alice); + lgeStaking.depositETH{ value: _amount }(); + + assertEq(lgeStaking.balance(address(wstETH), alice), predictedWSTETHAmount); + assertEq(lgeStaking.totalDeposited(address(wstETH)), predictedWSTETHAmount); + assertEq(wstETH.balanceOf(address(lgeStaking)), predictedWSTETHAmount); + } /// WITHDRAW /// @@ -198,10 +251,35 @@ contract LGEStakingTest is CommonTest { assertEq(wBTC.balanceOf(address(lgeStaking)), _amount0 - _amount1); } + function testDepositETHAndWithdrawSuccessConditions(uint256 _amount0, uint256 _amount1) public prank(alice) { + /// Setup + _amount0 = bound(_amount0, 2, 1e30 - 1); + uint256 predictedWSTETHAmount = wstETH.getWstETHByStETH(_amount0); + _amount1 = bound(_amount1, 1, predictedWSTETHAmount); + vm.deal(alice, 1e31); + + vm.expectEmit(true, true, true, true); + emit Deposit(address(wstETH), predictedWSTETHAmount, alice); + lgeStaking.depositETH{ value: _amount0 }(); + + assertEq(lgeStaking.balance(address(wstETH), alice), predictedWSTETHAmount); + assertEq(lgeStaking.totalDeposited(address(wstETH)), predictedWSTETHAmount); + assertEq(wstETH.balanceOf(address(lgeStaking)), predictedWSTETHAmount); + + vm.expectEmit(true, true, true, true); + emit Withdraw(address(wstETH), _amount1, alice); + lgeStaking.withdraw(address(wstETH), _amount1); + + assertEq(lgeStaking.balance(address(wstETH), alice), predictedWSTETHAmount - _amount1); + assertEq(lgeStaking.totalDeposited(address(wstETH)), predictedWSTETHAmount - _amount1); + assertEq(wstETH.balanceOf(address(lgeStaking)), predictedWSTETHAmount - _amount1); + } + /// MIGRATE /// /// migrate failure /// migrate success + /// set migration contract and migrate /// OWNER /// @@ -250,7 +328,84 @@ contract LGEStakingTest is CommonTest { assertEq(lgeStaking.depositCap(address(USDC)), _newCap); } - /// set paused - /// set migration - /// set migration contract + function testSetPaused() public { + vm.deal(hexTrust, 10000 ether); + + /// Non-owner revert + vm.expectRevert("Ownable: caller is not the owner"); + lgeStaking.setPaused(true); + + assertEq(lgeStaking.paused(), false); + + /// Owner allowed + vm.startPrank(hexTrust); + + vm.expectEmit(true, true, true, true); + emit Paused(hexTrust); + lgeStaking.setPaused(true); + + assertEq(lgeStaking.paused(), true); + + /// External functions paused + vm.expectRevert("Pausable: paused"); + lgeStaking.depositERC20(address(wBTC), 1e18); + + vm.expectRevert("Pausable: paused"); + lgeStaking.depositETH{ value: 1e18 }(); + + vm.expectRevert("Pausable: paused"); + lgeStaking.withdraw(address(wBTC), 1e18); + + address[] memory tokensArray; + vm.expectRevert("Pausable: paused"); + lgeStaking.migrate(alice, tokensArray); + + vm.expectEmit(true, true, true, true); + emit Unpaused(hexTrust); + lgeStaking.setPaused(false); + + assertEq(lgeStaking.paused(), false); + + vm.stopPrank(); + } + + function testSetMigrationActivation() public { + /// Non-owner revert + vm.expectRevert("Ownable: caller is not the owner"); + lgeStaking.setMigrationActivation(true); + + assertEq(lgeStaking.migrationActivated(), false); + + /// External functions paused + vm.startPrank(hexTrust); + + vm.expectEmit(true, true, true, true); + emit MigrationActivated(true); + lgeStaking.setMigrationActivation(true); + + assertEq(lgeStaking.migrationActivated(), true); + + vm.stopPrank(); + } + + function testSetMigrationContract() public { + address newMigrationContract = address(88); + + /// Non-owner revert + vm.expectRevert("Ownable: caller is not the owner"); + lgeStaking.setMigrationContract(newMigrationContract); + + assertEq(address(lgeStaking.LGEMigration()), lgeMigration); + + /// External functions paused + vm.startPrank(hexTrust); + + vm.expectEmit(true, true, true, true); + emit MigrationContractSet(newMigrationContract); + lgeStaking.setMigrationContract(newMigrationContract); + + assertEq(address(lgeStaking.LGEMigration()), newMigrationContract); + + vm.stopPrank(); + } } diff --git a/packages/contracts-bedrock/test/mocks/TestLido.sol b/packages/contracts-bedrock/test/mocks/TestLido.sol new file mode 100644 index 00000000000..13750c6659c --- /dev/null +++ b/packages/contracts-bedrock/test/mocks/TestLido.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ERC20 } from "@rari-capital/solmate/src/tokens/ERC20.sol"; + +contract TestStETH is ERC20 { + constructor() ERC20("staked ETH", "STETH", 18) { } + + function submit(address _referral) external payable returns (uint256) { + _referral; + _mint(msg.sender, msg.value); + return msg.value; + } +} + +contract TestWstETH is ERC20 { + address public immutable stETH; + + constructor(address _stETH) ERC20("Wrapped Staked ETH", "WSTETH", 18) { + stETH = _stETH; + } + + function wrap(uint256 _stETHAmount) external returns (uint256) { + ERC20(stETH).transferFrom(msg.sender, address(this), _stETHAmount); + uint256 wstETHAmount = getWstETHByStETH(_stETHAmount); + _mint(msg.sender, wstETHAmount); + return wstETHAmount; + } + + /// @dev Hard code stETH/wstETH factor of 0.9 + function getWstETHByStETH(uint256 _stETHAmount) public pure returns (uint256) { + return (_stETHAmount * 9) / 10; + } +} From b8e8ae517d6417039af4e3e4d4689bfe44ed41d9 Mon Sep 17 00:00:00 2001 From: William Date: Mon, 4 Nov 2024 15:17:46 +1100 Subject: [PATCH 03/15] build: first pass at migration contract --- .../scripts/ozean/LGEMigrationDeploy.s.sol | 38 ++++ .../scripts/ozean/LGEStakingDeploy.s.sol | 5 +- .../src/L1/LGEMigrationV1.sol | 71 ++++++- .../contracts-bedrock/src/L1/LGEStaking.sol | 76 +++---- .../src/L1/interface/ILGEMigration.sol | 14 +- .../test/L1/LGEStaking.t.sol | 196 +++++++++++++----- 6 files changed, 286 insertions(+), 114 deletions(-) create mode 100644 packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol diff --git a/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol new file mode 100644 index 00000000000..ba1303a81ae --- /dev/null +++ b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Script } from "forge-std/Script.sol"; +import { LGEMigrationV1 } from "src/L1/LGEMigrationV1.sol"; + +contract LGEMigrationDeploy is Script { + LGEMigrationV1 public lgeMigration; + address public l1StandardBridge; + address public lgeStaking; + address[] public l1Addresses; + address[] public l2Addresses; + + /// @dev Used in testing environment, unnecessary for mainnet deployment + function setUp( + address _l1StandardBridge, + address _lgeStaking, + address[] memory _l1Addresses, + address[] memory _l2Addresses + ) + external + { + l1StandardBridge = _l1StandardBridge; + lgeStaking = _lgeStaking; + l1Addresses = _l1Addresses; + l2Addresses = _l2Addresses; + } + + function run() external broadcast { + lgeMigration = new LGEMigrationV1(l1StandardBridge, lgeStaking, l1Addresses, l2Addresses); + } + + modifier broadcast() { + vm.startBroadcast(msg.sender); + _; + vm.stopBroadcast(); + } +} diff --git a/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol index 86cedf20d8e..5ffb18cddec 100644 --- a/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol @@ -6,7 +6,6 @@ import { LGEStaking } from "src/L1/LGEStaking.sol"; contract LGEStakingDeploy is Script { LGEStaking public lgeStaking; - address public lgeMigration; address public stETH; address public wstETH; address public hexTrust = makeAddr("HEX_TRUST"); @@ -16,7 +15,6 @@ contract LGEStakingDeploy is Script { /// @dev Used in testing environment, unnecessary for mainnet deployment function setUp( address _hexTrust, - address _lgeMigration, address _stETH, address _wstETH, address[] memory _tokens, @@ -25,7 +23,6 @@ contract LGEStakingDeploy is Script { external { hexTrust = _hexTrust; - lgeMigration = _lgeMigration; stETH = _stETH; wstETH = _wstETH; tokens = _tokens; @@ -33,7 +30,7 @@ contract LGEStakingDeploy is Script { } function run() external broadcast { - lgeStaking = new LGEStaking(hexTrust, lgeMigration, stETH, wstETH, tokens, depositCaps); + lgeStaking = new LGEStaking(hexTrust, stETH, wstETH, tokens, depositCaps); } modifier broadcast() { diff --git a/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol index 204d862cf71..e6087686916 100644 --- a/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol +++ b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol @@ -6,17 +6,45 @@ import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import { ILGEMigration } from "src/L1/interface/ILGEMigration.sol"; +/// @title LGE Migration V1 +/// @notice This contract facilitates the migration of staked tokens from the LGE Staking pool +/// on Layer 1 to the Ozean Layer 2. contract LGEMigrationV1 is ILGEMigration, ReentrancyGuard { using SafeERC20 for IERC20; + /// @notice The standard bridge contract for Layer 1 to Layer 2 transfers. + IL1StandardBridge public immutable l1StandardBridge; + + /// @notice The address of the LGE Staking contract. address public immutable lgeStaking; - constructor(address _lgeStaking) { + /// @notice A mapping from Layer 1 token addresses to their corresponding Layer 2 addresses. + mapping(address => address) public l1ToL2Addresses; + + constructor( + address _l1StandardBridge, + address _lgeStaking, + address[] memory _l1Addresses, + address[] memory _l2Addresses + ) { + l1StandardBridge = IL1StandardBridge(_l1StandardBridge); lgeStaking = _lgeStaking; + uint256 length = _l1Addresses.length; + require( + length == _l2Addresses.length, + "LGE Migration: L1 addresses array length must equal the L2 addresses array length." + ); + for (uint256 i; i < length; ++i) { + l1ToL2Addresses[_l1Addresses[i]] = _l2Addresses[i]; + } } + /// @notice This function is called by the LGE Staking contract to facilitate migration of staked tokens from + /// the LGE Staking pool to the Ozean L2. + /// @param _l2Destination The address which will be credited the tokens on Ozean. + /// @param _tokens The tokens being migrated to Ozean from the LGE Staking contract. + /// @param _amounts The amounts of each token to be migrated to Ozean for the _user function migrate( - address _user, address _l2Destination, address[] calldata _tokens, uint256[] calldata _amounts @@ -26,10 +54,39 @@ contract LGEMigrationV1 is ILGEMigration, ReentrancyGuard { { require(msg.sender == lgeStaking, "LGE Migration: Only the staking contract can call this function."); - _user; - _l2Destination; - _tokens; - _amounts; - /// @dev Some logic about handling each of the tokens + /// @dev need to account for USDC => USDX, and wstETH + + uint256 length = _tokens.length; + for (uint256 i; i < length; i++) { + require( + l1ToL2Addresses[_tokens[i]] != address(0), "LGE Migration: L2 contract address not set for migration." + ); + IERC20(_tokens[i]).approve(address(l1StandardBridge), _amounts[i]); + l1StandardBridge.depositERC20To( + _tokens[i], l1ToL2Addresses[_tokens[i]], _l2Destination, _amounts[i], 21000, "" + ); + } } } + +interface IL1StandardBridge { + /// @custom:legacy + /// @notice Deposits some amount of ERC20 tokens into a target account on L2. + /// @param _l1Token Address of the L1 token being deposited. + /// @param _l2Token Address of the corresponding token on L2. + /// @param _to Address of the recipient on L2. + /// @param _amount Amount of the ERC20 to deposit. + /// @param _minGasLimit Minimum gas limit for the deposit message on L2. + /// @param _extraData Optional data to forward to L2. + /// Data supplied here will not be used to execute any code on L2 and is + /// only emitted as extra data for the convenience of off-chain tooling. + function depositERC20To( + address _l1Token, + address _l2Token, + address _to, + uint256 _amount, + uint32 _minGasLimit, + bytes calldata _extraData + ) + external; +} diff --git a/packages/contracts-bedrock/src/L1/LGEStaking.sol b/packages/contracts-bedrock/src/L1/LGEStaking.sol index c6df7ec66fd..ad50625b62d 100644 --- a/packages/contracts-bedrock/src/L1/LGEStaking.sol +++ b/packages/contracts-bedrock/src/L1/LGEStaking.sol @@ -9,10 +9,9 @@ import { Pausable } from "@openzeppelin/contracts/security/Pausable.sol"; import { ISemver } from "src/universal/ISemver.sol"; import { ILGEMigration } from "src/L1/interface/ILGEMigration.sol"; -/// TODO Migration contract V1, tests, nat spec - /// @title LGE Staking -/// @notice This contract ... +/// @notice This contract facilitates staking of ERC20 tokens and ETH for users and allows migration of staked assets to +/// the Ozean L2. /// @dev Inspired by https://vscode.blockscan.com/ethereum/0xf047ab4c75cebf0eb9ed34ae2c186f3611aeafa6 contract LGEStaking is Ownable, ReentrancyGuard, Pausable { using SafeERC20 for IERC20; @@ -29,10 +28,7 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { address public immutable wstETH; /// @notice The migration contract that facilitates unstaking and deposits to the Ozean L2. - ILGEMigration public LGEMigration; - - /// @notice A switch used to gate migration of deposited assets to the Ozean L2. - bool public migrationActivated; + ILGEMigration public lgeMigration; /// @notice Addresses of allow-listed ERC20 tokens. /// @dev token => allowlisted @@ -59,7 +55,7 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { event Withdraw(address indexed _token, uint256 _amount, address indexed _to); /// @notice An event emitted when en ERC20 token is set as allowlisted or not (true if allowlisted, false if - /// removed). + /// removed). event AllowlistSet(address indexed _coin, bool _set); /// @notice An event emitted when the deposit cap for an ERC20 token is modified. @@ -68,9 +64,6 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { /// @notice An event emitted when a user migrates deposited assets to Ozean. event TokensMigrated(address indexed _user, address indexed _l2Destination, address[] _tokens, uint256[] _amounts); - /// @notice An event emitted when the migrationActivated boolean switch is modified. - event MigrationActivated(bool _set); - /// @notice An event emitted when the migration contract is modified. event MigrationContractSet(address _newContract); @@ -78,14 +71,12 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { constructor( address _owner, - address _lgeMigration, address _stETH, address _wstETH, address[] memory _tokens, uint256[] memory _depositCaps ) { _transferOwnership(_owner); - LGEMigration = ILGEMigration(_lgeMigration); stETH = _stETH; wstETH = _wstETH; IstETH(stETH).approve(wstETH, ~uint256(0)); @@ -103,9 +94,12 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { /// DEPOSIT /// - /// @dev Must grant approval for the contract to move tokens + /// @notice Deposits ERC20 tokens into the staking contract. + /// @param _token The address of the ERC20 token to deposit. + /// @param _amount The amount of tokens to deposit. + /// @dev Users must grant approval for the contract to move their tokens. function depositERC20(address _token, uint256 _amount) external nonReentrant whenNotPaused { - require(!migrationActivated, "LGE Staking: May not deposit once migration has been activated."); + require(!migrationActivated(), "LGE Staking: May not deposit once migration has been activated."); require(_amount > 0, "LGE Staking: May not deposit nothing."); require(allowlisted[_token], "LGE Staking: Token must be allowlisted."); require( @@ -117,9 +111,10 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { emit Deposit(_token, _amount, msg.sender); } - /// @dev All ETH is converted to wstETH + /// @notice Deposits ETH into the staking contract, converting it to wstETH. + /// @dev All ETH is converted to wstETH on deposit. function depositETH() external payable nonReentrant whenNotPaused { - require(!migrationActivated, "LGE Staking: May not deposit once migration has been activated."); + require(!migrationActivated(), "LGE Staking: May not deposit once migration has been activated."); require(msg.value > 0, "LGE Staking: May not deposit nothing."); require(allowlisted[wstETH], "LGE Staking: Token must be allowlisted."); uint256 stETHAmount = IstETH(stETH).submit{ value: msg.value }(address(0)); @@ -135,6 +130,9 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { /// WITHDRAW /// + /// @notice Withdraws ERC20 tokens from the staking contract. + /// @param _token The address of the ERC20 token to withdraw. + /// @param _amount The amount of tokens to withdraw. function withdraw(address _token, uint256 _amount) external nonReentrant whenNotPaused { require(_amount > 0, "LGE Staking: may not withdraw nothing."); require(balance[_token][msg.sender] >= _amount, "LGE Staking: insufficient deposited balance."); @@ -146,9 +144,12 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { /// MIGRATE /// - /// @dev Sends assets to migration contract, and then calls `migrate` to move the assets to Ozean + /// @notice Migrates assets to the specified L2 destination. + /// @param _l2Destination The address of the L2 destination to migrate tokens to. + /// @param _tokens An array of token addresses to migrate. + /// @dev Sends assets to the migration contract, and then calls `migrate` to move the assets. function migrate(address _l2Destination, address[] calldata _tokens) external nonReentrant whenNotPaused { - require(migrationActivated, "LGE Staking: Migration not active."); + require(migrationActivated(), "LGE Staking: Migration not active."); require(_l2Destination != address(0), "LGE Staking: May not send tokens to the zero address."); uint256 length = _tokens.length; require(length > 0, "LGE Staking: Must migrate some tokens."); @@ -157,10 +158,12 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { for (uint256 i; i < length; i++) { amount = balance[_tokens[i]][msg.sender]; require(amount > 0, "LGE Staking: No tokens to migrate."); + balance[_tokens[i]][msg.sender] -= amount; + totalDeposited[_tokens[i]] -= amount; amounts[i] = amount; - IERC20(_tokens[i]).safeTransfer(address(LGEMigration), amount); + IERC20(_tokens[i]).safeTransfer(address(lgeMigration), amount); } - LGEMigration.migrate(msg.sender, _l2Destination, _tokens, amounts); + lgeMigration.migrate(_l2Destination, _tokens, amounts); emit TokensMigrated(msg.sender, _l2Destination, _tokens, amounts); } @@ -182,29 +185,28 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { emit DepositCapSet(_token, _newDepositCap); } + /// @notice This function allows the owner to set the migration contract used to move deposited assets to the + /// Ozean L2. + /// @param _contract The new contract address for the LGE Migration logic. + /// @dev The new migration contract must conform to the ILGEMigration interface. + /// @dev If this contract is set to address(0) migration is deactivated + function setMigrationContract(address _contract) external onlyOwner { + lgeMigration = ILGEMigration(_contract); + emit MigrationContractSet(_contract); + } + /// @notice This function allows the owner to pause or unpause this contract. /// @param _set The boolean for whether the contract is to be paused or unpaused. True for paused, false otherwise. function setPaused(bool _set) external onlyOwner { _set ? _pause() : _unpause(); } - /// @notice This function allows the owner to set the migration boolean switch, which when true allows users to - /// migrated - /// deposited assets to the Ozean L2. - /// @param _set The boolean for whether migration is activated. True is activated, false otherwise. - /// @dev Activating migration will disable new deposits. - function setMigrationActivation(bool _set) external onlyOwner { - migrationActivated = _set; - emit MigrationActivated(_set); - } + /// VIEW /// - /// @notice This function allows the owner to set the migration contract used to move deposited assets to the - /// Ozean L2. - /// @param _contract The new contract address for the LGE Migration logic. - /// @dev The new migration contract must conform to the ILGEMigration interface. - function setMigrationContract(address _contract) external onlyOwner { - LGEMigration = ILGEMigration(_contract); - emit MigrationContractSet(_contract); + /// @notice Checks if migration has been activated. + /// @return activated A boolean indicating whether migration is active. + function migrationActivated() public view returns (bool activated) { + activated = (address(lgeMigration) != address(0)); } } diff --git a/packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol b/packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol index 12901f628ab..798e3f46ede 100644 --- a/packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol +++ b/packages/contracts-bedrock/src/L1/interface/ILGEMigration.sol @@ -4,17 +4,5 @@ pragma solidity 0.8.15; /// @title LGE Migration Interface /// @notice Interface for the LGE Migrator contract to move LGE assets onto Ozean mainnet. interface ILGEMigration { - /// @notice This function is called by the LGE Staking contract to facilitate migration of staked tokens from - /// the LGE Staking pool to the Ozean L2. - /// @param _user The address of the user whose staked funds are being migrated to Ozean. - /// @param _l2Destination The address which will be credited the tokens on Ozean. - /// @param _tokens The tokens being migrated to Ozean from the LGE Staking contract. - /// @param _amounts The amounts of each token to be migrated to Ozean for the _user - function migrate( - address _user, - address _l2Destination, - address[] calldata _tokens, - uint256[] calldata _amounts - ) - external; + function migrate(address _l2Destination, address[] calldata _tokens, uint256[] calldata _amounts) external; } diff --git a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol index 29ab48d792f..35c7de590f3 100644 --- a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol +++ b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol @@ -4,14 +4,16 @@ pragma solidity 0.8.15; import { console2 as console } from "forge-std/console2.sol"; import { CommonTest } from "test/setup/CommonTest.sol"; import { LGEStakingDeploy } from "scripts/ozean/LGEStakingDeploy.s.sol"; +import { LGEMigrationDeploy } from "scripts/ozean/LGEMigrationDeploy.s.sol"; import { LGEStaking } from "src/L1/LGEStaking.sol"; +import { LGEMigrationV1 } from "src/L1/LGEMigrationV1.sol"; import { TestERC20Decimals } from "test/mocks/TestERC20.sol"; import { TestStETH, TestWstETH } from "test/mocks/TestLido.sol"; /// @dev forge test --match-contract LGEStakingTest contract LGEStakingTest is CommonTest { LGEStaking public lgeStaking; - address public lgeMigration; + LGEMigrationV1 public lgeMigration; address public hexTrust; /// 18 decimals @@ -32,7 +34,8 @@ contract LGEStakingTest is CommonTest { TestStETH public stETH; TestWstETH public wstETH; - address[] public tokens; + address[] public l1Addresses; + address[] public l2Addresses; uint256[] public depositCaps; /// LGEStaking events @@ -41,7 +44,6 @@ contract LGEStakingTest is CommonTest { event AllowlistSet(address indexed _coin, bool _set); event DepositCapSet(address indexed _coin, uint256 _newDepositCap); event TokensMigrated(address indexed _user, address indexed _l2Destination, address[] _tokens, uint256[] _amounts); - event MigrationActivated(bool _set); event MigrationContractSet(address _newContract); /// Pausable events event Paused(address account); @@ -49,6 +51,7 @@ contract LGEStakingTest is CommonTest { function setUp() public override { /// Set up environment + /// @dev Hex Trust treated as owner of both lgeStaking and lgeMigration hexTrust = makeAddr("HEX_TRUST"); wBTC = new TestERC20Decimals{ salt: bytes32("wBTC") }(18); solvBTC = new TestERC20Decimals{ salt: bytes32("solvBTC") }(18); @@ -68,20 +71,20 @@ contract LGEStakingTest is CommonTest { super.setUp(); /// Deploy LGEStaking - tokens = new address[](13); - tokens[0] = address(wBTC); - tokens[1] = address(solvBTC); - tokens[2] = address(lombardBTC); - tokens[3] = address(wSOL); - tokens[4] = address(wstETH); - tokens[5] = address(sUSDe); - tokens[6] = address(USDe); - tokens[7] = address(AUSD); - tokens[8] = address(USDY); - tokens[9] = address(USDM); - tokens[10] = address(sDAI); - tokens[11] = address(USDC); - tokens[12] = address(usdx); + l1Addresses = new address[](13); + l1Addresses[0] = address(wBTC); + l1Addresses[1] = address(solvBTC); + l1Addresses[2] = address(lombardBTC); + l1Addresses[3] = address(wSOL); + l1Addresses[4] = address(wstETH); + l1Addresses[5] = address(sUSDe); + l1Addresses[6] = address(USDe); + l1Addresses[7] = address(AUSD); + l1Addresses[8] = address(USDY); + l1Addresses[9] = address(USDM); + l1Addresses[10] = address(sDAI); + l1Addresses[11] = address(USDC); + l1Addresses[12] = address(usdx); depositCaps = new uint256[](13); depositCaps[0] = 1e30; @@ -98,23 +101,33 @@ contract LGEStakingTest is CommonTest { depositCaps[11] = 1e30; depositCaps[12] = 1e30; - LGEStakingDeploy deployScript = new LGEStakingDeploy(); - deployScript.setUp(hexTrust, lgeMigration, address(stETH), address(wstETH), tokens, depositCaps); - deployScript.run(); - lgeStaking = deployScript.lgeStaking(); + LGEStakingDeploy stakingDeployScript = new LGEStakingDeploy(); + stakingDeployScript.setUp(hexTrust, address(stETH), address(wstETH), l1Addresses, depositCaps); + stakingDeployScript.run(); + lgeStaking = stakingDeployScript.lgeStaking(); + + /// Deploy LGEMigration + l2Addresses = new address[](13); + l2Addresses[0] = address(wBTC); + /// @dev not the correct L2 address + + LGEMigrationDeploy migrationDeployScript = new LGEMigrationDeploy(); + migrationDeployScript.setUp(address(l1StandardBridge), address(lgeStaking), l1Addresses, l2Addresses); + migrationDeployScript.run(); + lgeMigration = migrationDeployScript.lgeMigration(); } /// SETUP /// function testInitialize() public view { assertEq(lgeStaking.version(), "1.0.0"); - assertEq(address(lgeStaking.LGEMigration()), lgeMigration); + assertEq(address(lgeStaking.lgeMigration()), address(0)); assertEq(lgeStaking.migrationActivated(), false); for (uint256 i; i < 13; i++) { - assertEq(lgeStaking.allowlisted(tokens[i]), true); - assertEq(lgeStaking.depositCap(tokens[i]), 1e30); - assertEq(lgeStaking.totalDeposited(tokens[i]), 0); + assertEq(lgeStaking.allowlisted(l1Addresses[i]), true); + assertEq(lgeStaking.depositCap(l1Addresses[i]), 1e30); + assertEq(lgeStaking.totalDeposited(l1Addresses[i]), 0); } } @@ -138,7 +151,8 @@ contract LGEStakingTest is CommonTest { /// Migration activated vm.stopPrank(); vm.startPrank(hexTrust); - lgeStaking.setMigrationActivation(true); + lgeStaking.setMigrationContract(address(lgeMigration)); + assertEq(lgeStaking.migrationActivated(), true); vm.stopPrank(); vm.startPrank(alice); @@ -174,11 +188,12 @@ contract LGEStakingTest is CommonTest { lgeStaking.depositETH{ value: 0 }(); /// Migration activated - lgeStaking.setMigrationActivation(true); + lgeStaking.setMigrationContract(address(lgeMigration)); + assertEq(lgeStaking.migrationActivated(), true); vm.expectRevert("LGE Staking: May not deposit once migration has been activated."); lgeStaking.depositETH{ value: 1 ether }(); - lgeStaking.setMigrationActivation(false); + lgeStaking.setMigrationContract(address(0)); /// Not allowlisted lgeStaking.setAllowlist(address(wstETH), false); @@ -277,9 +292,102 @@ contract LGEStakingTest is CommonTest { /// MIGRATE /// - /// migrate failure - /// migrate success - /// set migration contract and migrate + function testMigrateFailureConditions(uint256 _amount0) public prank(alice) { + /// Setup + _amount0 = bound(_amount0, 2, 1e30 - 1); + + wBTC.mint(alice, 1e31); + wBTC.approve(address(lgeStaking), _amount0); + lgeStaking.depositERC20(address(wBTC), _amount0); + + assertEq(lgeStaking.balance(address(wBTC), alice), _amount0); + assertEq(lgeStaking.totalDeposited(address(wBTC)), _amount0); + assertEq(wBTC.balanceOf(address(lgeStaking)), _amount0); + + USDC.mint(alice, 1e31); + USDC.approve(address(lgeStaking), _amount0); + lgeStaking.depositERC20(address(USDC), _amount0); + + assertEq(lgeStaking.balance(address(USDC), alice), _amount0); + assertEq(lgeStaking.totalDeposited(address(USDC)), _amount0); + assertEq(USDC.balanceOf(address(lgeStaking)), _amount0); + + /// Only LGE may call + vm.expectRevert("LGE Migration: Only the staking contract can call this function."); + lgeMigration.migrate(alice, l1Addresses, depositCaps); + + address[] memory tokens = new address[](1); + tokens[0] = address(wBTC); + + /// Migration not active + vm.expectRevert("LGE Staking: Migration not active."); + lgeStaking.migrate(alice, tokens); + + /// L2 Destination zero address + vm.stopPrank(); + vm.startPrank(hexTrust); + lgeStaking.setMigrationContract(address(lgeMigration)); + assertEq(lgeStaking.migrationActivated(), true); + vm.stopPrank(); + vm.startPrank(alice); + + vm.expectRevert("LGE Staking: May not send tokens to the zero address."); + lgeStaking.migrate(address(0), tokens); + + /// Tokens length zero + tokens = new address[](0); + + vm.expectRevert("LGE Staking: Must migrate some tokens."); + lgeStaking.migrate(alice, tokens); + + /// No deposits to migrate + tokens = new address[](1); + tokens[0] = address(wSOL); + + vm.expectRevert("LGE Staking: No tokens to migrate."); + lgeStaking.migrate(alice, tokens); + + /// L2 Address not set + tokens[0] = address(USDC); + + vm.expectRevert("LGE Migration: L2 contract address not set for migration."); + lgeStaking.migrate(alice, tokens); + } + + function testMigrateSuccessConditions(uint256 _amount0) public prank(alice) { + /// Setup + _amount0 = bound(_amount0, 2, 1e30 - 1); + wBTC.mint(alice, 1e31); + wBTC.approve(address(lgeStaking), _amount0); + lgeStaking.depositERC20(address(wBTC), _amount0); + + assertEq(lgeStaking.balance(address(wBTC), alice), _amount0); + assertEq(lgeStaking.totalDeposited(address(wBTC)), _amount0); + assertEq(wBTC.balanceOf(address(lgeStaking)), _amount0); + + /// Migrate + vm.stopPrank(); + vm.startPrank(hexTrust); + lgeStaking.setMigrationContract(address(lgeMigration)); + assertEq(lgeStaking.migrationActivated(), true); + vm.stopPrank(); + vm.startPrank(alice); + + address[] memory tokens = new address[](1); + tokens[0] = address(wBTC); + uint256[] memory amounts = new uint256[](1); + amounts[0] = _amount0; + + vm.expectEmit(true, true, true, true); + emit TokensMigrated(alice, alice, tokens, amounts); + lgeStaking.migrate(alice, tokens); + + assertEq(lgeStaking.balance(address(wBTC), alice), 0); + assertEq(lgeStaking.totalDeposited(address(wBTC)), 0); + assertEq(wBTC.balanceOf(address(lgeStaking)), 0); + + /// @dev Flesh this out a bit more + } /// OWNER /// @@ -369,25 +477,6 @@ contract LGEStakingTest is CommonTest { vm.stopPrank(); } - function testSetMigrationActivation() public { - /// Non-owner revert - vm.expectRevert("Ownable: caller is not the owner"); - lgeStaking.setMigrationActivation(true); - - assertEq(lgeStaking.migrationActivated(), false); - - /// External functions paused - vm.startPrank(hexTrust); - - vm.expectEmit(true, true, true, true); - emit MigrationActivated(true); - lgeStaking.setMigrationActivation(true); - - assertEq(lgeStaking.migrationActivated(), true); - - vm.stopPrank(); - } - function testSetMigrationContract() public { address newMigrationContract = address(88); @@ -395,16 +484,17 @@ contract LGEStakingTest is CommonTest { vm.expectRevert("Ownable: caller is not the owner"); lgeStaking.setMigrationContract(newMigrationContract); - assertEq(address(lgeStaking.LGEMigration()), lgeMigration); + assertEq(address(lgeStaking.lgeMigration()), address(0)); + assertEq(lgeStaking.migrationActivated(), false); - /// External functions paused vm.startPrank(hexTrust); vm.expectEmit(true, true, true, true); emit MigrationContractSet(newMigrationContract); lgeStaking.setMigrationContract(newMigrationContract); - assertEq(address(lgeStaking.LGEMigration()), newMigrationContract); + assertEq(address(lgeStaking.lgeMigration()), newMigrationContract); + assertEq(lgeStaking.migrationActivated(), true); vm.stopPrank(); } From 212eed1e2da303387eeee86f93c62831a85e023a Mon Sep 17 00:00:00 2001 From: William Date: Wed, 6 Nov 2024 10:45:27 +1100 Subject: [PATCH 04/15] fix: ozUSD minting events --- packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol | 1 + packages/contracts-bedrock/src/L2/OzUSD.sol | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol b/packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol index 512240c14f7..98641121630 100644 --- a/packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol @@ -2,6 +2,7 @@ pragma solidity 0.8.15; import { Script } from "forge-std/Script.sol"; +import { console2 as console } from "forge-std/console2.sol"; import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import { OzUSD } from "src/L2/OzUSD.sol"; import { WozUSD } from "src/L2/WozUSD.sol"; diff --git a/packages/contracts-bedrock/src/L2/OzUSD.sol b/packages/contracts-bedrock/src/L2/OzUSD.sol index 0a18965da36..f513d4d3b71 100644 --- a/packages/contracts-bedrock/src/L2/OzUSD.sol +++ b/packages/contracts-bedrock/src/L2/OzUSD.sol @@ -170,9 +170,9 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @dev Have to minus `_usdxAmount` from denominator given the transfer of funds has already occured uint256 sharesToMint = (_usdxAmount * totalShares) / (_getTotalPooledUSDX() - _usdxAmount); - uint256 newTotalShares = _mintShares(_to, sharesToMint); + _mintShares(_to, sharesToMint); - _emitTransferAfterMintingShares(_to, newTotalShares); + _emitTransferAfterMintingShares(_to, sharesToMint); } /// @notice Redeems ozUSD tokens by burning shares and redeeming the equivalent amount of `_ozUSDAmount` in USDX. From 52dc4397f2046da8881894a668049ce92bb573cc Mon Sep 17 00:00:00 2001 From: William Date: Thu, 7 Nov 2024 11:06:57 +1100 Subject: [PATCH 05/15] build: yield event --- packages/contracts-bedrock/src/L2/OzUSD.sol | 10 ++++++++ .../contracts-bedrock/test/L2/OzUSD.t.sol | 24 ++++++++++++------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/packages/contracts-bedrock/src/L2/OzUSD.sol b/packages/contracts-bedrock/src/L2/OzUSD.sol index f513d4d3b71..754d16fe08a 100644 --- a/packages/contracts-bedrock/src/L2/OzUSD.sol +++ b/packages/contracts-bedrock/src/L2/OzUSD.sol @@ -49,6 +49,11 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { address indexed account, uint256 preRebaseTokenAmount, uint256 postRebaseTokenAmount, uint256 sharesAmount ); + /// @notice An event for distribution of yield (in the form of USDX) to all participants. + /// @param _previousTotalBalance The total amount of USDX held by the contract before rebasing. + /// @param _newTotalBalance The total amount of USDX held by the contract after rebasing. + event YieldDistributed(uint256 _previousTotalBalance, uint256 _newTotalBalance); + /// SETUP /// constructor() { @@ -68,6 +73,11 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { receive() external payable { } + /// @notice Distributes the yield to the protocol by updating the total pooled USDX balance. + function distributeYield() external payable nonReentrant { + emit YieldDistributed(_getTotalPooledUSDX() - msg.value, _getTotalPooledUSDX()); + } + /// @notice Transfers an amount of ozUSD tokens from the caller to a recipient. /// @param _recipient The recipient of the token transfer. /// @param _amount The number of ozUSD tokens to transfer. diff --git a/packages/contracts-bedrock/test/L2/OzUSD.t.sol b/packages/contracts-bedrock/test/L2/OzUSD.t.sol index c9440cf9549..e80160e0472 100644 --- a/packages/contracts-bedrock/test/L2/OzUSD.t.sol +++ b/packages/contracts-bedrock/test/L2/OzUSD.t.sol @@ -12,6 +12,10 @@ contract OzUSDTest is CommonTest { OzUSD public implementation; OzUSD public ozUSD; + event TransferShares(address indexed from, address indexed to, uint256 sharesValue); + event SharesBurnt(address indexed account, uint256 preRebaseTokenAmount, uint256 postRebaseTokenAmount, uint256 sharesAmount); + event YieldDistributed(uint256 _previousTotalBalance, uint256 _newTotalBalance); + function setUp() public override { alice = makeAddr("alice"); bob = makeAddr("bob"); @@ -44,8 +48,9 @@ contract OzUSDTest is CommonTest { assertEq(address(ozUSD).balance, 1e18); assertEq(ozUSD.getPooledUSDXByShares(sharesAmount), sharesAmount); - (bool s,) = address(ozUSD).call{ value: sharesAmount }(""); - assert(s); + vm.expectEmit(true, true, true, true); + emit YieldDistributed(1e18, 1e18 + sharesAmount); + ozUSD.distributeYield{value: sharesAmount}(); assertEq(ozUSD.getPooledUSDXByShares(sharesAmount), (sharesAmount * address(ozUSD).balance) / 1e18); } @@ -62,8 +67,9 @@ contract OzUSDTest is CommonTest { assertEq(address(ozUSD).balance, 1e18 + _amountA); assertEq(ozUSD.getPooledUSDXByShares(_amountA), _amountA); - (bool s,) = address(ozUSD).call{ value: _amountB }(""); - assert(s); + vm.expectEmit(true, true, true, true); + emit YieldDistributed(1e18 + _amountA, 1e18 + _amountA + _amountB); + ozUSD.distributeYield{value: _amountB}(); assertEq(address(ozUSD).balance, 1e18 + _amountA + _amountB); assertEq(ozUSD.balanceOf(alice), ozUSD.getPooledUSDXByShares(_amountA)); @@ -102,8 +108,9 @@ contract OzUSDTest is CommonTest { assertEq(ozUSD.balanceOf(alice), _amountA); assertEq(ozUSD.getPooledUSDXByShares(_amountA), _amountA); - (bool s,) = address(ozUSD).call{ value: _amountB }(""); - assert(s); + vm.expectEmit(true, true, true, true); + emit YieldDistributed(1e18 + _amountA, 1e18 + _amountA + _amountB); + ozUSD.distributeYield{value: _amountB}(); uint256 predictedAliceAmount = (_amountA * (1e18 + _amountA + _amountB)) / (1e18 + _amountA); @@ -131,8 +138,9 @@ contract OzUSDTest is CommonTest { assertEq(ozUSD.balanceOf(alice), 1e18); assertEq(ozUSD.getPooledUSDXByShares(sharesAmount), 1e18); - (bool s,) = address(ozUSD).call{ value: 1e18 }(""); - assert(s); + vm.expectEmit(true, true, true, true); + emit YieldDistributed(2e18, 3e18); + ozUSD.distributeYield{value: 1e18}(); assertEq(address(ozUSD).balance, 3e18); assertEq(ozUSD.balanceOf(alice), 1.5e18); From 7afc13bbb38d6f1bdde7c4e5118ce35eac08d383 Mon Sep 17 00:00:00 2001 From: William Date: Wed, 13 Nov 2024 15:09:08 +1100 Subject: [PATCH 06/15] fix: lge staking eth deposits --- packages/contracts-bedrock/src/L1/LGEStaking.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/LGEStaking.sol b/packages/contracts-bedrock/src/L1/LGEStaking.sol index ad50625b62d..bb3d29abd58 100644 --- a/packages/contracts-bedrock/src/L1/LGEStaking.sol +++ b/packages/contracts-bedrock/src/L1/LGEStaking.sol @@ -117,8 +117,8 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { require(!migrationActivated(), "LGE Staking: May not deposit once migration has been activated."); require(msg.value > 0, "LGE Staking: May not deposit nothing."); require(allowlisted[wstETH], "LGE Staking: Token must be allowlisted."); - uint256 stETHAmount = IstETH(stETH).submit{ value: msg.value }(address(0)); - uint256 wstETHAmount = IwstETH(wstETH).wrap(stETHAmount); + IstETH(stETH).submit{value: msg.value}(address(0)); + uint256 wstETHAmount = IwstETH(wstETH).wrap(IstETH(stETH).balanceOf(address(this))); require( totalDeposited[wstETH] + wstETHAmount < depositCap[wstETH], "LGE Staking: deposit amount exceeds deposit cap." From 96acf95ca3ee0d03660963efa89d567032ca5d75 Mon Sep 17 00:00:00 2001 From: William Date: Thu, 14 Nov 2024 16:43:00 +1100 Subject: [PATCH 07/15] build: more tests --- packages/contracts-bedrock/src/L2/OzUSD.sol | 50 ++++----- .../test/L1/LGEStaking.t.sol | 16 +++ .../contracts-bedrock/test/L2/OzUSD.t.sol | 103 +++++++++++++++++- 3 files changed, 136 insertions(+), 33 deletions(-) diff --git a/packages/contracts-bedrock/src/L2/OzUSD.sol b/packages/contracts-bedrock/src/L2/OzUSD.sol index 754d16fe08a..89713e75d1d 100644 --- a/packages/contracts-bedrock/src/L2/OzUSD.sol +++ b/packages/contracts-bedrock/src/L2/OzUSD.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; -import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; /// @title Ozean USD (ozUSD) Token Contract /// @notice This contract implements a rebasing token (ozUSD), where token balances are dynamic and calculated @@ -64,14 +64,14 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @dev Requires the sender to send USDX equal to the number of shares specified in `_sharesAmount`. /// @param _sharesAmount The number of shares to initialize. function initialize(uint256 _sharesAmount) external payable initializer nonReentrant { - require(msg.value == _sharesAmount, "OzUSD: INCORRECT_VALUE"); + require(msg.value == _sharesAmount, "OzUSD: Incorrect value."); _mintShares(address(0xdead), _sharesAmount); _emitTransferAfterMintingShares(address(0xdead), _sharesAmount); } /// EXTERNAL /// - receive() external payable { } + receive() external payable {} /// @notice Distributes the yield to the protocol by updating the total pooled USDX balance. function distributeYield() external payable nonReentrant { @@ -130,7 +130,7 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// Reverts if the current allowance is less than the amount being subtracted. function decreaseAllowance(address _spender, uint256 _subtractedValue) external nonReentrant returns (bool) { uint256 currentAllowance = allowances[msg.sender][_spender]; - require(currentAllowance >= _subtractedValue, "OzUSD: ALLOWANCE_BELOW_ZERO"); + require(currentAllowance >= _subtractedValue, "OzUSD: Allowance below value."); _approve(msg.sender, _spender, currentAllowance - _subtractedValue); return true; } @@ -154,11 +154,7 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @param _sharesAmount The number of shares to transfer. /// @return uint256 The amount of ozUSD tokens equivalent to the transferred shares. /// @dev The `_sharesAmount` argument is the amount of shares, not tokens. - function transferSharesFrom( - address _sender, - address _recipient, - uint256 _sharesAmount - ) + function transferSharesFrom(address _sender, address _recipient, uint256 _sharesAmount) external nonReentrant returns (uint256) @@ -175,8 +171,8 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @param _to The address to receive the minted ozUSD. /// @param _usdxAmount The amount of USDX to lock in exchange for ozUSD. function mintOzUSD(address _to, uint256 _usdxAmount) external payable nonReentrant { - require(_usdxAmount != 0, "OzUSD: Amount zero"); - require(msg.value == _usdxAmount, "OzUSD: Insufficient USDX transfer"); + require(_usdxAmount != 0, "OzUSD: Amount zero."); + require(msg.value == _usdxAmount, "OzUSD: Insufficient USDX transfer."); /// @dev Have to minus `_usdxAmount` from denominator given the transfer of funds has already occured uint256 sharesToMint = (_usdxAmount * totalShares) / (_getTotalPooledUSDX() - _usdxAmount); @@ -191,13 +187,13 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @dev Spender must approve contract, even if owner of coins /// Burns shares and transfers back the corresponding USDX. function redeemOzUSD(address _from, uint256 _ozUSDAmount) external nonReentrant { - require(_ozUSDAmount != 0, "OzUSD: Amount zero"); + require(_ozUSDAmount != 0, "OzUSD: Amount zero."); _spendAllowance(_from, msg.sender, _ozUSDAmount); uint256 sharesToBurn = getSharesByPooledUSDX(_ozUSDAmount); _burnShares(_from, sharesToBurn); - (bool s,) = _from.call{ value: _ozUSDAmount }(""); + (bool s,) = _from.call{value: _ozUSDAmount}(""); assert(s); _emitTransferEvents(msg.sender, address(0), _ozUSDAmount, sharesToBurn); @@ -257,10 +253,6 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { return address(this).balance; } - function _sharesOf(address _account) internal view returns (uint256) { - return shares[_account]; - } - /// @dev Moves `_amount` tokens from `_sender` to `_recipient`. function _transfer(address _sender, address _recipient, uint256 _amount) internal { uint256 _sharesToTransfer = getSharesByPooledUSDX(_amount); @@ -269,8 +261,8 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { } function _approve(address _owner, address _spender, uint256 _amount) internal { - require(_owner != address(0), "OzUSD: APPROVE_FROM_ZERO_ADDR"); - require(_spender != address(0), "OzUSD: APPROVE_TO_ZERO_ADDR"); + require(_owner != address(0), "OzUSD: Approve from zero address."); + require(_spender != address(0), "OzUSD: Approve to zero address."); allowances[_owner][_spender] = _amount; emit Approval(_owner, _spender, _amount); @@ -279,18 +271,18 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { function _spendAllowance(address _owner, address _spender, uint256 _amount) internal { uint256 currentAllowance = allowances[_owner][_spender]; if (currentAllowance != ~uint256(0)) { - require(currentAllowance >= _amount, "OzUSD: ALLOWANCE_EXCEEDED"); + require(currentAllowance >= _amount, "OzUSD: Allowance exceeded."); _approve(_owner, _spender, currentAllowance - _amount); } } function _transferShares(address _sender, address _recipient, uint256 _sharesAmount) internal { - require(_sender != address(0), "OzUSD: TRANSFER_FROM_ZERO_ADDR"); - require(_recipient != address(0), "OzUSD: TRANSFER_TO_ZERO_ADDR"); - require(_recipient != address(this), "OzUSD: TRANSFER_TO_STETH_CONTRACT"); + require(_sender != address(0), "OzUSD: Transfer from zero address."); + require(_recipient != address(0), "OzUSD: Transfer to zero address."); + require(_recipient != address(this), "OzUSD: Transfer to this contract."); uint256 currentSenderShares = shares[_sender]; - require(_sharesAmount <= currentSenderShares, "OzUSD: BALANCE_EXCEEDED"); + require(_sharesAmount <= currentSenderShares, "OzUSD: Balance exceeded."); shares[_sender] = currentSenderShares - _sharesAmount; shares[_recipient] = shares[_recipient] + _sharesAmount; @@ -299,7 +291,7 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @notice Creates `_sharesAmount` shares and assigns them to `_recipient`, increasing the total amount of shares. /// @dev This doesn't increase the token total supply. function _mintShares(address _recipient, uint256 _sharesAmount) internal returns (uint256 newTotalShares) { - require(_recipient != address(0), "OzUSD: MINT_TO_ZERO_ADDR"); + require(_recipient != address(0), "OzUSD: Mint to zero address."); newTotalShares = totalShares + _sharesAmount; totalShares = newTotalShares; @@ -309,10 +301,10 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @notice Destroys `_sharesAmount` shares from `_account`'s holdings, decreasing the total amount of shares. /// @dev This doesn't decrease the token total supply. function _burnShares(address _account, uint256 _sharesAmount) internal returns (uint256 newTotalShares) { - require(_account != address(0), "OzUSD: BURN_FROM_ZERO_ADDR"); + require(_account != address(0), "OzUSD: Burn from zero address."); uint256 accountShares = shares[_account]; - require(_sharesAmount <= accountShares, "OzUSD: BALANCE_EXCEEDED"); + require(_sharesAmount <= accountShares, "OzUSD: Balance exceeded."); uint256 preRebaseTokenAmount = getPooledUSDXByShares(_sharesAmount); diff --git a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol index 35c7de590f3..4a8a4697cde 100644 --- a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol +++ b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol @@ -131,6 +131,22 @@ contract LGEStakingTest is CommonTest { } } + function testDeployRevertWithUnequalArrayLengths() public { + l1Addresses = new address[](3); + l1Addresses[0] = address(wBTC); + l1Addresses[1] = address(solvBTC); + l1Addresses[2] = address(lombardBTC); + depositCaps = new uint256[](2); + depositCaps[0] = 1e30; + depositCaps[1] = 1e30; + vm.expectRevert("LGE Staking: Tokens array length must equal the Deposit Caps array length."); + lgeStaking = new LGEStaking(hexTrust, address(stETH), address(wstETH), l1Addresses, depositCaps); + + /// LGE Migration + vm.expectRevert("LGE Migration: L1 addresses array length must equal the L2 addresses array length."); + lgeMigration = new LGEMigrationV1(address(l1StandardBridge), address(lgeStaking), l1Addresses, l2Addresses); + } + /// DEPOSIT ERC20 /// function testDepositERC20FailureConditions() public prank(alice) { diff --git a/packages/contracts-bedrock/test/L2/OzUSD.t.sol b/packages/contracts-bedrock/test/L2/OzUSD.t.sol index e80160e0472..81a5b5d55b5 100644 --- a/packages/contracts-bedrock/test/L2/OzUSD.t.sol +++ b/packages/contracts-bedrock/test/L2/OzUSD.t.sol @@ -41,8 +41,52 @@ contract OzUSDTest is CommonTest { assertEq(ozUSD.decimals(), 18); } + function testInitializeRevertConditions() public { + uint256 initialSharesAmount = 1e18; + vm.expectRevert("OzUSD: Incorrect value."); + new TransparentUpgradeableProxy{value: initialSharesAmount - 1}( + address(implementation), admin, abi.encodeWithSignature("initialize(uint256)", initialSharesAmount) + ); + } + /// REBASE /// + function testMintRevertConditions() public prank(alice) { + /// Amount zero + vm.expectRevert("OzUSD: Amount zero."); + ozUSD.mintOzUSD{ value: 1e18 }(alice, 0); + + /// Insufficient amount + vm.expectRevert("OzUSD: Insufficient USDX transfer."); + ozUSD.mintOzUSD{ value: 1e18 }(alice, 1e18 + 1); + + /// Mint to zero address + vm.expectRevert("OzUSD: Mint to zero address."); + ozUSD.mintOzUSD{ value: 1e18 }(address(0), 1e18); + } + + function testRedeemOzUSDRevertConditions() public prank(alice) { + uint256 _amountA = 100 ether; + + assertEq(address(ozUSD).balance, 1e18); + assertEq(ozUSD.getPooledUSDXByShares(_amountA), _amountA); + + ozUSD.mintOzUSD{ value: _amountA }(alice, _amountA); + + assertEq(address(ozUSD).balance, 1e18 + _amountA); + assertEq(ozUSD.getPooledUSDXByShares(_amountA), _amountA); + + ozUSD.approve(alice, ~uint256(0)); + + /// Amount zero + vm.expectRevert("OzUSD: Amount zero."); + ozUSD.redeemOzUSD(alice, 0); + + /// Burn more than allowance + vm.expectRevert("OzUSD: Balance exceeded."); + ozUSD.redeemOzUSD(alice, 1e30); + } + function testRebase(uint256 sharesAmount) public prank(alice) { sharesAmount = bound(sharesAmount, 1, 1e20); assertEq(address(ozUSD).balance, 1e18); @@ -155,6 +199,19 @@ contract OzUSDTest is CommonTest { /// ERC20 /// + function testApproveRevertConditions() public prank(address(0)) { + /// Approve from zero address + vm.expectRevert("OzUSD: Approve from zero address."); + ozUSD.approve(alice, 1e18); + + vm.stopPrank(); + vm.startPrank(alice); + + /// Approve to zero address + vm.expectRevert("OzUSD: Approve to zero address."); + ozUSD.approve(address(0), 1e18); + } + function testApproveAndTransferFrom() public prank(alice) { uint256 sharesAmount = 1e18; @@ -185,23 +242,61 @@ contract OzUSDTest is CommonTest { ozUSD.mintOzUSD{ value: 1e18 }(alice, 1e18); assertEq(ozUSD.balanceOf(alice), 1e18); - // Increase bob's allowance + // Increase Bob's allowance ozUSD.increaseAllowance(bob, 0.5e18); assertEq(ozUSD.allowance(alice, bob), 0.5e18); - // Decrease bob's allowance + // Decrease Bob's allowance ozUSD.decreaseAllowance(bob, 0.2e18); assertEq(ozUSD.allowance(alice, bob), 0.3e18); + + /// Decrease Bob's allowance revert + vm.expectRevert("OzUSD: Allowance below value."); + ozUSD.decreaseAllowance(bob, 0.4e18); + } + + function testTransferSharesRevertConditions() public prank(address(0)) { + /// Transfer from zero address + vm.expectRevert("OzUSD: Transfer from zero address."); + ozUSD.transferShares(alice, 1e18); + + /// Transfer to zero address + vm.stopPrank(); + vm.startPrank(alice); + + vm.expectRevert("OzUSD: Transfer to zero address."); + ozUSD.transferShares(address(0), 1e18); + + /// Transfer to contract. + vm.expectRevert("OzUSD: Transfer to this contract."); + ozUSD.transferShares(address(ozUSD), 1e18); } function testTransferShares() public prank(alice) { // Mint ozUSD ozUSD.mintOzUSD{ value: 1e18 }(alice, 1e18); + assertEq(ozUSD.sharesOf(alice), 1e18); // Transfer shares from alice to bob uint256 sharesToTransfer = 0.5e18; uint256 tokensTransferred = ozUSD.transferShares(bob, sharesToTransfer); + // Check balances after the transfer + assertEq(ozUSD.balanceOf(alice), 0.5e18); + assertEq(ozUSD.balanceOf(bob), tokensTransferred); + assertEq(ozUSD.sharesOf(alice), 0.5e18); + assertEq(ozUSD.sharesOf(bob), 0.5e18); + } + + function testTransferSharesFrom() public prank(alice) { + // Mint ozUSD + ozUSD.mintOzUSD{ value: 1e18 }(alice, 1e18); + + // Transfer shares from alice to bob + uint256 sharesToTransfer = 0.5e18; + ozUSD.approve(alice, ~uint256(0)); + uint256 tokensTransferred = ozUSD.transferSharesFrom(alice, bob, sharesToTransfer); + // Check balances after the transfer assertEq(ozUSD.balanceOf(alice), 0.5e18); assertEq(ozUSD.balanceOf(bob), tokensTransferred); @@ -212,7 +307,7 @@ contract OzUSDTest is CommonTest { ozUSD.mintOzUSD{ value: 1e18 }(alice, 1e18); // Attempt to transfer more than alice's balance - vm.expectRevert("OzUSD: BALANCE_EXCEEDED"); + vm.expectRevert("OzUSD: Balance exceeded."); ozUSD.transfer(bob, 2e18); // Transfer amount exceeds balance } @@ -242,7 +337,7 @@ contract OzUSDTest is CommonTest { // Bob tries to transfer more than allowed, should fail vm.stopPrank(); vm.startPrank(bob); - vm.expectRevert("OzUSD: ALLOWANCE_EXCEEDED"); + vm.expectRevert("OzUSD: Allowance exceeded."); ozUSD.transferFrom(alice, bob, 1e18); } From 6185f044b2098a6fe37d675db2506069d26b964b Mon Sep 17 00:00:00 2001 From: William Date: Tue, 19 Nov 2024 15:09:31 +1100 Subject: [PATCH 08/15] build: more migration cases --- .../scripts/ozean/LGEMigrationDeploy.s.sol | 27 ++++++- .../src/L1/LGEMigrationV1.sol | 76 ++++++++++++++----- .../test/L1/LGEStaking.t.sol | 28 ++++++- 3 files changed, 106 insertions(+), 25 deletions(-) diff --git a/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol index ba1303a81ae..121fcfd8dd4 100644 --- a/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol @@ -7,27 +7,46 @@ import { LGEMigrationV1 } from "src/L1/LGEMigrationV1.sol"; contract LGEMigrationDeploy is Script { LGEMigrationV1 public lgeMigration; address public l1StandardBridge; + address public l1LidoTokensBridge; + address public usdxBridge; address public lgeStaking; + address public usdc; + address public wstETH; address[] public l1Addresses; address[] public l2Addresses; /// @dev Used in testing environment, unnecessary for mainnet deployment function setUp( address _l1StandardBridge, + address _l1LidoTokensBridge, + address _usdxBridge, address _lgeStaking, + address _usdc, + address _wstETH, address[] memory _l1Addresses, address[] memory _l2Addresses - ) - external - { + ) external { l1StandardBridge = _l1StandardBridge; + l1LidoTokensBridge = _l1LidoTokensBridge; + usdxBridge = _usdxBridge; lgeStaking = _lgeStaking; + usdc = _usdc; + wstETH = _wstETH; l1Addresses = _l1Addresses; l2Addresses = _l2Addresses; } function run() external broadcast { - lgeMigration = new LGEMigrationV1(l1StandardBridge, lgeStaking, l1Addresses, l2Addresses); + lgeMigration = new LGEMigrationV1( + l1StandardBridge, + l1LidoTokensBridge, + usdxBridge, + lgeStaking, + usdc, + wstETH, + l1Addresses, + l2Addresses + ); } modifier broadcast() { diff --git a/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol index e6087686916..084efa9181d 100644 --- a/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol +++ b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; -import { ILGEMigration } from "src/L1/interface/ILGEMigration.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import {ILGEMigration} from "./interface/ILGEMigration.sol"; /// @title LGE Migration V1 /// @notice This contract facilitates the migration of staked tokens from the LGE Staking pool @@ -15,20 +15,40 @@ contract LGEMigrationV1 is ILGEMigration, ReentrancyGuard { /// @notice The standard bridge contract for Layer 1 to Layer 2 transfers. IL1StandardBridge public immutable l1StandardBridge; + /// @notice The L1 lido bridge contract. + IL1LidoTokensBridge public immutable l1LidoTokensBridge; + + /// @notice The L1 USDX bridge that converts USDC into USDX. + IUSDXBridge public immutable usdxBridge; + /// @notice The address of the LGE Staking contract. address public immutable lgeStaking; + /// @notice The address of Circle's USDC. + address public immutable usdc; + + /// @notice The address of Wrapped Statked Ether. + address public immutable wstETH; + /// @notice A mapping from Layer 1 token addresses to their corresponding Layer 2 addresses. mapping(address => address) public l1ToL2Addresses; constructor( address _l1StandardBridge, + address _l1LidoTokensBridge, + address _usdxBridge, address _lgeStaking, + address _usdc, + address _wstETH, address[] memory _l1Addresses, address[] memory _l2Addresses ) { l1StandardBridge = IL1StandardBridge(_l1StandardBridge); + l1LidoTokensBridge = IL1LidoTokensBridge(_l1LidoTokensBridge); + usdxBridge = IUSDXBridge(_usdxBridge); lgeStaking = _lgeStaking; + usdc = _usdc; + wstETH = _wstETH; uint256 length = _l1Addresses.length; require( length == _l2Addresses.length, @@ -44,31 +64,37 @@ contract LGEMigrationV1 is ILGEMigration, ReentrancyGuard { /// @param _l2Destination The address which will be credited the tokens on Ozean. /// @param _tokens The tokens being migrated to Ozean from the LGE Staking contract. /// @param _amounts The amounts of each token to be migrated to Ozean for the _user - function migrate( - address _l2Destination, - address[] calldata _tokens, - uint256[] calldata _amounts - ) + function migrate(address _l2Destination, address[] calldata _tokens, uint256[] calldata _amounts) external nonReentrant { require(msg.sender == lgeStaking, "LGE Migration: Only the staking contract can call this function."); - - /// @dev need to account for USDC => USDX, and wstETH - uint256 length = _tokens.length; for (uint256 i; i < length; i++) { require( l1ToL2Addresses[_tokens[i]] != address(0), "LGE Migration: L2 contract address not set for migration." ); - IERC20(_tokens[i]).approve(address(l1StandardBridge), _amounts[i]); - l1StandardBridge.depositERC20To( - _tokens[i], l1ToL2Addresses[_tokens[i]], _l2Destination, _amounts[i], 21000, "" - ); + if (_tokens[i] == usdc) { + /// Handle USDC + IERC20(_tokens[i]).approve(address(usdxBridge), _amounts[i]); + usdxBridge.bridge(_tokens[i], _amounts[i], _l2Destination); + } else if (_tokens[i] == wstETH) { + /// Handle wstETH + IERC20(_tokens[i]).approve(address(l1LidoTokensBridge), _amounts[i]); + l1LidoTokensBridge.depositERC20To(_tokens[i], l1ToL2Addresses[_tokens[i]], _l2Destination, _amounts[i], 320000, ""); + } else { + /// Handle other tokens + IERC20(_tokens[i]).approve(address(l1StandardBridge), _amounts[i]); + l1StandardBridge.depositERC20To( + _tokens[i], l1ToL2Addresses[_tokens[i]], _l2Destination, _amounts[i], 21000, "" + ); + } } } } +/// Interfaces /// + interface IL1StandardBridge { /// @custom:legacy /// @notice Deposits some amount of ERC20 tokens into a target account on L2. @@ -87,6 +113,20 @@ interface IL1StandardBridge { uint256 _amount, uint32 _minGasLimit, bytes calldata _extraData - ) - external; + ) external; +} + +interface IL1LidoTokensBridge { + function depositERC20To( + address l1Token_, + address l2Token_, + address to_, + uint256 amount_, + uint32 l2Gas_, + bytes calldata data_ + ) external; +} + +interface IUSDXBridge { + function bridge(address _stablecoin, uint256 _amount, address _to) external; } diff --git a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol index 4a8a4697cde..db0b0bb4f0a 100644 --- a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol +++ b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol @@ -33,6 +33,10 @@ contract LGEStakingTest is CommonTest { /// Mock Lido contracts TestStETH public stETH; TestWstETH public wstETH; + + /// @dev mock these too? + address public l1LidoTokensBridge; + address public usdxBridge; address[] public l1Addresses; address[] public l2Addresses; @@ -107,12 +111,21 @@ contract LGEStakingTest is CommonTest { lgeStaking = stakingDeployScript.lgeStaking(); /// Deploy LGEMigration + /// @dev not the correct L2 address l2Addresses = new address[](13); l2Addresses[0] = address(wBTC); - /// @dev not the correct L2 address LGEMigrationDeploy migrationDeployScript = new LGEMigrationDeploy(); - migrationDeployScript.setUp(address(l1StandardBridge), address(lgeStaking), l1Addresses, l2Addresses); + migrationDeployScript.setUp( + address(l1StandardBridge), + address(l1LidoTokensBridge), + address(usdxBridge), + address(lgeStaking), + address(USDC), + address(wstETH), + l1Addresses, + l2Addresses + ); migrationDeployScript.run(); lgeMigration = migrationDeployScript.lgeMigration(); } @@ -144,7 +157,16 @@ contract LGEStakingTest is CommonTest { /// LGE Migration vm.expectRevert("LGE Migration: L1 addresses array length must equal the L2 addresses array length."); - lgeMigration = new LGEMigrationV1(address(l1StandardBridge), address(lgeStaking), l1Addresses, l2Addresses); + lgeMigration = new LGEMigrationV1( + address(l1StandardBridge), + address(l1LidoTokensBridge), + address(usdxBridge), + address(lgeStaking), + address(USDC), + address(wstETH), + l1Addresses, + l2Addresses + ); } /// DEPOSIT ERC20 /// From 894293f6d68ec6bb1a74d917fab2f947eeb7de6c Mon Sep 17 00:00:00 2001 From: William Date: Wed, 4 Dec 2024 16:05:28 +1100 Subject: [PATCH 09/15] fix: audit --- .../scripts/ozean/LGEMigrationDeploy.s.sol | 4 ++ .../src/L1/LGEMigrationV1.sol | 36 ++++++++++++--- .../contracts-bedrock/src/L1/LGEStaking.sol | 43 +++++++++++------- .../contracts-bedrock/src/L1/USDXBridge.sol | 25 ++++++++--- packages/contracts-bedrock/src/L2/OzUSD.sol | 13 +++--- .../test/L1/LGEStaking.t.sol | 44 ++++++++++++++++++- .../test/L1/USDXBridge.t.sol | 17 +++++++ .../contracts-bedrock/test/L2/OzUSD.t.sol | 38 ++++++++-------- 8 files changed, 164 insertions(+), 56 deletions(-) diff --git a/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol index 121fcfd8dd4..023c80220d5 100644 --- a/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol @@ -5,6 +5,7 @@ import { Script } from "forge-std/Script.sol"; import { LGEMigrationV1 } from "src/L1/LGEMigrationV1.sol"; contract LGEMigrationDeploy is Script { + address public hexTrust = makeAddr("HEX_TRUST"); LGEMigrationV1 public lgeMigration; address public l1StandardBridge; address public l1LidoTokensBridge; @@ -17,6 +18,7 @@ contract LGEMigrationDeploy is Script { /// @dev Used in testing environment, unnecessary for mainnet deployment function setUp( + address _hexTrust, address _l1StandardBridge, address _l1LidoTokensBridge, address _usdxBridge, @@ -26,6 +28,7 @@ contract LGEMigrationDeploy is Script { address[] memory _l1Addresses, address[] memory _l2Addresses ) external { + hexTrust = _hexTrust; l1StandardBridge = _l1StandardBridge; l1LidoTokensBridge = _l1LidoTokensBridge; usdxBridge = _usdxBridge; @@ -38,6 +41,7 @@ contract LGEMigrationDeploy is Script { function run() external broadcast { lgeMigration = new LGEMigrationV1( + hexTrust, l1StandardBridge, l1LidoTokensBridge, usdxBridge, diff --git a/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol index 084efa9181d..f2089a7625f 100644 --- a/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol +++ b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; @@ -9,7 +10,7 @@ import {ILGEMigration} from "./interface/ILGEMigration.sol"; /// @title LGE Migration V1 /// @notice This contract facilitates the migration of staked tokens from the LGE Staking pool /// on Layer 1 to the Ozean Layer 2. -contract LGEMigrationV1 is ILGEMigration, ReentrancyGuard { +contract LGEMigrationV1 is Ownable, ILGEMigration, ReentrancyGuard { using SafeERC20 for IERC20; /// @notice The standard bridge contract for Layer 1 to Layer 2 transfers. @@ -33,7 +34,11 @@ contract LGEMigrationV1 is ILGEMigration, ReentrancyGuard { /// @notice A mapping from Layer 1 token addresses to their corresponding Layer 2 addresses. mapping(address => address) public l1ToL2Addresses; + /// @notice A mapping from Layer 1 token address to the gas limits passed to the bridge contracts. + mapping(address => uint32) public gasLimits; + constructor( + address _owner, address _l1StandardBridge, address _l1LidoTokensBridge, address _usdxBridge, @@ -43,6 +48,7 @@ contract LGEMigrationV1 is ILGEMigration, ReentrancyGuard { address[] memory _l1Addresses, address[] memory _l2Addresses ) { + _transferOwnership(_owner); l1StandardBridge = IL1StandardBridge(_l1StandardBridge); l1LidoTokensBridge = IL1LidoTokensBridge(_l1LidoTokensBridge); usdxBridge = IUSDXBridge(_usdxBridge); @@ -56,6 +62,7 @@ contract LGEMigrationV1 is ILGEMigration, ReentrancyGuard { ); for (uint256 i; i < length; ++i) { l1ToL2Addresses[_l1Addresses[i]] = _l2Addresses[i]; + gasLimits[_l1Addresses[i]] = 21000; } } @@ -76,21 +83,38 @@ contract LGEMigrationV1 is ILGEMigration, ReentrancyGuard { ); if (_tokens[i] == usdc) { /// Handle USDC - IERC20(_tokens[i]).approve(address(usdxBridge), _amounts[i]); + IERC20(_tokens[i]).safeApprove(address(usdxBridge), _amounts[i]); usdxBridge.bridge(_tokens[i], _amounts[i], _l2Destination); } else if (_tokens[i] == wstETH) { /// Handle wstETH - IERC20(_tokens[i]).approve(address(l1LidoTokensBridge), _amounts[i]); - l1LidoTokensBridge.depositERC20To(_tokens[i], l1ToL2Addresses[_tokens[i]], _l2Destination, _amounts[i], 320000, ""); + IERC20(_tokens[i]).safeApprove(address(l1LidoTokensBridge), _amounts[i]); + l1LidoTokensBridge.depositERC20To( + _tokens[i], l1ToL2Addresses[_tokens[i]], _l2Destination, _amounts[i], gasLimits[_tokens[i]], "" + ); } else { /// Handle other tokens - IERC20(_tokens[i]).approve(address(l1StandardBridge), _amounts[i]); + IERC20(_tokens[i]).safeApprove(address(l1StandardBridge), _amounts[i]); l1StandardBridge.depositERC20To( - _tokens[i], l1ToL2Addresses[_tokens[i]], _l2Destination, _amounts[i], 21000, "" + _tokens[i], l1ToL2Addresses[_tokens[i]], _l2Destination, _amounts[i], gasLimits[_tokens[i]], "" ); } } } + + /// @notice This function allows the contract owner to recover ERC20 tokens from the contract. + /// @param _token The address of the ERC20 token to recover. + /// @param _amount The amount of tokens to transfer to the recipient. + /// @param _recipient The address that will receive the recovered tokens. + function recoverTokens(address _token, uint256 _amount, address _recipient) external onlyOwner nonReentrant { + IERC20(_token).transfer(_recipient, _amount); + } + + /// @notice This function allows the contract owner to change the gas limit passed to the bridging contracts. + /// @param _token The address of the ERC20 token. + /// @param _limit The new gas limit for bridging the token. + function setGasLimit(address _token, uint32 _limit) external onlyOwner { + gasLimits[_token] = _limit; + } } /// Interfaces /// diff --git a/packages/contracts-bedrock/src/L1/LGEStaking.sol b/packages/contracts-bedrock/src/L1/LGEStaking.sol index bb3d29abd58..cd74be8835d 100644 --- a/packages/contracts-bedrock/src/L1/LGEStaking.sol +++ b/packages/contracts-bedrock/src/L1/LGEStaking.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; -import { Pausable } from "@openzeppelin/contracts/security/Pausable.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; import { ISemver } from "src/universal/ISemver.sol"; -import { ILGEMigration } from "src/L1/interface/ILGEMigration.sol"; +import {ILGEMigration} from "src/L1/interface/ILGEMigration.sol"; /// @title LGE Staking /// @notice This contract facilitates staking of ERC20 tokens and ETH for users and allows migration of staked assets to @@ -102,13 +102,16 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { require(!migrationActivated(), "LGE Staking: May not deposit once migration has been activated."); require(_amount > 0, "LGE Staking: May not deposit nothing."); require(allowlisted[_token], "LGE Staking: Token must be allowlisted."); + uint256 balanceBefore = IERC20(_token).balanceOf(address(this)); + IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount); + uint256 recievedAmount = IERC20(_token).balanceOf(address(this)) - balanceBefore; require( - totalDeposited[_token] + _amount < depositCap[_token], "LGE Staking: deposit amount exceeds deposit cap." + totalDeposited[_token] + recievedAmount < depositCap[_token], + "LGE Staking: deposit amount exceeds deposit cap." ); - balance[_token][msg.sender] += _amount; - totalDeposited[_token] += _amount; - IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount); - emit Deposit(_token, _amount, msg.sender); + balance[_token][msg.sender] += recievedAmount; + totalDeposited[_token] += recievedAmount; + emit Deposit(_token, recievedAmount, msg.sender); } /// @notice Deposits ETH into the staking contract, converting it to wstETH. @@ -136,10 +139,12 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { function withdraw(address _token, uint256 _amount) external nonReentrant whenNotPaused { require(_amount > 0, "LGE Staking: may not withdraw nothing."); require(balance[_token][msg.sender] >= _amount, "LGE Staking: insufficient deposited balance."); - balance[_token][msg.sender] -= _amount; - totalDeposited[_token] -= _amount; + uint256 balanceBefore = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransfer(msg.sender, _amount); - emit Withdraw(_token, _amount, msg.sender); + uint256 sentAmount = balanceBefore - IERC20(_token).balanceOf(address(this)); + balance[_token][msg.sender] -= sentAmount; + totalDeposited[_token] -= sentAmount; + emit Withdraw(_token, sentAmount, msg.sender); } /// MIGRATE /// @@ -155,13 +160,17 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { require(length > 0, "LGE Staking: Must migrate some tokens."); uint256[] memory amounts = new uint256[](length); uint256 amount; + uint256 balanceBefore; + uint256 sentAmount; for (uint256 i; i < length; i++) { amount = balance[_tokens[i]][msg.sender]; require(amount > 0, "LGE Staking: No tokens to migrate."); - balance[_tokens[i]][msg.sender] -= amount; - totalDeposited[_tokens[i]] -= amount; - amounts[i] = amount; + balanceBefore = IERC20(_tokens[i]).balanceOf(address(this)); IERC20(_tokens[i]).safeTransfer(address(lgeMigration), amount); + sentAmount = balanceBefore - IERC20(_tokens[i]).balanceOf(address(this)); + balance[_tokens[i]][msg.sender] -= sentAmount; + totalDeposited[_tokens[i]] -= sentAmount; + amounts[i] = sentAmount; } lgeMigration.migrate(_l2Destination, _tokens, amounts); emit TokensMigrated(msg.sender, _l2Destination, _tokens, amounts); diff --git a/packages/contracts-bedrock/src/L1/USDXBridge.sol b/packages/contracts-bedrock/src/L1/USDXBridge.sol index daebe668b76..1f0fb1b392a 100644 --- a/packages/contracts-bedrock/src/L1/USDXBridge.sol +++ b/packages/contracts-bedrock/src/L1/USDXBridge.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import { OptimismPortal } from "src/L1/OptimismPortal.sol"; import { SystemConfig } from "src/L1/SystemConfig.sol"; import { ISemver } from "src/universal/ISemver.sol"; @@ -41,6 +41,9 @@ contract USDXBridge is Ownable, ReentrancyGuard, ISemver { /// @dev stablecoin => amount mapping(address => uint256) public totalBridged; + /// @notice The gas limit passed to the Optimism portal when depositing USDX. + uint64 public gasLimit; + /// EVENTS /// /// @notice An event emitted when a bridge deposit is made by a user. @@ -56,6 +59,9 @@ contract USDXBridge is Ownable, ReentrancyGuard, ISemver { /// @notice An event emitted when the deposit cap for an ERC20 stablecoin is modified. event DepositCapSet(address indexed _coin, uint256 _newDepositCap); + /// @notice An event emitted when the gas limit is updated. + event GasLimitSet(uint64 _newGasLimit); + /// SETUP /// /// @notice The constructor contract set up. @@ -77,6 +83,7 @@ contract USDXBridge is Ownable, ReentrancyGuard, ISemver { _transferOwnership(_owner); portal = _portal; config = _config; + gasLimit = 21000; /// Add allow-listed stablecoins and deposit caps if (address(config) != address(0)) { uint256 length = _stablecoins.length; @@ -119,8 +126,7 @@ contract USDXBridge is Ownable, ReentrancyGuard, ISemver { _to: _to, _mint: bridgeAmount, _value: bridgeAmount, - _gasLimit: 21000, - /// @dev portal.minimumGasLimit(0) + _gasLimit: gasLimit, _isCreation: false, _data: "" }); @@ -146,6 +152,13 @@ contract USDXBridge is Ownable, ReentrancyGuard, ISemver { emit DepositCapSet(_stablecoin, _newDepositCap); } + /// @notice This function allows the owner to modify the gas limit for USDX deposits. + /// @param _newGasLimit The new gas limit to be set for transactions. + function setGasLimit(uint64 _newGasLimit) external onlyOwner { + gasLimit = _newGasLimit; + emit GasLimitSet(_newGasLimit); + } + /// @notice This function allows the owner to withdraw any ERC20 token held by this contract. /// @param _coin The address of the ERC20 token to withdraw. /// @param _amount The amount of tokens to withdraw. diff --git a/packages/contracts-bedrock/src/L2/OzUSD.sol b/packages/contracts-bedrock/src/L2/OzUSD.sol index 89713e75d1d..32d5bf2425d 100644 --- a/packages/contracts-bedrock/src/L2/OzUSD.sol +++ b/packages/contracts-bedrock/src/L2/OzUSD.sol @@ -61,8 +61,8 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { } /// @notice Initializes the contract with a specific amount of shares. - /// @dev Requires the sender to send USDX equal to the number of shares specified in `_sharesAmount`. /// @param _sharesAmount The number of shares to initialize. + /// @dev Requires the sender to send USDX equal to the number of shares specified in `_sharesAmount`. function initialize(uint256 _sharesAmount) external payable initializer nonReentrant { require(msg.value == _sharesAmount, "OzUSD: Incorrect value."); _mintShares(address(0xdead), _sharesAmount); @@ -75,6 +75,7 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @notice Distributes the yield to the protocol by updating the total pooled USDX balance. function distributeYield() external payable nonReentrant { + require(msg.value > 1 ether, "OzUSD: Must distribute at least one USDX."); emit YieldDistributed(_getTotalPooledUSDX() - msg.value, _getTotalPooledUSDX()); } @@ -106,7 +107,7 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @param _spender The address authorized to spend the tokens. /// @param _amount The number of tokens allowed to be spent. /// @return success Returns `true` if the approval was successful. - /// @dev The `_amount` argument is the amount of tokens, not shares. + /// @dev The `_amount` argument is the amount of tokens, not shares. function approve(address _spender, uint256 _amount) external nonReentrant returns (bool) { _approve(msg.sender, _spender, _amount); return true; @@ -148,7 +149,6 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { } /// @notice Transfers `_sharesAmount` shares from `_sender` to `_recipient` and returns the equivalent ozUSD tokens. - /// @dev Shares are transferred, and equivalent ozUSD tokens are calculated and returned. /// @param _sender The address to transfer shares from. /// @param _recipient The address to transfer shares to. /// @param _sharesAmount The number of shares to transfer. @@ -184,11 +184,10 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @notice Redeems ozUSD tokens by burning shares and redeeming the equivalent amount of `_ozUSDAmount` in USDX. /// @param _from The address that owns the ozUSD to redeem. /// @param _ozUSDAmount The amount of ozUSD to redeem. - /// @dev Spender must approve contract, even if owner of coins - /// Burns shares and transfers back the corresponding USDX. + /// @dev Burns shares and transfers back the corresponding USDX. function redeemOzUSD(address _from, uint256 _ozUSDAmount) external nonReentrant { require(_ozUSDAmount != 0, "OzUSD: Amount zero."); - _spendAllowance(_from, msg.sender, _ozUSDAmount); + if (msg.sender != _from) _spendAllowance(_from, msg.sender, _ozUSDAmount); uint256 sharesToBurn = getSharesByPooledUSDX(_ozUSDAmount); _burnShares(_from, sharesToBurn); @@ -253,7 +252,7 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { return address(this).balance; } - /// @dev Moves `_amount` tokens from `_sender` to `_recipient`. + /// @dev Moves `_amount` tokens from `_sender` to `_recipient`. function _transfer(address _sender, address _recipient, uint256 _amount) internal { uint256 _sharesToTransfer = getSharesByPooledUSDX(_amount); _transferShares(_sender, _recipient, _sharesToTransfer); diff --git a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol index db0b0bb4f0a..d962ea2dab1 100644 --- a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol +++ b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol @@ -33,7 +33,7 @@ contract LGEStakingTest is CommonTest { /// Mock Lido contracts TestStETH public stETH; TestWstETH public wstETH; - + /// @dev mock these too? address public l1LidoTokensBridge; address public usdxBridge; @@ -117,6 +117,7 @@ contract LGEStakingTest is CommonTest { LGEMigrationDeploy migrationDeployScript = new LGEMigrationDeploy(); migrationDeployScript.setUp( + hexTrust, address(l1StandardBridge), address(l1LidoTokensBridge), address(usdxBridge), @@ -158,6 +159,7 @@ contract LGEStakingTest is CommonTest { /// LGE Migration vm.expectRevert("LGE Migration: L1 addresses array length must equal the L2 addresses array length."); lgeMigration = new LGEMigrationV1( + hexTrust, address(l1StandardBridge), address(l1LidoTokensBridge), address(usdxBridge), @@ -182,7 +184,12 @@ contract LGEStakingTest is CommonTest { vm.expectRevert("LGE Staking: Token must be allowlisted."); lgeStaking.depositERC20(address(88), 1); + /// Exceeding allowance + vm.expectRevert(); + lgeStaking.depositERC20(address(wBTC), 1e13); + /// Exceeding deposit caps + wBTC.approve(address(lgeStaking), 1e31); vm.expectRevert("LGE Staking: deposit amount exceeds deposit cap."); lgeStaking.depositERC20(address(wBTC), 1e31); @@ -423,8 +430,41 @@ contract LGEStakingTest is CommonTest { assertEq(lgeStaking.balance(address(wBTC), alice), 0); assertEq(lgeStaking.totalDeposited(address(wBTC)), 0); assertEq(wBTC.balanceOf(address(lgeStaking)), 0); + } + + function testRecoverTokens() public prank(alice) { + /// Setup + uint256 _amount0 = 100e18; + wBTC.mint(alice, _amount0); + wBTC.transfer(address(lgeMigration), _amount0); + assertEq(wBTC.balanceOf(address(lgeMigration)), _amount0); + + /// Non-owner revert + vm.expectRevert("Ownable: caller is not the owner"); + lgeMigration.recoverTokens(address(wBTC), _amount0, alice); + + vm.stopPrank(); + vm.startPrank(hexTrust); + + /// Recover + lgeMigration.recoverTokens(address(wBTC), _amount0, alice); + assertEq(wBTC.balanceOf(address(lgeMigration)), 0); + } + + function testSetGasLimit() public prank(alice) { + /// Non-owner revert + vm.expectRevert("Ownable: caller is not the owner"); + lgeMigration.setGasLimit(address(wstETH), 1e6); + + assertEq(lgeMigration.gasLimits(address(wstETH)), 21000); + + vm.stopPrank(); + vm.startPrank(hexTrust); + + /// Set new gas limit + lgeMigration.setGasLimit(address(wstETH), 1e6); - /// @dev Flesh this out a bit more + assertEq(lgeMigration.gasLimits(address(wstETH)), 1e6); } /// OWNER /// diff --git a/packages/contracts-bedrock/test/L1/USDXBridge.t.sol b/packages/contracts-bedrock/test/L1/USDXBridge.t.sol index 4c756e4bc7d..0eb5d6c2547 100644 --- a/packages/contracts-bedrock/test/L1/USDXBridge.t.sol +++ b/packages/contracts-bedrock/test/L1/USDXBridge.t.sol @@ -26,6 +26,7 @@ contract USDXBridgeTest is CommonTest { event WithdrawCoins(address indexed _coin, uint256 _amount, address indexed _to); event AllowlistSet(address indexed _coin, bool _set); event DepositCapSet(address indexed _coin, uint256 _newDepositCap); + event GasLimitSet(uint64 _newGasLimit); function setUp() public override { /// Set up environment @@ -88,6 +89,7 @@ contract USDXBridgeTest is CommonTest { assertEq(address(usdxBridge.usdx()), address(usdx)); assertEq(address(usdxBridge.portal()), address(optimismPortal)); assertEq(address(usdxBridge.config()), address(systemConfig)); + assertEq(usdxBridge.gasLimit(), 21000); assertEq(usdx.allowance(address(usdxBridge), address(optimismPortal)), 0); assertEq(usdxBridge.allowlisted(address(usdc)), true); assertEq(usdxBridge.allowlisted(address(usdt)), true); @@ -313,6 +315,21 @@ contract USDXBridgeTest is CommonTest { assertEq(usdxBridge.depositCap(address(usdc)), _newCap); } + function testSetGasLimit(uint64 _newGasLimit) public { + /// Non-owner revert + vm.expectRevert("Ownable: caller is not the owner"); + usdxBridge.setGasLimit(_newGasLimit); + assertEq(usdxBridge.gasLimit(), 21000); + + /// Owner allowed + vm.startPrank(hexTrust); + vm.expectEmit(true, true, true, true); + emit GasLimitSet(_newGasLimit); + usdxBridge.setGasLimit(_newGasLimit); + vm.stopPrank(); + assertEq(usdxBridge.gasLimit(), _newGasLimit); + } + function testWithdrawERC20(uint256 _amount) public { /// Send some tokens directly to the contract dai.mint(address(usdxBridge), _amount); diff --git a/packages/contracts-bedrock/test/L2/OzUSD.t.sol b/packages/contracts-bedrock/test/L2/OzUSD.t.sol index 81a5b5d55b5..e02de768f29 100644 --- a/packages/contracts-bedrock/test/L2/OzUSD.t.sol +++ b/packages/contracts-bedrock/test/L2/OzUSD.t.sol @@ -76,8 +76,6 @@ contract OzUSDTest is CommonTest { assertEq(address(ozUSD).balance, 1e18 + _amountA); assertEq(ozUSD.getPooledUSDXByShares(_amountA), _amountA); - ozUSD.approve(alice, ~uint256(0)); - /// Amount zero vm.expectRevert("OzUSD: Amount zero."); ozUSD.redeemOzUSD(alice, 0); @@ -85,10 +83,16 @@ contract OzUSDTest is CommonTest { /// Burn more than allowance vm.expectRevert("OzUSD: Balance exceeded."); ozUSD.redeemOzUSD(alice, 1e30); + + /// Allowance + vm.stopPrank(); + vm.startPrank(bob); + vm.expectRevert("OzUSD: Allowance exceeded."); + ozUSD.redeemOzUSD(alice, 1e30); } function testRebase(uint256 sharesAmount) public prank(alice) { - sharesAmount = bound(sharesAmount, 1, 1e20); + sharesAmount = bound(sharesAmount, 1e18 + 1, 1e20); assertEq(address(ozUSD).balance, 1e18); assertEq(ozUSD.getPooledUSDXByShares(sharesAmount), sharesAmount); @@ -100,8 +104,8 @@ contract OzUSDTest is CommonTest { } function testMintAndRebase(uint256 _amountA, uint256 _amountB) public prank(alice) { - _amountA = bound(_amountA, 1, 1e21); - _amountB = bound(_amountB, 1, 1e21); + _amountA = bound(_amountA, 1e18 + 1, 1e21); + _amountB = bound(_amountB, 1e18 + 1, 1e21); assertEq(address(ozUSD).balance, 1e18); assertEq(ozUSD.getPooledUSDXByShares(_amountA), _amountA); @@ -140,8 +144,8 @@ contract OzUSDTest is CommonTest { } function testMintRebaseAndRedeem(uint256 _amountA, uint256 _amountB) public prank(alice) { - _amountA = bound(_amountA, 1, 1e21); - _amountB = bound(_amountB, 1, 1e21); + _amountA = bound(_amountA, 1e18 + 1, 1e21); + _amountB = bound(_amountB, 1e18 + 1, 1e21); assertEq(address(ozUSD).balance, 1e18); assertEq(ozUSD.getPooledUSDXByShares(_amountA), _amountA); @@ -166,8 +170,6 @@ contract OzUSDTest is CommonTest { ozUSD.redeemOzUSD(alice, predictedAliceAmount); assertEq(address(ozUSD).balance, (1e18 + _amountA + _amountB) - predictedAliceAmount); - /// @dev precision loss here - ///assertEq(ozUSD.getPooledUSDXByShares(_amountA), predictedFinalAmount); } function testMintRebaseAndRedeem() public prank(alice) { @@ -183,18 +185,18 @@ contract OzUSDTest is CommonTest { assertEq(ozUSD.getPooledUSDXByShares(sharesAmount), 1e18); vm.expectEmit(true, true, true, true); - emit YieldDistributed(2e18, 3e18); - ozUSD.distributeYield{value: 1e18}(); + emit YieldDistributed(2e18, 4e18); + ozUSD.distributeYield{value: 2e18}(); - assertEq(address(ozUSD).balance, 3e18); - assertEq(ozUSD.balanceOf(alice), 1.5e18); - assertEq(ozUSD.getPooledUSDXByShares(sharesAmount), 1.5e18); + assertEq(address(ozUSD).balance, 4e18); + assertEq(ozUSD.balanceOf(alice), 2e18); + assertEq(ozUSD.getPooledUSDXByShares(sharesAmount), 2e18); - ozUSD.approve(alice, 1.5e18); - ozUSD.redeemOzUSD(alice, 1.5e18); + ozUSD.approve(alice, 2e18); + ozUSD.redeemOzUSD(alice, 2e18); - assertEq(address(ozUSD).balance, 1.5e18); - assertEq(ozUSD.getPooledUSDXByShares(sharesAmount), 1.5e18); + assertEq(address(ozUSD).balance, 2e18); + assertEq(ozUSD.getPooledUSDXByShares(sharesAmount), 2e18); } /// ERC20 /// From 573de739b5579868dbb53ce7c6235bb596cd1ef0 Mon Sep 17 00:00:00 2001 From: William Date: Tue, 10 Dec 2024 11:04:35 +1100 Subject: [PATCH 10/15] fix: audit --- .../contracts-bedrock/src/L1/LGEStaking.sol | 34 ++++++++----------- .../test/L1/LGEStaking.t.sol | 19 +++++++---- .../test/mocks/TestERC20.sol | 33 ++++++++++++++++++ 3 files changed, 61 insertions(+), 25 deletions(-) diff --git a/packages/contracts-bedrock/src/L1/LGEStaking.sol b/packages/contracts-bedrock/src/L1/LGEStaking.sol index cd74be8835d..221b3d524d9 100644 --- a/packages/contracts-bedrock/src/L1/LGEStaking.sol +++ b/packages/contracts-bedrock/src/L1/LGEStaking.sol @@ -6,7 +6,7 @@ import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import {ISemver} from "src/universal/ISemver.sol"; import {ILGEMigration} from "src/L1/interface/ILGEMigration.sol"; /// @title LGE Staking @@ -102,16 +102,18 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { require(!migrationActivated(), "LGE Staking: May not deposit once migration has been activated."); require(_amount > 0, "LGE Staking: May not deposit nothing."); require(allowlisted[_token], "LGE Staking: Token must be allowlisted."); + require( + totalDeposited[_token] + _amount < depositCap[_token], "LGE Staking: deposit amount exceeds deposit cap." + ); uint256 balanceBefore = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount); - uint256 recievedAmount = IERC20(_token).balanceOf(address(this)) - balanceBefore; require( - totalDeposited[_token] + recievedAmount < depositCap[_token], - "LGE Staking: deposit amount exceeds deposit cap." + IERC20(_token).balanceOf(address(this)) - balanceBefore == _amount, + "LGE Staking: Fee-on-transfer tokens not supported." ); - balance[_token][msg.sender] += recievedAmount; - totalDeposited[_token] += recievedAmount; - emit Deposit(_token, recievedAmount, msg.sender); + balance[_token][msg.sender] += _amount; + totalDeposited[_token] += _amount; + emit Deposit(_token, _amount, msg.sender); } /// @notice Deposits ETH into the staking contract, converting it to wstETH. @@ -139,12 +141,10 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { function withdraw(address _token, uint256 _amount) external nonReentrant whenNotPaused { require(_amount > 0, "LGE Staking: may not withdraw nothing."); require(balance[_token][msg.sender] >= _amount, "LGE Staking: insufficient deposited balance."); - uint256 balanceBefore = IERC20(_token).balanceOf(address(this)); + balance[_token][msg.sender] -= _amount; + totalDeposited[_token] -= _amount; IERC20(_token).safeTransfer(msg.sender, _amount); - uint256 sentAmount = balanceBefore - IERC20(_token).balanceOf(address(this)); - balance[_token][msg.sender] -= sentAmount; - totalDeposited[_token] -= sentAmount; - emit Withdraw(_token, sentAmount, msg.sender); + emit Withdraw(_token, _amount, msg.sender); } /// MIGRATE /// @@ -160,17 +160,13 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { require(length > 0, "LGE Staking: Must migrate some tokens."); uint256[] memory amounts = new uint256[](length); uint256 amount; - uint256 balanceBefore; - uint256 sentAmount; for (uint256 i; i < length; i++) { amount = balance[_tokens[i]][msg.sender]; require(amount > 0, "LGE Staking: No tokens to migrate."); - balanceBefore = IERC20(_tokens[i]).balanceOf(address(this)); + balance[_tokens[i]][msg.sender] -= amount; + totalDeposited[_tokens[i]] -= amount; + amounts[i] = amount; IERC20(_tokens[i]).safeTransfer(address(lgeMigration), amount); - sentAmount = balanceBefore - IERC20(_tokens[i]).balanceOf(address(this)); - balance[_tokens[i]][msg.sender] -= sentAmount; - totalDeposited[_tokens[i]] -= sentAmount; - amounts[i] = sentAmount; } lgeMigration.migrate(_l2Destination, _tokens, amounts); emit TokensMigrated(msg.sender, _l2Destination, _tokens, amounts); diff --git a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol index d962ea2dab1..19d12076437 100644 --- a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol +++ b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol @@ -7,7 +7,7 @@ import { LGEStakingDeploy } from "scripts/ozean/LGEStakingDeploy.s.sol"; import { LGEMigrationDeploy } from "scripts/ozean/LGEMigrationDeploy.s.sol"; import { LGEStaking } from "src/L1/LGEStaking.sol"; import { LGEMigrationV1 } from "src/L1/LGEMigrationV1.sol"; -import { TestERC20Decimals } from "test/mocks/TestERC20.sol"; +import { TestERC20Decimals, TestERC20DecimalsFeeOnTransfer } from "test/mocks/TestERC20.sol"; import { TestStETH, TestWstETH } from "test/mocks/TestLido.sol"; /// @dev forge test --match-contract LGEStakingTest @@ -184,18 +184,25 @@ contract LGEStakingTest is CommonTest { vm.expectRevert("LGE Staking: Token must be allowlisted."); lgeStaking.depositERC20(address(88), 1); - /// Exceeding allowance - vm.expectRevert(); - lgeStaking.depositERC20(address(wBTC), 1e13); - /// Exceeding deposit caps wBTC.approve(address(lgeStaking), 1e31); vm.expectRevert("LGE Staking: deposit amount exceeds deposit cap."); lgeStaking.depositERC20(address(wBTC), 1e31); - /// Migration activated vm.stopPrank(); vm.startPrank(hexTrust); + + /// Fee on transfer + TestERC20DecimalsFeeOnTransfer feeOnTransferToken = new TestERC20DecimalsFeeOnTransfer(18); + lgeStaking.setAllowlist(address(feeOnTransferToken), true); + lgeStaking.setDepositCap(address(feeOnTransferToken), 1e30); + feeOnTransferToken.mint(hexTrust, 1e21); + feeOnTransferToken.approve(address(lgeStaking), 1e20); + + vm.expectRevert("LGE Staking: Fee-on-transfer tokens not supported."); + lgeStaking.depositERC20(address(feeOnTransferToken), 1e20); + + /// Migration activated lgeStaking.setMigrationContract(address(lgeMigration)); assertEq(lgeStaking.migrationActivated(), true); vm.stopPrank(); diff --git a/packages/contracts-bedrock/test/mocks/TestERC20.sol b/packages/contracts-bedrock/test/mocks/TestERC20.sol index d0d32f5678b..57a76b90985 100644 --- a/packages/contracts-bedrock/test/mocks/TestERC20.sol +++ b/packages/contracts-bedrock/test/mocks/TestERC20.sol @@ -18,3 +18,36 @@ contract TestERC20Decimals is ERC20 { _mint(to, value); } } + +contract TestERC20DecimalsFeeOnTransfer is ERC20 { + constructor(uint8 _decimals) ERC20("TEST", "TST", _decimals) {} + + function mint(address to, uint256 value) public { + _mint(to, value); + } + + function transfer(address to, uint256 amount) public override returns (bool) { + balanceOf[msg.sender] -= amount; + unchecked { + balanceOf[to] += (amount - 1); + } + emit Transfer(msg.sender, to, amount - 1); + return true; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public override returns (bool) { + uint256 allowed = allowance[from][msg.sender]; + if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; + balanceOf[from] -= amount; + unchecked { + balanceOf[to] += (amount - 1); + } + emit Transfer(from, to, amount - 1); + return true; + } +} + From b33add240bfb8880293b73aad3155dba5be59a09 Mon Sep 17 00:00:00 2001 From: William Date: Fri, 20 Dec 2024 11:10:07 +1100 Subject: [PATCH 11/15] mixbytes audit 0 --- .../scripts/ozean/LGEMigrationDeploy.s.sol | 17 +++- .../scripts/ozean/LGEStakingDeploy.s.sol | 17 +++- .../scripts/ozean/OzUSDDeploy.s.sol | 24 +++--- .../scripts/ozean/OzUSDPackage.s.sol | 33 -------- .../scripts/ozean/USDXBridgeDeploy.s.sol | 16 +++- .../src/L1/LGEMigrationV1.sol | 5 +- .../contracts-bedrock/src/L1/LGEStaking.sol | 12 +-- .../contracts-bedrock/src/L1/USDXBridge.sol | 33 ++++---- packages/contracts-bedrock/src/L2/OzUSD.sol | 77 ++++++++++--------- packages/contracts-bedrock/src/L2/WozUSD.sol | 10 +-- .../test/L1/LGEStaking.t.sol | 29 ++++--- .../test/L1/USDXBridge.t.sol | 8 +- .../contracts-bedrock/test/L2/OzUSD.t.sol | 58 +++++--------- .../contracts-bedrock/test/L2/WozUSD.t.sol | 23 ++---- 14 files changed, 168 insertions(+), 194 deletions(-) delete mode 100644 packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol diff --git a/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol index 023c80220d5..5281287acca 100644 --- a/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol @@ -5,8 +5,8 @@ import { Script } from "forge-std/Script.sol"; import { LGEMigrationV1 } from "src/L1/LGEMigrationV1.sol"; contract LGEMigrationDeploy is Script { - address public hexTrust = makeAddr("HEX_TRUST"); LGEMigrationV1 public lgeMigration; + address public hexTrust; address public l1StandardBridge; address public l1LidoTokensBridge; address public usdxBridge; @@ -40,6 +40,21 @@ contract LGEMigrationDeploy is Script { } function run() external broadcast { + require(hexTrust != address(0), "Script: Zero address."); + require(l1StandardBridge != address(0), "Script: Zero address."); + require(l1LidoTokensBridge != address(0), "Script: Zero address."); + require(usdxBridge != address(0), "Script: Zero address."); + require(lgeStaking != address(0), "Script: Zero address."); + require(usdc != address(0), "Script: Zero address."); + require(wstETH != address(0), "Script: Zero address."); + + uint256 length = l1Addresses.length; + require(length == l2Addresses.length, "Script: Unequal length."); + for (uint256 i; i < length; i++) { + require(l1Addresses[i] != address(0), "Script: Zero address."); + require(l2Addresses[i] != address(0), "Script: Zero address."); + } + lgeMigration = new LGEMigrationV1( hexTrust, l1StandardBridge, diff --git a/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol index 5ffb18cddec..608d711dc16 100644 --- a/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol @@ -8,7 +8,7 @@ contract LGEStakingDeploy is Script { LGEStaking public lgeStaking; address public stETH; address public wstETH; - address public hexTrust = makeAddr("HEX_TRUST"); + address public hexTrust; address[] public tokens; uint256[] public depositCaps; @@ -19,9 +19,7 @@ contract LGEStakingDeploy is Script { address _wstETH, address[] memory _tokens, uint256[] memory _depositCaps - ) - external - { + ) external { hexTrust = _hexTrust; stETH = _stETH; wstETH = _wstETH; @@ -30,6 +28,17 @@ contract LGEStakingDeploy is Script { } function run() external broadcast { + require(hexTrust != address(0), "Script: Zero address."); + require(stETH != address(0), "Script: Zero address."); + require(wstETH != address(0), "Script: Zero address."); + + uint256 length = tokens.length; + require(length == depositCaps.length, "Script: Unequal length."); + for (uint256 i; i < length; i++) { + require(tokens[i] != address(0), "Script: Zero address."); + require(depositCaps[i] != 0, "Script: Zero address."); + } + lgeStaking = new LGEStaking(hexTrust, stETH, wstETH, tokens, depositCaps); } diff --git a/packages/contracts-bedrock/scripts/ozean/OzUSDDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/OzUSDDeploy.s.sol index dc6b363ea7c..f5ca750a9ab 100644 --- a/packages/contracts-bedrock/scripts/ozean/OzUSDDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/OzUSDDeploy.s.sol @@ -2,23 +2,25 @@ pragma solidity 0.8.15; import { Script } from "forge-std/Script.sol"; -import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import { OzUSD } from "src/L2/OzUSD.sol"; contract OzUSDDeploy is Script { - OzUSD public implementation; - TransparentUpgradeableProxy public proxy; - address public admin = makeAddr("admin"); + OzUSD public ozUSD; + address public hexTrust; uint256 public initialSharesAmount = 1e18; - function run() external broadcast { - /// Deploy implementation - implementation = new OzUSD(); + function setUp(address _hexTrust) external { + hexTrust = _hexTrust; + } + + function run() external payable broadcast { + require(hexTrust != address(0), "Script: Zero address."); + require(initialSharesAmount == 1e18, "Script: Zero amount."); + + ozUSD = new OzUSD{value: initialSharesAmount}(hexTrust, initialSharesAmount); - /// Deploy Proxy - proxy = new TransparentUpgradeableProxy{ value: initialSharesAmount }( - address(implementation), admin, abi.encodeWithSignature("initialize(uint256)", initialSharesAmount) - ); + require(address(ozUSD).balance == 1e18, "Script: Initial supply."); + require(ozUSD.balanceOf(address(0xdead)) == 1e18, "Script: Initial supply."); } modifier broadcast() { diff --git a/packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol b/packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol deleted file mode 100644 index 98641121630..00000000000 --- a/packages/contracts-bedrock/scripts/ozean/OzUSDPackage.s.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.15; - -import { Script } from "forge-std/Script.sol"; -import { console2 as console } from "forge-std/console2.sol"; -import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import { OzUSD } from "src/L2/OzUSD.sol"; -import { WozUSD } from "src/L2/WozUSD.sol"; - -contract OzUSDPackage is Script { - address public admin = 0xa2ef4A5fB028b4543700AC83e87a0B8b4572202e; - uint256 public initialSharesAmount = 1e18; - - function run() external broadcast { - /// Deploy implementation - OzUSD implementation = new OzUSD(); - - /// Deploy Proxy - TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy{ value: initialSharesAmount }( - address(implementation), admin, abi.encodeWithSignature("initialize(uint256)", initialSharesAmount) - ); - - /// Deploy wozUSD - WozUSD wozUSD = new WozUSD(OzUSD(payable(proxy))); - wozUSD; - } - - modifier broadcast() { - vm.startBroadcast(msg.sender); - _; - vm.stopBroadcast(); - } -} diff --git a/packages/contracts-bedrock/scripts/ozean/USDXBridgeDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/USDXBridgeDeploy.s.sol index 5499f887cd2..a2eb546660f 100644 --- a/packages/contracts-bedrock/scripts/ozean/USDXBridgeDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/USDXBridgeDeploy.s.sol @@ -8,7 +8,6 @@ import { USDXBridge } from "src/L1/USDXBridge.sol"; contract USDXBridgeDeploy is Script { USDXBridge public usdxBridge; - address public hexTrust; address public usdc; address public usdt; @@ -24,9 +23,7 @@ contract USDXBridgeDeploy is Script { address _dai, OptimismPortal _optimismPortal, SystemConfig _systemConfig - ) - external - { + ) external { hexTrust = _hexTrust; usdc = _usdc; usdt = _usdt; @@ -44,6 +41,17 @@ contract USDXBridgeDeploy is Script { depositCaps[0] = 1e30; depositCaps[1] = 1e30; depositCaps[2] = 1e30; + + require(hexTrust != address(0), "Script: Zero address."); + require(address(optimismPortal) != address(0), "Script: Zero address."); + require(address(systemConfig) != address(0), "Script: Zero address."); + + uint256 length = stablecoins.length; + require(length == depositCaps.length, "Script: Unequal length."); + for (uint256 i; i < length; i++) { + require(stablecoins[i] != address(0), "Script: Zero address."); + } + usdxBridge = new USDXBridge(hexTrust, optimismPortal, systemConfig, stablecoins, depositCaps); } diff --git a/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol index f2089a7625f..ac75c698e14 100644 --- a/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol +++ b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol @@ -28,7 +28,7 @@ contract LGEMigrationV1 is Ownable, ILGEMigration, ReentrancyGuard { /// @notice The address of Circle's USDC. address public immutable usdc; - /// @notice The address of Wrapped Statked Ether. + /// @notice The address of Wrapped Staked Ether. address public immutable wstETH; /// @notice A mapping from Layer 1 token addresses to their corresponding Layer 2 addresses. @@ -78,9 +78,6 @@ contract LGEMigrationV1 is Ownable, ILGEMigration, ReentrancyGuard { require(msg.sender == lgeStaking, "LGE Migration: Only the staking contract can call this function."); uint256 length = _tokens.length; for (uint256 i; i < length; i++) { - require( - l1ToL2Addresses[_tokens[i]] != address(0), "LGE Migration: L2 contract address not set for migration." - ); if (_tokens[i] == usdc) { /// Handle USDC IERC20(_tokens[i]).safeApprove(address(usdxBridge), _amounts[i]); diff --git a/packages/contracts-bedrock/src/L1/LGEStaking.sol b/packages/contracts-bedrock/src/L1/LGEStaking.sol index 221b3d524d9..7f15e9712fb 100644 --- a/packages/contracts-bedrock/src/L1/LGEStaking.sol +++ b/packages/contracts-bedrock/src/L1/LGEStaking.sol @@ -6,7 +6,6 @@ import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; -import {ISemver} from "src/universal/ISemver.sol"; import {ILGEMigration} from "src/L1/interface/ILGEMigration.sol"; /// @title LGE Staking @@ -16,10 +15,6 @@ import {ILGEMigration} from "src/L1/interface/ILGEMigration.sol"; contract LGEStaking is Ownable, ReentrancyGuard, Pausable { using SafeERC20 for IERC20; - /// @notice Semantic version. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; - /// @notice The contract address for Lido's staked ether. address public immutable stETH; @@ -34,7 +29,7 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { /// @dev token => allowlisted mapping(address => bool) public allowlisted; - /// @notice The total amount of tokens deposted via this contract per allowlisted token address. + /// @notice The total amount of tokens deposited via this contract per allowlisted token address. /// @dev token => amount mapping(address => uint256) public totalDeposited; @@ -85,6 +80,7 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { length == _depositCaps.length, "LGE Staking: Tokens array length must equal the Deposit Caps array length." ); for (uint256 i; i < length; ++i) { + require(!allowlisted[_tokens[i]], "LGE Staking: Duplicate tokens."); allowlisted[_tokens[i]] = true; emit AllowlistSet(_tokens[i], true); depositCap[_tokens[i]] = _depositCaps[i]; @@ -103,7 +99,7 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { require(_amount > 0, "LGE Staking: May not deposit nothing."); require(allowlisted[_token], "LGE Staking: Token must be allowlisted."); require( - totalDeposited[_token] + _amount < depositCap[_token], "LGE Staking: deposit amount exceeds deposit cap." + totalDeposited[_token] + _amount <= depositCap[_token], "LGE Staking: deposit amount exceeds deposit cap." ); uint256 balanceBefore = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount); @@ -125,7 +121,7 @@ contract LGEStaking is Ownable, ReentrancyGuard, Pausable { IstETH(stETH).submit{value: msg.value}(address(0)); uint256 wstETHAmount = IwstETH(wstETH).wrap(IstETH(stETH).balanceOf(address(this))); require( - totalDeposited[wstETH] + wstETHAmount < depositCap[wstETH], + totalDeposited[wstETH] + wstETHAmount <= depositCap[wstETH], "LGE Staking: deposit amount exceeds deposit cap." ); balance[wstETH][msg.sender] += wstETHAmount; diff --git a/packages/contracts-bedrock/src/L1/USDXBridge.sol b/packages/contracts-bedrock/src/L1/USDXBridge.sol index 1f0fb1b392a..27198eae85a 100644 --- a/packages/contracts-bedrock/src/L1/USDXBridge.sol +++ b/packages/contracts-bedrock/src/L1/USDXBridge.sol @@ -5,9 +5,8 @@ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; -import { OptimismPortal } from "src/L1/OptimismPortal.sol"; -import { SystemConfig } from "src/L1/SystemConfig.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import {OptimismPortal} from "src/L1/OptimismPortal.sol"; +import {SystemConfig} from "src/L1/SystemConfig.sol"; /// @title USDX Bridge /// @notice This contract provides bridging functionality for allow-listed stablecoins to the Ozean Layer L2. @@ -15,13 +14,9 @@ import { ISemver } from "src/universal/ISemver.sol"; /// the L2 via the Optimism Portal contract. The owner of this contract can modify the set of /// allow-listed stablecoins accepted, along with the deposit caps, and can also withdraw any deposited /// ERC20 tokens. -contract USDXBridge is Ownable, ReentrancyGuard, ISemver { +contract USDXBridge is Ownable, ReentrancyGuard { using SafeERC20 for IERC20Decimals; - /// @notice Semantic version. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; - /// @notice Contract of the Optimism Portal. /// @custom:network-specific OptimismPortal public immutable portal; @@ -89,9 +84,10 @@ contract USDXBridge is Ownable, ReentrancyGuard, ISemver { uint256 length = _stablecoins.length; require( length == _depositCaps.length, - "USDXBridge: Stablecoins array length must equal the Deposit Caps array length." + "USDX Bridge: Stablecoins array length must equal the Deposit Caps array length." ); for (uint256 i; i < length; ++i) { + require(_stablecoins[i] != address(0), "USDX Bridge: Zero address."); allowlisted[_stablecoins[i]] = true; emit AllowlistSet(_stablecoins[i], true); depositCap[_stablecoins[i]] = _depositCaps[i]; @@ -108,16 +104,21 @@ contract USDXBridge is Ownable, ReentrancyGuard, ISemver { /// @param _to Recieving address on L2. function bridge(address _stablecoin, uint256 _amount, address _to) external nonReentrant { /// Checks - require(allowlisted[_stablecoin], "USDXBridge: Stablecoin not accepted."); - require(_amount > 0, "USDXBridge: May not bridge nothing."); + require(allowlisted[_stablecoin], "USDX Bridge: Stablecoin not accepted."); + require(_amount > 0, "USDX Bridge: May not bridge nothing."); uint256 bridgeAmount = _getBridgeAmount(_stablecoin, _amount); require( - totalBridged[_stablecoin] + bridgeAmount < depositCap[_stablecoin], - "USDXBridge: Bridge amount exceeds deposit cap." + totalBridged[_stablecoin] + bridgeAmount <= depositCap[_stablecoin], + "USDX Bridge: Bridge amount exceeds deposit cap." ); /// Update state - totalBridged[_stablecoin] += bridgeAmount; + uint256 balanceBefore = IERC20Decimals(_stablecoin).balanceOf(address(this)); IERC20Decimals(_stablecoin).safeTransferFrom(msg.sender, address(this), _amount); + require( + IERC20Decimals(_stablecoin).balanceOf(address(this)) - balanceBefore == _amount, + "USDX Bridge: Fee-on-transfer tokens not supported." + ); + totalBridged[_stablecoin] += bridgeAmount; /// Mint USDX usdx().mint(address(this), bridgeAmount); /// Bridge USDX @@ -188,13 +189,13 @@ contract USDXBridge is Ownable, ReentrancyGuard, ISemver { } } -/// @notice An interface whihc extends the IERC20 to include a decimals view function. +/// @notice An interface which extends the IERC20 to include a decimals view function. /// @dev Any allow-listed stablecoin added to the bridge must conform to this interface. interface IERC20Decimals is IERC20 { function decimals() external view returns (uint8); } -/// @notice An interface whihc extends the IERC20Decimals to include a mint function to allow for minting +/// @notice An interface which extends the IERC20Decimals to include a mint function to allow for minting /// of new USDX tokens by this bridge. interface IUSDX is IERC20Decimals { function mint(address to, uint256 amount) external; diff --git a/packages/contracts-bedrock/src/L2/OzUSD.sol b/packages/contracts-bedrock/src/L2/OzUSD.sol index 32d5bf2425d..42af15bb277 100644 --- a/packages/contracts-bedrock/src/L2/OzUSD.sol +++ b/packages/contracts-bedrock/src/L2/OzUSD.sol @@ -3,7 +3,8 @@ pragma solidity 0.8.15; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; -import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; +import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; /// @title Ozean USD (ozUSD) Token Contract /// @notice This contract implements a rebasing token (ozUSD), where token balances are dynamic and calculated @@ -11,13 +12,21 @@ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.s /// total balances; meaning that any USDX sent to this contract automatically rebases all user balances. /// 1 USDX == 1 ozUSD. /// @dev This contract does not fully comply with the ERC20 standard as rebasing events do not emit `Transfer` -/// events. +/// events. /// This contract is inspired by Lido's stETH contract: -/// https://vscode.blockscan.com/ethereum/0x17144556fd3424edc8fc8a4c940b2d04936d17eb -contract OzUSD is IERC20, ReentrancyGuard, Initializable { +/// https://vscode.blockscan.com/ethereum/0x17144556fd3424edc8fc8a4c940b2d04936d17eb +contract OzUSD is IERC20, ReentrancyGuard, Pausable, Ownable { + /// @notice The name of the token, Ozean USD. string public constant name = "Ozean USD"; + + /// @notice The symbol of the token, ozUSD. string public constant symbol = "ozUSD"; + + /// @notice The number of decimals the token uses, 18. uint8 public constant decimals = 18; + + /// @notice Total number of shares in circulation for ozUSD. + /// @dev This is used to calculate the rebased ozUSD balances. uint256 private totalShares; /// @notice A mapping from addresses to shares controlled by each account. @@ -56,14 +65,9 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// SETUP /// - constructor() { - _disableInitializers(); - } - - /// @notice Initializes the contract with a specific amount of shares. - /// @param _sharesAmount The number of shares to initialize. - /// @dev Requires the sender to send USDX equal to the number of shares specified in `_sharesAmount`. - function initialize(uint256 _sharesAmount) external payable initializer nonReentrant { + constructor(address _owner, uint256 _sharesAmount) payable { + _transferOwnership(_owner); + require(msg.value >= 1 ether, "OzUSD: Must deploy with at least one USDX."); require(msg.value == _sharesAmount, "OzUSD: Incorrect value."); _mintShares(address(0xdead), _sharesAmount); _emitTransferAfterMintingShares(address(0xdead), _sharesAmount); @@ -71,14 +75,6 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// EXTERNAL /// - receive() external payable {} - - /// @notice Distributes the yield to the protocol by updating the total pooled USDX balance. - function distributeYield() external payable nonReentrant { - require(msg.value > 1 ether, "OzUSD: Must distribute at least one USDX."); - emit YieldDistributed(_getTotalPooledUSDX() - msg.value, _getTotalPooledUSDX()); - } - /// @notice Transfers an amount of ozUSD tokens from the caller to a recipient. /// @param _recipient The recipient of the token transfer. /// @param _amount The number of ozUSD tokens to transfer. @@ -170,14 +166,12 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @dev Transfers USDX and mints new shares accordingly. /// @param _to The address to receive the minted ozUSD. /// @param _usdxAmount The amount of USDX to lock in exchange for ozUSD. - function mintOzUSD(address _to, uint256 _usdxAmount) external payable nonReentrant { + function mintOzUSD(address _to, uint256 _usdxAmount) external payable nonReentrant whenNotPaused { require(_usdxAmount != 0, "OzUSD: Amount zero."); require(msg.value == _usdxAmount, "OzUSD: Insufficient USDX transfer."); - /// @dev Have to minus `_usdxAmount` from denominator given the transfer of funds has already occured uint256 sharesToMint = (_usdxAmount * totalShares) / (_getTotalPooledUSDX() - _usdxAmount); _mintShares(_to, sharesToMint); - _emitTransferAfterMintingShares(_to, sharesToMint); } @@ -188,14 +182,30 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { function redeemOzUSD(address _from, uint256 _ozUSDAmount) external nonReentrant { require(_ozUSDAmount != 0, "OzUSD: Amount zero."); if (msg.sender != _from) _spendAllowance(_from, msg.sender, _ozUSDAmount); - uint256 sharesToBurn = getSharesByPooledUSDX(_ozUSDAmount); _burnShares(_from, sharesToBurn); + (bool success,) = _from.call{value: _ozUSDAmount}(""); + require(success, "OzUSD: Transfer Failed."); + _emitTransferEvents(_from, address(0), _ozUSDAmount, sharesToBurn); + } - (bool s,) = _from.call{value: _ozUSDAmount}(""); - assert(s); + receive() external payable { + require(msg.value >= 1 ether, "OzUSD: Must distribute at least one USDX."); + emit YieldDistributed(_getTotalPooledUSDX() - msg.value, _getTotalPooledUSDX()); + } + + /// OWNER /// - _emitTransferEvents(msg.sender, address(0), _ozUSDAmount, sharesToBurn); + /// @notice Distributes the yield to the protocol by updating the total pooled USDX balance. + function distributeYield() external payable nonReentrant onlyOwner { + (bool success,) = address(this).call{value: msg.value}(""); + require(success, "OzUSD: Transfer failed."); + } + + /// @notice This function allows the owner to pause or unpause this contract. + /// @param _set The boolean for whether the contract is to be paused or unpaused. True for paused, false otherwise. + function setPaused(bool _set) external onlyOwner { + _set ? _pause() : _unpause(); } /// VIEW /// @@ -262,7 +272,6 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { function _approve(address _owner, address _spender, uint256 _amount) internal { require(_owner != address(0), "OzUSD: Approve from zero address."); require(_spender != address(0), "OzUSD: Approve to zero address."); - allowances[_owner][_spender] = _amount; emit Approval(_owner, _spender, _amount); } @@ -276,13 +285,12 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { } function _transferShares(address _sender, address _recipient, uint256 _sharesAmount) internal { + require(_sharesAmount != 0, "OzUSD: Transfer zero shares."); require(_sender != address(0), "OzUSD: Transfer from zero address."); require(_recipient != address(0), "OzUSD: Transfer to zero address."); require(_recipient != address(this), "OzUSD: Transfer to this contract."); - uint256 currentSenderShares = shares[_sender]; require(_sharesAmount <= currentSenderShares, "OzUSD: Balance exceeded."); - shares[_sender] = currentSenderShares - _sharesAmount; shares[_recipient] = shares[_recipient] + _sharesAmount; } @@ -291,7 +299,6 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @dev This doesn't increase the token total supply. function _mintShares(address _recipient, uint256 _sharesAmount) internal returns (uint256 newTotalShares) { require(_recipient != address(0), "OzUSD: Mint to zero address."); - newTotalShares = totalShares + _sharesAmount; totalShares = newTotalShares; shares[_recipient] += _sharesAmount; @@ -300,19 +307,15 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { /// @notice Destroys `_sharesAmount` shares from `_account`'s holdings, decreasing the total amount of shares. /// @dev This doesn't decrease the token total supply. function _burnShares(address _account, uint256 _sharesAmount) internal returns (uint256 newTotalShares) { + require(_sharesAmount != 0, "OzUSD: Burn zero shares."); require(_account != address(0), "OzUSD: Burn from zero address."); - uint256 accountShares = shares[_account]; require(_sharesAmount <= accountShares, "OzUSD: Balance exceeded."); - uint256 preRebaseTokenAmount = getPooledUSDXByShares(_sharesAmount); - newTotalShares = totalShares - _sharesAmount; totalShares = newTotalShares; shares[_account] = accountShares - _sharesAmount; - uint256 postRebaseTokenAmount = getPooledUSDXByShares(_sharesAmount); - emit SharesBurnt(_account, preRebaseTokenAmount, postRebaseTokenAmount, _sharesAmount); } @@ -321,7 +324,7 @@ contract OzUSD is IERC20, ReentrancyGuard, Initializable { emit TransferShares(_from, _to, _sharesAmount); } - /// @dev Emits {Transfer} and {TransferShares} events where `from` is 0 address. Indicates mint events. + /// @dev Emits {Transfer} and {TransferShares} events where `from` is 0 address. Indicates mint events. function _emitTransferAfterMintingShares(address _to, uint256 _sharesAmount) internal { _emitTransferEvents(address(0), _to, getPooledUSDXByShares(_sharesAmount), _sharesAmount); } diff --git a/packages/contracts-bedrock/src/L2/WozUSD.sol b/packages/contracts-bedrock/src/L2/WozUSD.sol index 3e028ea620d..4e62e77e64d 100644 --- a/packages/contracts-bedrock/src/L2/WozUSD.sol +++ b/packages/contracts-bedrock/src/L2/WozUSD.sol @@ -1,17 +1,17 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; -import { OzUSD } from "./OzUSD.sol"; +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import {OzUSD} from "./OzUSD.sol"; /// @title Wrapped Ozean USD (WozUSD) /// @notice A wrapper contract for OzUSD, providing auto-compounding functionality. /// @dev The contract wraps ozUSD into wozUSD, which represents shares of ozUSD. /// This contract is inspired by Lido's wstETH contract: -/// https://vscode.blockscan.com/ethereum/0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0 +/// https://vscode.blockscan.com/ethereum/0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0 contract WozUSD is ERC20, ReentrancyGuard { - /// @notice The instance of the ozUSD proxy contract. + /// @notice The instance of the ozUSD contract. OzUSD public immutable ozUSD; constructor(OzUSD _ozUSD) ERC20("Wrapped Ozean USD", "wozUSD") { diff --git a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol index 19d12076437..3339724b725 100644 --- a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol +++ b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol @@ -8,6 +8,7 @@ import { LGEMigrationDeploy } from "scripts/ozean/LGEMigrationDeploy.s.sol"; import { LGEStaking } from "src/L1/LGEStaking.sol"; import { LGEMigrationV1 } from "src/L1/LGEMigrationV1.sol"; import { TestERC20Decimals, TestERC20DecimalsFeeOnTransfer } from "test/mocks/TestERC20.sol"; +import { MockUSDX } from "test/mocks/MockUSDX.sol"; import { TestStETH, TestWstETH } from "test/mocks/TestLido.sol"; /// @dev forge test --match-contract LGEStakingTest @@ -54,6 +55,9 @@ contract LGEStakingTest is CommonTest { event Unpaused(address account); function setUp() public override { + /// Deploy Ozean + super.setUp(); + /// Set up environment /// @dev Hex Trust treated as owner of both lgeStaking and lgeMigration hexTrust = makeAddr("HEX_TRUST"); @@ -68,11 +72,13 @@ contract LGEStakingTest is CommonTest { USDM = new TestERC20Decimals{ salt: bytes32("USDM") }(18); sDAI = new TestERC20Decimals{ salt: bytes32("sDAI") }(18); USDC = new TestERC20Decimals{ salt: bytes32("USDC") }(6); + usdx = new MockUSDX(); stETH = new TestStETH(); wstETH = new TestWstETH(address(stETH)); - /// Deploy Ozean - super.setUp(); + /// @dev placeholders + l1LidoTokensBridge = address(1); + usdxBridge = address(1); /// Deploy LGEStaking l1Addresses = new address[](13); @@ -114,6 +120,18 @@ contract LGEStakingTest is CommonTest { /// @dev not the correct L2 address l2Addresses = new address[](13); l2Addresses[0] = address(wBTC); + l2Addresses[1] = address(wBTC); + l2Addresses[2] = address(wBTC); + l2Addresses[3] = address(wBTC); + l2Addresses[4] = address(wBTC); + l2Addresses[5] = address(wBTC); + l2Addresses[6] = address(wBTC); + l2Addresses[7] = address(wBTC); + l2Addresses[8] = address(wBTC); + l2Addresses[9] = address(wBTC); + l2Addresses[10] = address(wBTC); + l2Addresses[11] = address(wBTC); + l2Addresses[12] = address(wBTC); LGEMigrationDeploy migrationDeployScript = new LGEMigrationDeploy(); migrationDeployScript.setUp( @@ -134,7 +152,6 @@ contract LGEStakingTest is CommonTest { /// SETUP /// function testInitialize() public view { - assertEq(lgeStaking.version(), "1.0.0"); assertEq(address(lgeStaking.lgeMigration()), address(0)); assertEq(lgeStaking.migrationActivated(), false); @@ -398,12 +415,6 @@ contract LGEStakingTest is CommonTest { vm.expectRevert("LGE Staking: No tokens to migrate."); lgeStaking.migrate(alice, tokens); - - /// L2 Address not set - tokens[0] = address(USDC); - - vm.expectRevert("LGE Migration: L2 contract address not set for migration."); - lgeStaking.migrate(alice, tokens); } function testMigrateSuccessConditions(uint256 _amount0) public prank(alice) { diff --git a/packages/contracts-bedrock/test/L1/USDXBridge.t.sol b/packages/contracts-bedrock/test/L1/USDXBridge.t.sol index 0eb5d6c2547..74e8fbf9726 100644 --- a/packages/contracts-bedrock/test/L1/USDXBridge.t.sol +++ b/packages/contracts-bedrock/test/L1/USDXBridge.t.sol @@ -74,7 +74,7 @@ contract USDXBridgeTest is CommonTest { uint256[] memory depositCaps = new uint256[](2); depositCaps[0] = 1e30; depositCaps[1] = 1e30; - vm.expectRevert("USDXBridge: Stablecoins array length must equal the Deposit Caps array length."); + vm.expectRevert("USDX Bridge: Stablecoins array length must equal the Deposit Caps array length."); usdxBridge = new USDXBridge(hexTrust, optimismPortal, systemConfig, stablecoins, depositCaps); } @@ -134,16 +134,16 @@ contract USDXBridgeTest is CommonTest { /// Non-accepted stablecoin/ERC20 TestERC20Decimals usde = new TestERC20Decimals(18); - vm.expectRevert("USDXBridge: Stablecoin not accepted."); + vm.expectRevert("USDX Bridge: Stablecoin not accepted."); usdxBridge.bridge(address(usde), _amount, alice); /// Deposit zero - vm.expectRevert("USDXBridge: May not bridge nothing."); + vm.expectRevert("USDX Bridge: May not bridge nothing."); usdxBridge.bridge(address(dai), 0, alice); /// Deposit Cap exceeded uint256 excess = usdxBridge.depositCap(address(dai)) + 1; - vm.expectRevert("USDXBridge: Bridge amount exceeds deposit cap."); + vm.expectRevert("USDX Bridge: Bridge amount exceeds deposit cap."); usdxBridge.bridge(address(dai), excess, alice); } diff --git a/packages/contracts-bedrock/test/L2/OzUSD.t.sol b/packages/contracts-bedrock/test/L2/OzUSD.t.sol index e02de768f29..4887d02106a 100644 --- a/packages/contracts-bedrock/test/L2/OzUSD.t.sol +++ b/packages/contracts-bedrock/test/L2/OzUSD.t.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.15; import { console2 as console } from "forge-std/console2.sol"; import { CommonTest } from "test/setup/CommonTest.sol"; import { OzUSD } from "src/L2/OzUSD.sol"; -import { OzUSDDeploy, TransparentUpgradeableProxy } from "scripts/ozean/OzUSDDeploy.s.sol"; +import { OzUSDDeploy } from "scripts/ozean/OzUSDDeploy.s.sol"; /// @dev forge test --match-contract OzUSDTest -vvv contract OzUSDTest is CommonTest { @@ -26,9 +26,9 @@ contract OzUSDTest is CommonTest { /// Deploy OzUSD OzUSDDeploy deployScript = new OzUSDDeploy(); + deployScript.setUp(admin); deployScript.run(); - implementation = deployScript.implementation(); - ozUSD = OzUSD(payable(deployScript.proxy())); + ozUSD = deployScript.ozUSD(); } /// SETUP /// @@ -41,12 +41,15 @@ contract OzUSDTest is CommonTest { assertEq(ozUSD.decimals(), 18); } - function testInitializeRevertConditions() public { + function testDeployRevertConditions() public { + /// Deploy with less than 1 USDX uint256 initialSharesAmount = 1e18; + vm.expectRevert("OzUSD: Must deploy with at least one USDX."); + new OzUSD{value: initialSharesAmount - 1}(admin, initialSharesAmount - 1); + + /// Wrong value vm.expectRevert("OzUSD: Incorrect value."); - new TransparentUpgradeableProxy{value: initialSharesAmount - 1}( - address(implementation), admin, abi.encodeWithSignature("initialize(uint256)", initialSharesAmount) - ); + new OzUSD{value: initialSharesAmount}(admin, initialSharesAmount - 1); } /// REBASE /// @@ -98,7 +101,8 @@ contract OzUSDTest is CommonTest { vm.expectEmit(true, true, true, true); emit YieldDistributed(1e18, 1e18 + sharesAmount); - ozUSD.distributeYield{value: sharesAmount}(); + (bool s, ) = address(ozUSD).call{value: sharesAmount}(""); + require(s); assertEq(ozUSD.getPooledUSDXByShares(sharesAmount), (sharesAmount * address(ozUSD).balance) / 1e18); } @@ -117,7 +121,8 @@ contract OzUSDTest is CommonTest { vm.expectEmit(true, true, true, true); emit YieldDistributed(1e18 + _amountA, 1e18 + _amountA + _amountB); - ozUSD.distributeYield{value: _amountB}(); + (bool s, ) = address(ozUSD).call{value: _amountB}(""); + require(s); assertEq(address(ozUSD).balance, 1e18 + _amountA + _amountB); assertEq(ozUSD.balanceOf(alice), ozUSD.getPooledUSDXByShares(_amountA)); @@ -158,7 +163,8 @@ contract OzUSDTest is CommonTest { vm.expectEmit(true, true, true, true); emit YieldDistributed(1e18 + _amountA, 1e18 + _amountA + _amountB); - ozUSD.distributeYield{value: _amountB}(); + (bool s, ) = address(ozUSD).call{value: _amountB}(""); + require(s); uint256 predictedAliceAmount = (_amountA * (1e18 + _amountA + _amountB)) / (1e18 + _amountA); @@ -186,7 +192,8 @@ contract OzUSDTest is CommonTest { vm.expectEmit(true, true, true, true); emit YieldDistributed(2e18, 4e18); - ozUSD.distributeYield{value: 2e18}(); + (bool s, ) = address(ozUSD).call{value: 2e18}(""); + require(s); assertEq(address(ozUSD).balance, 4e18); assertEq(ozUSD.balanceOf(alice), 2e18); @@ -342,33 +349,4 @@ contract OzUSDTest is CommonTest { vm.expectRevert("OzUSD: Allowance exceeded."); ozUSD.transferFrom(alice, bob, 1e18); } - - /// PROXY /// - - /// @dev Can only be called by admin, otherwise delegatecalls to impl - function testAdmin() public prank(admin) { - assertEq(TransparentUpgradeableProxy(payable(ozUSD)).admin(), admin); - } - - function testProxyInitialize() public { - vm.expectRevert("Initializable: contract is already initialized"); - implementation.initialize{ value: 1e18 }(1e18); - - assertEq(address(implementation).balance, 0); - - vm.expectRevert("Initializable: contract is already initialized"); - ozUSD.initialize{ value: 1e18 }(1e18); - - assertEq(address(ozUSD).balance, 1e18); - } - - function testUpgradeImplementation() public prank(admin) { - OzUSD newImplementation = new OzUSD(); - - assertEq(TransparentUpgradeableProxy(payable(ozUSD)).implementation(), address(implementation)); - - TransparentUpgradeableProxy(payable(ozUSD)).upgradeToAndCall(address(newImplementation), ""); - - assertEq(TransparentUpgradeableProxy(payable(ozUSD)).implementation(), address(newImplementation)); - } } diff --git a/packages/contracts-bedrock/test/L2/WozUSD.t.sol b/packages/contracts-bedrock/test/L2/WozUSD.t.sol index a0f74d4f295..61dbd33a432 100644 --- a/packages/contracts-bedrock/test/L2/WozUSD.t.sol +++ b/packages/contracts-bedrock/test/L2/WozUSD.t.sol @@ -10,19 +10,23 @@ import { WozUSDDeploy } from "scripts/ozean/WozUSDDeploy.s.sol"; /// @dev forge test --match-contract WozUSDTest -vvv contract WozUSDTest is CommonTest { + address public admin; OzUSD public ozUSD; WozUSD public wozUSD; function setUp() public override { alice = makeAddr("alice"); bob = makeAddr("bob"); + admin = makeAddr("admin"); vm.deal(alice, 10000 ether); vm.deal(bob, 10000 ether); + vm.deal(admin, 10000 ether); /// Deploy OzUSD OzUSDDeploy ozDeployScript = new OzUSDDeploy(); + ozDeployScript.setUp(admin); ozDeployScript.run(); - ozUSD = OzUSD(payable(ozDeployScript.proxy())); + ozUSD = OzUSD(payable(ozDeployScript.ozUSD())); /// Deploy WozUSD WozUSDDeploy wozDeployScript = new WozUSDDeploy(); @@ -128,23 +132,6 @@ contract WozUSDTest is CommonTest { assertEq(ozUSD.balanceOf(alice), 1.5e18); } - function testWrapAndRebaseSmallAmount() public prank(alice) { - uint256 sharesAmount = 0.001e18; - ozUSD.mintOzUSD{ value: sharesAmount }(alice, sharesAmount); - - /// Wrap - ozUSD.approve(address(wozUSD), ~uint256(0)); - wozUSD.wrap(sharesAmount); - - /// Mock rebase - (bool s,) = address(ozUSD).call{ value: sharesAmount }(""); - assert(s); - - /// Unwrap - wozUSD.unwrap(sharesAmount); - assertGt(ozUSD.balanceOf(alice), sharesAmount); - } - function testMultipleWrapUnwrap() public prank(alice) { uint256 sharesAmount = 1e18; From c9067bf382ca7c3b8d6c7d6249af4c5038a9962f Mon Sep 17 00:00:00 2001 From: William Date: Thu, 2 Jan 2025 12:14:46 +1100 Subject: [PATCH 12/15] fix: audit fixes --- .../scripts/ozean/LGEMigrationDeploy.s.sol | 8 ++++++-- .../contracts-bedrock/src/L1/LGEMigrationV1.sol | 14 +++++++++++++- .../contracts-bedrock/test/L1/LGEStaking.t.sol | 12 ++++++++++-- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol index 5281287acca..c0d62842f56 100644 --- a/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol @@ -15,6 +15,7 @@ contract LGEMigrationDeploy is Script { address public wstETH; address[] public l1Addresses; address[] public l2Addresses; + address[] public restrictedL2Addresses; /// @dev Used in testing environment, unnecessary for mainnet deployment function setUp( @@ -26,7 +27,8 @@ contract LGEMigrationDeploy is Script { address _usdc, address _wstETH, address[] memory _l1Addresses, - address[] memory _l2Addresses + address[] memory _l2Addresses, + address[] memory _restrictedL2Addresses ) external { hexTrust = _hexTrust; l1StandardBridge = _l1StandardBridge; @@ -37,6 +39,7 @@ contract LGEMigrationDeploy is Script { wstETH = _wstETH; l1Addresses = _l1Addresses; l2Addresses = _l2Addresses; + restrictedL2Addresses = _restrictedL2Addresses; } function run() external broadcast { @@ -64,7 +67,8 @@ contract LGEMigrationDeploy is Script { usdc, wstETH, l1Addresses, - l2Addresses + l2Addresses, + restrictedL2Addresses ); } diff --git a/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol index ac75c698e14..d7b8dc9cd26 100644 --- a/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol +++ b/packages/contracts-bedrock/src/L1/LGEMigrationV1.sol @@ -34,6 +34,9 @@ contract LGEMigrationV1 is Ownable, ILGEMigration, ReentrancyGuard { /// @notice A mapping from Layer 1 token addresses to their corresponding Layer 2 addresses. mapping(address => address) public l1ToL2Addresses; + /// @notice A mapping that identifies invalid L2 migration address recipients. + mapping(address => bool) public restrictedL2Addresses; + /// @notice A mapping from Layer 1 token address to the gas limits passed to the bridge contracts. mapping(address => uint32) public gasLimits; @@ -46,7 +49,8 @@ contract LGEMigrationV1 is Ownable, ILGEMigration, ReentrancyGuard { address _usdc, address _wstETH, address[] memory _l1Addresses, - address[] memory _l2Addresses + address[] memory _l2Addresses, + address[] memory _restrictedL2Addresses ) { _transferOwnership(_owner); l1StandardBridge = IL1StandardBridge(_l1StandardBridge); @@ -64,6 +68,10 @@ contract LGEMigrationV1 is Ownable, ILGEMigration, ReentrancyGuard { l1ToL2Addresses[_l1Addresses[i]] = _l2Addresses[i]; gasLimits[_l1Addresses[i]] = 21000; } + length = _restrictedL2Addresses.length; + for (uint256 j; j < length; ++j) { + restrictedL2Addresses[_restrictedL2Addresses[j]] = true; + } } /// @notice This function is called by the LGE Staking contract to facilitate migration of staked tokens from @@ -76,8 +84,12 @@ contract LGEMigrationV1 is Ownable, ILGEMigration, ReentrancyGuard { nonReentrant { require(msg.sender == lgeStaking, "LGE Migration: Only the staking contract can call this function."); + require(!restrictedL2Addresses[_l2Destination], "LGE Migration: L2 address recipient restricted."); uint256 length = _tokens.length; for (uint256 i; i < length; i++) { + require( + l1ToL2Addresses[_tokens[i]] != address(0), "LGE Migration: L2 address not set for migration." + ); if (_tokens[i] == usdc) { /// Handle USDC IERC20(_tokens[i]).safeApprove(address(usdxBridge), _amounts[i]); diff --git a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol index 3339724b725..73b0f30a8f7 100644 --- a/packages/contracts-bedrock/test/L1/LGEStaking.t.sol +++ b/packages/contracts-bedrock/test/L1/LGEStaking.t.sol @@ -41,6 +41,7 @@ contract LGEStakingTest is CommonTest { address[] public l1Addresses; address[] public l2Addresses; + address[] public restrictedL2Addresses; uint256[] public depositCaps; /// LGEStaking events @@ -133,6 +134,11 @@ contract LGEStakingTest is CommonTest { l2Addresses[11] = address(wBTC); l2Addresses[12] = address(wBTC); + /// @dev abitrary restricted L2 destinations + restrictedL2Addresses = new address[](2); + restrictedL2Addresses[0] = address(1000); + restrictedL2Addresses[1] = address(1001); + LGEMigrationDeploy migrationDeployScript = new LGEMigrationDeploy(); migrationDeployScript.setUp( hexTrust, @@ -143,7 +149,8 @@ contract LGEStakingTest is CommonTest { address(USDC), address(wstETH), l1Addresses, - l2Addresses + l2Addresses, + restrictedL2Addresses ); migrationDeployScript.run(); lgeMigration = migrationDeployScript.lgeMigration(); @@ -184,7 +191,8 @@ contract LGEStakingTest is CommonTest { address(USDC), address(wstETH), l1Addresses, - l2Addresses + l2Addresses, + restrictedL2Addresses ); } From 96d1a0d7de64bd1ce33f753a457800fb6b765185 Mon Sep 17 00:00:00 2001 From: William Date: Mon, 13 Jan 2025 14:07:05 +1100 Subject: [PATCH 13/15] added constructor bytes to deploy scripts --- .../scripts/ozean/LGEMigrationDeploy.s.sol | 14 ++++++++++++++ .../scripts/ozean/LGEStakingDeploy.s.sol | 4 ++++ .../scripts/ozean/USDXBridgeDeploy.s.sol | 4 ++++ 3 files changed, 22 insertions(+) diff --git a/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol index c0d62842f56..4c394629683 100644 --- a/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/LGEMigrationDeploy.s.sol @@ -3,6 +3,7 @@ pragma solidity 0.8.15; import { Script } from "forge-std/Script.sol"; import { LGEMigrationV1 } from "src/L1/LGEMigrationV1.sol"; +import "forge-std/console.sol"; contract LGEMigrationDeploy is Script { LGEMigrationV1 public lgeMigration; @@ -58,6 +59,19 @@ contract LGEMigrationDeploy is Script { require(l2Addresses[i] != address(0), "Script: Zero address."); } + bytes memory deployData = abi.encode(hexTrust, + l1StandardBridge, + l1LidoTokensBridge, + usdxBridge, + lgeStaking, + usdc, + wstETH, + l1Addresses, + l2Addresses, + restrictedL2Addresses + ); + console.logBytes(deployData); + lgeMigration = new LGEMigrationV1( hexTrust, l1StandardBridge, diff --git a/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol index 608d711dc16..4959132517c 100644 --- a/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/LGEStakingDeploy.s.sol @@ -3,6 +3,7 @@ pragma solidity 0.8.15; import { Script } from "forge-std/Script.sol"; import { LGEStaking } from "src/L1/LGEStaking.sol"; +import "forge-std/console.sol"; contract LGEStakingDeploy is Script { LGEStaking public lgeStaking; @@ -39,6 +40,9 @@ contract LGEStakingDeploy is Script { require(depositCaps[i] != 0, "Script: Zero address."); } + bytes memory deployData = abi.encode(hexTrust, stETH, wstETH, tokens, depositCaps); + console.logBytes(deployData); + lgeStaking = new LGEStaking(hexTrust, stETH, wstETH, tokens, depositCaps); } diff --git a/packages/contracts-bedrock/scripts/ozean/USDXBridgeDeploy.s.sol b/packages/contracts-bedrock/scripts/ozean/USDXBridgeDeploy.s.sol index a2eb546660f..b3014b980aa 100644 --- a/packages/contracts-bedrock/scripts/ozean/USDXBridgeDeploy.s.sol +++ b/packages/contracts-bedrock/scripts/ozean/USDXBridgeDeploy.s.sol @@ -5,6 +5,7 @@ import { Script } from "forge-std/Script.sol"; import { OptimismPortal } from "src/L1/OptimismPortal.sol"; import { SystemConfig } from "src/L1/SystemConfig.sol"; import { USDXBridge } from "src/L1/USDXBridge.sol"; +import "forge-std/console.sol"; contract USDXBridgeDeploy is Script { USDXBridge public usdxBridge; @@ -52,6 +53,9 @@ contract USDXBridgeDeploy is Script { require(stablecoins[i] != address(0), "Script: Zero address."); } + bytes memory deployData = abi.encode(hexTrust, optimismPortal, systemConfig, stablecoins, depositCaps); + console.logBytes(deployData); + usdxBridge = new USDXBridge(hexTrust, optimismPortal, systemConfig, stablecoins, depositCaps); } From 2efc6632709c18529072fe800593b9b265b1914b Mon Sep 17 00:00:00 2001 From: William Date: Mon, 27 Jan 2025 11:00:19 +1100 Subject: [PATCH 14/15] build: deployment docs --- .../deployments/deployments.md | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 packages/contracts-bedrock/deployments/deployments.md diff --git a/packages/contracts-bedrock/deployments/deployments.md b/packages/contracts-bedrock/deployments/deployments.md new file mode 100644 index 00000000000..039c2efa624 --- /dev/null +++ b/packages/contracts-bedrock/deployments/deployments.md @@ -0,0 +1,54 @@ +# Ozean Smart Contract Deployments + +## Layer One + +### Mainnet + +TBD + +### Sepolia + +#### Contracts: + +| **Contract** | **Address** | +|:---:|:---:| +| **USDX** | [0x43bd82D1e29a1bEC03AfD11D5a3252779b8c760c](https://sepolia.etherscan.io/token/0x43bd82d1e29a1bec03afd11d5a3252779b8c760c#code)| +| **USDX Bridge** | [0x084C27a0bE5dF26ed47F00678027A6E76B14a0B4](https://sepolia.etherscan.io/address/0x084c27a0be5df26ed47f00678027a6e76b14a0b4#code)| +| **LGE Staking** | [0xc7c0f3b165dec204f6784c9f8b2b148d694d7a32](https://sepolia.etherscan.io/address/0xc7c0f3b165dec204f6784c9f8b2b148d694d7a32#code)| + +#### USDX Bridge Assets/Cap: +| **Asset** | **Address** |**Deposit Cap** | +|:---:|:---:|:---:| +| **USDT** | [0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0](https://sepolia.etherscan.io/address/0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0)| 1_000_000_000_000 | +| **DAI** | [0xFF34B3d4Aee8ddCd6F9AFFFB6Fe49bD371b8a357](https://sepolia.etherscan.io/address/0xFF34B3d4Aee8ddCd6F9AFFFB6Fe49bD371b8a357)| 1_000_000_000_000 | +| **USDC** | [0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8](https://sepolia.etherscan.io/address/0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8)| 1_000_000_000_000 | +| **USDC** | [0x15795aadca3759d7b356DecE036c285b1FBb32aa](https://sepolia.etherscan.io/address/0x15795aadca3759d7b356DecE036c285b1FBb32aa)| 1_000_000_000_000 | + +#### LGE Staking Assets/Cap: + +| **Asset** | **Address** |**Deposit Cap** | +|:---:|:---:|:---:| +| **wstETH** | [0xB82381A3fBD3FaFA77B3a7bE693342618240067b](https://sepolia.etherscan.io/address/0xB82381A3fBD3FaFA77B3a7bE693342618240067b)| 1_000_000 | +| **WBTC** | [0x29f2D40B0605204364af54EC677bD022dA425d03](https://sepolia.etherscan.io/address/0x29f2D40B0605204364af54EC677bD022dA425d03)| 1_000_000 | +| **USDT** | [0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0](https://sepolia.etherscan.io/address/0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0)| 1_000_000 | +| **DAI** | [0xFF34B3d4Aee8ddCd6F9AFFFB6Fe49bD371b8a357](https://sepolia.etherscan.io/address/0xFF34B3d4Aee8ddCd6F9AFFFB6Fe49bD371b8a357)| 1_000_000 | +| **USDC** | [0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8](https://sepolia.etherscan.io/address/0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8)| 1_000_000 | +| **AAVE** | [0x88541670E55cC00bEEFD87eB59EDd1b7C511AC9a](https://sepolia.etherscan.io/address/0x88541670E55cC00bEEFD87eB59EDd1b7C511AC9a)| 1_000_000 | + +[**Aave Faucet**](https://app.aave.com/faucet/) + +## Layer Two + +### Ozean Mainnet + +TBD + +### Ozean Poseidon + +#### Contracts: + +| **Contract** | **Address** | +|:---:|:---:| +| **ozUSD Impl (DEPRECATED)** | [0x9e76FE3E3859A4BF1C30d2DAD7b3C35d8654Eb50](https://ozean-testnet.explorer.caldera.xyz/address/0x9e76FE3E3859A4BF1C30d2DAD7b3C35d8654Eb50)| +| **ozUSD Proxy (DEPRECATED)** | [0x1Ce4888a6dED8d6aE5F5D9ca1CABc758c680950b](https://ozean-testnet.explorer.caldera.xyz/address/0x1Ce4888a6dED8d6aE5F5D9ca1CABc758c680950b)| +| **wozUSD** | [0x2f6807b76c426527C3a5C442E8697f12C554195b](https://ozean-testnet.explorer.caldera.xyz/address/0x2f6807b76c426527C3a5C442E8697f12C554195b)| From 9b0e6267fcdc1b5edc7c5683f21a251265884d1f Mon Sep 17 00:00:00 2001 From: William Date: Thu, 30 Jan 2025 09:05:03 +1100 Subject: [PATCH 15/15] build: add decurity audit --- ...zean L2 Contracts Audit Report 2024 1.0.pdf | Bin 0 -> 402966 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/contracts-bedrock/audit/decurity/Ozean L2 Contracts Audit Report 2024 1.0.pdf diff --git a/packages/contracts-bedrock/audit/decurity/Ozean L2 Contracts Audit Report 2024 1.0.pdf b/packages/contracts-bedrock/audit/decurity/Ozean L2 Contracts Audit Report 2024 1.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..599dc6374eda8bea796e8471c813389e9e55a418 GIT binary patch literal 402966 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
@S00HkAE2--vF8D=!}cH!xIPCEWibyB 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�Np7p@<%bIP)6B;|N#rF%EUB>qdnI)G%<$M(^ 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 z

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≤oFN<3B)B$nHu_MEiw?a0d{ALK7|cY0^}voG}So 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

-tA7IFY&b;5RDi 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 UZ~5av-M=(P=jqWB%^#ZoFXb`Y1^@s6 literal 0 HcmV?d00001