Contract Source Code:
File 1 of 1 : UChildERC20Proxy
// File: contracts/common/Proxy/IERCProxy.sol pragma solidity 0.6.6; interface IERCProxy { function proxyType() external pure returns (uint256 proxyTypeId); function implementation() external view returns (address codeAddr); } // File: contracts/common/Proxy/Proxy.sol pragma solidity 0.6.6; abstract contract Proxy is IERCProxy { function delegatedFwd(address _dst, bytes memory _calldata) internal { // solium-disable-next-line security/no-inline-assembly assembly { let result := delegatecall( sub(gas(), 10000), _dst, add(_calldata, 0x20), mload(_calldata), 0, 0 ) let size := returndatasize() let ptr := mload(0x40) returndatacopy(ptr, 0, size) // revert instead of invalid() bc if the underlying call failed with invalid() it already wasted gas. // if the call returned error data, forward it switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } } function proxyType() external virtual override pure returns (uint256 proxyTypeId) { // Upgradeable proxy proxyTypeId = 2; } function implementation() external virtual override view returns (address); } // File: contracts/common/Proxy/UpgradableProxy.sol pragma solidity 0.6.6; contract UpgradableProxy is Proxy { event ProxyUpdated(address indexed _new, address indexed _old); event ProxyOwnerUpdate(address _new, address _old); bytes32 constant IMPLEMENTATION_SLOT = keccak256("matic.network.proxy.implementation"); bytes32 constant OWNER_SLOT = keccak256("matic.network.proxy.owner"); constructor(address _proxyTo) public { setProxyOwner(msg.sender); setImplementation(_proxyTo); } fallback() external payable { delegatedFwd(loadImplementation(), msg.data); } receive() external payable { delegatedFwd(loadImplementation(), msg.data); } modifier onlyProxyOwner() { require(loadProxyOwner() == msg.sender, "NOT_OWNER"); _; } function proxyOwner() external view returns(address) { return loadProxyOwner(); } function loadProxyOwner() internal view returns(address) { address _owner; bytes32 position = OWNER_SLOT; assembly { _owner := sload(position) } return _owner; } function implementation() external override view returns (address) { return loadImplementation(); } function loadImplementation() internal view returns(address) { address _impl; bytes32 position = IMPLEMENTATION_SLOT; assembly { _impl := sload(position) } return _impl; } function transferProxyOwnership(address newOwner) public onlyProxyOwner { require(newOwner != address(0), "ZERO_ADDRESS"); emit ProxyOwnerUpdate(newOwner, loadProxyOwner()); setProxyOwner(newOwner); } function setProxyOwner(address newOwner) private { bytes32 position = OWNER_SLOT; assembly { sstore(position, newOwner) } } function updateImplementation(address _newProxyTo) public onlyProxyOwner { require(_newProxyTo != address(0x0), "INVALID_PROXY_ADDRESS"); require(isContract(_newProxyTo), "DESTINATION_ADDRESS_IS_NOT_A_CONTRACT"); emit ProxyUpdated(_newProxyTo, loadImplementation()); setImplementation(_newProxyTo); } function updateAndCall(address _newProxyTo, bytes memory data) payable public onlyProxyOwner { updateImplementation(_newProxyTo); (bool success, bytes memory returnData) = address(this).call{value: msg.value}(data); require(success, string(returnData)); } function setImplementation(address _newProxyTo) private { bytes32 position = IMPLEMENTATION_SLOT; assembly { sstore(position, _newProxyTo) } } function isContract(address _target) internal view returns (bool) { if (_target == address(0)) { return false; } uint256 size; assembly { size := extcodesize(_target) } return size > 0; } } // File: contracts/child/ChildToken/UpgradeableChildERC20/UChildERC20Proxy.sol pragma solidity 0.6.6; contract UChildERC20Proxy is UpgradableProxy { constructor(address _proxyTo) public UpgradableProxy(_proxyTo) {} }
Please enter a contract address above to load the contract details and source code.
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.