From e05763852661daaadadc270e1fe01a2dcd78d01a Mon Sep 17 00:00:00 2001 From: Luiz Date: Mon, 23 Feb 2026 10:04:08 -0300 Subject: [PATCH] use Ownable2Step instead of Ownable --- snapshots/verifyBroadcastMessage.json | 12 ++++----- src/contracts/StateProverPointer.sol | 3 ++- ...Pointer.t.sol => StateProverPointer.t.sol} | 26 ++++++++++++++++++- 3 files changed, 33 insertions(+), 8 deletions(-) rename test/{BlockHashProverPointer.t.sol => StateProverPointer.t.sol} (70%) diff --git a/snapshots/verifyBroadcastMessage.json b/snapshots/verifyBroadcastMessage.json index 65cab6e..c913dd7 100644 --- a/snapshots/verifyBroadcastMessage.json +++ b/snapshots/verifyBroadcastMessage.json @@ -1,9 +1,9 @@ { - "EthereumToOptimism": "1639195", - "EthereumToTaikoL2": "1052214", - "LineaL2ToEthereum": "2551776", - "ScrollL2ToEthereum": "1361940", + "EthereumToOptimism": "1639217", + "EthereumToTaikoL2": "1052236", + "LineaL2ToEthereum": "2551798", + "ScrollL2ToEthereum": "1361962", "ScrollToOptimism": "1348688", - "TaikoL2ToEthereum": "1022277", - "ZkSyncL2ToEthereum": "125663" + "TaikoL2ToEthereum": "1022299", + "ZkSyncL2ToEthereum": "125685" } \ No newline at end of file diff --git a/src/contracts/StateProverPointer.sol b/src/contracts/StateProverPointer.sol index e48368c..74fb441 100644 --- a/src/contracts/StateProverPointer.sol +++ b/src/contracts/StateProverPointer.sol @@ -2,6 +2,7 @@ pragma solidity 0.8.30; import {StorageSlot} from "@openzeppelin/contracts/utils/StorageSlot.sol"; +import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IStateProver} from "./interfaces/IStateProver.sol"; import {IStateProverPointer} from "./interfaces/IStateProverPointer.sol"; @@ -13,7 +14,7 @@ bytes32 constant STATE_PROVER_POINTER_SLOT = bytes32(uint256(keccak256("eip7888. /// @dev This contract stores the address and code hash of the current StateProver implementation. /// It enforces version monotonicity to ensure that updates always move to newer versions. /// The code hash is stored in a dedicated storage slot for efficient cross-chain verification. -contract StateProverPointer is IStateProverPointer, Ownable { +contract StateProverPointer is IStateProverPointer, Ownable2Step { address internal _implementationAddress; error NonIncreasingVersion(uint256 newVersion, uint256 oldVersion); diff --git a/test/BlockHashProverPointer.t.sol b/test/StateProverPointer.t.sol similarity index 70% rename from test/BlockHashProverPointer.t.sol rename to test/StateProverPointer.t.sol index f04a90a..8b585cb 100644 --- a/test/BlockHashProverPointer.t.sol +++ b/test/StateProverPointer.t.sol @@ -52,5 +52,29 @@ contract StateProverPointerTest is Test { vm.expectRevert(abi.encodeWithSelector(StateProverPointer.InvalidImplementationAddress.selector)); stateProverPointer.setImplementationAddress(makeAddr("invalid")); } -} + function test_transferOwnership() public { + address newOwner = makeAddr("newOwner"); + vm.prank(owner); + stateProverPointer.transferOwnership(newOwner); + assertEq(stateProverPointer.owner(), owner); + assertEq(stateProverPointer.pendingOwner(), newOwner); + + vm.prank(newOwner); + stateProverPointer.acceptOwnership(); + assertEq(stateProverPointer.owner(), newOwner); + assertEq(stateProverPointer.pendingOwner(), address(0)); + + vm.prank(newOwner); + // transfer ownership back to initial owner + stateProverPointer.transferOwnership(owner); + assertEq(stateProverPointer.owner(), newOwner); + assertEq(stateProverPointer.pendingOwner(), owner); + + // cancel initiated ownership transfer + vm.prank(newOwner); + stateProverPointer.transferOwnership(address(0)); + assertEq(stateProverPointer.owner(), newOwner); + assertEq(stateProverPointer.pendingOwner(), address(0)); + } +}