Contract 0xEc05e3f4D845f0E39e33146395aCE5D35c01Fcc0 1

Contract Overview

Balance:
0 Ether

Token:
Txn Hash
Method
Block
From
To
Value
0xea31da229477efa43c50dbd1674facfa8347cf87a7ee87ed58eff26b3137c069Relay Token95561492021-10-30 14:02:33247 days 9 hrs ago0x7859489a7d1065683b7cd204428939b9eed418d5 IN  0xec05e3f4d845f0e39e33146395ace5d35c01fcc00 Ether0.00028387 1
0xf883a7780213cbf87856336a7b5680be7fc4a31e872e6828a9a04b9419bfd52aTransfer Ownersh...86599812021-05-27 17:10:45403 days 6 hrs ago0x2d5c035f99a7df3067edacded0e117d7076abf7c IN  0xec05e3f4d845f0e39e33146395ace5d35c01fcc00 Ether0.000033761
0x5819e587081f85ceb464b7752596aad07ba759ccc70edf8712fac9cf2d7ef2c7Transfer Proxy O...86599802021-05-27 17:10:30403 days 6 hrs ago0x2d5c035f99a7df3067edacded0e117d7076abf7c IN  0xec05e3f4d845f0e39e33146395ace5d35c01fcc00 Ether0.000028361
0x202478efadad1745e0ab41af77cf9485a3243286902e9d01e824433765a48427Transfer Proxy O...86574152021-05-27 6:29:04403 days 17 hrs ago0x2d5c035f99a7df3067edacded0e117d7076abf7c IN  0xec05e3f4d845f0e39e33146395ace5d35c01fcc00 Ether0.0002556410
0x20f997c433d640c156496b70ec90a7f3c83e19fb9afa79b509f9e776d5cdfa26Initialize86574142021-05-27 6:28:49403 days 17 hrs ago0x2d5c035f99a7df3067edacded0e117d7076abf7c IN  0xec05e3f4d845f0e39e33146395ace5d35c01fcc00 Ether0.0020632610
0x66fc8dfc6477a6020f558420f91e61e2b3a8657b9ee0685b2572130603a3c2f1Upgrade To86574122021-05-27 6:28:19403 days 17 hrs ago0x2d5c035f99a7df3067edacded0e117d7076abf7c IN  0xec05e3f4d845f0e39e33146395ace5d35c01fcc00 Ether0.0007253810
0xe99dae6a37f64b72ca15f1af5d5e56842cc6cd8be648ca193feadb85d85b6d830x6080604086574082021-05-27 6:27:19403 days 17 hrs ago0x2d5c035f99a7df3067edacded0e117d7076abf7c IN  Create: EternalStorageProxy0 Ether0.0036262310
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xe500e91fc2d7a330e4f4791c6e18eb3c306c7f129715d2b5bc4ffe86a9b3d982108205842022-06-09 7:07:1725 days 16 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0xd4075fb57fcf038bfc702c915ef9592534bed5c10 Ether
0xe500e91fc2d7a330e4f4791c6e18eb3c306c7f129715d2b5bc4ffe86a9b3d982108205842022-06-09 7:07:1725 days 16 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x756a356e0f463c7b8f49fcb92de2311cc7ff0a9d0 Ether
0xe500e91fc2d7a330e4f4791c6e18eb3c306c7f129715d2b5bc4ffe86a9b3d982108205842022-06-09 7:07:1725 days 16 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x756a356e0f463c7b8f49fcb92de2311cc7ff0a9d0 Ether
0xe500e91fc2d7a330e4f4791c6e18eb3c306c7f129715d2b5bc4ffe86a9b3d982108205842022-06-09 7:07:1725 days 16 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x756a356e0f463c7b8f49fcb92de2311cc7ff0a9d0 Ether
0xe500e91fc2d7a330e4f4791c6e18eb3c306c7f129715d2b5bc4ffe86a9b3d982108205842022-06-09 7:07:1725 days 16 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x756a356e0f463c7b8f49fcb92de2311cc7ff0a9d0 Ether
0xe500e91fc2d7a330e4f4791c6e18eb3c306c7f129715d2b5bc4ffe86a9b3d982108205842022-06-09 7:07:1725 days 16 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x639775044a97637507cdd2ddec00351d1174e7a20 Ether
0xe500e91fc2d7a330e4f4791c6e18eb3c306c7f129715d2b5bc4ffe86a9b3d982108205842022-06-09 7:07:1725 days 16 hrs ago 0x756a356e0f463c7b8f49fcb92de2311cc7ff0a9d 0xec05e3f4d845f0e39e33146395ace5d35c01fcc00 Ether
0x652fbd1c968c5ef967b0a13bc8d1a6662975d0b0558cc792e6b63065180405c4107999122022-06-05 15:11:3829 days 8 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0xd4075fb57fcf038bfc702c915ef9592534bed5c10 Ether
0x652fbd1c968c5ef967b0a13bc8d1a6662975d0b0558cc792e6b63065180405c4107999122022-06-05 15:11:3829 days 8 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x5c62237a8d8cb018ec804a822681996eb96f4f2f0 Ether
0x652fbd1c968c5ef967b0a13bc8d1a6662975d0b0558cc792e6b63065180405c4107999122022-06-05 15:11:3829 days 8 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x5c62237a8d8cb018ec804a822681996eb96f4f2f0 Ether
0x652fbd1c968c5ef967b0a13bc8d1a6662975d0b0558cc792e6b63065180405c4107999122022-06-05 15:11:3829 days 8 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x5c62237a8d8cb018ec804a822681996eb96f4f2f0 Ether
0x652fbd1c968c5ef967b0a13bc8d1a6662975d0b0558cc792e6b63065180405c4107999122022-06-05 15:11:3829 days 8 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x5c62237a8d8cb018ec804a822681996eb96f4f2f0 Ether
0x652fbd1c968c5ef967b0a13bc8d1a6662975d0b0558cc792e6b63065180405c4107999122022-06-05 15:11:3829 days 8 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x639775044a97637507cdd2ddec00351d1174e7a20 Ether
0x652fbd1c968c5ef967b0a13bc8d1a6662975d0b0558cc792e6b63065180405c4107999122022-06-05 15:11:3829 days 8 hrs ago 0x5c62237a8d8cb018ec804a822681996eb96f4f2f 0xec05e3f4d845f0e39e33146395ace5d35c01fcc00 Ether
0xa5e21a84c857cb599d88df8eb1138c1fb896447ea0eb56e0aefb3791f02a2549107817132022-06-02 10:05:4132 days 13 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0xec121050658a360e151210d00044b4e5954ab3030 Ether
0xa5e21a84c857cb599d88df8eb1138c1fb896447ea0eb56e0aefb3791f02a2549107817132022-06-02 10:05:4132 days 13 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0xd4075fb57fcf038bfc702c915ef9592534bed5c10 Ether
0xa5e21a84c857cb599d88df8eb1138c1fb896447ea0eb56e0aefb3791f02a2549107817132022-06-02 10:05:4132 days 13 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0xec121050658a360e151210d00044b4e5954ab3030 Ether
0xa5e21a84c857cb599d88df8eb1138c1fb896447ea0eb56e0aefb3791f02a2549107817132022-06-02 10:05:4132 days 13 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0  Contract Creation0 Ether
0xa5e21a84c857cb599d88df8eb1138c1fb896447ea0eb56e0aefb3791f02a2549107817132022-06-02 10:05:4132 days 13 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0xd4075fb57fcf038bfc702c915ef9592534bed5c10 Ether
0xa5e21a84c857cb599d88df8eb1138c1fb896447ea0eb56e0aefb3791f02a2549107817132022-06-02 10:05:4132 days 13 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x639775044a97637507cdd2ddec00351d1174e7a20 Ether
0xa5e21a84c857cb599d88df8eb1138c1fb896447ea0eb56e0aefb3791f02a2549107817132022-06-02 10:05:4132 days 13 hrs ago 0xd4075fb57fcf038bfc702c915ef9592534bed5c1 0xec05e3f4d845f0e39e33146395ace5d35c01fcc00 Ether
0xec7390630c6e1e62f544866e2a0bc35dd1dcd4f8a691563858958ef4f63cb797107394512022-05-25 20:02:3840 days 3 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0xd4075fb57fcf038bfc702c915ef9592534bed5c10 Ether
0xec7390630c6e1e62f544866e2a0bc35dd1dcd4f8a691563858958ef4f63cb797107394512022-05-25 20:02:3840 days 3 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x0028ccd5c9da372ac7f8a396db102aa5288ad78b0 Ether
0xec7390630c6e1e62f544866e2a0bc35dd1dcd4f8a691563858958ef4f63cb797107394512022-05-25 20:02:3840 days 3 hrs ago 0xec05e3f4d845f0e39e33146395ace5d35c01fcc0 0x639775044a97637507cdd2ddec00351d1174e7a20 Ether
0xec7390630c6e1e62f544866e2a0bc35dd1dcd4f8a691563858958ef4f63cb797107394512022-05-25 20:02:3840 days 3 hrs ago 0x0028ccd5c9da372ac7f8a396db102aa5288ad78b 0xec05e3f4d845f0e39e33146395ace5d35c01fcc00 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EternalStorageProxy

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : EternalStorage.sol
pragma solidity 0.7.5;

/**
 * @title EternalStorage
 * @dev This contract holds all the necessary state variables to carry out the storage of any contract.
 */
contract EternalStorage {
    mapping(bytes32 => uint256) internal uintStorage;
    mapping(bytes32 => string) internal stringStorage;
    mapping(bytes32 => address) internal addressStorage;
    mapping(bytes32 => bytes) internal bytesStorage;
    mapping(bytes32 => bool) internal boolStorage;
    mapping(bytes32 => int256) internal intStorage;
}

File 2 of 8 : EternalStorageProxy.sol
pragma solidity 0.7.5;

import "./EternalStorage.sol";
import "./OwnedUpgradeabilityProxy.sol";

/**
 * @title EternalStorageProxy
 * @dev This proxy holds the storage of the token contract and delegates every call to the current implementation set.
 * Besides, it allows to upgrade the token's behaviour towards further implementations, and provides basic
 * authorization control functionalities
 */
// solhint-disable-next-line no-empty-blocks
contract EternalStorageProxy is EternalStorage, OwnedUpgradeabilityProxy {

}

File 3 of 8 : OwnedUpgradeabilityProxy.sol
pragma solidity 0.7.5;

import "./UpgradeabilityProxy.sol";
import "./UpgradeabilityOwnerStorage.sol";

/**
 * @title OwnedUpgradeabilityProxy
 * @dev This contract combines an upgradeability proxy with basic authorization control functionalities
 */
contract OwnedUpgradeabilityProxy is UpgradeabilityOwnerStorage, UpgradeabilityProxy {
    /**
     * @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 the constructor sets the original owner of the contract to the sender account.
     */
    constructor() {
        setUpgradeabilityOwner(msg.sender);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyUpgradeabilityOwner() {
        require(msg.sender == upgradeabilityOwner());
        _;
    }

    /**
     * @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) external onlyUpgradeabilityOwner {
        require(newOwner != address(0));
        emit ProxyOwnershipTransferred(upgradeabilityOwner(), newOwner);
        setUpgradeabilityOwner(newOwner);
    }

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

    /**
     * @dev Allows the upgradeability 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 version representing the version name of the new implementation to be set.
     * @param implementation 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(
        uint256 version,
        address implementation,
        bytes calldata data
    ) external payable onlyUpgradeabilityOwner {
        upgradeTo(version, implementation);
        // solhint-disable-next-line avoid-call-value
        (bool status, ) = address(this).call{ value: msg.value }(data);
        require(status);
    }
}

File 4 of 8 : Proxy.sol
pragma solidity 0.7.5;

/**
 * @title Proxy
 * @dev Gives the possibility to delegate any call to a foreign implementation.
 */
abstract contract Proxy {
    /**
     * @dev Tells the address of the implementation where every call will be delegated.
     * @return address of the implementation to which it will be delegated
     */
    function implementation() public view virtual returns (address);

    /**
     * @dev Fallback function allowing to perform a delegatecall to the given implementation.
     * This function will return whatever the implementation call returns
     */
    fallback() external payable {
        // solhint-disable-previous-line no-complex-fallback
        address _impl = implementation();
        require(_impl != address(0));
        assembly {
            /*
                0x40 is the "free memory slot", meaning a pointer to next slot of empty memory. mload(0x40)
                loads the data in the free memory slot, so `ptr` is a pointer to the next slot of empty
                memory. It's needed because we're going to write the return data of delegatecall to the
                free memory slot.
            */
            let ptr := mload(0x40)
            /*
                `calldatacopy` is copy calldatasize bytes from calldata
                First argument is the destination to which data is copied(ptr)
                Second argument specifies the start position of the copied data.
                    Since calldata is sort of its own unique location in memory,
                    0 doesn't refer to 0 in memory or 0 in storage - it just refers to the zeroth byte of calldata.
                    That's always going to be the zeroth byte of the function selector.
                Third argument, calldatasize, specifies how much data will be copied.
                    calldata is naturally calldatasize bytes long (same thing as msg.data.length)
            */
            calldatacopy(ptr, 0, calldatasize())
            /*
                delegatecall params explained:
                gas: the amount of gas to provide for the call. `gas` is an Opcode that gives
                    us the amount of gas still available to execution

                _impl: address of the contract to delegate to

                ptr: to pass copied data

                calldatasize: loads the size of `bytes memory data`, same as msg.data.length

                0, 0: These are for the `out` and `outsize` params. Because the output could be dynamic,
                        these are set to 0, 0 so the output data will not be written to memory. The output
                        data will be read using `returndatasize` and `returdatacopy` instead.

                result: This will be 0 if the call fails and 1 if it succeeds
            */
            let result := delegatecall(gas(), _impl, ptr, calldatasize(), 0, 0)
            /*

            */
            /*
                ptr current points to the value stored at 0x40,
                because we assigned it like ptr := mload(0x40).
                Because we use 0x40 as a free memory pointer,
                we want to make sure that the next time we want to allocate memory,
                we aren't overwriting anything important.
                So, by adding ptr and returndatasize,
                we get a memory location beyond the end of the data we will be copying to ptr.
                We place this in at 0x40, and any reads from 0x40 will now read from free memory
            */
            mstore(0x40, add(ptr, returndatasize()))
            /*
                `returndatacopy` is an Opcode that copies the last return data to a slot. `ptr` is the
                    slot it will copy to, 0 means copy from the beginning of the return data, and size is
                    the amount of data to copy.
                `returndatasize` is an Opcode that gives us the size of the last return data. In this case, that is the size of the data returned from delegatecall
            */
            returndatacopy(ptr, 0, returndatasize())

            /*
                if `result` is 0, revert.
                if `result` is 1, return `size` amount of data from `ptr`. This is the data that was
                copied to `ptr` from the delegatecall return data
            */
            switch result
                case 0 {
                    revert(ptr, returndatasize())
                }
                default {
                    return(ptr, returndatasize())
                }
        }
    }
}

File 5 of 8 : UpgradeabilityOwnerStorage.sol
pragma solidity 0.7.5;

/**
 * @title UpgradeabilityOwnerStorage
 * @dev This contract keeps track of the upgradeability owner
 */
contract UpgradeabilityOwnerStorage {
    /**
     * @dev Tells the address of the owner
     * @return owner the address of the owner
     */
    function upgradeabilityOwner() public view returns (address owner) {
        assembly {
            // EIP 1967
            // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)
            owner := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)
        }
    }

    /**
     * @dev Sets the address of the owner
     */
    function setUpgradeabilityOwner(address newUpgradeabilityOwner) internal {
        assembly {
            // EIP 1967
            // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)
            sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newUpgradeabilityOwner)
        }
    }
}

File 6 of 8 : UpgradeabilityProxy.sol
pragma solidity 0.7.5;

import "@openzeppelin/contracts/utils/Address.sol";
import "./Proxy.sol";
import "./UpgradeabilityStorage.sol";

/**
 * @title UpgradeabilityProxy
 * @dev This contract represents a proxy where the implementation address to which it will delegate can be upgraded
 */
contract UpgradeabilityProxy is Proxy, UpgradeabilityStorage {
    /**
     * @dev This event will be emitted every time the implementation gets upgraded
     * @param version representing the version name of the upgraded implementation
     * @param implementation representing the address of the upgraded implementation
     */
    event Upgraded(uint256 version, address indexed implementation);

    /**
     * @dev Tells the address of the current implementation
     * @return address of the current implementation
     */
    function implementation() public view override(Proxy, UpgradeabilityStorage) returns (address) {
        return UpgradeabilityStorage.implementation();
    }

    /**
     * @dev Upgrades the implementation address.
     * @param _version representing the version name of the new implementation to be set.
     * @param _implementation representing the address of the new implementation to be set.
     */
    function _upgradeTo(uint256 _version, address _implementation) internal {
        require(_implementation != implementation());

        // This additional check verifies that provided implementation is at least a contract
        require(Address.isContract(_implementation));

        // This additional check guarantees that new version will be at least greater than the privios one,
        // so it is impossible to reuse old versions, or use the last version twice
        require(_version > version());

        _setVersion(_version);
        _setImplementation(_implementation);
        emit Upgraded(_version, _implementation);
    }
}

File 7 of 8 : UpgradeabilityStorage.sol
pragma solidity 0.7.5;

/**
 * @title UpgradeabilityStorage
 * @dev This contract holds all the necessary state variables to support the upgrade functionality
 */
contract UpgradeabilityStorage {
    /**
     * @dev Tells the version name of the current implementation
     * @return version uint256 representing the name of the current version
     */
    function version() public view returns (uint256 version) {
        assembly {
            // EIP 1967
            // bytes32(uint256(keccak256('eip1967.proxy.version')) - 1)
            version := sload(0x460994c355dbc8229336897ed9def5884fb6b26b0a995b156780d056c758577d)
        }
    }

    /**
     * @dev Tells the address of the current implementation
     * @return impl address of the current implementation
     */
    function implementation() public view virtual returns (address impl) {
        assembly {
            // EIP 1967
            // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)
            impl := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)
        }
    }

    /**
     * Internal function for updating version of the implementation contract.
     * @param _version new version number.
     */
    function _setVersion(uint256 _version) internal {
        assembly {
            // EIP 1967
            // bytes32(uint256(keccak256('eip1967.proxy.version')) - 1)
            sstore(0x460994c355dbc8229336897ed9def5884fb6b26b0a995b156780d056c758577d, _version)
        }
    }

    /**
     * Internal function for updating implementation contract address.
     * @param _impl new implementation contract address.
     */
    function _setImplementation(address _impl) internal {
        assembly {
            // EIP 1967
            // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)
            sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, _impl)
        }
    }
}

File 8 of 8 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    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");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (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 {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"ProxyOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferProxyOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"address","name":"implementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"address","name":"implementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"upgradeabilityOwner","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"version","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b5061001a3361001f565b610043565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b61052f806100526000396000f3fe6080604052600436106100555760003560e01c80633ad06d161461009e57806354fd4d50146100d95780635c60da1b146101005780636fde820214610131578063a9c45fcb14610146578063f1739cae146101cb575b600061005f6101fe565b90506001600160a01b03811661007457600080fd5b60405136600082376000803683855af43d82016040523d6000833e80801561009a573d83f35b3d83fd5b3480156100aa57600080fd5b506100d7600480360360408110156100c157600080fd5b50803590602001356001600160a01b031661020d565b005b3480156100e557600080fd5b506100ee610240565b60408051918252519081900360200190f35b34801561010c57600080fd5b506101156101fe565b604080516001600160a01b039092168252519081900360200190f35b34801561013d57600080fd5b50610115610265565b6100d76004803603606081101561015c57600080fd5b8135916001600160a01b036020820135169181019060608101604082013564010000000081111561018c57600080fd5b82018360208201111561019e57600080fd5b803590602001918460018302840111640100000000831117156101c057600080fd5b50909250905061028a565b3480156101d757600080fd5b506100d7600480360360208110156101ee57600080fd5b50356001600160a01b0316610333565b60006102086103c2565b905090565b610215610265565b6001600160a01b0316336001600160a01b03161461023257600080fd5b61023c82826103e7565b5050565b7f460994c355dbc8229336897ed9def5884fb6b26b0a995b156780d056c758577d5490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610292610265565b6001600160a01b0316336001600160a01b0316146102af57600080fd5b6102b9848461020d565b6000306001600160a01b0316348484604051808383808284376040519201945060009350909150508083038185875af1925050503d8060008114610319576040519150601f19603f3d011682016040523d82523d6000602084013e61031e565b606091505b505090508061032c57600080fd5b5050505050565b61033b610265565b6001600160a01b0316336001600160a01b03161461035857600080fd5b6001600160a01b03811661036b57600080fd5b7f5a3e66efaa1e445ebd894728a69d6959842ea1e97bd79b892797106e270efcd9610394610265565b604080516001600160a01b03928316815291841660208301528051918290030190a16103bf81610487565b50565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6103ef6101fe565b6001600160a01b0316816001600160a01b0316141561040d57600080fd5b610416816104ab565b61041f57600080fd5b610427610240565b821161043257600080fd5b61043b826104b1565b610444816104d5565b6040805183815290516001600160a01b038316917f4289d6195cf3c2d2174adf98d0e19d4d2d08887995b99cb7b100e7ffe795820e919081900360200190a25050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b3b151590565b7f460994c355dbc8229336897ed9def5884fb6b26b0a995b156780d056c758577d55565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fea2646970667358221220b20dbe2062d660b40fdc93e67ac4bde8bb4d1fc1c085ecea26a8ca9e2064d30c64736f6c63430007050033

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.