Skip to content
This repository has been archived by the owner on Aug 26, 2024. It is now read-only.

Store (de)registration messages in contract storage #7

Merged
merged 1 commit into from
Oct 6, 2023
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
23 changes: 10 additions & 13 deletions src/IValidatorRegistry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,16 @@
pragma solidity ^0.8.20;

interface IValidatorRegistry {
function register(
bytes memory registrationMessage,
bytes memory registrationSignature
) external;
struct Update {
bytes message;
bytes signature;
}

function deregister(
bytes memory deregistrationMessage,
bytes memory deregistrationSignature
) external;
function getNumUpdates() external view returns (uint256);

event Registration(bytes registrationMessage, bytes registrationSignature);
event Deregistration(
bytes deregistrationMessage,
bytes deregistrationSignature
);
function getUpdate(uint256 i) external view returns (Update memory);

function update(bytes memory message, bytes memory signature) external;

event Updated(bytes message, bytes signature);
}
21 changes: 11 additions & 10 deletions src/ValidatorRegistry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,18 @@ pragma solidity ^0.8.20;
import "src/IValidatorRegistry.sol";

contract ValidatorRegistry is IValidatorRegistry {
function register(
bytes memory registrationMessage,
bytes memory registrationSignature
) external {
emit Registration(registrationMessage, registrationSignature);
Update[] updates;

function update(bytes memory message, bytes memory signature) external {
updates.push(Update({message: message, signature: signature}));
emit Updated(message, signature);
}

function getNumUpdates() external view returns (uint256) {
return updates.length;
}

function deregister(
bytes memory deregistrationMessage,
bytes memory deregistrationSignature
) external {
emit Deregistration(deregistrationMessage, deregistrationSignature);
function getUpdate(uint256 i) external view returns (Update memory) {
return updates[i];
}
}
53 changes: 38 additions & 15 deletions test/ValidatorRegistry.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,35 +6,58 @@ import "../src/IValidatorRegistry.sol";
import "../src/ValidatorRegistry.sol";

contract ValidatorRegistryTest is Test {
event Registration(bytes registrationMessage, bytes registrationSignature);
event Deregistration(
bytes deregistrationMessage,
bytes deregistrationSignature
);
event Updated(bytes message, bytes signature);

IValidatorRegistry registry;

function setUp() public {
registry = new ValidatorRegistry();
}

function testRegistration() public {
function testUpdate() public {
bytes memory message = bytes("msg");
bytes memory signature = bytes("sig");

vm.expectEmit(address(registry));
emit Registration(message, signature);
emit Updated(message, signature);

registry.register(message, signature);
registry.update(message, signature);
}

function testDeregistration() public {
bytes memory message = bytes("msg");
bytes memory signature = bytes("sig");

vm.expectEmit(address(registry));
emit Deregistration(message, signature);
function testGetters() public {
assertEq(registry.getNumUpdates(), 0);
vm.expectRevert();
registry.getUpdate(0);

IValidatorRegistry.Update memory up1 = IValidatorRegistry.Update({
message: bytes("msg1"),
signature: bytes("sig1")
});
IValidatorRegistry.Update memory up2 = IValidatorRegistry.Update({
message: bytes("msg2"),
signature: bytes("sig1")
});
IValidatorRegistry.Update memory up3 = IValidatorRegistry.Update({
message: bytes("msg3"),
signature: bytes("sig3")
});

registry.update(up1.message, up1.signature);
registry.update(up2.message, up2.signature);
registry.update(up3.message, up3.signature);

assertEq(registry.getNumUpdates(), 3);
assertTrue(cmpUpdates(registry.getUpdate(0), up1));
assertTrue(cmpUpdates(registry.getUpdate(1), up2));
assertTrue(cmpUpdates(registry.getUpdate(2), up3));
vm.expectRevert();
registry.getUpdate(3);
}

registry.deregister(message, signature);
function cmpUpdates(
IValidatorRegistry.Update memory up1,
IValidatorRegistry.Update memory up2
) internal pure returns (bool) {
return keccak256(abi.encode(up1)) == keccak256(abi.encode(up2));
}
}