92 lines
2.8 KiB
Solidity
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);
|
|
}
|
|
}
|