Sonic Blaze Testnet

Contract

0x07Ae0A6D2a687DE98D62Ff3B0220c476EBC950b4

Overview

S Balance

Sonic Blaze LogoSonic Blaze LogoSonic Blaze Logo0 S

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

4 Internal Transactions found.

Latest 4 internal transactions

Parent Transaction Hash Block From To
256827132025-03-11 0:24:4132 hrs ago1741652681
0x07Ae0A6D...6EBC950b4
0 S
256827132025-03-11 0:24:4132 hrs ago1741652681
0x07Ae0A6D...6EBC950b4
0 S
256827132025-03-11 0:24:4132 hrs ago1741652681
0x07Ae0A6D...6EBC950b4
0 S
256823822025-03-11 0:21:5032 hrs ago1741652510  Contract Creation0 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
InitialProxyImplementationWithOwner

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 8 : InitialProxyImplementationWithOwner.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

import { UUPSImplementation } from "src/proxy/UUPSImplementation.sol";
import { Ownable } from "src/ownership/Ownable.sol";

/**
 * @dev The below contract is only used as an intermediary implementation contract
 * when initializing the proxy to make sure that, when deployed using CREATE2,
 * we always get the same contract address since the bytecode is deterministic.
 */
contract InitialProxyImplementationWithOwner is UUPSImplementation, Ownable {
    constructor() Ownable(address(this)) { }

    function upgradeTo(address newImplementation) public override {
        _onlyOwner();

        // If the current implementation is the same as the new one, we return blank to avoid the NoChange Error event.
        // This is helpful when trying to build the package for the first time, so that we can smoothly upgrade the proxy impl
        if (newImplementation == this.getImplementation()) {
            emit Upgraded(address(this), newImplementation);
            return;
        }

        _upgradeTo(newImplementation);
    }
}

File 2 of 8 : AddressUtil.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

library AddressUtil {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

File 3 of 8 : IOwnable.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

/**
 * @title Contract for facilitating ownership by a single address, using the Openzeppelin ownable upgradable storage slot.
 * @dev Implementation is a modified version of Openzeppelin and Synthetix Ownable implementations.
 */
interface IOwnable {
    /*///////////////////////////////////////////////////////////////
                                ERRORS
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Thrown when an address tries to accept ownership but has not been nominated.
     * @param addr The address that is trying to accept ownership.
     */
    error NotNominated(address addr);

    /**
     * @notice Thrown when an address tries to renounce pending ownership but not owner or pending owner.
     * @param addr The address that is trying to renounce pending ownership.
     */
    error NotNominatedOrOwner(address addr);

    /**
     * @notice Thrown when an address is zero.
     */
    error ZeroAddress();

    /**
     * @notice Thrown when no change is made.
     */
    error NoChange();

    /**
     * @notice Thrown when an address is not the owner.
     */
    error Unauthorized(address addr);

    /*///////////////////////////////////////////////////////////////
                                EVENTS
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Emitted when an address has been nominated.
     * @param newOwner The address that has been nominated.
     */
    event OwnerNominated(address newOwner);

    /**
     * @notice Emitted when the owner of the contract has changed.
     * @param oldOwner The previous owner of the contract.
     * @param newOwner The new owner of the contract.
     */
    event OwnerChanged(address oldOwner, address newOwner);

    /**
     * @notice Emitted when the nominated pending owner renounces themselves as nominated.
     * @param pendingOwner The pending owner that is renounced.
     */
    event PendingOwnerRenounced(address pendingOwner);

    /*///////////////////////////////////////////////////////////////
                        VIEW FUNCTIONS
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Returns the current owner of the contract.
     */
    function owner() external view returns (address);

    /**
     * @notice Returns the current pending owner of the contract.
     * @dev Only one address can be pending at a time.
     */
    function pendingOwner() external view returns (address);

    /*///////////////////////////////////////////////////////////////
                        MUTATIVE FUNCTIONS
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Allows a pending owner address to accept ownership of the contract.
     * @dev Reverts if the caller has not been nominated.
     */
    function acceptOwnership() external;

    /**
     * @notice Allows the current owner to nominate a new owner.
     * @dev The pending owner will have to call `acceptOwnership` in a separate transaction in order to finalize the action and become the new contract owner.
     * @param newOwner The address that is to become nominated.
     */
    function transferOwnership(address newOwner) external;

    /**
     * @notice Allows a pending owner to reject the nomination.
     */
    function renouncePendingOwnership() external;

    /**
     * @notice Allows the current owner of the contract to renounce the ownership and pending ownership completely.
     */
    function renounceOwnership() external;
}

File 4 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

import { IOwnable } from "src/ownership/IOwnable.sol";

import { OwnableStorage } from "src/ownership/OwnableStorage.sol";

/**
 * @title Contract for facilitating ownership by a single address, using the Openzeppelin ownable upgradable storage slot.
 * @dev Implementation is a modified version of Openzeppelin and Synthetix Ownable implementations.
 */
abstract contract Ownable is IOwnable {
    /*///////////////////////////////////////////////////////////////
                            CONSTRUCTOR
    ///////////////////////////////////////////////////////////////*/

    constructor(address initialOwner) {
        if (initialOwner == address(0)) revert ZeroAddress();
        OwnableStorage._setOwner(initialOwner);
    }

    /*///////////////////////////////////////////////////////////////
                            MODIFIERS
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Reverts if the caller is not the owner.
     */
    modifier onlyOwner() {
        _onlyOwner();

        _;
    }

    /*///////////////////////////////////////////////////////////////
                            VIEW FUNCTIONS
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Returns the current owner of the contract.
     */
    function owner() external view virtual returns (address) {
        return _owner();
    }

    /**
     * @notice Returns the current pending owner of the contract.
     * @dev Only one address can be pending at a time.
     */
    function pendingOwner() external view virtual returns (address) {
        return _pendingOwner();
    }

    /*///////////////////////////////////////////////////////////////
                            INTERNAL FUNCTIONS
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Returns the current owner of the contract.
     */
    function _owner() internal view virtual returns (address) {
        return OwnableStorage._getOwner();
    }

    /**
     * @notice Returns the current pending owner of the contract.
     * @dev Only one address can be nominated at a time.
     */
    function _pendingOwner() internal view virtual returns (address) {
        return OwnableStorage._getPendingOwner();
    }

    /**
     * @notice Reverts if the caller is not the owner.
     */
    function _onlyOwner() internal view virtual {
        if (msg.sender != _owner()) {
            revert Unauthorized(msg.sender);
        }
    }

    /*///////////////////////////////////////////////////////////////
                        MUTATIVE FUNCTIONS
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Allows a pending owner to accept ownership of the contract.
     * @dev Reverts if the caller is not pending owner.
     */
    function acceptOwnership() public virtual {
        address currentPendingOwner = _pendingOwner();

        if (msg.sender != currentPendingOwner) {
            revert NotNominated(msg.sender);
        }

        emit OwnerChanged(_owner(), currentPendingOwner);
        OwnableStorage._setOwner(currentPendingOwner);
        OwnableStorage._setPendingOwner(address(0));
    }

    /**
     * @notice Allows the current owner to nominate a new owner.
     * @dev The pending owner will have to call `acceptOwnership` in a separate transaction in order to finalize the action and become the new contract owner.
     * @param newOwner The address that is to become nominated.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert ZeroAddress();
        }

        if (newOwner == _pendingOwner()) {
            revert NoChange();
        }

        emit OwnerNominated(newOwner);
        OwnableStorage._setPendingOwner(newOwner);
    }

    /**
     * @notice Allows a pending owner or owner to reject the nomination.
     */
    function renouncePendingOwnership() external virtual {
        address pendingOwner = _pendingOwner();

        if (pendingOwner != msg.sender && msg.sender != _owner()) {
            revert NotNominatedOrOwner(msg.sender);
        }

        emit PendingOwnerRenounced(pendingOwner);
        OwnableStorage._setPendingOwner(address(0));
    }

    /**
     * @notice Allows the current owner of the contract to renounce the ownership and pending ownership completely.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit PendingOwnerRenounced(_pendingOwner());
        OwnableStorage._setPendingOwner(address(0));

        emit OwnerChanged(_owner(), address(0));
        OwnableStorage._setOwner(address(0));
    }
}

File 5 of 8 : OwnableStorage.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

/**
 * @title Ownable Storage
 * @dev This library provides storage and functions for managing the ownership of a contract, using the Openzeppelin ownable upgradable storage slot.
 * Implementation is a modified version of Openzeppelin and Synthetix Ownable implementations.
 */
library OwnableStorage {
    // Storage slot copied from the Openzeppelin ownable upgradable contract.
    // https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/master/contracts/access/OwnableUpgradeable.sol
    // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant _SLOT_OWNABLE_STORAGE = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; //#gitleaks:allow

    struct Storage {
        address _owner;
        address _pendingOwner;
    }

    /**
     * @notice Loads the storage data for the Ownable contract
     * @return store The storage data for the Ownable contract
     */
    function getStorage() internal pure returns (Storage storage store) {
        bytes32 s = _SLOT_OWNABLE_STORAGE;
        assembly {
            store.slot := s
        }
    }

    /**
     * @notice Returns the current owner of the contract
     * @return The address of the owner
     */
    function _getOwner() internal view returns (address) {
        return getStorage()._owner;
    }

    /**
     * @notice Returns the pending owner of the contract.
     * @return The address of the pending owner.
     */
    function _getPendingOwner() internal view returns (address) {
        return getStorage()._pendingOwner;
    }

    /**
     * @notice Sets the owner in ownable storage.
     * @param _newOwner The new owner of the contract.
     */
    function _setOwner(address _newOwner) internal {
        getStorage()._owner = _newOwner;
    }

    /**
     * @notice Sets the pending owner.
     * @param _newOwner The new pending owner of the contract.
     */
    function _setPendingOwner(address _newOwner) internal {
        getStorage()._pendingOwner = _newOwner;
    }
}

File 6 of 8 : IUUPSImplementation.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

/**
 * @title Contract to be used as the implementation of a Universal Upgradeable Proxy Standard (UUPS) proxy.
 * Important: A UUPS proxy requires its upgradeability functions to be in the implementation as opposed to the proxy.
 * This means that if the proxy is upgraded to an implementation that does not support this interface, it will no longer be upgradeable.
 * Copied from Synthetix
 * https://github.com/Synthetixio/synthetix-v3/blob/main/utils/core-contracts/contracts/interfaces/IUUPSImplementation.sol
 */
interface IUUPSImplementation {
    /**
     * @notice Thrown when an incoming implementation will not be able to receive future upgrades.
     */
    error ImplementationIsSterile(address implementation);

    /**
     * @notice Thrown intentionally when testing future upgradeability of an implementation.
     */
    error UpgradeSimulationFailed();

    /**
     * @notice Thrown when the address is zero.
     */
    error NullAddress();

    /**
     * @notice Thrown when the address is not a contract.
     */
    error NotAContract(address implementation);

    /**
     * @notice Thrown when the implementation is the same as the current implementation.
     */
    error SameImplementation();

    /**
     * @notice Emitted when the implementation of the proxy has been upgraded.
     * @param self The address of the proxy whose implementation was upgraded.
     * @param implementation The address of the proxy's new implementation.
     */
    event Upgraded(address indexed self, address implementation);

    /**
     * @notice Allows the proxy to be upgraded to a new implementation.
     * @param newImplementation The address of the proxy's new implementation.
     * @dev Will revert if `newImplementation` is not upgradeable.
     * @dev The implementation of this function needs to be protected by some sort of access control such as `onlyOwner`.
     */
    function upgradeTo(address newImplementation) external;

    /**
     * @notice Function used to determine if a new implementation will be able to receive future upgrades in `upgradeTo`.
     * @param newImplementation The address of the new implementation being tested for future upgradeability.
     * @dev This function will always revert, but will revert with different error messages. The function `upgradeTo` uses this error to determine the future upgradeability of the implementation in question.
     */
    function simulateUpgradeTo(address newImplementation) external;

    /**
     * @notice Retrieves the current implementation of the proxy.
     * @return The address of the current implementation.
     */
    function getImplementation() external view returns (address);
}

File 7 of 8 : ProxyStorage.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

/**
 * @dev Modified Synthetix proxy storage contract.
 * https://github.com/Synthetixio/synthetix-v3/blob/main/utils/core-contracts/contracts/proxy/ProxyStorage.sol
 */
contract ProxyStorage {
    // keccak256(abi.encode("io.synthetix.core-contracts.Proxy"));
    bytes32 private constant _SLOT_PROXY_STORAGE = 0x5a648c35a2f5512218b4683cf10e03f5b7c9dc7346e1bf77d304ae97f60f592b; //#gitleaks:allow

    struct ProxyStore {
        address implementation;
        bool simulatingUpgrade;
    }

    function _proxyStore() internal pure returns (ProxyStore storage store) {
        bytes32 s = _SLOT_PROXY_STORAGE;
        assembly {
            store.slot := s
        }
    }
}

File 8 of 8 : UUPSImplementation.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

import { IUUPSImplementation } from "src/proxy/IUUPSImplementation.sol";
import { AddressUtil } from "src/libraries/AddressUtil.sol";
import { ProxyStorage } from "src/proxy/ProxyStorage.sol";

/**
 * @dev Modified Synthetix UUPS Implementation contract
 * https://github.com/Synthetixio/synthetix-v3/blob/main/utils/core-contracts/contracts/proxy/UUPSImplementation.sol
 */
abstract contract UUPSImplementation is IUUPSImplementation, ProxyStorage {
    /**
     * @notice Function used to determine if a new implementation will be able to receive future upgrades in `upgradeTo`.
     * @param newImplementation The address of the new implementation being tested for future upgradeability.
     * @dev This function will always revert, but will revert with different error messages. The function `upgradeTo` uses this error to determine the future upgradeability of the implementation in question.
     */
    function simulateUpgradeTo(address newImplementation) public override {
        if (newImplementation == address(0)) {
            revert NullAddress();
        }

        ProxyStore storage store = _proxyStore();
        store.simulatingUpgrade = true;
        address currentImplementation = store.implementation;
        store.implementation = newImplementation;

        // slither-disable-start controlled-delegatecall
        // solhint-disable-next-line avoid-low-level-calls
        (bool rollbackSuccessful,) = newImplementation.delegatecall(abi.encodeCall(this.upgradeTo, (currentImplementation)));
        // slither-disable-end controlled-delegatecall

        if (!rollbackSuccessful || _proxyStore().implementation != currentImplementation) {
            revert UpgradeSimulationFailed();
        }

        store.simulatingUpgrade = false;

        // solhint-disable-next-line reason-string,gas-custom-errors
        revert();
    }

    /**
     * @notice Retrieves the current implementation of the proxy.
     * @return The address of the current implementation.
     */
    function getImplementation() external view override returns (address) {
        return _proxyStore().implementation;
    }

    /**
     * @notice Allows the proxy to be upgraded to a new implementation.
     * @param newImplementation The address of the new implementation.
     * @dev Will revert if `newImplementation` is not upgradeable.
     * @dev The implementation of this function needs to be protected by some sort of access control such as `onlyOwner`.
     */
    function _upgradeTo(address newImplementation) internal virtual {
        if (newImplementation == address(0)) {
            revert NullAddress();
        }

        if (!AddressUtil.isContract(newImplementation)) {
            revert NotAContract(newImplementation);
        }

        ProxyStore storage store = _proxyStore();

        if (newImplementation == store.implementation) {
            revert SameImplementation();
        }

        if (!store.simulatingUpgrade && _implementationIsSterile(newImplementation)) {
            revert ImplementationIsSterile(newImplementation);
        }

        store.implementation = newImplementation;

        emit Upgraded(address(this), newImplementation);
    }

    /**
     * @notice Checks if the candidate implementation is sterile.
     * @param candidateImplementation The address of the candidate implementation.
     * @return True if the candidate implementation is sterile, false otherwise.
     */
    function _implementationIsSterile(address candidateImplementation) internal virtual returns (bool) {
        (bool simulationReverted, bytes memory simulationResponse) =
        // solhint-disable-next-line avoid-low-level-calls
         address(this).delegatecall(abi.encodeCall(this.simulateUpgradeTo, (candidateImplementation)));

        return !simulationReverted
            && keccak256(abi.encodePacked(simulationResponse)) == keccak256(abi.encodePacked(UpgradeSimulationFailed.selector));
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "shanghai",
  "remappings": [
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@pythnetwork/entropy-sdk-solidity/=node_modules/@pythnetwork/entropy-sdk-solidity/",
    "@synthetixio/core-contracts/=node_modules/@synthetixio/core-contracts/",
    "@synthetixio/core-modules/=node_modules/@synthetixio/core-modules/",
    "@synthetixio/main/=node_modules/@synthetixio/main/",
    "@synthetixio/oracle-manager/=node_modules/@synthetixio/oracle-manager/",
    "@synthetixio/perps-market/=node_modules/@synthetixio/perps-market/",
    "@synthetixio/spot-market/=node_modules/@synthetixio/spot-market/",
    "ERC721A/=lib/ERC721A/contracts/",
    "cannon-std/=lib/cannon-std/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "wormhole-circle-integration/=lib/wormhole-circle-integration/evm/src/",
    "wormhole-solidity-sdk/=lib/wormhole-solidity-sdk/src/",
    "wormhole/=lib/wormhole-circle-integration/evm/src/"
  ],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ImplementationIsSterile","type":"error"},{"inputs":[],"name":"NoChange","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"NotAContract","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"NotNominated","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"NotNominatedOrOwner","type":"error"},{"inputs":[],"name":"NullAddress","type":"error"},{"inputs":[],"name":"SameImplementation","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UpgradeSimulationFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"PendingOwnerRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"self","type":"address"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePendingOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"simulateUpgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561000f575f80fd5b50308061002f5760405163d92e233d60e01b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b0319166001600160a01b038316179055506109fd806100775f395ff3fe608060405234801561000f575f80fd5b5060043610610090575f3560e01c80639ced959c116100635780639ced959c146100dd578063aaf10f42146100e5578063c7f62cda146100ed578063e30c397814610100578063f2fde38b14610108575f80fd5b80633659cfe614610094578063715018a6146100a957806379ba5097146100b15780638da5cb5b146100b9575b5f80fd5b6100a76100a236600461093e565b61011b565b005b6100a76101e8565b6100a7610291565b6100c1610329565b6040516001600160a01b03909116815260200160405180910390f35b6100a7610337565b6100c16103d9565b6100a76100fb36600461093e565b6103f8565b6100c1610533565b6100a761011636600461093e565b61053c565b6101236105e9565b306001600160a01b031663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa15801561015f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101839190610960565b6001600160a01b0316816001600160a01b0316036101dc576040516001600160a01b038216815230907f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c79060200160405180910390a250565b6101e581610624565b50565b6101f06105e9565b7ff4907248db93a98ecbc4159d3185003476dd4e957f364d6a150074c34778cae061021961074b565b6040516001600160a01b03909116815260200160405180910390a161023d5f61077d565b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6102666107be565b604080516001600160a01b0390921682525f60208301520160405180910390a161028f5f6107c7565b565b5f61029a61074b565b9050336001600160a01b038216146102cc5760405163a0e5a0d760e01b81523360048201526024015b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6102f56107be565b604080516001600160a01b03928316815291841660208301520160405180910390a1610320816107c7565b6101e55f61077d565b5f6103326107be565b905090565b5f61034061074b565b90506001600160a01b0381163314801590610374575061035e6107be565b6001600160a01b0316336001600160a01b031614155b1561039457604051637bce25d560e11b81523360048201526024016102c3565b6040516001600160a01b03821681527ff4907248db93a98ecbc4159d3185003476dd4e957f364d6a150074c34778cae09060200160405180910390a16101e55f61077d565b5f5f805160206109a88339815191525b546001600160a01b0316919050565b6001600160a01b03811661041f5760405163e99d5ac560e01b815260040160405180910390fd5b5f805160206109a883398151915280546001600160a01b038381166001600160a81b031983168117600160a01b1784556040805192909316602480840182905284518085039091018152604490930184526020830180516001600160e01b0316631b2ce7f360e11b17905292515f926104979161097b565b5f60405180830381855af49150503d805f81146104cf576040519150601f19603f3d011682016040523d82523d5f602084013e6104d4565b606091505b5050905080158061050557506001600160a01b0382165f805160206109a8833981519152546001600160a01b031614155b1561052357604051631439f4b560e31b815260040160405180910390fd5b825460ff60a01b191683555f8080fd5b5f61033261074b565b6105446105e9565b6001600160a01b03811661056b5760405163d92e233d60e01b815260040160405180910390fd5b61057361074b565b6001600160a01b0316816001600160a01b0316036105a45760405163a88ee57760e01b815260040160405180910390fd5b6040516001600160a01b03821681527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a16101e58161077d565b6105f16107be565b6001600160a01b0316336001600160a01b03161461028f5760405163472511eb60e11b81523360048201526024016102c3565b6001600160a01b03811661064b5760405163e99d5ac560e01b815260040160405180910390fd5b803b610675576040516322a2d07b60e21b81526001600160a01b03821660048201526024016102c3565b5f805160206109a883398151915280546001600160a01b03908116908316036106b157604051634c3b76bf60e01b815260040160405180910390fd5b8054600160a01b900460ff161580156106ce57506106ce82610808565b156106f757604051631550430160e01b81526001600160a01b03831660048201526024016102c3565b80546001600160a01b0319166001600160a01b038316908117825560405190815230907f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c79060200160405180910390a25050565b5f6103327f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199301546001600160a01b031690565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930180546001600160a01b0319166001600160a01b0392909216919091179055565b5f610332610903565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b03831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166363fb166d60e11b17905290515f9182918291309161085e919061097b565b5f60405180830381855af49150503d805f8114610896576040519150601f19603f3d011682016040523d82523d5f602084013e61089b565b606091505b5091509150811580156108fb5750604051631439f4b560e31b602082015260240160405160208183030381529060405280519060200120816040516020016108e3919061097b565b60405160208183030381529060405280519060200120145b949350505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993006103e9565b6001600160a01b03811681146101e5575f80fd5b5f6020828403121561094e575f80fd5b81356109598161092a565b9392505050565b5f60208284031215610970575f80fd5b81516109598161092a565b5f82515f5b8181101561099a5760208186018101518583015201610980565b505f92019182525091905056fe5a648c35a2f5512218b4683cf10e03f5b7c9dc7346e1bf77d304ae97f60f592ba264697066735822122008290d04104f33834f57eb14ff1fe78bd45ce36f93fba32187f5d605ac13bbbc64736f6c63430008150033

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610090575f3560e01c80639ced959c116100635780639ced959c146100dd578063aaf10f42146100e5578063c7f62cda146100ed578063e30c397814610100578063f2fde38b14610108575f80fd5b80633659cfe614610094578063715018a6146100a957806379ba5097146100b15780638da5cb5b146100b9575b5f80fd5b6100a76100a236600461093e565b61011b565b005b6100a76101e8565b6100a7610291565b6100c1610329565b6040516001600160a01b03909116815260200160405180910390f35b6100a7610337565b6100c16103d9565b6100a76100fb36600461093e565b6103f8565b6100c1610533565b6100a761011636600461093e565b61053c565b6101236105e9565b306001600160a01b031663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa15801561015f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101839190610960565b6001600160a01b0316816001600160a01b0316036101dc576040516001600160a01b038216815230907f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c79060200160405180910390a250565b6101e581610624565b50565b6101f06105e9565b7ff4907248db93a98ecbc4159d3185003476dd4e957f364d6a150074c34778cae061021961074b565b6040516001600160a01b03909116815260200160405180910390a161023d5f61077d565b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6102666107be565b604080516001600160a01b0390921682525f60208301520160405180910390a161028f5f6107c7565b565b5f61029a61074b565b9050336001600160a01b038216146102cc5760405163a0e5a0d760e01b81523360048201526024015b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6102f56107be565b604080516001600160a01b03928316815291841660208301520160405180910390a1610320816107c7565b6101e55f61077d565b5f6103326107be565b905090565b5f61034061074b565b90506001600160a01b0381163314801590610374575061035e6107be565b6001600160a01b0316336001600160a01b031614155b1561039457604051637bce25d560e11b81523360048201526024016102c3565b6040516001600160a01b03821681527ff4907248db93a98ecbc4159d3185003476dd4e957f364d6a150074c34778cae09060200160405180910390a16101e55f61077d565b5f5f805160206109a88339815191525b546001600160a01b0316919050565b6001600160a01b03811661041f5760405163e99d5ac560e01b815260040160405180910390fd5b5f805160206109a883398151915280546001600160a01b038381166001600160a81b031983168117600160a01b1784556040805192909316602480840182905284518085039091018152604490930184526020830180516001600160e01b0316631b2ce7f360e11b17905292515f926104979161097b565b5f60405180830381855af49150503d805f81146104cf576040519150601f19603f3d011682016040523d82523d5f602084013e6104d4565b606091505b5050905080158061050557506001600160a01b0382165f805160206109a8833981519152546001600160a01b031614155b1561052357604051631439f4b560e31b815260040160405180910390fd5b825460ff60a01b191683555f8080fd5b5f61033261074b565b6105446105e9565b6001600160a01b03811661056b5760405163d92e233d60e01b815260040160405180910390fd5b61057361074b565b6001600160a01b0316816001600160a01b0316036105a45760405163a88ee57760e01b815260040160405180910390fd5b6040516001600160a01b03821681527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a16101e58161077d565b6105f16107be565b6001600160a01b0316336001600160a01b03161461028f5760405163472511eb60e11b81523360048201526024016102c3565b6001600160a01b03811661064b5760405163e99d5ac560e01b815260040160405180910390fd5b803b610675576040516322a2d07b60e21b81526001600160a01b03821660048201526024016102c3565b5f805160206109a883398151915280546001600160a01b03908116908316036106b157604051634c3b76bf60e01b815260040160405180910390fd5b8054600160a01b900460ff161580156106ce57506106ce82610808565b156106f757604051631550430160e01b81526001600160a01b03831660048201526024016102c3565b80546001600160a01b0319166001600160a01b038316908117825560405190815230907f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c79060200160405180910390a25050565b5f6103327f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199301546001600160a01b031690565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930180546001600160a01b0319166001600160a01b0392909216919091179055565b5f610332610903565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b03831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166363fb166d60e11b17905290515f9182918291309161085e919061097b565b5f60405180830381855af49150503d805f8114610896576040519150601f19603f3d011682016040523d82523d5f602084013e61089b565b606091505b5091509150811580156108fb5750604051631439f4b560e31b602082015260240160405160208183030381529060405280519060200120816040516020016108e3919061097b565b60405160208183030381529060405280519060200120145b949350505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993006103e9565b6001600160a01b03811681146101e5575f80fd5b5f6020828403121561094e575f80fd5b81356109598161092a565b9392505050565b5f60208284031215610970575f80fd5b81516109598161092a565b5f82515f5b8181101561099a5760208186018101518583015201610980565b505f92019182525091905056fe5a648c35a2f5512218b4683cf10e03f5b7c9dc7346e1bf77d304ae97f60f592ba264697066735822122008290d04104f33834f57eb14ff1fe78bd45ce36f93fba32187f5d605ac13bbbc64736f6c63430008150033

Block Transaction Gas Used Reward
view all blocks ##produced##

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

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.