From 1d7e4ad46991e85fe324648504acdd925f0aa5b5 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Thu, 30 Oct 2025 09:36:10 +0000 Subject: [PATCH 1/3] fix(base): prevent cummulaitve deposits from exceeding max u64 --- base/src/libraries/TokenLib.sol | 53 +++++++++++++++++++++++++++--- base/test/libraries/TokenLib.t.sol | 53 ++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 4 deletions(-) diff --git a/base/src/libraries/TokenLib.sol b/base/src/libraries/TokenLib.sol index e27e547..b966406 100644 --- a/base/src/libraries/TokenLib.sol +++ b/base/src/libraries/TokenLib.sol @@ -58,6 +58,9 @@ library TokenLib { /// @notice Thrown when the transfer amount is zero. error ZeroAmount(); + /// @notice Thrown when cumulative deposits exceed uint64 max when scaled to remote amount. + error CumulativeDepositExceedsU64(); + ////////////////////////////////////////////////////////////// /// Events /// ////////////////////////////////////////////////////////////// @@ -137,8 +140,15 @@ library TokenLib { localAmount = transfer.remoteAmount * scalar; require(msg.value == localAmount, InvalidMsgValue()); + _addToDeposits({ + $: $, + localToken: transfer.localToken, + remoteToken: transfer.remoteToken, + scalar: scalar, + additionalLocalAmount: localAmount + }); + tokenType = SolanaTokenType.WrappedToken; - $.deposits[transfer.localToken][transfer.remoteToken] += localAmount; } else { // Prevent sending ETH when bridging ERC20 tokens require(msg.value == 0, InvalidMsgValue()); @@ -169,7 +179,10 @@ library TokenLib { // NOTE: This is needed to support tokens with transfer fees. uint256 balanceBefore = SafeTransferLib.balanceOf({token: transfer.localToken, account: address(this)}); SafeTransferLib.safeTransferFrom({ - token: transfer.localToken, from: msg.sender, to: address(this), amount: transferLocalAmount + token: transfer.localToken, + from: msg.sender, + to: address(this), + amount: transferLocalAmount }); uint256 balanceAfter = SafeTransferLib.balanceOf({token: transfer.localToken, account: address(this)}); uint256 receivedLocalAmount = balanceAfter - balanceBefore; @@ -187,7 +200,13 @@ library TokenLib { // IMPORTANT: Update the transfer struct IN MEMORY to reflect the remote amount to use for bridging. transfer.remoteAmount = SafeCastLib.toUint64(receivedRemoteAmount); - $.deposits[transfer.localToken][transfer.remoteToken] += localAmount; + _addToDeposits({ + $: $, + localToken: transfer.localToken, + remoteToken: transfer.remoteToken, + scalar: scalar, + additionalLocalAmount: localAmount + }); tokenType = SolanaTokenType.WrappedToken; } @@ -240,7 +259,10 @@ library TokenLib { } emit TransferFinalized({ - localToken: transfer.localToken, remoteToken: transfer.remoteToken, to: to, amount: localAmount + localToken: transfer.localToken, + remoteToken: transfer.remoteToken, + to: to, + amount: localAmount }); } @@ -254,4 +276,27 @@ library TokenLib { TokenLibStorage storage $ = getTokenLibStorage(); $.scalars[localToken][remoteToken] = 10 ** scalarExponent; } + + ////////////////////////////////////////////////////////////// + /// Private Functions /// + ////////////////////////////////////////////////////////////// + + /// @notice Validates and updates cumulative deposits, ensuring they don't exceed uint64 max when scaled. + /// + /// @param $ Storage reference to the TokenLibStorage struct. + /// @param localToken Address of the local token. + /// @param remoteToken Pubkey of the remote token. + /// @param scalar Conversion scalar for the token pair. + /// @param additionalLocalAmount Amount to add to deposits (in local units). + function _addToDeposits( + TokenLibStorage storage $, + address localToken, + Pubkey remoteToken, + uint256 scalar, + uint256 additionalLocalAmount + ) private { + uint256 newDeposits = $.deposits[localToken][remoteToken] + additionalLocalAmount; + require(newDeposits / scalar <= type(uint64).max, CumulativeDepositExceedsU64()); + $.deposits[localToken][remoteToken] = newDeposits; + } } diff --git a/base/test/libraries/TokenLib.t.sol b/base/test/libraries/TokenLib.t.sol index 895b888..b7e48a9 100644 --- a/base/test/libraries/TokenLib.t.sol +++ b/base/test/libraries/TokenLib.t.sol @@ -317,6 +317,59 @@ contract TokenLibTest is CommonTest { bridge.bridgeToken(transfer, emptyIxs); } + function test_initializeTransfer_revertsOnCumulativeU64Overflow() public { + // Step 1: Create a local ERC20 token with 18 decimals + MockERC20 localToken = new MockERC20("Test Token", "TEST", 18); + + // Give alice a large balance + localToken.mint(alice, 10000e18); + + // Step 2: Register a remote token with a scalar exponent of 2 + // This means: localAmount = remoteAmount * 10^2 (scalar = 100) + // Or: remoteAmount = localAmount / 100 + Pubkey remoteToken = Pubkey.wrap(0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef); + uint8 scalarExponent = 2; + + _registerTokenPair(address(localToken), remoteToken, scalarExponent, 0); + + // Verify the scalar is correctly set + uint256 expectedScalar = 10 ** scalarExponent; // 100 + assertEq(bridge.scalars(address(localToken), remoteToken), expectedScalar, "Scalar should be 100"); + + // Step 3: Calculate the remote amount for each bridge operation + // When we bridge 1000 tokens (1000 * 10^18 in smallest units): + // remoteAmount = localAmount / scalar = (1000 * 10^18) / 100 = 10^19 + uint256 bridgeAmount = 1000e18; + uint256 expectedRemoteAmountPerBridge = bridgeAmount / expectedScalar; + + // Step 4: Bridge 1000 units twice + Transfer memory transfer = Transfer({ + localToken: address(localToken), + remoteToken: remoteToken, + to: bytes32(uint256(uint160(alice))), + remoteAmount: uint64(expectedRemoteAmountPerBridge) // This will be 10^19 + }); + + Ix[] memory emptyIxs; + + // First bridge - should succeed + vm.startPrank(alice); + localToken.approve(address(bridge), bridgeAmount); + bridge.bridgeToken(transfer, emptyIxs); + vm.stopPrank(); + + uint256 depositsAfterFirst = bridge.deposits(address(localToken), remoteToken); + assertEq(depositsAfterFirst, bridgeAmount, "Deposits after first bridge should equal bridge amount"); + + // Second bridge - should revert with CumulativeDepositExceedsU64 + // because total would be 2 * 10^19 which exceeds uint64.max (18,446,744,073.709551615) + vm.startPrank(alice); + localToken.approve(address(bridge), bridgeAmount); + vm.expectRevert(TokenLib.CumulativeDepositExceedsU64.selector); + bridge.bridgeToken(transfer, emptyIxs); + vm.stopPrank(); + } + ////////////////////////////////////////////////////////////// /// Finalize Transfer Tests /// ////////////////////////////////////////////////////////////// From 07c866f489f4e3c8d72d477a964a50bd7257f388 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Thu, 30 Oct 2025 09:36:25 +0000 Subject: [PATCH 2/3] chore(solana): run forge fmt --- base/script/Deploy.s.sol | 41 ++++++------ .../script/actions/BridgeTokensToSolana.s.sol | 5 +- base/script/actions/CreateToken.s.sol | 5 +- base/src/Bridge.sol | 11 +++- base/src/CrossChainERC20Factory.sol | 8 ++- base/test/Bridge.t.sol | 3 +- base/test/BridgeValidator.t.sol | 63 ++++++++++++------- base/test/CommonTest.t.sol | 3 +- base/test/Twin.t.sol | 5 +- base/test/libraries/MessageStorageLib.t.sol | 48 +++++++++----- base/test/libraries/SVMBridgeLib.t.sol | 15 ++++- 11 files changed, 136 insertions(+), 71 deletions(-) diff --git a/base/script/Deploy.s.sol b/base/script/Deploy.s.sol index 5da9f3d..be4d47d 100644 --- a/base/script/Deploy.s.sol +++ b/base/script/Deploy.s.sol @@ -31,7 +31,10 @@ contract DeployScript is DevOps { address bridgeValidator = _deployBridgeValidator({cfg: cfg, bridge: precomputedBridgeAddress}); address bridge = _deployBridge({ - cfg: cfg, twinBeacon: twinBeacon, crossChainErc20Factory: factory, bridgeValidator: bridgeValidator + cfg: cfg, + twinBeacon: twinBeacon, + crossChainErc20Factory: factory, + bridgeValidator: bridgeValidator }); address relayerOrchestrator = _deployRelayerOrchestrator({cfg: cfg, bridge: bridge, bridgeValidator: bridgeValidator}); @@ -82,15 +85,13 @@ contract DeployScript is DevOps { address bridgeValidatorImpl = address(new BridgeValidator({bridgeAddress: bridge, partnerValidators: cfg.partnerValidators})); - return ERC1967Factory(cfg.erc1967Factory) - .deployAndCall({ - implementation: bridgeValidatorImpl, - admin: cfg.initialOwner, - data: abi.encodeCall( - BridgeValidator.initialize, - (cfg.baseValidators, cfg.baseSignatureThreshold, cfg.partnerValidatorThreshold) - ) - }); + return ERC1967Factory(cfg.erc1967Factory).deployAndCall({ + implementation: bridgeValidatorImpl, + admin: cfg.initialOwner, + data: abi.encodeCall( + BridgeValidator.initialize, (cfg.baseValidators, cfg.baseSignatureThreshold, cfg.partnerValidatorThreshold) + ) + }); } function _deployBridge( @@ -106,13 +107,12 @@ contract DeployScript is DevOps { bridgeValidator: bridgeValidator }); - return ERC1967Factory(cfg.erc1967Factory) - .deployDeterministicAndCall({ - implementation: address(bridgeImpl), - admin: cfg.initialOwner, - salt: _salt(salt), - data: abi.encodeCall(Bridge.initialize, (cfg.initialOwner, cfg.guardians)) - }); + return ERC1967Factory(cfg.erc1967Factory).deployDeterministicAndCall({ + implementation: address(bridgeImpl), + admin: cfg.initialOwner, + salt: _salt(salt), + data: abi.encodeCall(Bridge.initialize, (cfg.initialOwner, cfg.guardians)) + }); } function _deployRelayerOrchestrator(HelperConfig.NetworkConfig memory cfg, address bridge, address bridgeValidator) @@ -122,9 +122,10 @@ contract DeployScript is DevOps { address relayerOrchestratorImpl = address(new RelayerOrchestrator({bridge: bridge, bridgeValidator: bridgeValidator})); - return - ERC1967Factory(cfg.erc1967Factory) - .deploy({implementation: relayerOrchestratorImpl, admin: cfg.initialOwner}); + return ERC1967Factory(cfg.erc1967Factory).deploy({ + implementation: relayerOrchestratorImpl, + admin: cfg.initialOwner + }); } function _salt(bytes12 salt_) private view returns (bytes32) { diff --git a/base/script/actions/BridgeTokensToSolana.s.sol b/base/script/actions/BridgeTokensToSolana.s.sol index 11b8063..5d9eb7b 100644 --- a/base/script/actions/BridgeTokensToSolana.s.sol +++ b/base/script/actions/BridgeTokensToSolana.s.sol @@ -33,7 +33,10 @@ contract BridgeTokensToSolanaScript is DevOps { } uint256 value = LOCAL_TOKEN == ETH_ADDRESS ? AMOUNT : 0; Transfer memory t = Transfer({ - localToken: LOCAL_TOKEN, remoteToken: Pubkey.wrap(REMOTE_TOKEN), to: TO, remoteAmount: AMOUNT / 1e9 + localToken: LOCAL_TOKEN, + remoteToken: Pubkey.wrap(REMOTE_TOKEN), + to: TO, + remoteAmount: AMOUNT / 1e9 }); bridge.bridgeToken{value: value}(t, new Ix[](0)); vm.stopBroadcast(); diff --git a/base/script/actions/CreateToken.s.sol b/base/script/actions/CreateToken.s.sol index 73954f6..085d0bd 100644 --- a/base/script/actions/CreateToken.s.sol +++ b/base/script/actions/CreateToken.s.sol @@ -25,7 +25,10 @@ contract CreateTokenScript is DevOps { function run() public { vm.startBroadcast(); address token = crossChainErc20Factory.deploy({ - remoteToken: REMOTE_TOKEN, name: tokenName, symbol: tokenSymbol, decimals: 9 + remoteToken: REMOTE_TOKEN, + name: tokenName, + symbol: tokenSymbol, + decimals: 9 }); console.log("Deployed Token at: %s", token); vm.stopBroadcast(); diff --git a/base/src/Bridge.sol b/base/src/Bridge.sol index 56ca66d..35c47b4 100644 --- a/base/src/Bridge.sol +++ b/base/src/Bridge.sol @@ -225,7 +225,9 @@ contract Bridge is ReentrancyGuardTransient, Initializable, OwnableRoles { abi.decode(call.data, (address, Pubkey, uint8)); TokenLib.registerRemoteToken({ - localToken: localToken, remoteToken: remoteToken, scalarExponent: scalarExponent + localToken: localToken, + remoteToken: remoteToken, + scalarExponent: scalarExponent }); return; } @@ -242,7 +244,8 @@ contract Bridge is ReentrancyGuardTransient, Initializable, OwnableRoles { address twinAddress = twins[message.sender]; if (twinAddress == address(0)) { twinAddress = LibClone.deployDeterministicERC1967BeaconProxy({ - beacon: TWIN_BEACON, salt: Pubkey.unwrap(message.sender) + beacon: TWIN_BEACON, + salt: Pubkey.unwrap(message.sender) }); twins[message.sender] = twinAddress; } @@ -299,7 +302,9 @@ contract Bridge is ReentrancyGuardTransient, Initializable, OwnableRoles { /// @return The predicted address of the Twin contract for the given Solana sender pubkey. function getPredictedTwinAddress(Pubkey sender) external view returns (address) { return LibClone.predictDeterministicAddressERC1967BeaconProxy({ - beacon: TWIN_BEACON, salt: Pubkey.unwrap(sender), deployer: address(this) + beacon: TWIN_BEACON, + salt: Pubkey.unwrap(sender), + deployer: address(this) }); } diff --git a/base/src/CrossChainERC20Factory.sol b/base/src/CrossChainERC20Factory.sol index 8127898..bf2ba59 100644 --- a/base/src/CrossChainERC20Factory.sol +++ b/base/src/CrossChainERC20Factory.sol @@ -98,8 +98,12 @@ contract CrossChainERC20Factory { isCrossChainErc20[localToken] = true; // Initialize the deployed proxy with the token parameters - CrossChainERC20(localToken) - .initialize({remoteToken_: remoteToken, name_: name, symbol_: symbol, decimals_: decimals}); + CrossChainERC20(localToken).initialize({ + remoteToken_: remoteToken, + name_: name, + symbol_: symbol, + decimals_: decimals + }); emit CrossChainERC20Created({localToken: localToken, remoteToken: remoteToken, deployer: msg.sender}); } diff --git a/base/test/Bridge.t.sol b/base/test/Bridge.t.sol index 08f6233..672fcd2 100644 --- a/base/test/Bridge.t.sol +++ b/base/test/Bridge.t.sol @@ -21,8 +21,7 @@ import {TestTarget} from "./mocks/TestTarget.sol"; contract BridgeTest is CommonTest { address public user = makeAddr("user"); - Pubkey public constant TEST_SENDER = - Pubkey.wrap(0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef); + Pubkey public constant TEST_SENDER = Pubkey.wrap(0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef); Pubkey public constant TEST_REMOTE_TOKEN = Pubkey.wrap(0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890); diff --git a/base/test/BridgeValidator.t.sol b/base/test/BridgeValidator.t.sol index d47a12d..fc31e14 100644 --- a/base/test/BridgeValidator.t.sol +++ b/base/test/BridgeValidator.t.sol @@ -71,7 +71,8 @@ contract BridgeValidatorTest is CommonTest { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes memory sigs = _getValidatorSigs(signedMessages); @@ -89,10 +90,12 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_success() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](2); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); signedMessages[1] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_2 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_2 }); bytes32[] memory expectedFinalHashes = _calculateFinalHashes(signedMessages); @@ -110,7 +113,8 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_singleMessage() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes32[] memory expectedFinalHashes = _calculateFinalHashes(signedMessages); @@ -148,14 +152,16 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_duplicateMessageHashes() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](3); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); signedMessages[1] = BridgeValidator.SignedMessage({ outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 // Duplicate }); signedMessages[2] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_2 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_2 }); bytes32[] memory expectedFinalHashes = _calculateFinalHashes(signedMessages); @@ -175,7 +181,8 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_revertsOnInvalidSignatureLength() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); // Create signature with invalid length (64 bytes instead of 65) @@ -188,7 +195,8 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_revertsWhenPartnerThresholdNotMet() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); address testOracle = vm.addr(77); @@ -211,7 +219,8 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_revertsOnEmptySignature() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); vm.expectRevert(BridgeValidator.BaseThresholdNotMet.selector); @@ -221,7 +230,8 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_anyoneCanCallWithValidSigs() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes32[] memory expectedFinalHashes = _calculateFinalHashes(signedMessages); @@ -236,7 +246,8 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_revertsOnDuplicateSigners() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes32[] memory finalHashes = _calculateFinalHashes(signedMessages); @@ -254,7 +265,8 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_revertsOnUnsortedSigners() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes32[] memory finalHashes = _calculateFinalHashes(signedMessages); @@ -293,7 +305,8 @@ contract BridgeValidatorTest is CommonTest { // Prepare a single message BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes32[] memory finalHashes = _calculateFinalHashes(signedMessages); bytes memory signedHash = abi.encode(finalHashes); @@ -346,7 +359,8 @@ contract BridgeValidatorTest is CommonTest { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); // Calculate final hashes with the validator's current nonce @@ -373,7 +387,8 @@ contract BridgeValidatorTest is CommonTest { // Prepare a single message BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); // Compute final hash using the proxy's current nonce @@ -428,13 +443,16 @@ contract BridgeValidatorTest is CommonTest { assertEq(bridgeValidator.nextNonce(), 0); BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](3); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); signedMessages[1] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_2 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_2 }); signedMessages[2] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_3 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_3 }); bridgeValidator.registerMessages(signedMessages, _getValidatorSigs(signedMessages)); assertEq(bridgeValidator.nextNonce(), 3); @@ -453,10 +471,12 @@ contract BridgeValidatorTest is CommonTest { function test_validMessages_afterRegistration() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](2); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_1 }); signedMessages[1] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_2 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: TEST_MESSAGE_HASH_2 }); bytes32[] memory expectedFinalHashes = _calculateFinalHashes(signedMessages); @@ -480,7 +500,8 @@ contract BridgeValidatorTest is CommonTest { new BridgeValidator.SignedMessage[](innerMessageHashes.length); for (uint256 i; i < innerMessageHashes.length; i++) { signedMessages[i] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: innerMessageHashes[i] + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: innerMessageHashes[i] }); } diff --git a/base/test/CommonTest.t.sol b/base/test/CommonTest.t.sol index 6646746..d2756ec 100644 --- a/base/test/CommonTest.t.sol +++ b/base/test/CommonTest.t.sol @@ -43,7 +43,8 @@ contract CommonTest is Test { { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: MessageLib.getInnerMessageHash(message) + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, + innerMessageHash: MessageLib.getInnerMessageHash(message) }); return signedMessages; } diff --git a/base/test/Twin.t.sol b/base/test/Twin.t.sol index 17216c2..209a7de 100644 --- a/base/test/Twin.t.sol +++ b/base/test/Twin.t.sol @@ -97,7 +97,10 @@ contract TwinTest is Test { // Create a call to execute the above call (recursive call) Call memory selfCall = Call({ - ty: CallType.Call, to: address(twin), value: 0, data: abi.encodeWithSelector(Twin.execute.selector, call) + ty: CallType.Call, + to: address(twin), + value: 0, + data: abi.encodeWithSelector(Twin.execute.selector, call) }); vm.prank(bridge); diff --git a/base/test/libraries/MessageStorageLib.t.sol b/base/test/libraries/MessageStorageLib.t.sol index 9a04191..8df1b9f 100644 --- a/base/test/libraries/MessageStorageLib.t.sol +++ b/base/test/libraries/MessageStorageLib.t.sol @@ -215,7 +215,8 @@ contract MessageStorageLibTest is Test { // Arrange & Act for (uint256 i = 1; i <= 3; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -229,7 +230,8 @@ contract MessageStorageLibTest is Test { // Arrange & Act for (uint256 i = 1; i <= 4; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -243,7 +245,8 @@ contract MessageStorageLibTest is Test { // Arrange & Act for (uint256 i = 1; i <= 8; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -261,7 +264,8 @@ contract MessageStorageLibTest is Test { // Arrange for (uint256 i = 1; i <= 3; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("data", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("data", i))) }); } @@ -350,7 +354,8 @@ contract MessageStorageLibTest is Test { // Act & Assert for (uint256 i = 0; i < numLeaves; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("data", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("data", i))) }); bytes32 currentRoot = _getRoot(); @@ -375,7 +380,8 @@ contract MessageStorageLibTest is Test { // Act & Assert for (uint256 i = 0; i < 5; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("data", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("data", i))) }); uint256 currentNodeCount = _getNodeCount(); @@ -450,7 +456,8 @@ contract MessageStorageLibTest is Test { // Act for (uint256 i = 0; i < messageCount; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("message", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("message", i))) }); } @@ -466,7 +473,8 @@ contract MessageStorageLibTest is Test { for (uint256 i = 0; i < numLeaves; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -527,7 +535,8 @@ contract MessageStorageLibTest is Test { // Arrange for (uint256 i = 0; i < 4; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -554,7 +563,8 @@ contract MessageStorageLibTest is Test { // Add 5 leaves to create multiple peaks for (uint256 i = 0; i < 5; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -570,7 +580,8 @@ contract MessageStorageLibTest is Test { // Add 4 leaves to create a complete binary tree for (uint256 i = 0; i < 4; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -587,7 +598,8 @@ contract MessageStorageLibTest is Test { // Add 7 leaves to create multiple mountains of different heights for (uint256 i = 0; i < 7; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("mountain", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("mountain", i))) }); } @@ -605,7 +617,8 @@ contract MessageStorageLibTest is Test { // Create MMR with 6 leaves to have multiple peaks for (uint256 i = 0; i < 6; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("peak", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("peak", i))) }); } @@ -646,7 +659,8 @@ contract MessageStorageLibTest is Test { // Add leaves to create multiple peaks for (uint256 i = 0; i < 3; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("peak_test", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("peak_test", i))) }); } @@ -661,7 +675,8 @@ contract MessageStorageLibTest is Test { // Create MMR with 15 leaves (complex structure with multiple mountains) for (uint256 i = 0; i < 15; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("complex", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("complex", i))) }); } @@ -722,7 +737,8 @@ contract MessageStorageLibTest is Test { // Act & Assert for (uint256 i = 0; i < iterations; i++) { MessageStorageLib.sendMessage({ - sender: address(this), data: _createTestData(string(abi.encodePacked("iteration", i))) + sender: address(this), + data: _createTestData(string(abi.encodePacked("iteration", i))) }); assertEq(_getLeafCount(), i + 1, "Leaf count should increment correctly"); } diff --git a/base/test/libraries/SVMBridgeLib.t.sol b/base/test/libraries/SVMBridgeLib.t.sol index eea0167..cfffc68 100644 --- a/base/test/libraries/SVMBridgeLib.t.sol +++ b/base/test/libraries/SVMBridgeLib.t.sol @@ -207,7 +207,10 @@ contract SVMBridgeLibTest is Test { function test_serializeTransfer_wrappedToken_withInstructions() public pure { Transfer memory transfer = Transfer({ - localToken: TEST_LOCAL_TOKEN, remoteToken: TEST_REMOTE_TOKEN, to: TEST_TO, remoteAmount: 123456789 + localToken: TEST_LOCAL_TOKEN, + remoteToken: TEST_REMOTE_TOKEN, + to: TEST_TO, + remoteAmount: 123456789 }); Ix[] memory ixs = new Ix[](3); @@ -245,7 +248,10 @@ contract SVMBridgeLibTest is Test { function test_serializeTransfer_maxAmount() public pure { Transfer memory transfer = Transfer({ - localToken: TEST_LOCAL_TOKEN, remoteToken: TEST_REMOTE_TOKEN, to: TEST_TO, remoteAmount: type(uint64).max + localToken: TEST_LOCAL_TOKEN, + remoteToken: TEST_REMOTE_TOKEN, + to: TEST_TO, + remoteAmount: type(uint64).max }); Ix[] memory ixs = new Ix[](0); @@ -292,7 +298,10 @@ contract SVMBridgeLibTest is Test { for (uint256 i = 0; i < tokenAddresses.length; i++) { Transfer memory transfer = Transfer({ - localToken: tokenAddresses[i], remoteToken: TEST_REMOTE_TOKEN, to: TEST_TO, remoteAmount: 1000 + localToken: tokenAddresses[i], + remoteToken: TEST_REMOTE_TOKEN, + to: TEST_TO, + remoteAmount: 1000 }); Ix[] memory ixs = new Ix[](0); From 02f6c90ae82c2b76c2be8789a7a598e257f8b4b1 Mon Sep 17 00:00:00 2001 From: Baptiste Oueriagli Date: Thu, 30 Oct 2025 13:49:29 +0000 Subject: [PATCH 3/3] chore(base): foundryup & forge fmt --- base/script/Deploy.s.sol | 41 ++++++------ .../script/actions/BridgeTokensToSolana.s.sol | 5 +- base/script/actions/CreateToken.s.sol | 5 +- base/src/Bridge.sol | 11 +--- base/src/CrossChainERC20Factory.sol | 8 +-- base/src/libraries/TokenLib.sol | 10 +-- base/test/Bridge.t.sol | 3 +- base/test/BridgeValidator.t.sol | 63 +++++++------------ base/test/CommonTest.t.sol | 3 +- base/test/Twin.t.sol | 5 +- base/test/libraries/MessageStorageLib.t.sol | 48 +++++--------- base/test/libraries/SVMBridgeLib.t.sol | 15 +---- 12 files changed, 73 insertions(+), 144 deletions(-) diff --git a/base/script/Deploy.s.sol b/base/script/Deploy.s.sol index be4d47d..5da9f3d 100644 --- a/base/script/Deploy.s.sol +++ b/base/script/Deploy.s.sol @@ -31,10 +31,7 @@ contract DeployScript is DevOps { address bridgeValidator = _deployBridgeValidator({cfg: cfg, bridge: precomputedBridgeAddress}); address bridge = _deployBridge({ - cfg: cfg, - twinBeacon: twinBeacon, - crossChainErc20Factory: factory, - bridgeValidator: bridgeValidator + cfg: cfg, twinBeacon: twinBeacon, crossChainErc20Factory: factory, bridgeValidator: bridgeValidator }); address relayerOrchestrator = _deployRelayerOrchestrator({cfg: cfg, bridge: bridge, bridgeValidator: bridgeValidator}); @@ -85,13 +82,15 @@ contract DeployScript is DevOps { address bridgeValidatorImpl = address(new BridgeValidator({bridgeAddress: bridge, partnerValidators: cfg.partnerValidators})); - return ERC1967Factory(cfg.erc1967Factory).deployAndCall({ - implementation: bridgeValidatorImpl, - admin: cfg.initialOwner, - data: abi.encodeCall( - BridgeValidator.initialize, (cfg.baseValidators, cfg.baseSignatureThreshold, cfg.partnerValidatorThreshold) - ) - }); + return ERC1967Factory(cfg.erc1967Factory) + .deployAndCall({ + implementation: bridgeValidatorImpl, + admin: cfg.initialOwner, + data: abi.encodeCall( + BridgeValidator.initialize, + (cfg.baseValidators, cfg.baseSignatureThreshold, cfg.partnerValidatorThreshold) + ) + }); } function _deployBridge( @@ -107,12 +106,13 @@ contract DeployScript is DevOps { bridgeValidator: bridgeValidator }); - return ERC1967Factory(cfg.erc1967Factory).deployDeterministicAndCall({ - implementation: address(bridgeImpl), - admin: cfg.initialOwner, - salt: _salt(salt), - data: abi.encodeCall(Bridge.initialize, (cfg.initialOwner, cfg.guardians)) - }); + return ERC1967Factory(cfg.erc1967Factory) + .deployDeterministicAndCall({ + implementation: address(bridgeImpl), + admin: cfg.initialOwner, + salt: _salt(salt), + data: abi.encodeCall(Bridge.initialize, (cfg.initialOwner, cfg.guardians)) + }); } function _deployRelayerOrchestrator(HelperConfig.NetworkConfig memory cfg, address bridge, address bridgeValidator) @@ -122,10 +122,9 @@ contract DeployScript is DevOps { address relayerOrchestratorImpl = address(new RelayerOrchestrator({bridge: bridge, bridgeValidator: bridgeValidator})); - return ERC1967Factory(cfg.erc1967Factory).deploy({ - implementation: relayerOrchestratorImpl, - admin: cfg.initialOwner - }); + return + ERC1967Factory(cfg.erc1967Factory) + .deploy({implementation: relayerOrchestratorImpl, admin: cfg.initialOwner}); } function _salt(bytes12 salt_) private view returns (bytes32) { diff --git a/base/script/actions/BridgeTokensToSolana.s.sol b/base/script/actions/BridgeTokensToSolana.s.sol index 5d9eb7b..11b8063 100644 --- a/base/script/actions/BridgeTokensToSolana.s.sol +++ b/base/script/actions/BridgeTokensToSolana.s.sol @@ -33,10 +33,7 @@ contract BridgeTokensToSolanaScript is DevOps { } uint256 value = LOCAL_TOKEN == ETH_ADDRESS ? AMOUNT : 0; Transfer memory t = Transfer({ - localToken: LOCAL_TOKEN, - remoteToken: Pubkey.wrap(REMOTE_TOKEN), - to: TO, - remoteAmount: AMOUNT / 1e9 + localToken: LOCAL_TOKEN, remoteToken: Pubkey.wrap(REMOTE_TOKEN), to: TO, remoteAmount: AMOUNT / 1e9 }); bridge.bridgeToken{value: value}(t, new Ix[](0)); vm.stopBroadcast(); diff --git a/base/script/actions/CreateToken.s.sol b/base/script/actions/CreateToken.s.sol index 085d0bd..73954f6 100644 --- a/base/script/actions/CreateToken.s.sol +++ b/base/script/actions/CreateToken.s.sol @@ -25,10 +25,7 @@ contract CreateTokenScript is DevOps { function run() public { vm.startBroadcast(); address token = crossChainErc20Factory.deploy({ - remoteToken: REMOTE_TOKEN, - name: tokenName, - symbol: tokenSymbol, - decimals: 9 + remoteToken: REMOTE_TOKEN, name: tokenName, symbol: tokenSymbol, decimals: 9 }); console.log("Deployed Token at: %s", token); vm.stopBroadcast(); diff --git a/base/src/Bridge.sol b/base/src/Bridge.sol index 35c47b4..56ca66d 100644 --- a/base/src/Bridge.sol +++ b/base/src/Bridge.sol @@ -225,9 +225,7 @@ contract Bridge is ReentrancyGuardTransient, Initializable, OwnableRoles { abi.decode(call.data, (address, Pubkey, uint8)); TokenLib.registerRemoteToken({ - localToken: localToken, - remoteToken: remoteToken, - scalarExponent: scalarExponent + localToken: localToken, remoteToken: remoteToken, scalarExponent: scalarExponent }); return; } @@ -244,8 +242,7 @@ contract Bridge is ReentrancyGuardTransient, Initializable, OwnableRoles { address twinAddress = twins[message.sender]; if (twinAddress == address(0)) { twinAddress = LibClone.deployDeterministicERC1967BeaconProxy({ - beacon: TWIN_BEACON, - salt: Pubkey.unwrap(message.sender) + beacon: TWIN_BEACON, salt: Pubkey.unwrap(message.sender) }); twins[message.sender] = twinAddress; } @@ -302,9 +299,7 @@ contract Bridge is ReentrancyGuardTransient, Initializable, OwnableRoles { /// @return The predicted address of the Twin contract for the given Solana sender pubkey. function getPredictedTwinAddress(Pubkey sender) external view returns (address) { return LibClone.predictDeterministicAddressERC1967BeaconProxy({ - beacon: TWIN_BEACON, - salt: Pubkey.unwrap(sender), - deployer: address(this) + beacon: TWIN_BEACON, salt: Pubkey.unwrap(sender), deployer: address(this) }); } diff --git a/base/src/CrossChainERC20Factory.sol b/base/src/CrossChainERC20Factory.sol index bf2ba59..8127898 100644 --- a/base/src/CrossChainERC20Factory.sol +++ b/base/src/CrossChainERC20Factory.sol @@ -98,12 +98,8 @@ contract CrossChainERC20Factory { isCrossChainErc20[localToken] = true; // Initialize the deployed proxy with the token parameters - CrossChainERC20(localToken).initialize({ - remoteToken_: remoteToken, - name_: name, - symbol_: symbol, - decimals_: decimals - }); + CrossChainERC20(localToken) + .initialize({remoteToken_: remoteToken, name_: name, symbol_: symbol, decimals_: decimals}); emit CrossChainERC20Created({localToken: localToken, remoteToken: remoteToken, deployer: msg.sender}); } diff --git a/base/src/libraries/TokenLib.sol b/base/src/libraries/TokenLib.sol index b966406..a0294a5 100644 --- a/base/src/libraries/TokenLib.sol +++ b/base/src/libraries/TokenLib.sol @@ -179,10 +179,7 @@ library TokenLib { // NOTE: This is needed to support tokens with transfer fees. uint256 balanceBefore = SafeTransferLib.balanceOf({token: transfer.localToken, account: address(this)}); SafeTransferLib.safeTransferFrom({ - token: transfer.localToken, - from: msg.sender, - to: address(this), - amount: transferLocalAmount + token: transfer.localToken, from: msg.sender, to: address(this), amount: transferLocalAmount }); uint256 balanceAfter = SafeTransferLib.balanceOf({token: transfer.localToken, account: address(this)}); uint256 receivedLocalAmount = balanceAfter - balanceBefore; @@ -259,10 +256,7 @@ library TokenLib { } emit TransferFinalized({ - localToken: transfer.localToken, - remoteToken: transfer.remoteToken, - to: to, - amount: localAmount + localToken: transfer.localToken, remoteToken: transfer.remoteToken, to: to, amount: localAmount }); } diff --git a/base/test/Bridge.t.sol b/base/test/Bridge.t.sol index 672fcd2..08f6233 100644 --- a/base/test/Bridge.t.sol +++ b/base/test/Bridge.t.sol @@ -21,7 +21,8 @@ import {TestTarget} from "./mocks/TestTarget.sol"; contract BridgeTest is CommonTest { address public user = makeAddr("user"); - Pubkey public constant TEST_SENDER = Pubkey.wrap(0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef); + Pubkey public constant TEST_SENDER = + Pubkey.wrap(0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef); Pubkey public constant TEST_REMOTE_TOKEN = Pubkey.wrap(0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890); diff --git a/base/test/BridgeValidator.t.sol b/base/test/BridgeValidator.t.sol index fc31e14..d47a12d 100644 --- a/base/test/BridgeValidator.t.sol +++ b/base/test/BridgeValidator.t.sol @@ -71,8 +71,7 @@ contract BridgeValidatorTest is CommonTest { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes memory sigs = _getValidatorSigs(signedMessages); @@ -90,12 +89,10 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_success() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](2); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); signedMessages[1] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_2 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_2 }); bytes32[] memory expectedFinalHashes = _calculateFinalHashes(signedMessages); @@ -113,8 +110,7 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_singleMessage() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes32[] memory expectedFinalHashes = _calculateFinalHashes(signedMessages); @@ -152,16 +148,14 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_duplicateMessageHashes() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](3); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); signedMessages[1] = BridgeValidator.SignedMessage({ outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 // Duplicate }); signedMessages[2] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_2 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_2 }); bytes32[] memory expectedFinalHashes = _calculateFinalHashes(signedMessages); @@ -181,8 +175,7 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_revertsOnInvalidSignatureLength() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); // Create signature with invalid length (64 bytes instead of 65) @@ -195,8 +188,7 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_revertsWhenPartnerThresholdNotMet() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); address testOracle = vm.addr(77); @@ -219,8 +211,7 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_revertsOnEmptySignature() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); vm.expectRevert(BridgeValidator.BaseThresholdNotMet.selector); @@ -230,8 +221,7 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_anyoneCanCallWithValidSigs() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes32[] memory expectedFinalHashes = _calculateFinalHashes(signedMessages); @@ -246,8 +236,7 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_revertsOnDuplicateSigners() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes32[] memory finalHashes = _calculateFinalHashes(signedMessages); @@ -265,8 +254,7 @@ contract BridgeValidatorTest is CommonTest { function test_registerMessages_revertsOnUnsortedSigners() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes32[] memory finalHashes = _calculateFinalHashes(signedMessages); @@ -305,8 +293,7 @@ contract BridgeValidatorTest is CommonTest { // Prepare a single message BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); bytes32[] memory finalHashes = _calculateFinalHashes(signedMessages); bytes memory signedHash = abi.encode(finalHashes); @@ -359,8 +346,7 @@ contract BridgeValidatorTest is CommonTest { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); // Calculate final hashes with the validator's current nonce @@ -387,8 +373,7 @@ contract BridgeValidatorTest is CommonTest { // Prepare a single message BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); // Compute final hash using the proxy's current nonce @@ -443,16 +428,13 @@ contract BridgeValidatorTest is CommonTest { assertEq(bridgeValidator.nextNonce(), 0); BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](3); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); signedMessages[1] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_2 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_2 }); signedMessages[2] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_3 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_3 }); bridgeValidator.registerMessages(signedMessages, _getValidatorSigs(signedMessages)); assertEq(bridgeValidator.nextNonce(), 3); @@ -471,12 +453,10 @@ contract BridgeValidatorTest is CommonTest { function test_validMessages_afterRegistration() public { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](2); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_1 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_1 }); signedMessages[1] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: TEST_MESSAGE_HASH_2 + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: TEST_MESSAGE_HASH_2 }); bytes32[] memory expectedFinalHashes = _calculateFinalHashes(signedMessages); @@ -500,8 +480,7 @@ contract BridgeValidatorTest is CommonTest { new BridgeValidator.SignedMessage[](innerMessageHashes.length); for (uint256 i; i < innerMessageHashes.length; i++) { signedMessages[i] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: innerMessageHashes[i] + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: innerMessageHashes[i] }); } diff --git a/base/test/CommonTest.t.sol b/base/test/CommonTest.t.sol index d2756ec..6646746 100644 --- a/base/test/CommonTest.t.sol +++ b/base/test/CommonTest.t.sol @@ -43,8 +43,7 @@ contract CommonTest is Test { { BridgeValidator.SignedMessage[] memory signedMessages = new BridgeValidator.SignedMessage[](1); signedMessages[0] = BridgeValidator.SignedMessage({ - outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, - innerMessageHash: MessageLib.getInnerMessageHash(message) + outgoingMessagePubkey: TEST_OUTGOING_MESSAGE, innerMessageHash: MessageLib.getInnerMessageHash(message) }); return signedMessages; } diff --git a/base/test/Twin.t.sol b/base/test/Twin.t.sol index 209a7de..17216c2 100644 --- a/base/test/Twin.t.sol +++ b/base/test/Twin.t.sol @@ -97,10 +97,7 @@ contract TwinTest is Test { // Create a call to execute the above call (recursive call) Call memory selfCall = Call({ - ty: CallType.Call, - to: address(twin), - value: 0, - data: abi.encodeWithSelector(Twin.execute.selector, call) + ty: CallType.Call, to: address(twin), value: 0, data: abi.encodeWithSelector(Twin.execute.selector, call) }); vm.prank(bridge); diff --git a/base/test/libraries/MessageStorageLib.t.sol b/base/test/libraries/MessageStorageLib.t.sol index 8df1b9f..9a04191 100644 --- a/base/test/libraries/MessageStorageLib.t.sol +++ b/base/test/libraries/MessageStorageLib.t.sol @@ -215,8 +215,7 @@ contract MessageStorageLibTest is Test { // Arrange & Act for (uint256 i = 1; i <= 3; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -230,8 +229,7 @@ contract MessageStorageLibTest is Test { // Arrange & Act for (uint256 i = 1; i <= 4; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -245,8 +243,7 @@ contract MessageStorageLibTest is Test { // Arrange & Act for (uint256 i = 1; i <= 8; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -264,8 +261,7 @@ contract MessageStorageLibTest is Test { // Arrange for (uint256 i = 1; i <= 3; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("data", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("data", i))) }); } @@ -354,8 +350,7 @@ contract MessageStorageLibTest is Test { // Act & Assert for (uint256 i = 0; i < numLeaves; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("data", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("data", i))) }); bytes32 currentRoot = _getRoot(); @@ -380,8 +375,7 @@ contract MessageStorageLibTest is Test { // Act & Assert for (uint256 i = 0; i < 5; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("data", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("data", i))) }); uint256 currentNodeCount = _getNodeCount(); @@ -456,8 +450,7 @@ contract MessageStorageLibTest is Test { // Act for (uint256 i = 0; i < messageCount; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("message", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("message", i))) }); } @@ -473,8 +466,7 @@ contract MessageStorageLibTest is Test { for (uint256 i = 0; i < numLeaves; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -535,8 +527,7 @@ contract MessageStorageLibTest is Test { // Arrange for (uint256 i = 0; i < 4; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -563,8 +554,7 @@ contract MessageStorageLibTest is Test { // Add 5 leaves to create multiple peaks for (uint256 i = 0; i < 5; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -580,8 +570,7 @@ contract MessageStorageLibTest is Test { // Add 4 leaves to create a complete binary tree for (uint256 i = 0; i < 4; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("leaf", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("leaf", i))) }); } @@ -598,8 +587,7 @@ contract MessageStorageLibTest is Test { // Add 7 leaves to create multiple mountains of different heights for (uint256 i = 0; i < 7; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("mountain", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("mountain", i))) }); } @@ -617,8 +605,7 @@ contract MessageStorageLibTest is Test { // Create MMR with 6 leaves to have multiple peaks for (uint256 i = 0; i < 6; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("peak", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("peak", i))) }); } @@ -659,8 +646,7 @@ contract MessageStorageLibTest is Test { // Add leaves to create multiple peaks for (uint256 i = 0; i < 3; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("peak_test", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("peak_test", i))) }); } @@ -675,8 +661,7 @@ contract MessageStorageLibTest is Test { // Create MMR with 15 leaves (complex structure with multiple mountains) for (uint256 i = 0; i < 15; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("complex", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("complex", i))) }); } @@ -737,8 +722,7 @@ contract MessageStorageLibTest is Test { // Act & Assert for (uint256 i = 0; i < iterations; i++) { MessageStorageLib.sendMessage({ - sender: address(this), - data: _createTestData(string(abi.encodePacked("iteration", i))) + sender: address(this), data: _createTestData(string(abi.encodePacked("iteration", i))) }); assertEq(_getLeafCount(), i + 1, "Leaf count should increment correctly"); } diff --git a/base/test/libraries/SVMBridgeLib.t.sol b/base/test/libraries/SVMBridgeLib.t.sol index cfffc68..eea0167 100644 --- a/base/test/libraries/SVMBridgeLib.t.sol +++ b/base/test/libraries/SVMBridgeLib.t.sol @@ -207,10 +207,7 @@ contract SVMBridgeLibTest is Test { function test_serializeTransfer_wrappedToken_withInstructions() public pure { Transfer memory transfer = Transfer({ - localToken: TEST_LOCAL_TOKEN, - remoteToken: TEST_REMOTE_TOKEN, - to: TEST_TO, - remoteAmount: 123456789 + localToken: TEST_LOCAL_TOKEN, remoteToken: TEST_REMOTE_TOKEN, to: TEST_TO, remoteAmount: 123456789 }); Ix[] memory ixs = new Ix[](3); @@ -248,10 +245,7 @@ contract SVMBridgeLibTest is Test { function test_serializeTransfer_maxAmount() public pure { Transfer memory transfer = Transfer({ - localToken: TEST_LOCAL_TOKEN, - remoteToken: TEST_REMOTE_TOKEN, - to: TEST_TO, - remoteAmount: type(uint64).max + localToken: TEST_LOCAL_TOKEN, remoteToken: TEST_REMOTE_TOKEN, to: TEST_TO, remoteAmount: type(uint64).max }); Ix[] memory ixs = new Ix[](0); @@ -298,10 +292,7 @@ contract SVMBridgeLibTest is Test { for (uint256 i = 0; i < tokenAddresses.length; i++) { Transfer memory transfer = Transfer({ - localToken: tokenAddresses[i], - remoteToken: TEST_REMOTE_TOKEN, - to: TEST_TO, - remoteAmount: 1000 + localToken: tokenAddresses[i], remoteToken: TEST_REMOTE_TOKEN, to: TEST_TO, remoteAmount: 1000 }); Ix[] memory ixs = new Ix[](0);