Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xCB7607867f4478c758f8fd75a099e671C6ed33Bf
Balance 0 ETH
Nonce 1
Code Size 1978 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

1978 bytes
0x6080604052600436106100745760003560e01c80635c60da1b1161004e5780635c60da1b146100f9578063612f2f371461011b5780636c376cc51461013b578063f1739cae1461017a57610083565b8063025313a21461008b5780633659cfe6146100c65780634f1ef286146100e657610083565b366100835761008161019a565b005b61008161019a565b34801561009757600080fd5b50600080516020610765833981519152545b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100d257600080fd5b506100816100e1366004610575565b61026f565b6100816100f43660046105ad565b6102bb565b34801561010557600080fd5b50600080516020610745833981519152546100a9565b34801561012757600080fd5b5061008161013636600461066f565b610387565b34801561014757600080fd5b507fcb0dab1e6cc3c636dc4b1be2197f382380f2a9391da8f17a2b35e7f43e1d30f95460405190151581526020016100bd565b34801561018657600080fd5b50610081610195366004610575565b6103eb565b7fcb0dab1e6cc3c636dc4b1be2197f382380f2a9391da8f17a2b35e7f43e1d30f9541561020a57600080516020610765833981519152546001600160a01b0316336001600160a01b03161461020a5760405162461bcd60e51b815260040161020190610691565b60405180910390fd5b60006102226000805160206107458339815191525490565b90506001600160a01b03811661024a5760405162461bcd60e51b8152600401610201906106d4565b60405136600082376000803683855af43d806000843e81801561026b578184f35b8184fd5b600080516020610765833981519152546001600160a01b0316336001600160a01b0316146102af5760405162461bcd60e51b815260040161020190610691565b6102b8816104c0565b50565b600080516020610765833981519152546001600160a01b0316336001600160a01b0316146102fb5760405162461bcd60e51b815260040161020190610691565b6103048261026f565b6000306001600160a01b0316348360405161031f9190610715565b60006040518083038185875af1925050503d806000811461035c576040519150601f19603f3d011682016040523d82523d6000602084013e610361565b606091505b50509050806103825760405162461bcd60e51b8152600401610201906106d4565b505050565b600080516020610765833981519152546001600160a01b0316336001600160a01b0316146103c75760405162461bcd60e51b815260040161020190610691565b7fcb0dab1e6cc3c636dc4b1be2197f382380f2a9391da8f17a2b35e7f43e1d30f955565b600080516020610765833981519152546001600160a01b0316336001600160a01b03161461042b5760405162461bcd60e51b815260040161020190610691565b6001600160a01b0381166104515760405162461bcd60e51b8152600401610201906106d4565b7f5a3e66efaa1e445ebd894728a69d6959842ea1e97bd79b892797106e270efcd96104886000805160206107658339815191525490565b604080516001600160a01b03928316815291841660208301520160405180910390a16102b88160008051602061076583398151915255565b60006104d86000805160206107458339815191525490565b9050816001600160a01b0316816001600160a01b03160361050b5760405162461bcd60e51b8152600401610201906106d4565b6105218260008051602061074583398151915255565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b80356001600160a01b038116811461057057600080fd5b919050565b60006020828403121561058757600080fd5b61059082610559565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156105c057600080fd5b6105c983610559565b9150602083013567ffffffffffffffff808211156105e657600080fd5b818501915085601f8301126105fa57600080fd5b81358181111561060c5761060c610597565b604051601f8201601f19908116603f0116810190838211818310171561063457610634610597565b8160405282815288602084870101111561064d57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60006020828403121561068157600080fd5b8135801515811461059057600080fd5b60208082526023908201527f4f776e6564557067726164656162696c69747950726f78793a20464f524249446040820152622222a760e91b606082015260800190565b60208082526021908201527f4f776e6564557067726164656162696c69747950726f78793a20494e56414c496040820152601160fa1b606082015260800190565b6000825160005b81811015610736576020818601810151858301520161071c565b50600092019182525091905056fe613eb104735602a1469ce30942ddab8605d472e94a2bb3ce803d73ddf73e97c14d33a8b5e3e1d149d028da45e6961d0aa820dfa7bd417639c3c934c49b81783ea2646970667358221220b12eb775dc028439bf85309a3e20d3ec39a149854a72184321158c9b0688266264736f6c63430008110033

Verified Source Code Full Match

Compiler: v0.8.17+commit.8df45f5f EVM: london Optimization: Yes (200 runs)
OwnedUpgradeabilityProxy.sol 187 lines
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.5;

/**
 * @title OwnedUpgradeabilityProxy
 * @dev This contract combines an upgradeability proxy with basic authorization control functionalities
 */
contract OwnedUpgradeabilityProxy {
    /**
     * @dev Event to show ownership has been transferred
     * @param previousOwner representing the address of the previous owner
     * @param newOwner representing the address of the new owner
     */
    event ProxyOwnershipTransferred(address previousOwner, address newOwner);

    /**
     * @dev This event will be emitted every time the implementation gets upgraded
     * @param implementation representing the address of the upgraded implementation
     */
    event Upgraded(address indexed implementation);

    // Storage position of the address of the maintenance boolean
    bytes32 private constant maintenancePosition = keccak256("com.ibg.proxy.maintenance");
    // Storage position of the address of the current implementation
    bytes32 private constant implementationPosition = keccak256("com.ibg.proxy.implementation");
    // Storage position of the owner of the contract
    bytes32 private constant proxyOwnerPosition = keccak256("com.ibg.proxy.owner");

    /**
     * @dev the constructor sets the original owner of the contract to the sender account.
     */
    constructor() {
        setUpgradeabilityOwner(msg.sender);
    }

    /**
     * @dev Tells if contract is on maintenance
     * @return _maintenance if contract is on maintenance
     */
    function maintenance() public view returns (bool _maintenance) {
        bytes32 position = maintenancePosition;
        assembly {
            _maintenance := sload(position)
        }
    }

    /**
     * @dev Sets if contract is on maintenance
     */
    function setMaintenance(bool _maintenance) external onlyProxyOwner {
        bytes32 position = maintenancePosition;
        assembly {
            sstore(position, _maintenance)
        }
    }

    /**
     * @dev Tells the address of the owner
     * @return owner the address of the owner
     */
    function proxyOwner() public view returns (address owner) {
        bytes32 position = proxyOwnerPosition;
        assembly {
            owner := sload(position)
        }
    }

    /**
     * @dev Sets the address of the owner
     */
    function setUpgradeabilityOwner(address newProxyOwner) internal {
        bytes32 position = proxyOwnerPosition;
        assembly {
            sstore(position, newProxyOwner)
        }
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferProxyOwnership(address newOwner) public onlyProxyOwner {
        require(newOwner != address(0), "OwnedUpgradeabilityProxy: INVALID");
        emit ProxyOwnershipTransferred(proxyOwner(), newOwner);
        setUpgradeabilityOwner(newOwner);
    }

    /**
     * @dev Allows the proxy owner to upgrade the current version of the proxy.
     * @param newImplementation representing the address of the new implementation to be set.
     */
    function upgradeTo(address newImplementation) public onlyProxyOwner {
        _upgradeTo(newImplementation);
    }

    /**
     * @dev Allows the proxy owner to upgrade the current version of the proxy and call the new implementation
     * to initialize whatever is needed through a low level call.
     * @param newImplementation representing the address of the new implementation to be set.
     * @param data represents the msg.data to bet sent in the low level call. This parameter may include the function
     * signature of the implementation to be called with the needed payload
     */
    function upgradeToAndCall(
        address newImplementation,
        bytes memory data
    ) public payable onlyProxyOwner {
        upgradeTo(newImplementation);
        (bool success, ) = address(this).call{value: msg.value}(data);
        require(success, "OwnedUpgradeabilityProxy: INVALID");
    }

    /**
     * @dev Fallback function allowing to perform a delegatecall to the given implementation.
     * This function will return whatever the implementation call returns
     */
    fallback() external payable {
        _fallback();
    }

    receive() external payable {
        _fallback();
    }

    /**
     * @dev Tells the address of the current implementation
     * @return impl address of the current implementation
     */
    function implementation() public view returns (address impl) {
        bytes32 position = implementationPosition;
        assembly {
            impl := sload(position)
        }
    }

    /**
     * @dev Sets the address of the current implementation
     * @param newImplementation address representing the new implementation to be set
     */
    function setImplementation(address newImplementation) internal {
        bytes32 position = implementationPosition;
        assembly {
            sstore(position, newImplementation)
        }
    }

    /**
     * @dev Upgrades the implementation address
     * @param newImplementation representing the address of the new implementation to be set
     */
    function _upgradeTo(address newImplementation) internal {
        address currentImplementation = implementation();
        require(currentImplementation != newImplementation, "OwnedUpgradeabilityProxy: INVALID");
        setImplementation(newImplementation);
        emit Upgraded(newImplementation);
    }

    function _fallback() internal {
        if (maintenance()) {
            require(msg.sender == proxyOwner(), "OwnedUpgradeabilityProxy: FORBIDDEN");
        }
        address _impl = implementation();
        require(_impl != address(0), "OwnedUpgradeabilityProxy: INVALID");
        assembly {
            let ptr := mload(0x40)
            calldatacopy(ptr, 0, calldatasize())
            let result := delegatecall(gas(), _impl, ptr, calldatasize(), 0, 0)
            let size := returndatasize()
            returndatacopy(ptr, 0, size)

            switch result
            case 0 {
                revert(ptr, size)
            }
            default {
                return(ptr, size)
            }
        }
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyProxyOwner() {
        require(msg.sender == proxyOwner(), "OwnedUpgradeabilityProxy: FORBIDDEN");
        _;
    }
}

Read Contract

implementation 0x5c60da1b → address
maintenance 0x6c376cc5 → bool
proxyOwner 0x025313a2 → address

Write Contract 4 functions

These functions modify contract state and require a wallet transaction to execute.

setMaintenance 0x612f2f37
bool _maintenance
transferProxyOwnership 0xf1739cae
address newOwner
upgradeTo 0x3659cfe6
address newImplementation
upgradeToAndCall 0x4f1ef286
address newImplementation
bytes data

Recent Transactions

No transactions found for this address