diff --git a/contracts/protocol/switchboard/EVMxSwitchboard.sol b/contracts/protocol/switchboard/EVMxSwitchboard.sol index 0fd6b253..d422f12b 100644 --- a/contracts/protocol/switchboard/EVMxSwitchboard.sol +++ b/contracts/protocol/switchboard/EVMxSwitchboard.sol @@ -266,7 +266,13 @@ contract EVMxSwitchboard is SwitchboardBase { address watcher = _recoverSigner( keccak256( - abi.encodePacked(toBytes32Format(address(this)), chainSlug, oldDigest, newDigest) + abi.encodePacked( + toBytes32Format(address(this)), + chainSlug, + oldDigest, + newDigest, + nonce_ + ) ), signature_ ); diff --git a/contracts/protocol/switchboard/MessageSwitchboard.sol b/contracts/protocol/switchboard/MessageSwitchboard.sol index ee15ea3d..dbacb999 100644 --- a/contracts/protocol/switchboard/MessageSwitchboard.sol +++ b/contracts/protocol/switchboard/MessageSwitchboard.sol @@ -697,7 +697,13 @@ contract MessageSwitchboard is SwitchboardBase, ReentrancyGuard { address watcher = _recoverSigner( keccak256( - abi.encodePacked(toBytes32Format(address(this)), chainSlug, oldDigest, newDigest) + abi.encodePacked( + toBytes32Format(address(this)), + chainSlug, + oldDigest, + newDigest, + nonce_ + ) ), signature_ ); diff --git a/test/protocol/switchboard/EVMxSwitchboard.t.sol b/test/protocol/switchboard/EVMxSwitchboard.t.sol index 5b616e38..ae117217 100644 --- a/test/protocol/switchboard/EVMxSwitchboard.t.sol +++ b/test/protocol/switchboard/EVMxSwitchboard.t.sol @@ -284,18 +284,25 @@ contract EVMxSwitchboardTestBase is Test, Utils { */ function _createAssignTransmitterSignature( DigestParams memory digestParams_, - address newTransmitter_ + address newTransmitter_, + uint256 nonce_ ) internal view returns (bytes memory signature) { // Create old digest with current transmitter (before modification) bytes32 oldDigest = createDigest(digestParams_); - + // Create new digest with new transmitter digestParams_.transmitter = toBytes32Format(newTransmitter_); bytes32 newDigest = createDigest(digestParams_); // Create signature digest with both old and new digests bytes32 signatureDigest = keccak256( - abi.encodePacked(toBytes32Format(address(evmxSwitchboard)), CHAIN_SLUG, oldDigest, newDigest) + abi.encodePacked( + toBytes32Format(address(evmxSwitchboard)), + CHAIN_SLUG, + oldDigest, + newDigest, + nonce_ + ) ); signature = createSignature(signatureDigest, watcherPrivateKey); } @@ -1179,7 +1186,11 @@ contract SocketPayloadIdVerificationTest is EVMxSwitchboardTestBase { assertEq(oldDigest, storedDigest, "Old digest should match stored digest"); // Create signature for new transmitter - bytes memory signature = _createAssignTransmitterSignature(digestParams, newTransmitter); + bytes memory signature = _createAssignTransmitterSignature( + digestParams, + newTransmitter, + nonce + ); // Create new digest for verification digestParams.transmitter = toBytes32Format(newTransmitter); @@ -1229,7 +1240,11 @@ contract SocketPayloadIdVerificationTest is EVMxSwitchboardTestBase { ); // Create signature for new transmitter - bytes memory signature = _createAssignTransmitterSignature(digestParams, newTransmitter); + bytes memory signature = _createAssignTransmitterSignature( + digestParams, + newTransmitter, + nonce + ); // Should revert because old digest doesn't match stored digest vm.prank(getWatcherAddress()); @@ -1271,14 +1286,19 @@ contract SocketPayloadIdVerificationTest is EVMxSwitchboardTestBase { // Create old digest with old transmitter bytes32 oldDigest = createDigest(digestParams); - + // Create new digest with new transmitter digestParams.transmitter = toBytes32Format(newTransmitter); bytes32 newDigest = createDigest(digestParams); // Create signature digest with both old and new digests with non-watcher key bytes32 signatureDigest = keccak256( - abi.encodePacked(toBytes32Format(address(evmxSwitchboard)), CHAIN_SLUG, oldDigest, newDigest) + abi.encodePacked( + toBytes32Format(address(evmxSwitchboard)), + CHAIN_SLUG, + oldDigest, + newDigest + ) ); bytes memory signature = createSignature(signatureDigest, nonWatcherKey); @@ -1320,7 +1340,11 @@ contract SocketPayloadIdVerificationTest is EVMxSwitchboardTestBase { ); // Create signature for new transmitter - bytes memory signature = _createAssignTransmitterSignature(digestParams, newTransmitter); + bytes memory signature = _createAssignTransmitterSignature( + digestParams, + newTransmitter, + nonce + ); // First call succeeds vm.prank(getWatcherAddress()); @@ -1349,7 +1373,8 @@ contract SocketPayloadIdVerificationTest is EVMxSwitchboardTestBase { // Create signature for the new assignment bytes memory signature2 = _createAssignTransmitterSignature( updatedDigestParams, - anotherNewTransmitter + anotherNewTransmitter, + nonce ); vm.prank(getWatcherAddress()); diff --git a/test/protocol/switchboard/MessageSwitchboard.t.sol b/test/protocol/switchboard/MessageSwitchboard.t.sol index 7437580d..d90aa293 100644 --- a/test/protocol/switchboard/MessageSwitchboard.t.sol +++ b/test/protocol/switchboard/MessageSwitchboard.t.sol @@ -517,7 +517,8 @@ contract MessageSwitchboardTest is Test, Utils { */ function _createAssignTransmitterSignature( DigestParams memory digestParams_, - address newTransmitter_ + address newTransmitter_, + uint256 nonce_ ) internal view returns (bytes memory signature) { // Create old digest with current transmitter (before modification) bytes32 oldDigest = createDigest(digestParams_); @@ -532,7 +533,8 @@ contract MessageSwitchboardTest is Test, Utils { toBytes32Format(address(messageSwitchboard)), SRC_CHAIN, oldDigest, - newDigest + newDigest, + nonce_ ) ); signature = createSignature(signatureDigest, watcherPrivateKey); @@ -2446,7 +2448,11 @@ contract MessageSwitchboardTest is Test, Utils { assertEq(oldDigest, storedDigest, "Old digest should match stored digest"); // Create signature for new transmitter - bytes memory signature = _createAssignTransmitterSignature(digestParams, newTransmitter); + bytes memory signature = _createAssignTransmitterSignature( + digestParams, + newTransmitter, + nonce + ); // Create new digest for verification digestParams.transmitter = toBytes32Format(newTransmitter); @@ -2496,7 +2502,11 @@ contract MessageSwitchboardTest is Test, Utils { ); // Create signature for new transmitter - bytes memory signature = _createAssignTransmitterSignature(digestParams, newTransmitter); + bytes memory signature = _createAssignTransmitterSignature( + digestParams, + newTransmitter, + nonce + ); // Should revert because old digest doesn't match stored digest vm.prank(getWatcherAddress()); @@ -2592,7 +2602,11 @@ contract MessageSwitchboardTest is Test, Utils { ); // Create signature for new transmitter - bytes memory signature = _createAssignTransmitterSignature(digestParams, newTransmitter); + bytes memory signature = _createAssignTransmitterSignature( + digestParams, + newTransmitter, + nonce + ); // First call succeeds vm.prank(getWatcherAddress()); @@ -2621,7 +2635,8 @@ contract MessageSwitchboardTest is Test, Utils { // Create signature for the new assignment bytes memory signature2 = _createAssignTransmitterSignature( updatedDigestParams, - anotherNewTransmitter + anotherNewTransmitter, + nonce ); vm.prank(getWatcherAddress());