Skip to content
Open
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
4 changes: 4 additions & 0 deletions src/contracts/StateProverPointer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ contract StateProverPointer is IStateProverPointer, Ownable {

_implementationAddress = _newImplementationAddress;
_setCodeHash(_newImplementationAddress.codehash);

emit ImplementationAddressSet(
newVersion, _newImplementationAddress, _newImplementationAddress.codehash, currentImplementationAddress
);
}

function _setCodeHash(bytes32 _codeHash) internal {
Expand Down
9 changes: 9 additions & 0 deletions src/contracts/interfaces/IStateProverPointer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,15 @@ pragma solidity 0.8.30;
/// If the pointer's prover is updated, the new prover MUST have a higher IStateProver::version() than the old one.
/// These pointers are always referred to by their address on their home chain.
interface IStateProverPointer {
/// @notice Emitted when the pointer is set to a new implementation.
/// MUST be emitted when the pointer is set
event ImplementationAddressSet(
uint256 indexed newVersion,
address indexed newImplementationAddress,
bytes32 indexed newCodeHash,
address oldImplementationAddress
);

/// @notice Return the code hash of the latest version of the prover.
function implementationCodeHash() external view returns (bytes32);

Expand Down
4 changes: 4 additions & 0 deletions test/Receiver.ethereum.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(parentToChildProver), address(parentToChildProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(parentToChildProver));

bytes32 message = 0x0000000000000000000000000000000000000000000000000000000074657374; // "test"
Expand Down
60 changes: 60 additions & 0 deletions test/Receiver.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(childToParentProver), address(childToParentProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(childToParentProver));

bytes32 message = 0x0000000000000000000000000000000000000000000000000000000074657374; // "test"
Expand Down Expand Up @@ -184,6 +188,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(parentToChildProver), address(parentToChildProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(parentToChildProver));

bytes32 message = 0x0000000000000000000000000000000000000000000000000000000074657374; // "test"
Expand Down Expand Up @@ -256,6 +264,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(childToParentProver), address(childToParentProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(childToParentProver));

bytes32 message = 0x0000000000000000000000000000000000000000000000000000000074657374; // "test"
Expand Down Expand Up @@ -330,6 +342,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(childToParentProver), address(childToParentProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(childToParentProver));

uint256 expectedSlot = uint256(keccak256("eip7888.pointer.slot")) - 1;
Expand Down Expand Up @@ -403,6 +419,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(childToParentProver), address(childToParentProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(childToParentProver));

uint256 expectedSlot = uint256(keccak256("eip7888.pointer.slot")) - 1;
Expand Down Expand Up @@ -464,6 +484,10 @@ contract ReceiverTest is Test {
address arbParentToChildProverPointerAddress;

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(childToParentProver), address(childToParentProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(childToParentProver));
// Update the Arbitrum Prover (ParentToChildProver) copy on OP chain
{
Expand Down Expand Up @@ -619,6 +643,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(childToParentProver), address(childToParentProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(childToParentProver));

uint256 expectedSlot = uint256(keccak256("eip7888.pointer.slot")) - 1;
Expand Down Expand Up @@ -696,6 +724,10 @@ contract ReceiverTest is Test {
address arbParentToChildProverPointerAddress;

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(childToParentProver), address(childToParentProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(childToParentProver));
// Update the Arbitrum Prover (ParentToChildProver) copy on ZKSync chain
{
Expand Down Expand Up @@ -847,6 +879,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(childToParentProver), address(childToParentProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(childToParentProver));

uint256 expectedSlot = uint256(keccak256("eip7888.pointer.slot")) - 1;
Expand Down Expand Up @@ -924,6 +960,10 @@ contract ReceiverTest is Test {
address arbParentToChildProverPointerAddress;

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(childToParentProver), address(childToParentProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(childToParentProver));
// Update the Arbitrum Prover (ParentToChildProver) copy on Linea chain
{
Expand Down Expand Up @@ -1075,6 +1115,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(childToParentProver), address(childToParentProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(childToParentProver));

uint256 expectedSlot = uint256(keccak256("eip7888.pointer.slot")) - 1;
Expand Down Expand Up @@ -1152,6 +1196,10 @@ contract ReceiverTest is Test {
address arbParentToChildProverPointerAddress;

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(childToParentProver), address(childToParentProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(childToParentProver));
// Update the Arbitrum Prover (ParentToChildProver) copy on Scroll chain
{
Expand Down Expand Up @@ -1309,6 +1357,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(parentToChildProver), address(parentToChildProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(parentToChildProver));

// Load the E2E proof data
Expand Down Expand Up @@ -1365,6 +1417,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(parentToChildProver), address(parentToChildProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(parentToChildProver));

// Load the E2E proof data
Expand Down Expand Up @@ -1443,6 +1499,10 @@ contract ReceiverTest is Test {
StateProverPointer stateProverPointer = new StateProverPointer(owner);

vm.prank(owner);
vm.expectEmit();
emit IStateProverPointer.ImplementationAddressSet(
1, address(parentToChildProver), address(parentToChildProver).codehash, address(0)
);
stateProverPointer.setImplementationAddress(address(parentToChildProver));

// Read the SMT proof data
Expand Down