文件 1 的 68:Address.sol
pragma solidity ^0.8.0;
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 2 的 68:AddressUpgradeable.sol
pragma solidity ^0.8.0;
library AddressUpgradeable {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 3 的 68:AllowChild.sol
pragma solidity ^0.8.9;
import "./AllowParent.sol";
contract AllowChild is AllowParent {
function shouldBeAllowed(bytes memory data) public {
internalDelegateCall(data);
}
}
文件 4 的 68:AllowChildCallTransitive.sol
pragma solidity ^0.8.9;
import "./AllowReachableParentCall.sol";
contract AllowChildCallTransitive is AllowReachableParentCall {
function myfunction(bytes memory data) internal {
allowed(data);
}
}
文件 5 的 68:AllowChildInheritedTransitive.sol
pragma solidity ^0.8.9;
import "./TransitiveAllowReachable.sol";
contract AllowChildInheritedTransitive is TransitiveAllowReachable {
}
文件 6 的 68:AllowChildSelfReachable.sol
pragma solidity ^0.8.9;
import "./AllowParentSelfReachable.sol";
contract AllowChildSelfReachable is AllowParentSelfReachable {
function shouldBeAllowed(bytes memory data) public {
internalDelegateCall(data);
}
}
文件 7 的 68:AllowParent.sol
pragma solidity ^0.8.9;
contract AllowParent {
function internalDelegateCall(
bytes memory data
) internal returns (bytes memory) {
(, bytes memory returndata) = address(this).delegatecall(data);
return returndata;
}
}
文件 8 的 68:AllowParentSelfReachable.sol
pragma solidity ^0.8.9;
contract AllowParentSelfReachable {
function internalDelegateCall(
bytes memory data
) internal returns (bytes memory) {
(, bytes memory returndata) = address(this).delegatecall(data);
return returndata;
}
}
文件 9 的 68:AllowReachable.sol
pragma solidity ^0.8.9;
import "./TransitiveRiskyLibrary.sol";
contract AllowReachable {
function unsafe(bytes memory data) public {
TransitiveRiskyLibrary.internalDelegateCall(address(this), data);
}
}
文件 10 的 68:AllowReachableParent.sol
pragma solidity ^0.8.9;
import "./TransitiveUnsafeParent.sol";
contract AllowReachableParent is TransitiveUnsafeParent {
}
文件 11 的 68:AllowReachableParentCall.sol
pragma solidity ^0.8.9;
import "./RiskyParentContract.sol";
contract AllowReachableParentCall is RiskyParentContract {
function allowed(bytes memory data) internal {
internalDelegateCall(address(this), data);
}
}
文件 12 的 68:BeaconProxy.sol
pragma solidity ^0.8.0;
import "./IBeacon.sol";
import "../Proxy.sol";
import "../ERC1967/ERC1967Upgrade.sol";
contract BeaconProxy is Proxy, ERC1967Upgrade {
constructor(address beacon, bytes memory data) payable {
assert(_BEACON_SLOT == bytes32(uint256(keccak256("eip1967.proxy.beacon")) - 1));
_upgradeBeaconToAndCall(beacon, data, false);
}
function _beacon() internal view virtual returns (address) {
return _getBeacon();
}
function _implementation() internal view virtual override returns (address) {
return IBeacon(_getBeacon()).implementation();
}
function _setBeacon(address beacon, bytes memory data) internal virtual {
_upgradeBeaconToAndCall(beacon, data, false);
}
}
文件 13 的 68:Constructors.sol
pragma solidity ^0.8.9;
abstract contract UnsafeParent {
constructor(bytes memory data) {
msg.sender.delegatecall(data);
}
}
contract UnsafeChild1 is UnsafeParent {
constructor() UnsafeParent('') {}
function foo1(uint x) public {}
}
contract UnsafeChild2 is UnsafeParent('') {
function foo2(uint x) public {}
}
abstract contract UnsafeParentNoArgs {
constructor() {
msg.sender.delegatecall('');
}
}
contract UnsafeChild3 is UnsafeParentNoArgs {
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() UnsafeParentNoArgs() {}
function foo3(uint x) public {}
}
contract UnsafeChild4 is UnsafeParentNoArgs {
function foo4(uint x) public {}
}
/**
* @custom:oz-upgrades-unsafe-allow delegatecall
*/
abstract contract AllowParentNoArgs {
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
msg.sender.delegatecall('');
}
}
contract AllowChild5 is AllowParentNoArgs {
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() AllowParentNoArgs() {}
function foo5(uint x) public {}
}
contract AllowChild6 is AllowParentNoArgs {
function foo6(uint x) public {}
}
/**
* allow has no effect because the delegatecall is in a parent function
*
* @custom:oz-upgrades-unsafe-allow delegatecall
*/
contract UnsafeAllowChild7 is UnsafeParentNoArgs {
function foo7(uint x) public {}
}
/**
* @custom:oz-upgrades-unsafe-allow-reachable delegatecall
*/
contract AllowReachableChild8 is UnsafeParentNoArgs {
function foo8(uint x) public {}
}
abstract contract UnsafeFunctions {
function unsafe() internal {
msg.sender.delegatecall('');
}
}
contract UnsafeChild9 is UnsafeFunctions {
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
unsafe();
}
function foo9(uint x) public {}
}
文件 14 的 68:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this;
return msg.data;
}
}
文件 15 的 68:ERC1967Proxy.sol
pragma solidity ^0.8.0;
import "../Proxy.sol";
import "./ERC1967Upgrade.sol";
contract ERC1967Proxy is Proxy, ERC1967Upgrade {
constructor(address _logic, bytes memory _data) payable {
assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
_upgradeToAndCall(_logic, _data, false);
}
function _implementation() internal view virtual override returns (address impl) {
return ERC1967Upgrade._getImplementation();
}
}
文件 16 的 68:ERC1967Upgrade.sol
pragma solidity ^0.8.2;
import "../beacon/IBeacon.sol";
import "../../utils/Address.sol";
import "../../utils/StorageSlot.sol";
abstract contract ERC1967Upgrade {
bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
event Upgraded(address indexed implementation);
function _getImplementation() internal view returns (address) {
return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
}
function _setImplementation(address newImplementation) private {
require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
}
function _upgradeTo(address newImplementation) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
if (data.length > 0 || forceCall) {
Address.functionDelegateCall(newImplementation, data);
}
}
function _upgradeToAndCallSecure(address newImplementation, bytes memory data, bool forceCall) internal {
address oldImplementation = _getImplementation();
_setImplementation(newImplementation);
if (data.length > 0 || forceCall) {
Address.functionDelegateCall(newImplementation, data);
}
StorageSlot.BooleanSlot storage rollbackTesting = StorageSlot.getBooleanSlot(_ROLLBACK_SLOT);
if (!rollbackTesting.value) {
rollbackTesting.value = true;
Address.functionDelegateCall(
newImplementation,
abi.encodeWithSignature(
"upgradeTo(address)",
oldImplementation
)
);
rollbackTesting.value = false;
require(oldImplementation == _getImplementation(), "ERC1967Upgrade: upgrade breaks further upgrades");
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
}
function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {
_setBeacon(newBeacon);
emit BeaconUpgraded(newBeacon);
if (data.length > 0 || forceCall) {
Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
}
}
bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
event AdminChanged(address previousAdmin, address newAdmin);
function _getAdmin() internal view returns (address) {
return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
}
function _setAdmin(address newAdmin) private {
require(newAdmin != address(0), "ERC1967: new admin is the zero address");
StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
}
function _changeAdmin(address newAdmin) internal {
emit AdminChanged(_getAdmin(), newAdmin);
_setAdmin(newAdmin);
}
bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
event BeaconUpgraded(address indexed beacon);
function _getBeacon() internal view returns (address) {
return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
}
function _setBeacon(address newBeacon) private {
require(
Address.isContract(newBeacon),
"ERC1967: new beacon is not a contract"
);
require(
Address.isContract(IBeacon(newBeacon).implementation()),
"ERC1967: beacon implementation is not a contract"
);
StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
}
}
文件 17 的 68:ERC1967UpgradeUpgradeable.sol
pragma solidity ^0.8.2;
import "../beacon/IBeaconUpgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/StorageSlotUpgradeable.sol";
import "../utils/Initializable.sol";
abstract contract ERC1967UpgradeUpgradeable is Initializable {
function __ERC1967Upgrade_init() internal initializer {
__ERC1967Upgrade_init_unchained();
}
function __ERC1967Upgrade_init_unchained() internal initializer {
}
bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
event Upgraded(address indexed implementation);
function _getImplementation() internal view returns (address) {
return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;
}
function _setImplementation(address newImplementation) private {
require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract");
StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
}
function _upgradeTo(address newImplementation) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
if (data.length > 0 || forceCall) {
_functionDelegateCall(newImplementation, data);
}
}
function _upgradeToAndCallSecure(address newImplementation, bytes memory data, bool forceCall) internal {
address oldImplementation = _getImplementation();
_setImplementation(newImplementation);
if (data.length > 0 || forceCall) {
_functionDelegateCall(newImplementation, data);
}
StorageSlotUpgradeable.BooleanSlot storage rollbackTesting = StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT);
if (!rollbackTesting.value) {
rollbackTesting.value = true;
_functionDelegateCall(
newImplementation,
abi.encodeWithSignature(
"upgradeTo(address)",
oldImplementation
)
);
rollbackTesting.value = false;
require(oldImplementation == _getImplementation(), "ERC1967Upgrade: upgrade breaks further upgrades");
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
}
function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {
_setBeacon(newBeacon);
emit BeaconUpgraded(newBeacon);
if (data.length > 0 || forceCall) {
_functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);
}
}
bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
event AdminChanged(address previousAdmin, address newAdmin);
function _getAdmin() internal view returns (address) {
return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;
}
function _setAdmin(address newAdmin) private {
require(newAdmin != address(0), "ERC1967: new admin is the zero address");
StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
}
function _changeAdmin(address newAdmin) internal {
emit AdminChanged(_getAdmin(), newAdmin);
_setAdmin(newAdmin);
}
bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
event BeaconUpgraded(address indexed beacon);
function _getBeacon() internal view returns (address) {
return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;
}
function _setBeacon(address newBeacon) private {
require(
AddressUpgradeable.isContract(newBeacon),
"ERC1967: new beacon is not a contract"
);
require(
AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),
"ERC1967: beacon implementation is not a contract"
);
StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;
}
function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) {
require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, "Address: low-level delegate call failed");
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
uint256[50] private __gap;
}
文件 18 的 68:IBeacon.sol
pragma solidity ^0.8.0;
interface IBeacon {
function implementation() external view returns (address);
}
文件 19 的 68:IBeaconUpgradeable.sol
pragma solidity ^0.8.0;
interface IBeaconUpgradeable {
function implementation() external view returns (address);
}
文件 20 的 68:Initializable.sol
pragma solidity ^0.8.0;
abstract contract Initializable {
bool private _initialized;
bool private _initializing;
modifier initializer() {
require(_initializing || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
}
文件 21 的 68:Memory08.sol
pragma solidity 0.8.9;
contract Memory08 {
mapping(string => address) a;
mapping(bytes => address) b;
}
contract Memory08Bad {
mapping(bytes => address) a;
mapping(string => address) b;
}
文件 22 的 68:Modifiers.sol
pragma solidity ^0.8.9;
abstract contract UnsafeParentModifier {
modifier unsafe(bytes memory data) {
_;
msg.sender.delegatecall(data);
}
}
contract ModifierUsed is UnsafeParentModifier {
function foo() public unsafe('') {}
}
文件 23 的 68:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 24 的 68:Proxiable.sol
pragma solidity ^0.8.2;
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
abstract contract Proxiable is UUPSUpgradeable {
function _authorizeUpgrade(address newImplementation) internal override {
_beforeUpgrade(newImplementation);
}
function _beforeUpgrade(address newImplementation) internal virtual;
}
contract ChildOfProxiable is Proxiable {
function _beforeUpgrade(address newImplementation) internal virtual override {}
}
文件 25 的 68:Proxy.sol
pragma solidity ^0.8.0;
abstract contract Proxy {
function _delegate(address implementation) internal virtual {
assembly {
calldatacopy(0, 0, calldatasize())
let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
returndatacopy(0, 0, returndatasize())
switch result
case 0 { revert(0, returndatasize()) }
default { return(0, returndatasize()) }
}
}
function _implementation() internal view virtual returns (address);
function _fallback() internal virtual {
_beforeFallback();
_delegate(_implementation());
}
fallback () external payable virtual {
_fallback();
}
receive () external payable virtual {
_fallback();
}
function _beforeFallback() internal virtual {
}
}
文件 26 的 68:ProxyAdmin.sol
pragma solidity ^0.8.0;
import "./TransparentUpgradeableProxy.sol";
import "../../access/Ownable.sol";
contract ProxyAdmin is Ownable {
function getProxyImplementation(TransparentUpgradeableProxy proxy) public view virtual returns (address) {
(bool success, bytes memory returndata) = address(proxy).staticcall(hex"5c60da1b");
require(success);
return abi.decode(returndata, (address));
}
function getProxyAdmin(TransparentUpgradeableProxy proxy) public view virtual returns (address) {
(bool success, bytes memory returndata) = address(proxy).staticcall(hex"f851a440");
require(success);
return abi.decode(returndata, (address));
}
function changeProxyAdmin(TransparentUpgradeableProxy proxy, address newAdmin) public virtual onlyOwner {
proxy.changeAdmin(newAdmin);
}
function upgrade(TransparentUpgradeableProxy proxy, address implementation) public virtual onlyOwner {
proxy.upgradeTo(implementation);
}
function upgradeAndCall(TransparentUpgradeableProxy proxy, address implementation, bytes memory data) public payable virtual onlyOwner {
proxy.upgradeToAndCall{value: msg.value}(implementation, data);
}
}
文件 27 的 68:RenamedRetyped.sol
pragma solidity ^0.8.2;
contract RenameV1 {
uint x;
}
contract RenameV2 {
uint y;
}
contract RetypeV1 {
bool x;
}
contract RetypeV2 {
uint8 x;
}
contract WronglyReportedRetypeV3 {
uint8 x;
}
contract MissmatchingTypeRetypeV4 {
bytes32 x;
}
contract ConfusingRetypeV1 {
address y;
bool x;
}
contract ConfusingRetypeV2 {
address y;
uint8 x;
}
contract NonHardcodedRetypeV1 {
address a;
}
contract NonHardcodedRetypeV2 {
bytes20 a;
}
contract LayoutChangeV1 {
bool a;
bool b;
}
contract LayoutChangeV2 {
uint16 a;
uint8 b;
}
文件 28 的 68:RetypeFromContract.sol
pragma solidity ^0.8.2;
interface CustomInterface {}
contract CustomContract {}
interface CustomInterface2 {}
contract CustomContract2 {}
contract RetypeContractToUint160V1 {
CustomInterface a;
CustomContract b;
}
contract RetypeContractToUint160V2 {
uint160 a;
uint160 b;
}
contract RetypeUint160ToContractV1 {
uint160 a;
uint160 b;
}
contract RetypeUint160ToContractV2 {
CustomInterface private a;
CustomContract private b;
}
contract RetypeContractToUint160MappingV1 {
mapping(uint8 => CustomInterface) a;
mapping(uint8 => CustomContract) b;
mapping(CustomInterface => CustomInterface) c;
mapping(CustomContract => CustomContract) d;
}
contract RetypeContractToUint160MappingV2 {
mapping(uint8 => uint160) a;
mapping(uint8 => uint160) b;
mapping(uint160 => uint160) c;
mapping(uint160 => uint160) d;
}
contract RetypeUint160ToContractMappingV1 {
mapping(uint8 => uint160) a;
mapping(uint8 => uint160) b;
mapping(uint160 => uint160) c;
mapping(uint160 => uint160) d;
}
contract RetypeUint160ToContractMappingV2 {
mapping(uint8 => CustomInterface) a;
mapping(uint8 => CustomContract) b;
mapping(CustomInterface => CustomInterface) c;
mapping(CustomContract => CustomContract) d;
}
contract ImplicitRetypeV1 {
CustomInterface a;
CustomContract b;
address c;
address d;
CustomInterface e;
CustomInterface f;
CustomContract g;
CustomContract h;
}
contract ImplicitRetypeV2 {
address a;
address b;
CustomInterface c;
CustomContract d;
CustomInterface2 e;
CustomContract f;
CustomContract2 g;
CustomInterface h;
}
contract ImplicitRetypeMappingV1 {
mapping(uint8 => CustomInterface) a;
mapping(uint8 => CustomContract) b;
mapping(uint8 => address) c;
mapping(uint8 => address) d;
mapping(uint8 => CustomInterface) e;
mapping(uint8 => CustomInterface) f;
mapping(uint8 => CustomContract) g;
mapping(uint8 => CustomContract) h;
}
contract ImplicitRetypeMappingV2 {
mapping(uint8 => address) a;
mapping(uint8 => address) b;
mapping(uint8 => CustomInterface) c;
mapping(uint8 => CustomContract) d;
mapping(uint8 => CustomInterface2) e;
mapping(uint8 => CustomContract) f;
mapping(uint8 => CustomContract2) g;
mapping(uint8 => CustomInterface) h;
}
struct StructUint256 {
uint256 a;
uint256 b;
}
contract RetypeStructV1 {
StructUint256 x;
}
contract RetypeStructV2 {
uint256[2] x;
}
contract RetypeStructV2Bad {
uint256[3] x;
}
enum MyEnums { ONE, TWO }
contract RetypeEnumV1 {
MyEnums x;
}
contract RetypeEnumV2 {
uint8 x;
}
contract RetypeEnumV2Bad {
uint16 x;
}
文件 29 的 68:RiskyFreeFunctions.sol
pragma solidity ^0.8.9;
function isContract(address account) view returns (bool) {
return account.code.length > 0;
}
function freeDelegateCall(
address target,
bytes memory data
) returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
文件 30 的 68:RiskyLibrary.sol
pragma solidity ^0.8.9;
library RiskyLibrary {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function internalDelegateCall(
address target,
bytes memory data
) internal returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
function privateDelegateCall(
address target,
bytes memory data
) private returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
function publicDelegateCall(
address target,
bytes memory data
) public returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
function externalDelegateCall(
address target,
bytes memory data
) external returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
}
文件 31 的 68:RiskyParentContract.sol
pragma solidity ^0.8.9;
contract RiskyParentContract {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function internalDelegateCall(
address target,
bytes memory data
) internal returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
function privateDelegateCall(
address target,
bytes memory data
) private returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
}
文件 32 的 68:SafeContract.sol
pragma solidity ^0.8.9;
contract SafeContract {
}
文件 33 的 68:SafeContractWithFreeFunctionCall.sol
pragma solidity ^0.8.9;
import "./RiskyFreeFunctions.sol" as RiskyFreeFunctions;
contract SafeContractWithFreeFunctionCall {
function safe() public view returns (bool) {
return RiskyFreeFunctions.isContract(address(this));
}
}
文件 34 的 68:SafeContractWithLibraryCall.sol
pragma solidity ^0.8.9;
import "./RiskyLibrary.sol";
contract SafeContractWithLibraryCall {
function safe() public view returns (bool) {
return RiskyLibrary.isContract(address(this));
}
}
文件 35 的 68:SafeContractWithLibraryImport.sol
pragma solidity ^0.8.9;
import "./RiskyLibrary.sol";
contract SafeContractWithLibraryImport {
}
文件 36 的 68:SafeContractWithLibraryUsingFor.sol
pragma solidity ^0.8.9;
import "./RiskyLibrary.sol";
contract SafeContractWithLibraryUsingFor {
using RiskyLibrary for address;
function safe() public view returns (bool) {
return address(this).isContract();
}
}
文件 37 的 68:SafeContractWithParentCall.sol
pragma solidity ^0.8.9;
import "./RiskyParentContract.sol";
contract SafeContractWithParentCall is RiskyParentContract {
function safe() public view returns (bool) {
return isContract(address(this));
}
}
文件 38 的 68:SafeContractWithTransitiveLibraryCall.sol
pragma solidity ^0.8.9;
import "./TransitiveRiskyLibrary.sol";
contract SafeContractWithTransitiveLibraryCall {
function safe() public view returns (bool) {
return TransitiveRiskyLibrary.isContract(address(this));
}
}
文件 39 的 68:SafeRecursion.sol
pragma solidity ^0.8.9;
import "./RiskyParentContract.sol";
contract SafeRecursion is RiskyParentContract {
function safe(uint256 i) public view returns (bool) {
if (++i == 10) {
return isContract(address(this));
} else {
return safe(i);
}
}
}
文件 40 的 68:Standalone.sol
pragma solidity ^0.8.2;
contract StandaloneV1 {
uint a;
string b;
function extremelyUnsafe(address target, bytes memory data) public {
(bool ok, ) = target.delegatecall(data);
require(ok);
}
}
contract StandaloneV2Good {
uint a;
string b;
uint c;
}
contract StandaloneV2Bad {
uint x;
uint a;
string b;
}
contract StandaloneRenameV1 {
uint x;
}
contract StandaloneRenameV2 {
uint y;
}
contract StandaloneRenameV3 is StandaloneRenameV2 {
uint z;
}
文件 41 的 68:Storage089.sol
pragma solidity 0.8.9;
contract Storage089 {
type MyUserValueType is uint128;
MyUserValueType my_user_value;
}
contract Storage089_V2 {
type MyUserValueType is uint128;
MyUserValueType my_user_value;
uint x;
}
contract Storage089_V3 {
type MyUserValueType is uint8;
MyUserValueType my_user_value;
uint x;
}
文件 42 的 68:StorageRenamedRetyped.sol
pragma solidity 0.8.9;
contract StorageRenamedRetyped {
uint a;
uint8 b;
uint8 c;
uint8 d;
}
文件 43 的 68:StorageSlot.sol
pragma solidity ^0.8.0;
library StorageSlot {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
assembly {
r.slot := slot
}
}
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
assembly {
r.slot := slot
}
}
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
assembly {
r.slot := slot
}
}
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
assembly {
r.slot := slot
}
}
}
文件 44 的 68:StorageSlotUpgradeable.sol
pragma solidity ^0.8.0;
library StorageSlotUpgradeable {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
assembly {
r.slot := slot
}
}
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
assembly {
r.slot := slot
}
}
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
assembly {
r.slot := slot
}
}
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
assembly {
r.slot := slot
}
}
}
文件 45 的 68:TransitiveAllowReachable.sol
pragma solidity ^0.8.9;
import "./RiskyLibrary.sol";
contract TransitiveAllowReachable {
function internalDelegateCall(
bytes memory data
) external returns (bytes memory) {
return RiskyLibrary.internalDelegateCall(address(this), data);
}
}
文件 46 的 68:TransitiveRiskyLibrary.sol
pragma solidity ^0.8.9;
import "./RiskyLibrary.sol";
library TransitiveRiskyLibrary {
function isContract(address account) internal view returns (bool) {
return RiskyLibrary.isContract(account);
}
function internalDelegateCall(
address target,
bytes memory data
) internal returns (bytes memory) {
return RiskyLibrary.internalDelegateCall(target, data);
}
}
文件 47 的 68:TransitiveUnsafeParent.sol
pragma solidity ^0.8.9;
import "./UnsafeParentContract.sol";
contract TransitiveUnsafeParent is UnsafeParentContract {
}
文件 48 的 68:TransparentUpgradeableProxy.sol
pragma solidity ^0.8.0;
import "../ERC1967/ERC1967Proxy.sol";
contract TransparentUpgradeableProxy is ERC1967Proxy {
constructor(address _logic, address admin_, bytes memory _data) payable ERC1967Proxy(_logic, _data) {
assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
_changeAdmin(admin_);
}
modifier ifAdmin() {
if (msg.sender == _getAdmin()) {
_;
} else {
_fallback();
}
}
function admin() external ifAdmin returns (address admin_) {
admin_ = _getAdmin();
}
function implementation() external ifAdmin returns (address implementation_) {
implementation_ = _implementation();
}
function changeAdmin(address newAdmin) external virtual ifAdmin {
_changeAdmin(newAdmin);
}
function upgradeTo(address newImplementation) external ifAdmin {
_upgradeToAndCall(newImplementation, bytes(""), false);
}
function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {
_upgradeToAndCall(newImplementation, data, true);
}
function _admin() internal view virtual returns (address) {
return _getAdmin();
}
function _beforeFallback() internal virtual override {
require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
super._beforeFallback();
}
}
文件 49 的 68:UUPSUpgradeable.sol
pragma solidity ^0.8.0;
import "../ERC1967/ERC1967UpgradeUpgradeable.sol";
import "./Initializable.sol";
abstract contract UUPSUpgradeable is Initializable, ERC1967UpgradeUpgradeable {
function __UUPSUpgradeable_init() internal initializer {
__ERC1967Upgrade_init_unchained();
__UUPSUpgradeable_init_unchained();
}
function __UUPSUpgradeable_init_unchained() internal initializer {
}
function upgradeTo(address newImplementation) external virtual {
_authorizeUpgrade(newImplementation);
_upgradeToAndCallSecure(newImplementation, bytes(""), false);
}
function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual {
_authorizeUpgrade(newImplementation);
_upgradeToAndCallSecure(newImplementation, data, true);
}
function _authorizeUpgrade(address newImplementation) internal virtual;
uint256[50] private __gap;
}
文件 50 的 68:UnsafeAllow.sol
pragma solidity ^0.8.9;
import "./TransitiveRiskyLibrary.sol";
contract UnsafeAllow {
function unsafe(address target, bytes memory data) public {
TransitiveRiskyLibrary.internalDelegateCall(target, data);
}
}
文件 51 的 68:UnsafeAllowParent.sol
pragma solidity ^0.8.9;
import "./TransitiveUnsafeParent.sol";
contract UnsafeAllowParent is TransitiveUnsafeParent {
}
文件 52 的 68:UnsafeAllowReachableDifferentOpcode.sol
pragma solidity ^0.8.9;
import "./TransitiveRiskyLibrary.sol";
contract UnsafeAllowReachableDifferentOpcode {
function unsafe(bytes memory data) public {
TransitiveRiskyLibrary.internalDelegateCall(address(this), data);
}
}
文件 53 的 68:UnsafeAllowReachableParentDifferentOpcode.sol
pragma solidity ^0.8.9;
import "./TransitiveUnsafeParent.sol";
contract UnsafeAllowReachableParentDifferentOpcode is TransitiveUnsafeParent {
}
文件 54 的 68:UnsafeContract.sol
pragma solidity ^0.8.9;
contract UnsafeContract {
function externalDelegateCall(
address target,
bytes memory data
) external returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
}
文件 55 的 68:UnsafeContractWithFreeFunctionCall.sol
pragma solidity ^0.8.9;
import "./RiskyFreeFunctions.sol" as RiskyFreeFunctions;
contract UnsafeContractWithFreeFunctionCall {
function unsafe(address target, bytes memory data) public {
RiskyFreeFunctions.freeDelegateCall(target, data);
}
}
文件 56 的 68:UnsafeContractWithInheritedParent.sol
pragma solidity ^0.8.9;
import "./UnsafeParentContract.sol";
contract UnsafeContractWithInheritedParent is UnsafeParentContract {
}
文件 57 的 68:UnsafeContractWithInheritedTransitiveParent.sol
pragma solidity ^0.8.9;
import "./TransitiveUnsafeParent.sol";
contract UnsafeContractWithInheritedTransitiveParent is TransitiveUnsafeParent {
}
文件 58 的 68:UnsafeContractWithLibraryCall.sol
pragma solidity ^0.8.9;
import "./RiskyLibrary.sol";
contract UnsafeContractWithLibraryCall {
function unsafe(address target, bytes memory data) public {
RiskyLibrary.internalDelegateCall(target, data);
}
}
文件 59 的 68:UnsafeContractWithLibraryUsingFor.sol
pragma solidity ^0.8.9;
import "./RiskyLibrary.sol";
contract UnsafeContractWithLibraryUsingFor {
using RiskyLibrary for address;
function unsafe(address target, bytes memory data) public {
target.internalDelegateCall(data);
}
}
文件 60 的 68:UnsafeContractWithParentCall.sol
pragma solidity ^0.8.9;
import "./RiskyParentContract.sol";
contract UnsafeContractWithParentCall is RiskyParentContract {
function unsafe(address target, bytes memory data) public {
internalDelegateCall(target, data);
}
}
文件 61 的 68:UnsafeContractWithTransitiveLibraryCall.sol
pragma solidity ^0.8.9;
import "./TransitiveRiskyLibrary.sol";
contract UnsafeContractWithTransitiveLibraryCall {
function unsafe(address target, bytes memory data) public {
TransitiveRiskyLibrary.internalDelegateCall(target, data);
}
}
文件 62 的 68:UnsafeParentContract.sol
pragma solidity ^0.8.9;
contract UnsafeParentContract {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function internalDelegateCall(
address target,
bytes memory data
) internal returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
function privateDelegateCall(
address target,
bytes memory data
) private returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
function publicDelegateCall(
address target,
bytes memory data
) public returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
function externalDelegateCall(
address target,
bytes memory data
) external returns (bytes memory) {
(, bytes memory returndata) = target.delegatecall(data);
return returndata;
}
}
文件 63 的 68:UnsafeRecursion.sol
pragma solidity ^0.8.9;
import "./RiskyParentContract.sol";
contract UnsafeRecursion is RiskyParentContract {
function unsafe(uint256 i, address target, bytes memory data) public returns (bytes memory) {
if (++i == 10) {
return internalDelegateCall(target, data);
} else {
return unsafe(i, target, data);
}
}
}
文件 64 的 68:UpgradeableBeacon.sol
pragma solidity ^0.8.0;
import "./IBeacon.sol";
import "../../access/Ownable.sol";
import "../../utils/Address.sol";
contract UpgradeableBeacon is IBeacon, Ownable {
address private _implementation;
event Upgraded(address indexed implementation);
constructor(address implementation_) {
_setImplementation(implementation_);
}
function implementation() public view virtual override returns (address) {
return _implementation;
}
function upgradeTo(address newImplementation) public virtual onlyOwner {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
function _setImplementation(address newImplementation) private {
require(Address.isContract(newImplementation), "UpgradeableBeacon: implementation is not a contract");
_implementation = newImplementation;
}
}
文件 65 的 68:ValidationsNatspec.sol
pragma solidity ^0.8.2;
contract HasNonEmptyConstructorNatspec1 {
constructor() { msg.sender; }
}
contract HasNonEmptyConstructorNatspec2 {
constructor() { msg.sender; }
}
contract HasNonEmptyConstructorNatspec3 {
constructor() { msg.sender; }
}
contract HasNonEmptyConstructorNatspec4 {
constructor() { msg.sender; }
}
contract ParentHasNonEmptyConstructorNatspec1 is HasNonEmptyConstructorNatspec1 {}
contract ParentHasNonEmptyConstructorNatspec2 is HasNonEmptyConstructorNatspec2 {}
contract AncestorHasNonEmptyConstructorNatspec1 is ParentHasNonEmptyConstructorNatspec1 {}
contract AncestorHasNonEmptyConstructorNatspec2 is ParentHasNonEmptyConstructorNatspec2 {}
contract HasStateVariableAssignmentNatspec1 {
uint x = 1;
}
contract HasStateVariableAssignmentNatspec2 {
uint x = 1;
}
contract HasStateVariableAssignmentNatspec3 {
uint x = 1;
uint y = 2;
}
contract HasImmutableStateVariableNatspec1 {
uint immutable x = 1;
}
contract HasImmutableStateVariableNatspec2 {
uint immutable x = 1;
}
contract HasImmutableStateVariableNatspec3 {
uint immutable x = 1;
uint immutable y = 2;
}
contract HasSelfDestructNatspec1 {
function d() public {
selfdestruct(payable(msg.sender));
}
}
contract HasSelfDestructNatspec2 {
function d() public {
selfdestruct(payable(msg.sender));
}
}
contract HasSelfDestructNatspec3 {
function d() public {
selfdestruct(payable(msg.sender));
}
}
contract HasDelegateCallNatspec1 {
function d() public {
(bool s, ) = msg.sender.delegatecall("");
s;
}
}
contract HasDelegateCallNatspec2 {
/// @custom:oz-upgrades-unsafe-allow delegatecall
function d() public {
(bool s, ) = msg.sender.delegatecall("");
s;
}
}
contract HasDelegateCallNatspec3 {
function d() public {
/// @custom:oz-upgrades-unsafe-allow delegatecall
(bool s, ) = msg.sender.delegatecall("");
s;
}
}
import './ValidationsNatspecImport.sol';
contract ImportedParentHasStateVariableAssignmentNatspec1 is ImportedHasStateVariableAssignmentNatspec1 {}
contract ImportedParentHasStateVariableAssignmentNatspec2 is ImportedHasStateVariableAssignmentNatspec2 {}
// For each of 3 dimensions, libraries usage can be
// 1. implicit or explicit (_use for_ directive or not)
// 2. upgrade safe or unsafe
// 3. internal or external (method's visibility)
// libs
library SafeInternalLibraryNatspec {
function add(uint x, uint y) internal pure returns (uint) {
return x + y;
}
}
library SafeExternalLibraryNatspec {
function add(uint x, uint y) public pure returns (uint) {
return x + y;
}
}
library UnsafeInternalLibraryNatspec {
function explode(uint x, uint y) internal {
x + y;
/// @custom:oz-upgrades-unsafe-allow selfdestruct
selfdestruct(payable(msg.sender));
}
}
library UnsafeExternalLibraryNatspec {
function explode(uint x, uint y) public {
x + y;
/// @custom:oz-upgrades-unsafe-allow selfdestruct
selfdestruct(payable(msg.sender));
}
}
// usage
contract UsesImplicitSafeInternalLibraryNatspec {
using SafeInternalLibraryNatspec for uint;
uint x;
function foo(uint y) public view {
x.add(y);
}
}
/// @custom:oz-upgrades-unsafe-allow external-library-linking
contract UsesImplicitSafeExternalLibraryNatspec {
using SafeExternalLibraryNatspec for uint;
uint x;
function foo(uint y) public view {
x.add(y);
}
}
contract UsesImplicitUnsafeInternalLibraryNatspec {
using UnsafeInternalLibraryNatspec for uint;
uint x;
function foo(uint y) public {
x.explode(y);
}
}
/// @custom:oz-upgrades-unsafe-allow external-library-linking
contract UsesImplicitUnsafeExternalLibraryNatspec {
using UnsafeExternalLibraryNatspec for uint;
uint x;
function foo(uint y) public {
x.explode(y);
}
}
contract UsesExplicitSafeInternalLibraryNatspec {
uint x;
function foo(uint y) public view {
SafeInternalLibraryNatspec.add(x, y);
}
}
/// @custom:oz-upgrades-unsafe-allow external-library-linking
contract UsesExplicitSafeExternalLibraryNatspec {
uint x;
function foo(uint y) public view {
SafeExternalLibraryNatspec.add(x, y);
}
}
contract UsesExplicitUnsafeInternalLibraryNatspec {
uint x;
function foo(uint y) public {
UnsafeInternalLibraryNatspec.explode(x, y);
}
}
/// @custom:oz-upgrades-unsafe-allow external-library-linking
contract UsesExplicitUnsafeExternalLibraryNatspec {
uint x;
function foo(uint y) public {
UnsafeExternalLibraryNatspec.explode(x, y);
}
}
文件 66 的 68:ValidationsNatspecImport.sol
pragma solidity ^0.8.2;
contract ImportedHasStateVariableAssignmentNatspec1 {
uint x = 1;
}
contract ImportedHasStateVariableAssignmentNatspec2 {
uint x = 1;
}
文件 67 的 68:ValidationsUDVT.sol
pragma solidity ^0.8.9;
contract ValidationsUDVT {
type MyUserValueType is uint128;
MyUserValueType my_user_value;
function foo(MyUserValueType v) external {
my_user_value = v;
}
}
文件 68 的 68:import.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
contract AdminUpgradeabilityProxy is TransparentUpgradeableProxy {
constructor(address logic, address admin, bytes memory data) payable TransparentUpgradeableProxy(logic, admin, data) {}
}
{
"compilationTarget": {
"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol": "ERC1967Proxy"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_logic","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}]