编译器
0.8.19+commit.7dd6d404
文件 1 的 5:IContractExecutor.sol
pragma solidity ^0.8.0;
interface IContractExecutor {
function executeContract(
address target,
bytes calldata callData,
uint256 nativeValue
) external payable returns (bytes memory);
}
文件 2 的 5:IOperators.sol
pragma solidity ^0.8.0;
import { IOwnable } from './IOwnable.sol';
import { IContractExecutor } from './IContractExecutor.sol';
interface IOperators is IOwnable, IContractExecutor {
error NotOperator();
error InvalidOperator();
error OperatorAlreadyAdded();
error NotAnOperator();
error ExecutionFailed();
event OperatorAdded(address indexed operator);
event OperatorRemoved(address indexed operator);
function isOperator(address account) external view returns (bool);
function addOperator(address operator) external;
function removeOperator(address operator) external;
function executeContract(
address target,
bytes calldata callData,
uint256 nativeValue
) external payable returns (bytes memory);
}
文件 3 的 5:IOwnable.sol
pragma solidity ^0.8.0;
interface IOwnable {
error NotOwner();
error InvalidOwner();
error InvalidOwnerAddress();
event OwnershipTransferStarted(address indexed newOwner);
event OwnershipTransferred(address indexed newOwner);
function owner() external view returns (address);
function pendingOwner() external view returns (address);
function transferOwnership(address newOwner) external;
function proposeOwnership(address newOwner) external;
function acceptOwnership() external;
}
文件 4 的 5:Operators.sol
pragma solidity ^0.8.0;
import { IOperators } from '../interfaces/IOperators.sol';
import { Ownable } from './Ownable.sol';
contract Operators is Ownable, IOperators {
mapping(address => bool) public operators;
constructor(address initialOwner) Ownable(initialOwner) {}
modifier onlyOperator() {
if (!operators[msg.sender]) revert NotOperator();
_;
}
function isOperator(address account) external view returns (bool) {
return operators[account];
}
function addOperator(address operator) external onlyOwner {
if (operator == address(0)) revert InvalidOperator();
if (operators[operator]) revert OperatorAlreadyAdded();
operators[operator] = true;
emit OperatorAdded(operator);
}
function removeOperator(address operator) external onlyOwner {
if (operator == address(0)) revert InvalidOperator();
if (!operators[operator]) revert NotAnOperator();
operators[operator] = false;
emit OperatorRemoved(operator);
}
function executeContract(
address target,
bytes calldata callData,
uint256 nativeValue
) external payable onlyOperator returns (bytes memory) {
if (nativeValue == 0) {
nativeValue = msg.value;
}
(bool success, bytes memory data) = target.call{ value: nativeValue }(callData);
if (!success) {
revert ExecutionFailed();
}
return data;
}
receive() external payable {}
}
文件 5 的 5:Ownable.sol
pragma solidity ^0.8.0;
import { IOwnable } from '../interfaces/IOwnable.sol';
abstract contract Ownable is IOwnable {
bytes32 internal constant _OWNER_SLOT = 0x02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c0;
bytes32 internal constant _OWNERSHIP_TRANSFER_SLOT =
0x9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d1;
constructor(address _owner) {
_transferOwnership(_owner);
}
modifier onlyOwner() {
if (owner() != msg.sender) revert NotOwner();
_;
}
function owner() public view returns (address owner_) {
assembly {
owner_ := sload(_OWNER_SLOT)
}
}
function pendingOwner() public view returns (address owner_) {
assembly {
owner_ := sload(_OWNERSHIP_TRANSFER_SLOT)
}
}
function transferOwnership(address newOwner) external virtual onlyOwner {
_transferOwnership(newOwner);
}
function proposeOwnership(address newOwner) external virtual onlyOwner {
if (newOwner == address(0)) revert InvalidOwnerAddress();
emit OwnershipTransferStarted(newOwner);
assembly {
sstore(_OWNERSHIP_TRANSFER_SLOT, newOwner)
}
}
function acceptOwnership() external virtual {
address newOwner = pendingOwner();
if (newOwner != msg.sender) revert InvalidOwner();
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
if (newOwner == address(0)) revert InvalidOwnerAddress();
emit OwnershipTransferred(newOwner);
assembly {
sstore(_OWNER_SLOT, newOwner)
sstore(_OWNERSHIP_TRANSFER_SLOT, 0)
}
}
}
{
"compilationTarget": {
"contracts/utils/Operators.sol": "Operators"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 1000000
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ExecutionFailed","type":"error"},{"inputs":[],"name":"InvalidOperator","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidOwnerAddress","type":"error"},{"inputs":[],"name":"NotAnOperator","type":"error"},{"inputs":[],"name":"NotOperator","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"OperatorAlreadyAdded","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"nativeValue","type":"uint256"}],"name":"executeContract","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"proposeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]