// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; /// @notice Minimal two-step ownership. abstract contract Owned { address public owner; address public pendingOwner; error NotOwner(); error ZeroOwner(); event OwnershipTransferStarted(address indexed from, address indexed to); event OwnershipTransferred(address indexed from, address indexed to); constructor(address _owner) { if (_owner == address(0)) revert ZeroOwner(); owner = _owner; emit OwnershipTransferred(address(0), _owner); } modifier onlyOwner() { if (msg.sender != owner) revert NotOwner(); _; } function transferOwnership(address to) external onlyOwner { pendingOwner = to; emit OwnershipTransferStarted(owner, to); } function acceptOwnership() external { if (msg.sender != pendingOwner) revert NotOwner(); emit OwnershipTransferred(owner, msg.sender); owner = msg.sender; pendingOwner = address(0); } }