Skip to content

Commit 3bfcd84

Browse files
authored
clean Base contracts (#77)
1 parent de00401 commit 3bfcd84

18 files changed

Lines changed: 108 additions & 123 deletions

base/script/Deploy.s.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ contract DeployScript is DevOps {
7272
address erc20Beacon =
7373
address(new UpgradeableBeacon({initialOwner: cfg.initialOwner, initialImplementation: erc20Impl}));
7474

75-
address xChainERC20FactoryImpl = address(new CrossChainERC20Factory(erc20Beacon));
75+
address xChainErc20FactoryImpl = address(new CrossChainERC20Factory(erc20Beacon));
7676
return
77-
ERC1967Factory(cfg.erc1967Factory).deploy({implementation: xChainERC20FactoryImpl, admin: cfg.initialOwner});
77+
ERC1967Factory(cfg.erc1967Factory).deploy({implementation: xChainErc20FactoryImpl, admin: cfg.initialOwner});
7878
}
7979

8080
function _deployBridgeValidator(HelperConfig.NetworkConfig memory cfg, address bridge) private returns (address) {

base/script/HelperConfig.s.sol

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,16 @@ contract HelperConfig is Script {
5050
}
5151

5252
function getBaseSepoliaDevConfig() public pure returns (NetworkConfig memory) {
53-
address BASE_ORACLE = 0x6D0E9C04BD896608b7e10b87FB686E1Feba85510;
54-
address BRIDGE_ADMIN = 0x20624CA8d0dF80B8bd67C25Bc19A9E10AfB67733;
53+
address baseOracle = 0x6D0E9C04BD896608b7e10b87FB686E1Feba85510;
54+
address bridgeAdmin = 0x20624CA8d0dF80B8bd67C25Bc19A9E10AfB67733;
5555

5656
address[] memory guardians = new address[](1);
5757
address[] memory baseValidators = new address[](1);
58-
guardians[0] = BRIDGE_ADMIN;
59-
baseValidators[0] = BASE_ORACLE;
58+
guardians[0] = bridgeAdmin;
59+
baseValidators[0] = baseOracle;
6060

6161
return NetworkConfig({
62-
initialOwner: BRIDGE_ADMIN,
62+
initialOwner: bridgeAdmin,
6363
remoteBridge: Pubkey.wrap(0x890394bc966bf6a9d808ff4a700236444afbc430bd691db0f8118754ae023b6d), // ADr2FqCx35AFdS2j46gJtkoksxAFPRtjVMPo6u62tVfz
6464
erc1967Factory: ERC1967FactoryConstants.ADDRESS,
6565
baseValidators: baseValidators,
@@ -71,16 +71,16 @@ contract HelperConfig is Script {
7171
}
7272

7373
function getBaseSepoliaProdConfig() public pure returns (NetworkConfig memory) {
74-
address BASE_ORACLE = 0x2880a6DcC8c87dD2874bCBB9ad7E627a407Cf3C2;
75-
address BRIDGE_ADMIN = 0x20624CA8d0dF80B8bd67C25Bc19A9E10AfB67733;
74+
address baseOracle = 0x2880a6DcC8c87dD2874bCBB9ad7E627a407Cf3C2;
75+
address bridgeAdmin = 0x20624CA8d0dF80B8bd67C25Bc19A9E10AfB67733;
7676

7777
address[] memory guardians = new address[](1);
7878
address[] memory baseValidators = new address[](1);
79-
guardians[0] = BRIDGE_ADMIN;
80-
baseValidators[0] = BASE_ORACLE;
79+
guardians[0] = bridgeAdmin;
80+
baseValidators[0] = baseOracle;
8181

8282
return NetworkConfig({
83-
initialOwner: BRIDGE_ADMIN,
83+
initialOwner: bridgeAdmin,
8484
remoteBridge: Pubkey.wrap(0x083abe7dfcdf7b07b857e3b141d49bf0e5a959a0c3ad07445160417b31274a68), // Z8DUqPNTT4tZAX3hNoQjYdNoB7rLxDBDX6CrHG972c7
8585
erc1967Factory: ERC1967FactoryConstants.ADDRESS,
8686
baseValidators: baseValidators,

base/script/UpgradeScript.s.sol

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import {HelperConfig} from "./HelperConfig.s.sol";
1616
contract UpgradeScript is DevOps {
1717
// Upgrade Config:
1818
bool upgradeTwin = false; // MODIFY THIS WHEN UPGRADING
19-
bool upgradeERC20 = false; // MODIFY THIS WHEN UPGRADING
20-
bool upgradeERC20Factory = false; // MODIFY THIS WHEN UPGRADING
19+
bool upgradeErc20 = false; // MODIFY THIS WHEN UPGRADING
20+
bool upgradeErc20Factory = false; // MODIFY THIS WHEN UPGRADING
2121
bool upgradeBridgeValidator = false; // MODIFY THIS WHEN UPGRADING
2222
bool upgradeBridge = false; // MODIFY THIS WHEN UPGRADING
2323

@@ -26,14 +26,14 @@ contract UpgradeScript is DevOps {
2626
address bridgeAddress;
2727
address erc20FactoryAddress;
2828
address twinBeaconAddress;
29-
address crossChainERC20BeaconAddress;
29+
address crossChainErc20BeaconAddress;
3030

3131
function setUp() external {
3232
// Read existing deployment addresses
3333
(bridgeAddress, erc20FactoryAddress, twinBeaconAddress) = _readAndParseDeploymentFile();
3434

3535
// Upgrade CrossChainERC20Beacon and CrossChainERC20Factory
36-
crossChainERC20BeaconAddress = CrossChainERC20Factory(erc20FactoryAddress).BEACON();
36+
crossChainErc20BeaconAddress = CrossChainERC20Factory(erc20FactoryAddress).BEACON();
3737
}
3838

3939
function run() public {
@@ -47,12 +47,12 @@ contract UpgradeScript is DevOps {
4747
_upgradeTwinBeacon();
4848
}
4949

50-
if (upgradeERC20) {
51-
_upgradeCrossChainERC20Beacon();
50+
if (upgradeErc20) {
51+
_upgradeCrossChainErc20Beacon();
5252
}
5353

54-
if (upgradeERC20Factory) {
55-
_upgradeCrossChainERC20Factory(cfg);
54+
if (upgradeErc20Factory) {
55+
_upgradeCrossChainErc20Factory(cfg);
5656
}
5757

5858
if (upgradeBridgeValidator) {
@@ -82,24 +82,24 @@ contract UpgradeScript is DevOps {
8282
console.log("Upgraded TwinBeacon!");
8383
}
8484

85-
function _upgradeCrossChainERC20Beacon() internal {
85+
function _upgradeCrossChainErc20Beacon() internal {
8686
// Deploy new erc20 implementation
8787
address erc20Impl = address(new CrossChainERC20(bridgeAddress));
8888

8989
// Upgrade CrossChainERC20Beacon to new implementation --> This will automatically upgrade the Factory contract
9090
// as well
91-
UpgradeableBeacon beacon = UpgradeableBeacon(crossChainERC20BeaconAddress);
91+
UpgradeableBeacon beacon = UpgradeableBeacon(crossChainErc20BeaconAddress);
9292
beacon.upgradeTo(erc20Impl);
9393
console.log("Upgraded CrossChainERC20Beacon!");
9494
}
9595

96-
function _upgradeCrossChainERC20Factory(HelperConfig.NetworkConfig memory cfg) internal {
96+
function _upgradeCrossChainErc20Factory(HelperConfig.NetworkConfig memory cfg) internal {
9797
// Deploy new Factory implementation
98-
address xChainERC20FactoryImpl = address(new CrossChainERC20Factory(crossChainERC20BeaconAddress));
99-
console.log("Deployed new CrossChainERC20Factory implementation: %s", xChainERC20FactoryImpl);
98+
address xChainErc20FactoryImpl = address(new CrossChainERC20Factory(crossChainErc20BeaconAddress));
99+
console.log("Deployed new CrossChainERC20Factory implementation: %s", xChainErc20FactoryImpl);
100100

101101
// Upgrade CrossChainERC20Factory to new implementation
102-
ERC1967Factory(cfg.erc1967Factory).upgrade(erc20FactoryAddress, xChainERC20FactoryImpl);
102+
ERC1967Factory(cfg.erc1967Factory).upgrade(erc20FactoryAddress, xChainErc20FactoryImpl);
103103
console.log("Upgraded CrossChainERC20Factory!");
104104
}
105105

base/script/actions/CreateToken.s.sol

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ pragma solidity 0.8.28;
33

44
import {stdJson} from "forge-std/StdJson.sol";
55
import {console} from "forge-std/console.sol";
6-
import {ERC1967Factory} from "solady/utils/ERC1967Factory.sol";
7-
import {ERC1967FactoryConstants} from "solady/utils/ERC1967FactoryConstants.sol";
86
import {LibString} from "solady/utils/LibString.sol";
97

108
import {CrossChainERC20Factory} from "../../src/CrossChainERC20Factory.sol";
@@ -18,15 +16,15 @@ contract CreateTokenScript is DevOps {
1816
string public tokenName = vm.envString("TOKEN_NAME");
1917
string public tokenSymbol = vm.envString("TOKEN_SYMBOL");
2018

21-
CrossChainERC20Factory public crossChainERC20Factory;
19+
CrossChainERC20Factory public crossChainErc20Factory;
2220

2321
function setUp() public {
24-
crossChainERC20Factory = CrossChainERC20Factory(_getAddress("CrossChainERC20Factory"));
22+
crossChainErc20Factory = CrossChainERC20Factory(_getAddress("CrossChainERC20Factory"));
2523
}
2624

2725
function run() public {
2826
vm.startBroadcast();
29-
address token = crossChainERC20Factory.deploy({
27+
address token = crossChainErc20Factory.deploy({
3028
remoteToken: REMOTE_TOKEN,
3129
name: tokenName,
3230
symbol: tokenSymbol,

base/src/BridgeValidator.sol

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import {OwnableRoles} from "solady/auth/OwnableRoles.sol";
55
import {ECDSA} from "solady/utils/ECDSA.sol";
66
import {Initializable} from "solady/utils/Initializable.sol";
77

8-
import {Bridge} from "./Bridge.sol";
98
import {IPartner} from "./interfaces/IPartner.sol";
9+
import {MessageLib} from "./libraries/MessageLib.sol";
1010
import {VerificationLib} from "./libraries/VerificationLib.sol";
1111

1212
/// @title BridgeValidator
@@ -35,6 +35,9 @@ contract BridgeValidator is Initializable {
3535
/// @notice Address of the contract holding the partner validator set
3636
address public immutable PARTNER_VALIDATORS;
3737

38+
/// @notice A bit to be used in bitshift operations
39+
uint256 private constant _BIT = 1;
40+
3841
//////////////////////////////////////////////////////////////
3942
/// Storage ///
4043
//////////////////////////////////////////////////////////////
@@ -142,7 +145,7 @@ contract BridgeValidator is Initializable {
142145
uint256 currentNonce = nextNonce;
143146

144147
for (uint256 i; i < len; i++) {
145-
messageHashes[i] = keccak256(abi.encode(currentNonce++, innerMessageHashes[i]));
148+
messageHashes[i] = MessageLib.getMessageHash(currentNonce++, innerMessageHashes[i]);
146149
}
147150

148151
_validateSigs({messageHashes: messageHashes, sigData: validatorSigs});
@@ -195,7 +198,8 @@ contract BridgeValidator is Initializable {
195198
IPartner.Signer[] memory partnerValidators = IPartner(PARTNER_VALIDATORS).getSigners();
196199
require(_countBaseSigners(recoveredSigners) >= VerificationLib.getBaseThreshold(), BaseThresholdNotMet());
197200
require(
198-
_countPartnerSigners(partnerValidators, recoveredSigners) >= PARTNER_VALIDATOR_THRESHOLD, PartnerThresholdNotMet()
201+
_countPartnerSigners(partnerValidators, recoveredSigners) >= PARTNER_VALIDATOR_THRESHOLD,
202+
PartnerThresholdNotMet()
199203
);
200204
}
201205

@@ -256,11 +260,11 @@ contract BridgeValidator is Initializable {
256260
continue;
257261
}
258262

259-
if (signedBitMap & (0x1 << partnerIndex) != 0) {
263+
if (signedBitMap & (_BIT << partnerIndex) != 0) {
260264
revert DuplicateSigner();
261265
}
262266

263-
signedBitMap |= 0x1 << partnerIndex;
267+
signedBitMap |= _BIT << partnerIndex;
264268
unchecked {
265269
count++;
266270
}
@@ -272,7 +276,7 @@ contract BridgeValidator is Initializable {
272276
/// @dev Linear search for `addr` in memory array `addrs`.
273277
function _indexOf(IPartner.Signer[] memory addrs, address addr) private pure returns (uint256) {
274278
for (uint256 i; i < addrs.length; i++) {
275-
if (addr == addrs[i].evmAddress || addr == addrs[i].newEVMAddress) {
279+
if (addr == addrs[i].evmAddress || addr == addrs[i].newEvmAddress) {
276280
return i;
277281
}
278282
}

base/src/interfaces/IPartner.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ interface IPartner {
99
address evmAddress;
1010
// New candidate EVM address that each signer will sign with during key rotation.
1111
// Upon completion of rotation, this will be promoted to evm_address.
12-
address newEVMAddress;
12+
address newEvmAddress;
1313
}
1414

1515
/// @notice Returns the full signer set.

base/src/libraries/MessageLib.sol

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity 0.8.28;
33

4+
import {EfficientHashLib} from "solady/utils/EfficientHashLib.sol";
5+
46
import {Pubkey} from "./SVMLib.sol";
57

68
/// @notice Enum containing operation types.
@@ -25,11 +27,15 @@ struct IncomingMessage {
2527

2628
library MessageLib {
2729
function getMessageHashCd(IncomingMessage calldata message) internal pure returns (bytes32) {
28-
return keccak256(abi.encode(message.nonce, getInnerMessageHashCd(message)));
30+
return getMessageHash(message.nonce, getInnerMessageHashCd(message));
2931
}
3032

3133
function getMessageHash(IncomingMessage memory message) internal pure returns (bytes32) {
32-
return keccak256(abi.encode(message.nonce, getInnerMessageHash(message)));
34+
return getMessageHash(message.nonce, getInnerMessageHash(message));
35+
}
36+
37+
function getMessageHash(uint256 nonce, bytes32 innerMessageHash) internal pure returns (bytes32) {
38+
return EfficientHashLib.hash(bytes32(nonce), innerMessageHash);
3339
}
3440

3541
function getInnerMessageHashCd(IncomingMessage calldata message) internal pure returns (bytes32) {

0 commit comments

Comments
 (0)