// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Proxy {
address public owner;
address public target;
event ProxyTargetSet(address target);
event ProxyOwnerChanged(address owner);
constructor() {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_;
}
function setTarget(address _implementation) public onlyOwner {
target = _implementation;
emit ProxyTargetSet(_implementation);
}
function setOwner(address _owner) external onlyOwner {
owner = _owner;
emit ProxyOwnerChanged(_owner);
}
fallback() external {
address _impl = target;
require(_impl != address(0), "Target not set");
assembly {
calldatacopy(0, 0, calldatasize())
let result := delegatecall(gas(), _impl, 0, calldatasize(), 0, 0)
returndatacopy(0, 0, returndatasize())
switch result
case 0 {
revert(0, returndatasize())
}
default {
return(0, returndatasize())
}
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import "./proxy.sol";
contract ProxyCDC is Proxy{
}
{
"compilationTarget": {
"contracts/Proxy/proxyCDC.sol": "ProxyCDC"
},
"evmVersion": "shanghai",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"ProxyOwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"target","type":"address"}],"name":"ProxyTargetSet","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"setTarget","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"target","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]