diff --git a/contracts/socket/SocketBatcher.sol b/contracts/socket/SocketBatcher.sol index 0d00c044..a0606443 100644 --- a/contracts/socket/SocketBatcher.sol +++ b/contracts/socket/SocketBatcher.sol @@ -58,7 +58,6 @@ contract SocketBatcher is AccessControl { */ struct AttestRequest { bytes32 packetId; - uint32 srcChainSlug; bytes signature; } @@ -306,7 +305,6 @@ contract SocketBatcher is AccessControl { for (uint256 index = 0; index < attestRequestslength; ) { FastSwitchboard(switchBoardAddress_).attest( attestRequests_[index].packetId, - attestRequests_[index].srcChainSlug, attestRequests_[index].signature ); unchecked { diff --git a/contracts/switchboard/default-switchboards/FastSwitchboard.sol b/contracts/switchboard/default-switchboards/FastSwitchboard.sol index 2613ce5e..d6e92a88 100644 --- a/contracts/switchboard/default-switchboards/FastSwitchboard.sol +++ b/contracts/switchboard/default-switchboards/FastSwitchboard.sol @@ -62,29 +62,29 @@ contract FastSwitchboard is SwitchboardBase { /** * @dev Function to attest a packet * @param packetId_ Packet ID - * @param srcChainSlug_ Chain slug of the source chain * @param signature_ Signature of the packet */ function attest( bytes32 packetId_, - uint32 srcChainSlug_, bytes calldata signature_ ) external { + + uint32 srcChainSlug = uint32(uint256(packetId_) >> 224); address watcher = SignatureVerifierLib.recoverSignerFromDigest( keccak256( - abi.encode(address(this), srcChainSlug_, chainSlug, packetId_) + abi.encode(address(this), srcChainSlug, chainSlug, packetId_) ), signature_ ); if (isAttested[watcher][packetId_]) revert AlreadyAttested(); - if (!_hasRoleWithSlug(WATCHER_ROLE, srcChainSlug_, watcher)) + if (!_hasRoleWithSlug(WATCHER_ROLE, srcChainSlug, watcher)) revert WatcherNotFound(); isAttested[watcher][packetId_] = true; attestations[packetId_]++; - if (attestations[packetId_] >= totalWatchers[srcChainSlug_]) + if (attestations[packetId_] >= totalWatchers[srcChainSlug]) isPacketValid[packetId_] = true; emit PacketAttested(packetId_, watcher); diff --git a/test/Setup.t.sol b/test/Setup.t.sol index 3df729b3..65d45c1e 100644 --- a/test/Setup.t.sol +++ b/test/Setup.t.sol @@ -488,7 +488,6 @@ contract Setup is Test { // attest with packetId_, srcSlug and signature FastSwitchboard(switchboardAddress).attest( packetId_, - srcSlug, attestSignature ); } diff --git a/test/switchboard/default-switchboards/FastSwitchboard.t.sol b/test/switchboard/default-switchboards/FastSwitchboard.t.sol index 0651672c..d58ed8a3 100644 --- a/test/switchboard/default-switchboards/FastSwitchboard.t.sol +++ b/test/switchboard/default-switchboards/FastSwitchboard.t.sol @@ -5,7 +5,7 @@ import "../../Setup.t.sol"; contract FastSwitchboardTest is Setup { bool isFast = true; - uint32 immutable remoteChainSlug = uint32(uint256(2)); + uint32 immutable remoteChainSlug = uint32(2); bytes32 immutable packetId = bytes32(0); address watcher; address altWatcher; @@ -26,7 +26,7 @@ contract FastSwitchboardTest is Setup { function setUp() external { initialise(); - _a.chainSlug = uint32(uint256(1)); + _a.chainSlug = uint32(1); vm.startPrank(_socketOwner); fastSwitchboard = new FastSwitchboard( @@ -106,7 +106,7 @@ contract FastSwitchboardTest is Setup { vm.expectEmit(false, false, false, true); emit PacketAttested(packetId, watcher); - fastSwitchboard.attest(packetId, remoteChainSlug, sig); + fastSwitchboard.attest(packetId, sig); assertTrue(fastSwitchboard.isAttested(watcher, packetId)); } @@ -125,12 +125,12 @@ contract FastSwitchboardTest is Setup { vm.expectEmit(false, false, false, true); emit PacketAttested(packetId, watcher); - fastSwitchboard.attest(packetId, remoteChainSlug, sig); + fastSwitchboard.attest(packetId, sig); assertTrue(fastSwitchboard.isAttested(watcher, packetId)); vm.expectRevert(AlreadyAttested.selector); - fastSwitchboard.attest(packetId, remoteChainSlug, sig); + fastSwitchboard.attest(packetId, sig); } function testIsAllowed() external { @@ -144,7 +144,7 @@ contract FastSwitchboardTest is Setup { ); bytes memory sig = _createSignature(digest, _watcherPrivateKey); - fastSwitchboard.attest(packetId, remoteChainSlug, sig); + fastSwitchboard.attest(packetId, sig); digest = keccak256( abi.encode( @@ -156,7 +156,7 @@ contract FastSwitchboardTest is Setup { ); sig = _createSignature(digest, _altWatcherPrivateKey); - fastSwitchboard.attest(packetId, remoteChainSlug, sig); + fastSwitchboard.attest(packetId, sig); uint256 proposeTime = block.timestamp - fastSwitchboard.timeoutInSeconds(); @@ -344,6 +344,26 @@ contract FastSwitchboardTest is Setup { bytes memory sig = "0x121234323123232323"; vm.expectRevert(InvalidSigLength.selector); - fastSwitchboard.attest(packetId, remoteChainSlug, sig); + fastSwitchboard.attest(packetId, sig); + } + + + function testAttesterCantAttestAllChains() public { + + // Packet is coming from a chain different from remoteChainSlug + bytes32 altPacketId = bytes32(uint256(100)<<224); + + bytes32 digest = keccak256( + abi.encode( + address(fastSwitchboard), + remoteChainSlug, + _a.chainSlug, + altPacketId + ) + ); + bytes memory sig = _createSignature(digest, _watcherPrivateKey); + + vm.expectRevert(WatcherNotFound.selector); + fastSwitchboard.attest(altPacketId, sig); } }