Skip to content

Commit

Permalink
improve supermajority tests
Browse files Browse the repository at this point in the history
  • Loading branch information
apenzk committed Feb 21, 2025
1 parent 8977bd7 commit fab1857
Showing 1 changed file with 45 additions and 9 deletions.
54 changes: 45 additions & 9 deletions protocol-units/settlement/mcr/contracts/test/settlement/MCR.sol
Original file line number Diff line number Diff line change
Expand Up @@ -272,9 +272,10 @@ contract MCRTest is Test, IMCR {
}


function testDishonestAttester() public {
/// @notice Test that an attester cannot submit multiple commitments for the same height
function testAttesterCannotCommitTwice() public {
// three well-funded signers
(address alice, address bob, address carol) = setupGenesisWithThreeAttesters(34, 33, 33);
(, , address carol) = setupGenesisWithThreeAttesters(1, 1, 1);

// carol will be dishonest
vm.prank(carol);
Expand All @@ -284,23 +285,59 @@ contract MCRTest is Test, IMCR {
vm.prank(carol);
vm.expectRevert(AttesterAlreadyCommitted.selector);
mcr.submitSuperBlockCommitment(newDishonestCommitment(1));
}

// make a block commitment
/// @notice Test that honest supermajority succeeds despite dishonest attesters
function testHonestSupermajoritySucceeds() public {
// Setup with alice+bob having supermajority (67%)
(address alice, address bob, address carol) = setupGenesisWithThreeAttesters(2, 1, 1);

// Dishonest carol submits first
vm.prank(carol);
mcr.submitSuperBlockCommitment(newDishonestCommitment(1));

// Honest majority submits
vm.prank(alice);
mcr.submitSuperBlockCommitment(newHonestCommitment(1));
vm.prank(bob);
vm.prank(bob);
mcr.submitSuperBlockCommitment(newHonestCommitment(1));

// Trigger postconfirmation
// Trigger postconfirmation with majority
vm.prank(alice);
mcr.postconfirmSuperBlocks();

// Verify honest commitment was postconfirmed
MCRStorage.SuperBlockCommitment memory retrievedCommitment = mcr.getPostconfirmedCommitment(1);
assert(retrievedCommitment.commitment == honestCommitmentTemplate);
assert(retrievedCommitment.blockId == honestBlockIdTemplate);
assert(retrievedCommitment.height == 1);
assertEq(retrievedCommitment.commitment, honestCommitmentTemplate);
assertEq(retrievedCommitment.blockId, honestBlockIdTemplate);
assertEq(retrievedCommitment.height, 1);
}


/// @notice Test that no postconfirmation happens when stakes are equal
function testNoPostconfirmationWithEqualStakes() public {
// Setup with equal stakes (no possible supermajority)
(address alice, address bob, address carol) = setupGenesisWithThreeAttesters(1, 1, 1);

// Honnest commitments
vm.prank(alice);
mcr.submitSuperBlockCommitment(newHonestCommitment(1));
vm.prank(bob);
mcr.submitSuperBlockCommitment(newHonestCommitment(1));
// Dishonest commitment
vm.prank(carol);
mcr.submitSuperBlockCommitment(newDishonestCommitment(1));

vm.prank(alice);
mcr.postconfirmSuperBlocks();
assertEq(mcr.getLastPostconfirmedSuperBlockHeight(), 0, "Height should not advance - Alice");
// Verify no commitment was postconfirmed
MCRStorage.SuperBlockCommitment memory retrievedCommitment = mcr.getPostconfirmedCommitment(1);
assertEq(retrievedCommitment.height, 0, "No commitment should be postconfirmed");
assertEq(retrievedCommitment.commitment, bytes32(0), "No commitment should be postconfirmed");
}


function testRollsOverHandlingDishonesty() public {
vm.warp(300 seconds);

Expand Down Expand Up @@ -647,5 +684,4 @@ contract MCRTest is Test, IMCR {
assertEq(mcr.getLastPostconfirmedSuperBlockHeight(), 0);
}


}

0 comments on commit fab1857

Please sign in to comment.