Commit d317e96c authored by smartcontracts's avatar smartcontracts Committed by GitHub

feat(ct): add semgrep rule to use encodeCall (#12626)

* feat(ct): add semgrep rule to use encodeCall

encodeCall is almost always better than encodeWithSelector because
it maintains type safety. Prefer encodeCall unless
encodeWithSelector is actually necessary.

* maint(ct): update contracts to use encodeCall

Updates a number of contracts to use encodeCall instead of
encodeWithSelector where possible.
parent dda07ca0
...@@ -570,9 +570,7 @@ contract DeployImplementations is Script { ...@@ -570,9 +570,7 @@ contract DeployImplementations is Script {
OPContractsManager.InitializerInputs(_blueprints, _setters, _release, true); OPContractsManager.InitializerInputs(_blueprints, _setters, _release, true);
vm.startBroadcast(msg.sender); vm.startBroadcast(msg.sender);
proxy.upgradeToAndCall( proxy.upgradeToAndCall(address(opcmImpl), abi.encodeCall(opcmImpl.initialize, (initializerInputs)));
address(opcmImpl), abi.encodeWithSelector(opcmImpl.initialize.selector, initializerInputs)
);
proxy.changeAdmin(address(opcmProxyOwner)); // transfer ownership of Proxy contract to the ProxyAdmin contract proxy.changeAdmin(address(opcmProxyOwner)); // transfer ownership of Proxy contract to the ProxyAdmin contract
vm.stopBroadcast(); vm.stopBroadcast();
...@@ -1146,9 +1144,7 @@ contract DeployImplementationsInterop is DeployImplementations { ...@@ -1146,9 +1144,7 @@ contract DeployImplementationsInterop is DeployImplementations {
OPContractsManager.InitializerInputs(_blueprints, _setters, _release, true); OPContractsManager.InitializerInputs(_blueprints, _setters, _release, true);
vm.startBroadcast(msg.sender); vm.startBroadcast(msg.sender);
proxy.upgradeToAndCall( proxy.upgradeToAndCall(address(opcmImpl), abi.encodeCall(opcmImpl.initialize, (initializerInputs)));
address(opcmImpl), abi.encodeWithSelector(opcmImpl.initialize.selector, initializerInputs)
);
proxy.changeAdmin(opcmProxyOwner); // transfer ownership of Proxy contract to the ProxyAdmin contract proxy.changeAdmin(opcmProxyOwner); // transfer ownership of Proxy contract to the ProxyAdmin contract
vm.stopBroadcast(); vm.stopBroadcast();
......
...@@ -12,8 +12,8 @@ ...@@ -12,8 +12,8 @@
"sourceCodeHash": "0x848ec3774be17bcc8ba65a23d08e35e979b3f39f9d2ac8a810188f945c69c9ea" "sourceCodeHash": "0x848ec3774be17bcc8ba65a23d08e35e979b3f39f9d2ac8a810188f945c69c9ea"
}, },
"src/L1/L1ERC721Bridge.sol": { "src/L1/L1ERC721Bridge.sol": {
"initCodeHash": "0x63dc4da75200f4b968f57e27e81834e6eb3f6625826410882526ab1eec7847ff", "initCodeHash": "0xb3bf093ea83a24574a6093bebf5b2aea707355ed8d6702b2b5eb292e75b6ae42",
"sourceCodeHash": "0xfec29cfbb7aa05473e32a6c2484deebfc1ff50c0e08c42e8ee70696ad701ceaa" "sourceCodeHash": "0x289de9f40898b6305deecc6b60cdf566aa6c6a1444f713c3a0af23ea7878207e"
}, },
"src/L1/L1StandardBridge.sol": { "src/L1/L1StandardBridge.sol": {
"initCodeHash": "0x2868b09ecbe9f2bbc885605c2886b4c79f1c8e4171626c63776603b1b84698a8", "initCodeHash": "0x2868b09ecbe9f2bbc885605c2886b4c79f1c8e4171626c63776603b1b84698a8",
...@@ -88,8 +88,8 @@ ...@@ -88,8 +88,8 @@
"sourceCodeHash": "0x56edf0f36366326a92722ae3c7502bce3d80b2ee5e354181dc09ba801437a488" "sourceCodeHash": "0x56edf0f36366326a92722ae3c7502bce3d80b2ee5e354181dc09ba801437a488"
}, },
"src/L2/L2ERC721Bridge.sol": { "src/L2/L2ERC721Bridge.sol": {
"initCodeHash": "0x558fff5939a26b9d5d86e6b907d9dd9c7c917eaef7657a8b5acfeb58de1442f0", "initCodeHash": "0xb8236514beabcc1830e5e7e9eccb965e30d01f8bbb5a2d8b4f3d241c2d12819b",
"sourceCodeHash": "0xca9acd19fd5f42e6a7a5b1de6359f2d841814fb54d377664c2fe9c3f9c6be34a" "sourceCodeHash": "0x268e34289b7b8a5d1785af1907bd07d1c8ce4a9e3ea1685bdd9a77904dab3557"
}, },
"src/L2/L2StandardBridge.sol": { "src/L2/L2StandardBridge.sol": {
"initCodeHash": "0x651eed10044d0b19b7e4eba864345df15e252be1401f39a552ec0d2f9c4df064", "initCodeHash": "0x651eed10044d0b19b7e4eba864345df15e252be1401f39a552ec0d2f9c4df064",
......
...@@ -28,8 +28,8 @@ contract L1ERC721Bridge is ERC721Bridge, ISemver { ...@@ -28,8 +28,8 @@ contract L1ERC721Bridge is ERC721Bridge, ISemver {
ISuperchainConfig public superchainConfig; ISuperchainConfig public superchainConfig;
/// @notice Semantic version. /// @notice Semantic version.
/// @custom:semver 2.1.1-beta.4 /// @custom:semver 2.2.0-beta.1
string public constant version = "2.1.1-beta.4"; string public constant version = "2.2.0-beta.1";
/// @notice Constructs the L1ERC721Bridge contract. /// @notice Constructs the L1ERC721Bridge contract.
constructor() ERC721Bridge() { constructor() ERC721Bridge() {
...@@ -107,8 +107,8 @@ contract L1ERC721Bridge is ERC721Bridge, ISemver { ...@@ -107,8 +107,8 @@ contract L1ERC721Bridge is ERC721Bridge, ISemver {
require(_remoteToken != address(0), "L1ERC721Bridge: remote token cannot be address(0)"); require(_remoteToken != address(0), "L1ERC721Bridge: remote token cannot be address(0)");
// Construct calldata for _l2Token.finalizeBridgeERC721(_to, _tokenId) // Construct calldata for _l2Token.finalizeBridgeERC721(_to, _tokenId)
bytes memory message = abi.encodeWithSelector( bytes memory message = abi.encodeCall(
IL2ERC721Bridge.finalizeBridgeERC721.selector, _remoteToken, _localToken, _from, _to, _tokenId, _extraData IL2ERC721Bridge.finalizeBridgeERC721, (_remoteToken, _localToken, _from, _to, _tokenId, _extraData)
); );
// Lock token into bridge // Lock token into bridge
......
...@@ -26,8 +26,8 @@ import { ISemver } from "src/universal/interfaces/ISemver.sol"; ...@@ -26,8 +26,8 @@ import { ISemver } from "src/universal/interfaces/ISemver.sol";
/// wait for the one-week challenge period to elapse before their Optimism-native NFT /// wait for the one-week challenge period to elapse before their Optimism-native NFT
/// can be refunded on L2. /// can be refunded on L2.
contract L2ERC721Bridge is ERC721Bridge, ISemver { contract L2ERC721Bridge is ERC721Bridge, ISemver {
/// @custom:semver 1.7.1-beta.3 /// @custom:semver 1.8.0-beta.1
string public constant version = "1.7.1-beta.3"; string public constant version = "1.8.0-beta.1";
/// @notice Constructs the L2ERC721Bridge contract. /// @notice Constructs the L2ERC721Bridge contract.
constructor() ERC721Bridge() { constructor() ERC721Bridge() {
...@@ -117,8 +117,8 @@ contract L2ERC721Bridge is ERC721Bridge, ISemver { ...@@ -117,8 +117,8 @@ contract L2ERC721Bridge is ERC721Bridge, ISemver {
// slither-disable-next-line reentrancy-events // slither-disable-next-line reentrancy-events
IOptimismMintableERC721(_localToken).burn(_from, _tokenId); IOptimismMintableERC721(_localToken).burn(_from, _tokenId);
bytes memory message = abi.encodeWithSelector( bytes memory message = abi.encodeCall(
IL1ERC721Bridge.finalizeBridgeERC721.selector, remoteToken, _localToken, _from, _to, _tokenId, _extraData IL1ERC721Bridge.finalizeBridgeERC721, (remoteToken, _localToken, _from, _to, _tokenId, _extraData)
); );
// Send message to L1 bridge // Send message to L1 bridge
......
...@@ -118,3 +118,17 @@ rules: ...@@ -118,3 +118,17 @@ rules:
exclude: exclude:
- packages/contracts-bedrock/test - packages/contracts-bedrock/test
- packages/contracts-bedrock/src/cannon/libraries/MIPSInstructions.sol - packages/contracts-bedrock/src/cannon/libraries/MIPSInstructions.sol
- id: sol-style-use-abi-encodecall
languages: [solidity]
severity: ERROR
message: Use abi.encodeCall instead of abi.encodeWithSelector
patterns:
- pattern: |
abi.encodeWithSelector(...);
paths:
exclude:
- packages/contracts-bedrock/test
- packages/contracts-bedrock/src/L1/OPContractsManager.sol
- packages/contracts-bedrock/src/L1/OPContractsManagerInterop.sol
- packages/contracts-bedrock/src/legacy/L1ChugSplashProxy.sol
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment