编译器
0.8.18+commit.87f61d96
文件 1 的 4:Configuration.sol
pragma solidity 0.8.18;
import "./interfaces/IConfiguration.sol";
import "./OwnerController.sol";
contract Configuration is IConfiguration, OwnerController {
mapping(bytes32 => uint256) private _data;
mapping(address => mapping(bytes32 => uint256)) _overrides;
function setUint256(
bytes32 key,
uint256 value
) external override onlyController {
_data[key] = value;
emit ParameterUpdated(key, value);
}
function setAddress(
bytes32 key,
address value
) external override onlyController {
_data[key] = uint256(uint160(value));
emit ParameterUpdated(key, value);
}
function setAddressUint96(
bytes32 key,
address value0,
uint96 value1
) external override onlyController {
uint256 val = uint256(uint160(value0));
val |= uint256(value1) << 160;
_data[key] = val;
emit ParameterUpdated(key, value0, value1);
}
function getUint256(bytes32 key) external view override returns (uint256) {
if (_overrides[msg.sender][key] > 0) return _overrides[msg.sender][key];
return _data[key];
}
function getAddress(bytes32 key) external view override returns (address) {
if (_overrides[msg.sender][key] > 0)
return address(uint160(_overrides[msg.sender][key]));
return address(uint160(_data[key]));
}
function getAddressUint96(
bytes32 key
) external view override returns (address, uint96) {
uint256 val = _overrides[msg.sender][key] > 0
? _overrides[msg.sender][key]
: _data[key];
return (address(uint160(val)), uint96(val >> 160));
}
function overrideUint256(
address caller,
bytes32 key,
uint256 value
) external override onlyController {
_overrides[caller][key] = value;
emit ParameterOverridden(caller, key, value);
}
function overrideAddress(
address caller,
bytes32 key,
address value
) external override onlyController {
uint256 val = uint256(uint160(value));
_overrides[caller][key] = val;
emit ParameterOverridden(caller, key, value);
}
function overrideAddressUint96(
address caller,
bytes32 key,
address value0,
uint96 value1
) external override onlyController {
uint256 val = uint256(uint160(value0));
val |= uint256(value1) << 160;
_overrides[caller][key] = val;
emit ParameterOverridden(caller, key, value0, value1);
}
}
文件 2 的 4:IConfiguration.sol
pragma solidity 0.8.18;
interface IConfiguration {
event ParameterUpdated(bytes32 indexed key, address value);
event ParameterUpdated(bytes32 indexed key, uint256 value);
event ParameterUpdated(bytes32 indexed key, address value0, uint96 value1);
event ParameterOverridden(
address indexed caller,
bytes32 indexed key,
address value
);
event ParameterOverridden(
address indexed caller,
bytes32 indexed key,
uint256 value
);
event ParameterOverridden(
address indexed caller,
bytes32 indexed key,
address value0,
uint96 value1
);
function setUint256(bytes32 key, uint256 value) external;
function setAddress(bytes32 key, address value) external;
function setAddressUint96(
bytes32 key,
address value0,
uint96 value1
) external;
function getUint256(bytes32 key) external view returns (uint256);
function getAddress(bytes32 key) external view returns (address);
function getAddressUint96(
bytes32 key
) external view returns (address, uint96);
function overrideUint256(
address caller,
bytes32 key,
uint256 value
) external;
function overrideAddress(
address caller,
bytes32 key,
address value
) external;
function overrideAddressUint96(
address caller,
bytes32 key,
address value0,
uint96 value1
) external;
}
文件 3 的 4:IOwnerController.sol
pragma solidity 0.8.18;
interface IOwnerController {
function owner() external view returns (address);
function controller() external view returns (address);
function transferOwnership(address newOwner) external;
function transferControl(address newController) external;
}
文件 4 的 4:OwnerController.sol
pragma solidity 0.8.18;
import "./interfaces/IOwnerController.sol";
contract OwnerController is IOwnerController {
address private _owner;
address private _controller;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
event ControlTransferred(
address indexed previousController,
address indexed newController
);
constructor() {
_owner = msg.sender;
_controller = msg.sender;
emit OwnershipTransferred(address(0), _owner);
emit ControlTransferred(address(0), _owner);
}
function owner() public view override returns (address) {
return _owner;
}
function controller() public view override returns (address) {
return _controller;
}
modifier onlyOwner() {
require(_owner == msg.sender, "oc1");
_;
}
modifier onlyController() {
require(_controller == msg.sender, "oc2");
_;
}
function requireOwner() internal view {
require(_owner == msg.sender, "oc1");
}
function requireController() internal view {
require(_controller == msg.sender, "oc2");
}
function transferOwnership(address newOwner) public virtual override {
requireOwner();
require(newOwner != address(0), "oc3");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
function transferControl(address newController) public virtual override {
requireOwner();
require(newController != address(0), "oc4");
emit ControlTransferred(_controller, newController);
_controller = newController;
}
}
{
"compilationTarget": {
"contracts/Configuration.sol": "Configuration"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 10000
},
"remappings": []
}
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousController","type":"address"},{"indexed":true,"internalType":"address","name":"newController","type":"address"}],"name":"ControlTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"address","name":"value","type":"address"}],"name":"ParameterOverridden","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ParameterOverridden","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"address","name":"value0","type":"address"},{"indexed":false,"internalType":"uint96","name":"value1","type":"uint96"}],"name":"ParameterOverridden","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"address","name":"value","type":"address"}],"name":"ParameterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ParameterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"address","name":"value0","type":"address"},{"indexed":false,"internalType":"uint96","name":"value1","type":"uint96"}],"name":"ParameterUpdated","type":"event"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getAddressUint96","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getUint256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"value","type":"address"}],"name":"overrideAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"value0","type":"address"},{"internalType":"uint96","name":"value1","type":"uint96"}],"name":"overrideAddressUint96","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"overrideUint256","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"value","type":"address"}],"name":"setAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"address","name":"value0","type":"address"},{"internalType":"uint96","name":"value1","type":"uint96"}],"name":"setAddressUint96","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setUint256","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newController","type":"address"}],"name":"transferControl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]