Files
openzeppelin-contracts/contracts/access/Ownable.sol

92 lines
2.8 KiB
Solidity

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev 合约模块,提供基本的访问控制机制,其中有一个账户(所有者)可以被授予对特定函数的独占访问权限。
*
* 初始所有者设置为部署者提供的地址。这可以稍后通过 {transferOwnership} 更改。
*
* 此模块通过继承使用。它将提供修饰符 `onlyOwner`,可以应用于您的函数以限制它们仅供所有者使用。
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev 调用者账户未被授权执行操作。
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev 所有者不是有效的所有者账户。(例如 `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev 初始化合约,将部署者提供的地址设置为初始所有者。
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev 如果由所有者以外的任何账户调用则抛出异常。
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev 返回当前所有者的地址。
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev 如果发送者不是所有者则抛出异常。
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev 使合约没有所有者。将无法调用 `onlyOwner` 函数。只能由当前所有者调用。
*
* 注意:放弃所有权将使合约没有所有者,从而禁用仅对所有者可用的任何功能。
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev 将合约的所有权转移给新账户 (`newOwner`)。只能由当前所有者调用。
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev 将合约的所有权转移给新账户 (`newOwner`)。内部函数,无访问限制。
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}