diff --git a/contracts/BridgingManager.sol b/contracts/BridgingManager.sol index 224c331f..bb844aff 100644 --- a/contracts/BridgingManager.sol +++ b/contracts/BridgingManager.sol @@ -38,6 +38,9 @@ contract BridgingManager is AccessControl { /// @dev This method might be called only once /// @param admin_ Address of the account to grant the DEFAULT_ADMIN_ROLE function _initializeBridgingManager(address admin_) internal { + if (admin_ == address(0)) { + revert ErrorZeroAddressAdmin(); + } State storage s = _loadState(); if (s.isInitialized) { revert ErrorAlreadyInitialized(); @@ -135,6 +138,7 @@ contract BridgingManager is AccessControl { event WithdrawalsDisabled(address indexed disabler); event Initialized(address indexed admin); + error ErrorZeroAddressAdmin(); error ErrorDepositsEnabled(); error ErrorDepositsDisabled(); error ErrorWithdrawalsEnabled(); diff --git a/contracts/token/ERC20RebasableBridged.sol b/contracts/token/ERC20RebasableBridged.sol index 69f9ee2f..f2adfe12 100644 --- a/contracts/token/ERC20RebasableBridged.sol +++ b/contracts/token/ERC20RebasableBridged.sol @@ -362,7 +362,7 @@ contract ERC20RebasableBridged is IERC20, IERC20Wrapper, IBridgeWrapper, ERC20Me _setERC20MetadataSymbol(symbol_); } - function _wrap(address from_, address to_, uint256 sharesAmount_) internal returns (uint256) { + function _wrap(address from_, address to_, uint256 sharesAmount_) internal returns (uint256) { if (sharesAmount_ == 0) revert ErrorZeroSharesWrap(); TOKEN_TO_WRAP_FROM.safeTransferFrom(from_, address(this), sharesAmount_); _mintShares(to_, sharesAmount_); diff --git a/test/optimism/L1LidoTokensBridge.unit.test.ts b/test/optimism/L1LidoTokensBridge.unit.test.ts index 2b5aac66..4ddf4304 100644 --- a/test/optimism/L1LidoTokensBridge.unit.test.ts +++ b/test/optimism/L1LidoTokensBridge.unit.test.ts @@ -171,6 +171,37 @@ unit("Optimism :: L1LidoTokensBridge", ctxFactory) ); }) + .test("initialize() :: revert when admin is zero", async (ctx) => { + const { deployer, l2TokenBridgeEOA, zero } = ctx.accounts; + const { + totalPooledEther, + totalShares, + genesisTime, + secondsPerSlot, + lastProcessingRefSlot + } = ctx.constants; + + const { l1TokenBridgeImpl } = await getL1LidoTokensBridgeImpl( + totalPooledEther, + totalShares, + genesisTime, + secondsPerSlot, + lastProcessingRefSlot, + deployer, + l2TokenBridgeEOA.address + ); + + await assert.revertsWith(new OssifiableProxy__factory( + deployer + ).deploy( + l1TokenBridgeImpl.address, + deployer.address, + l1TokenBridgeImpl.interface.encodeFunctionData("initialize", [ + zero.address + ]) + ), "ErrorZeroAddressAdmin()"); + }) + .test("initialize() :: don't allow to initialize twice", async (ctx) => { const { deployer, l2TokenBridgeEOA } = ctx.accounts; const { diff --git a/test/optimism/L2ERC20ExtendedTokensBridge.unit.test.ts b/test/optimism/L2ERC20ExtendedTokensBridge.unit.test.ts index a00f1130..c857a22e 100644 --- a/test/optimism/L2ERC20ExtendedTokensBridge.unit.test.ts +++ b/test/optimism/L2ERC20ExtendedTokensBridge.unit.test.ts @@ -161,6 +161,21 @@ unit("Optimism:: L2ERC20ExtendedTokensBridge", ctxFactory) ); }) + .test("initialize() :: revert when admin is zero", async (ctx) => { + const { deployer, l1TokenBridgeEOA, zero } = ctx.accounts; + const l2TokenBridgeImpl = await getL2TokenBridgeImpl(deployer, l1TokenBridgeEOA.address); + + await assert.revertsWith(new OssifiableProxy__factory( + deployer + ).deploy( + l2TokenBridgeImpl.address, + deployer.address, + l2TokenBridgeImpl.interface.encodeFunctionData("initialize", [ + zero.address + ]) + ), "ErrorZeroAddressAdmin()"); + }) + .test("finalizeUpgrade_v2() :: bridging manager uninitialized", async (ctx) => { const { deployer, l1TokenBridgeEOA } = ctx.accounts;