Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions src/SequencerSetPublisher.sol
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ contract SequencerSetPublisher is
using ECDSA for bytes32;
using MessageHashUtils for bytes32;

mapping(uint256 height => SequencerSetUpdateWitness) public sequencerSetUpdateWitnesses;
mapping(uint256 height => SequencerSetUpdateWitness[]) private _sequencerSetUpdateWitnesses;
mapping(uint256 height => mapping(bytes32 pubkeyHash => bool)) private _hasWitness;

function initialize(
address initialOwner
Expand All @@ -40,11 +41,18 @@ contract SequencerSetPublisher is
) external override {
BtcUtils.verifyBtcSignature(witness.sigHash, witness.btcPubkey, witness.btcSig);

// Avoid double commit
if (sequencerSetUpdateWitnesses[goatHeight].sigHash != bytes32(0)) {
bytes32 pubkeyHash = keccak256(witness.btcPubkey);
if (_hasWitness[goatHeight][pubkeyHash]) {
revert DoubleCommit();
}

sequencerSetUpdateWitnesses[goatHeight] = witness;
_hasWitness[goatHeight][pubkeyHash] = true;
_sequencerSetUpdateWitnesses[goatHeight].push(witness);
}

function getSequencerSetUpdateWitnesses(
uint256 goatHeight
) external view override returns (SequencerSetUpdateWitness[] memory) {
return _sequencerSetUpdateWitnesses[goatHeight];
}
}
4 changes: 4 additions & 0 deletions src/interfaces/ISequencerSetPublisher.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,8 @@ interface ISequencerSetPublisher {
uint256 goatHeight,
SequencerSetUpdateWitness calldata witness
) external;

function getSequencerSetUpdateWitnesses(
uint256 goatHeight
) external view returns (SequencerSetUpdateWitness[] memory);
}
40 changes: 40 additions & 0 deletions test/SequencerSetPublisher.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -255,4 +255,44 @@ contract SequencerSetPublisherTest is Test {
keccak256("set5")
);
}

function testMultipleWitnesses() public {
uint256 height = 100;
bytes32 sigHash = keccak256("commit_multi");

// Witness 1 (pk=11)
run_sequencer_update_test(
batch, // contains 11
batch,
height,
sigHash,
bytes32(0),
bytes32(0)
);

// Witness 2 (pk=21)
run_sequencer_update_test(
batch1, // contains 21
batch1,
height,
sigHash,
bytes32(0),
bytes32(0)
);

// Check if we have 2 witnesses
ISequencerSetPublisher.SequencerSetUpdateWitness[] memory witnesses = sspublisher.getSequencerSetUpdateWitnesses(height);
assertEq(witnesses.length, 2);

// Try adding Witness 1 again (should fail)
vm.expectRevert(ISequencerSetPublisher.DoubleCommit.selector);
run_sequencer_update_test(
batch,
batch,
height,
sigHash,
bytes32(0),
bytes32(0)
);
}
}