From f59872222a6b32a59504ebe79637332f5e9d8d1c Mon Sep 17 00:00:00 2001 From: snowrugar-beep Date: Wed, 29 Jul 2026 17:14:05 +0100 Subject: [PATCH] perf(access): inline access control checks into unchecked helpers Refactor modifier logic into an internal _checkOwner() view function so that each guarded function reuses a single check routine instead of duplicating the same bytecode at every entry point. Closes #739 --- contracts/access/GasGuardAccess.sol | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 contracts/access/GasGuardAccess.sol diff --git a/contracts/access/GasGuardAccess.sol b/contracts/access/GasGuardAccess.sol new file mode 100644 index 0000000..d8c3e42 --- /dev/null +++ b/contracts/access/GasGuardAccess.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +abstract contract GasGuardAccess { + address public owner; + address public pendingOwner; + + error Unauthorized(); + error ZeroAddress(); + error AlreadySet(); + + event OwnershipTransferStarted(address indexed from, address indexed to); + + constructor(address owner_) { + if (owner_ == address(0)) revert ZeroAddress(); + owner = owner_; + } + + function _checkOwner() internal view { + if (msg.sender != owner) revert Unauthorized(); + } + + modifier onlyOwner() { + _checkOwner(); + _; + } + + function transferOwnership(address newOwner) external onlyOwner { + if (newOwner == address(0)) revert ZeroAddress(); + pendingOwner = newOwner; + emit OwnershipTransferStarted(owner, newOwner); + } + + function acceptOwnership() external { + if (msg.sender != pendingOwner) revert Unauthorized(); + owner = pendingOwner; + pendingOwner = address(0); + } +}