ETH Price: $2,412.19 (-0.23%)

Contract

0x91763Fb0Cb149cFd35EFA398480593f0638083DF
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute152636472022-08-02 14:27:10795 days ago1659450430IN
0x91763Fb0...0638083DF
0 ETH0.0009937514.12467097

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
152636322022-08-02 14:23:48795 days ago1659450228  Contract Creation0 ETH
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xECEb337e...49EBeE4F8
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
PRBProxy

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 8000 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2022-05-20
*/

// SPDX-License-Identifier: Unlicense
pragma solidity >=0.8.4;

/// @title IPRBProxy
/// @author Paul Razvan Berg
/// @notice Proxy contract to compose transactions on owner's behalf.
interface IPRBProxy {
    /// EVENTS ///

    event Execute(address indexed target, bytes data, bytes response);

    event TransferOwnership(address indexed oldOwner, address indexed newOwner);

    /// PUBLIC CONSTANT FUNCTIONS ///

    /// @notice Returns a boolean flag that indicates whether the envoy has permission to call the given target
    /// contract and function selector.
    function getPermission(
        address envoy,
        address target,
        bytes4 selector
    ) external view returns (bool);

    /// @notice The address of the owner account or contract.
    function owner() external view returns (address);

    /// @notice How much gas to reserve for running the remainder of the "execute" function after the DELEGATECALL.
    /// @dev This prevents the proxy from becoming unusable if EVM opcode gas costs change in the future.
    function minGasReserve() external view returns (uint256);

    /// PUBLIC NON-CONSTANT FUNCTIONS ///

    /// @notice Delegate calls to the target contract by forwarding the call data. Returns the data it gets back,
    /// including when the contract call reverts with a reason or custom error.
    ///
    /// @dev Requirements:
    /// - The caller must be either an owner or an envoy.
    /// - `target` must be a deployed contract.
    /// - The owner cannot be changed during the DELEGATECALL.
    ///
    /// @param target The address of the target contract.
    /// @param data Function selector plus ABI encoded data.
    /// @return response The response received from the target contract.
    function execute(address target, bytes calldata data) external payable returns (bytes memory response);

    /// @notice Gives or takes a permission from an envoy to call the given target contract and function selector
    /// on behalf of the owner.
    /// @dev It is not an error to reset a permission on the same (envoy,target,selector) tuple multiple types.
    ///
    /// Requirements:
    /// - The caller must be the owner.
    ///
    /// @param envoy The address of the envoy account.
    /// @param target The address of the target contract.
    /// @param selector The 4 byte function selector on the target contract.
    /// @param permission The boolean permission to set.
    function setPermission(
        address envoy,
        address target,
        bytes4 selector,
        bool permission
    ) external;

    /// @notice Transfers the owner of the contract to a new account.
    /// @dev Requirements:
    /// - The caller must be the owner.
    /// @param newOwner The address of the new owner account.
    function transferOwnership(address newOwner) external;
}// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)



// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)



// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)



// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)



/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)





/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}

/**
 * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.
 *
 * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
 * stuck.
 *
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol)



// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)



/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of the {IERC721Receiver} interface.
 *
 * Accepts all token transfers.
 * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
 */
contract ERC721Holder is IERC721Receiver {
    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
}
/// @notice Emitted when the caller is not the owner.
error PRBProxy__ExecutionNotAuthorized(address owner, address caller, address target, bytes4 selector);

/// @notice Emitted when execution reverted with no reason.
error PRBProxy__ExecutionReverted();

/// @notice Emitted when the caller is not the owner.
error PRBProxy__NotOwner(address owner, address caller);

/// @notice Emitted when the owner is changed during the DELEGATECALL.
error PRBProxy__OwnerChanged(address originalOwner, address newOwner);

/// @notice Emitted when passing an EOA or an undeployed contract as the target.
error PRBProxy__TargetInvalid(address target);

/// @title PRBProxy
/// @author Paul Razvan Berg
contract PRBProxy is IPRBProxy, ERC1155Holder, ERC721Holder {
    /// PUBLIC STORAGE ///

    /// @inheritdoc IPRBProxy
    address public override owner;

    /// @inheritdoc IPRBProxy
    uint256 public override minGasReserve;

    /// INTERNAL STORAGE ///

    /// @notice Maps envoys to target contracts to function selectors to boolean flags.
    mapping(address => mapping(address => mapping(bytes4 => bool))) internal permissions;

    /// CONSTRUCTOR ///

    constructor() {
        minGasReserve = 5_000;
        owner = msg.sender;
        emit TransferOwnership(address(0), msg.sender);
    }

    /// FALLBACK FUNCTION ///

    /// @dev Called when Ether is sent and the call data is empty.
    receive() external payable {}

    /// PUBLIC CONSTANT FUNCTIONS ///

    /// @inheritdoc IPRBProxy
    function getPermission(
        address envoy,
        address target,
        bytes4 selector
    ) external view override returns (bool) {
        return permissions[envoy][target][selector];
    }

    /// PUBLIC NON-CONSTANT FUNCTIONS ///

    /// @inheritdoc IPRBProxy
    function execute(address target, bytes calldata data) external payable override returns (bytes memory response) {
        // Check that the caller is either the owner or an envoy.
        if (owner != msg.sender) {
            bytes4 selector;
            assembly {
                selector := calldataload(data.offset)
            }
            if (!permissions[msg.sender][target][selector]) {
                revert PRBProxy__ExecutionNotAuthorized(owner, msg.sender, target, selector);
            }
        }

        // Check that the target is a valid contract.
        if (target.code.length == 0) {
            revert PRBProxy__TargetInvalid(target);
        }

        // Save the owner address in memory. This local variable cannot be modified during the DELEGATECALL.
        address owner_ = owner;

        // Reserve some gas to ensure that the function has enough to finish the execution.
        uint256 stipend = gasleft() - minGasReserve;

        // Delegate call to the target contract.
        bool success;
        (success, response) = target.delegatecall{ gas: stipend }(data);

        // Check that the owner has not been changed.
        if (owner_ != owner) {
            revert PRBProxy__OwnerChanged(owner_, owner);
        }

        // Log the execution.
        emit Execute(target, data, response);

        // Check if the call was successful or not.
        if (!success) {
            // If there is return data, the call reverted with a reason or a custom error.
            if (response.length > 0) {
                assembly {
                    let returndata_size := mload(response)
                    revert(add(32, response), returndata_size)
                }
            } else {
                revert PRBProxy__ExecutionReverted();
            }
        }
    }

    /// @inheritdoc IPRBProxy
    function setPermission(
        address envoy,
        address target,
        bytes4 selector,
        bool permission
    ) external override {
        if (owner != msg.sender) {
            revert PRBProxy__NotOwner(owner, msg.sender);
        }
        permissions[envoy][target][selector] = permission;
    }

    /// @inheritdoc IPRBProxy
    function transferOwnership(address newOwner) external override {
        address oldOwner = owner;
        if (oldOwner != msg.sender) {
            revert PRBProxy__NotOwner(oldOwner, msg.sender);
        }
        owner = newOwner;
        emit TransferOwnership(oldOwner, newOwner);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"PRBProxy__ExecutionNotAuthorized","type":"error"},{"inputs":[],"name":"PRBProxy__ExecutionReverted","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"caller","type":"address"}],"name":"PRBProxy__NotOwner","type":"error"},{"inputs":[{"internalType":"address","name":"originalOwner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"PRBProxy__OwnerChanged","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"PRBProxy__TargetInvalid","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"response","type":"bytes"}],"name":"Execute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"TransferOwnership","type":"event"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bytes","name":"response","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"envoy","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"getPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minGasReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"envoy","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"bool","name":"permission","type":"bool"}],"name":"setPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

Deployed Bytecode

0x6080604052600436106100b55760003560e01c8063bc197c8111610069578063e64624fa1161004e578063e64624fa146102c7578063f23a6e61146102e9578063f2fde38b1461032e57600080fd5b8063bc197c8114610201578063da8d882c1461024657600080fd5b80631cff79cd1161009a5780631cff79cd1461016b5780638da5cb5b1461018b5780639d159568146101dd57600080fd5b806301ffc9a7146100c1578063150b7a02146100f657600080fd5b366100bc57005b600080fd5b3480156100cd57600080fd5b506100e16100dc36600461093b565b61034e565b60405190151581526020015b60405180910390f35b34801561010257600080fd5b5061013a610111366004610a8d565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100ed565b61017e610179366004610af5565b6103e7565b6040516100ed9190610be3565b34801561019757600080fd5b506000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b3480156101e957600080fd5b506101f360015481565b6040519081526020016100ed565b34801561020d57600080fd5b5061013a61021c366004610c76565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561025257600080fd5b506100e1610261366004610d20565b73ffffffffffffffffffffffffffffffffffffffff92831660009081526002602090815260408083209490951682529283528381207fffffffff000000000000000000000000000000000000000000000000000000009290921681529152205460ff1690565b3480156102d357600080fd5b506102e76102e2366004610d63565b61071c565b005b3480156102f557600080fd5b5061013a610304366004610dbe565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561033a57600080fd5b506102e7610349366004610e23565b610822565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806103e157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60005460609073ffffffffffffffffffffffffffffffffffffffff1633146104f85733600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452825280832086357fffffffff000000000000000000000000000000000000000000000000000000008116855292529091205460ff166104f6576000546040517fa2ee03b800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015233602482015290861660448201527fffffffff00000000000000000000000000000000000000000000000000000000821660648201526084015b60405180910390fd5b505b8373ffffffffffffffffffffffffffffffffffffffff163b600003610561576040517f29ba3bdf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016104ed565b6000805460015473ffffffffffffffffffffffffffffffffffffffff90911691905a61058d9190610e3e565b905060008673ffffffffffffffffffffffffffffffffffffffff168287876040516105b9929190610e7c565b6000604051808303818686f4925050503d80600081146105f5576040519150601f19603f3d011682016040523d82523d6000602084013e6105fa565b606091505b5060005490955090915073ffffffffffffffffffffffffffffffffffffffff848116911614610679576000546040517fbcac60ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808616600483015290911660248201526044016104ed565b8673ffffffffffffffffffffffffffffffffffffffff167fb24ebe141c5f2a744b103bea65fce6c40e0dc65d7341d092c09b160f404479908787876040516106c393929190610e8c565b60405180910390a280610712578351156106e05783518085602001fd5b6040517fe336368800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050509392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461078f576000546040517fac976e3900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201523360248201526044016104ed565b73ffffffffffffffffffffffffffffffffffffffff93841660009081526002602090815260408083209590961682529384528481207fffffffff00000000000000000000000000000000000000000000000000000000939093168152919092529190912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16338114610892576040517fac976e3900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201523360248201526044016104ed565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84811691821783556040519192908416917f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c9190a35050565b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461093657600080fd5b919050565b60006020828403121561094d57600080fd5b61095682610906565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461093657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156109f7576109f7610981565b604052919050565b600082601f830112610a1057600080fd5b813567ffffffffffffffff811115610a2a57610a2a610981565b610a5b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016109b0565b818152846020838601011115610a7057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215610aa357600080fd5b610aac8561095d565b9350610aba6020860161095d565b925060408501359150606085013567ffffffffffffffff811115610add57600080fd5b610ae9878288016109ff565b91505092959194509250565b600080600060408486031215610b0a57600080fd5b610b138461095d565b9250602084013567ffffffffffffffff80821115610b3057600080fd5b818601915086601f830112610b4457600080fd5b813581811115610b5357600080fd5b876020828501011115610b6557600080fd5b6020830194508093505050509250925092565b6000815180845260005b81811015610b9e57602081850181015186830182015201610b82565b81811115610bb0576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006109566020830184610b78565b600082601f830112610c0757600080fd5b8135602067ffffffffffffffff821115610c2357610c23610981565b8160051b610c328282016109b0565b9283528481018201928281019087851115610c4c57600080fd5b83870192505b84831015610c6b57823582529183019190830190610c52565b979650505050505050565b600080600080600060a08688031215610c8e57600080fd5b610c978661095d565b9450610ca56020870161095d565b9350604086013567ffffffffffffffff80821115610cc257600080fd5b610cce89838a01610bf6565b94506060880135915080821115610ce457600080fd5b610cf089838a01610bf6565b93506080880135915080821115610d0657600080fd5b50610d13888289016109ff565b9150509295509295909350565b600080600060608486031215610d3557600080fd5b610d3e8461095d565b9250610d4c6020850161095d565b9150610d5a60408501610906565b90509250925092565b60008060008060808587031215610d7957600080fd5b610d828561095d565b9350610d906020860161095d565b9250610d9e60408601610906565b915060608501358015158114610db357600080fd5b939692955090935050565b600080600080600060a08688031215610dd657600080fd5b610ddf8661095d565b9450610ded6020870161095d565b93506040860135925060608601359150608086013567ffffffffffffffff811115610e1757600080fd5b610d13888289016109ff565b600060208284031215610e3557600080fd5b6109568261095d565b600082821015610e77577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b8183823760009101908152919050565b604081528260408201528284606083013760006060848301015260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011682016060838203016020840152610ee86060820185610b78565b969550505050505056fea264697066735822122040baae7ba7d17a7154c2408661b75cada84bdd2dbfcadd8f3fe3bd34c5af3fe764736f6c634300080d0033

Deployed Bytecode Sourcemap

10910:3693:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7479:223;;;;;;;;;;-1:-1:-1;7479:223:0;;;;;:::i;:::-;;:::i;:::-;;;592:14:1;;585:22;567:41;;555:2;540:18;7479:223:0;;;;;;;;9991:207;;;;;;;;;;-1:-1:-1;9991:207:0;;;;;:::i;:::-;10160:30;9991:207;;;;;;;;;;2658:66:1;2646:79;;;2628:98;;2616:2;2601:18;9991:207:0;2484:248:1;12041:1860:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11038:29::-;;;;;;;;;;-1:-1:-1;11038:29:0;;;;;;;;;;;4340:42:1;4328:55;;;4310:74;;4298:2;4283:18;11038:29:0;4164:226:1;11107:37:0;;;;;;;;;;;;;;;;;;;4541:25:1;;;4529:2;4514:18;11107:37:0;4395:177:1;8273:255:0;;;;;;;;;;-1:-1:-1;8273:255:0;;;;;:::i;:::-;8484:36;8273:255;;;;;;;;11752:205;;;;;;;;;;-1:-1:-1;11752:205:0;;;;;:::i;:::-;11913:18;;;;11889:4;11913:18;;;:11;:18;;;;;;;;:26;;;;;;;;;;;;:36;;;;;;;;;;;;;;11752:205;13940:323;;;;;;;;;;-1:-1:-1;13940:323:0;;;;;:::i;:::-;;:::i;:::-;;8038:227;;;;;;;;;;-1:-1:-1;8038:227:0;;;;;:::i;:::-;8226:31;8038:227;;;;;;;;14302:298;;;;;;;;;;-1:-1:-1;14302:298:0;;;;;:::i;:::-;;:::i;7479:223::-;7581:4;7605:49;;;7620:34;7605:49;;:89;;-1:-1:-1;7263:25:0;7248:40;;;;7658:36;7598:96;7479:223;-1:-1:-1;;7479:223:0:o;12041:1860::-;12235:5;;12130:21;;12235:19;:5;12244:10;12235:19;12231:334;;12412:10;12271:15;12400:23;;;:11;:23;;;;;;;;;:31;;;;;;;;;12341:25;;12400:41;;;;;;;;;;;;;12395:159;;12502:5;;12469:69;;;;;12502:5;;;;12469:69;;;8170:34:1;12509:10:0;8220:18:1;;;8213:43;8292:15;;;8272:18;;;8265:43;8356:66;8344:79;;8324:18;;;8317:107;8081:19;;12469:69:0;;;;;;;;12395:159;12256:309;12231:334;12636:6;:18;;;12658:1;12636:23;12632:94;;12683:31;;;;;4340:42:1;4328:55;;12683:31:0;;;4310:74:1;4283:18;;12683:31:0;4164:226:1;12632:94:0;12848:14;12865:5;;;13006:13;12865:5;;;;;12848:14;12994:9;:25;;;;:::i;:::-;12976:43;;13082:12;13127:6;:19;;13153:7;13163:4;;13127:41;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13250:5:0;;13105:63;;-1:-1:-1;13105:63:0;;-1:-1:-1;13250:5:0;13240:15;;;13250:5;;13240:15;13236:92;;13310:5;;13279:37;;;;;13310:5;9248:15:1;;;13279:37:0;;;9230:34:1;13310:5:0;;;9280:18:1;;;9273:43;9142:18;;13279:37:0;8995:327:1;13236:92:0;13384:6;13376:31;;;13392:4;;13398:8;13376:31;;;;;;;;:::i;:::-;;;;;;;;13478:7;13473:421;;13598:15;;:19;13594:289;;13699:8;13693:15;13756;13745:8;13741:2;13737:17;13730:42;13594:289;13838:29;;;;;;;;;;;;;;13594:289;12153:1748;;;12041:1860;;;;;:::o;13940:323::-;14104:5;;:19;:5;14113:10;14104:19;14100:96;;14166:5;;14147:37;;;;;14166:5;;;;14147:37;;;9230:34:1;14173:10:0;9280:18:1;;;9273:43;9142:18;;14147:37:0;8995:327:1;14100:96:0;14206:18;;;;;;;;:11;:18;;;;;;;;:26;;;;;;;;;;;;:36;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;13940:323::o;14302:298::-;14376:16;14395:5;;;14427:10;14415:22;;14411:102;;14461:40;;;;;9179:42:1;9248:15;;14461:40:0;;;9230:34:1;14490:10:0;9280:18:1;;;9273:43;9142:18;;14461:40:0;8995:327:1;14411:102:0;14523:5;:16;;;;;;;;;;;;;14555:37;;14523:16;;14555:37;;;;;;14523:5;14555:37;14365:235;14302:298;:::o;14:219:1:-;81:20;;141:66;130:78;;120:89;;110:117;;223:1;220;213:12;110:117;14:219;;;:::o;238:184::-;296:6;349:2;337:9;328:7;324:23;320:32;317:52;;;365:1;362;355:12;317:52;388:28;406:9;388:28;:::i;:::-;378:38;238:184;-1:-1:-1;;;238:184:1:o;619:196::-;687:20;;747:42;736:54;;726:65;;716:93;;805:1;802;795:12;820:184;872:77;869:1;862:88;969:4;966:1;959:15;993:4;990:1;983:15;1009:334;1080:2;1074:9;1136:2;1126:13;;1141:66;1122:86;1110:99;;1239:18;1224:34;;1260:22;;;1221:62;1218:88;;;1286:18;;:::i;:::-;1322:2;1315:22;1009:334;;-1:-1:-1;1009:334:1:o;1348:589::-;1390:5;1443:3;1436:4;1428:6;1424:17;1420:27;1410:55;;1461:1;1458;1451:12;1410:55;1497:6;1484:20;1523:18;1519:2;1516:26;1513:52;;;1545:18;;:::i;:::-;1589:114;1697:4;1628:66;1621:4;1617:2;1613:13;1609:86;1605:97;1589:114;:::i;:::-;1728:2;1719:7;1712:19;1774:3;1767:4;1762:2;1754:6;1750:15;1746:26;1743:35;1740:55;;;1791:1;1788;1781:12;1740:55;1856:2;1849:4;1841:6;1837:17;1830:4;1821:7;1817:18;1804:55;1904:1;1879:16;;;1897:4;1875:27;1868:38;;;;1883:7;1348:589;-1:-1:-1;;;1348:589:1:o;1942:537::-;2037:6;2045;2053;2061;2114:3;2102:9;2093:7;2089:23;2085:33;2082:53;;;2131:1;2128;2121:12;2082:53;2154:29;2173:9;2154:29;:::i;:::-;2144:39;;2202:38;2236:2;2225:9;2221:18;2202:38;:::i;:::-;2192:48;;2287:2;2276:9;2272:18;2259:32;2249:42;;2342:2;2331:9;2327:18;2314:32;2369:18;2361:6;2358:30;2355:50;;;2401:1;2398;2391:12;2355:50;2424:49;2465:7;2456:6;2445:9;2441:22;2424:49;:::i;:::-;2414:59;;;1942:537;;;;;;;:::o;2737:665::-;2816:6;2824;2832;2885:2;2873:9;2864:7;2860:23;2856:32;2853:52;;;2901:1;2898;2891:12;2853:52;2924:29;2943:9;2924:29;:::i;:::-;2914:39;;3004:2;2993:9;2989:18;2976:32;3027:18;3068:2;3060:6;3057:14;3054:34;;;3084:1;3081;3074:12;3054:34;3122:6;3111:9;3107:22;3097:32;;3167:7;3160:4;3156:2;3152:13;3148:27;3138:55;;3189:1;3186;3179:12;3138:55;3229:2;3216:16;3255:2;3247:6;3244:14;3241:34;;;3271:1;3268;3261:12;3241:34;3316:7;3311:2;3302:6;3298:2;3294:15;3290:24;3287:37;3284:57;;;3337:1;3334;3327:12;3284:57;3368:2;3364;3360:11;3350:21;;3390:6;3380:16;;;;;2737:665;;;;;:::o;3407:530::-;3448:3;3486:5;3480:12;3513:6;3508:3;3501:19;3538:1;3548:162;3562:6;3559:1;3556:13;3548:162;;;3624:4;3680:13;;;3676:22;;3670:29;3652:11;;;3648:20;;3641:59;3577:12;3548:162;;;3728:6;3725:1;3722:13;3719:87;;;3794:1;3787:4;3778:6;3773:3;3769:16;3765:27;3758:38;3719:87;-1:-1:-1;3851:2:1;3839:15;3856:66;3835:88;3826:98;;;;3926:4;3822:109;;3407:530;-1:-1:-1;;3407:530:1:o;3942:217::-;4089:2;4078:9;4071:21;4052:4;4109:44;4149:2;4138:9;4134:18;4126:6;4109:44;:::i;4577:712::-;4631:5;4684:3;4677:4;4669:6;4665:17;4661:27;4651:55;;4702:1;4699;4692:12;4651:55;4738:6;4725:20;4764:4;4787:18;4783:2;4780:26;4777:52;;;4809:18;;:::i;:::-;4855:2;4852:1;4848:10;4878:28;4902:2;4898;4894:11;4878:28;:::i;:::-;4940:15;;;5010;;;5006:24;;;4971:12;;;;5042:15;;;5039:35;;;5070:1;5067;5060:12;5039:35;5106:2;5098:6;5094:15;5083:26;;5118:142;5134:6;5129:3;5126:15;5118:142;;;5200:17;;5188:30;;5151:12;;;;5238;;;;5118:142;;;5278:5;4577:712;-1:-1:-1;;;;;;;4577:712:1:o;5294:943::-;5448:6;5456;5464;5472;5480;5533:3;5521:9;5512:7;5508:23;5504:33;5501:53;;;5550:1;5547;5540:12;5501:53;5573:29;5592:9;5573:29;:::i;:::-;5563:39;;5621:38;5655:2;5644:9;5640:18;5621:38;:::i;:::-;5611:48;;5710:2;5699:9;5695:18;5682:32;5733:18;5774:2;5766:6;5763:14;5760:34;;;5790:1;5787;5780:12;5760:34;5813:61;5866:7;5857:6;5846:9;5842:22;5813:61;:::i;:::-;5803:71;;5927:2;5916:9;5912:18;5899:32;5883:48;;5956:2;5946:8;5943:16;5940:36;;;5972:1;5969;5962:12;5940:36;5995:63;6050:7;6039:8;6028:9;6024:24;5995:63;:::i;:::-;5985:73;;6111:3;6100:9;6096:19;6083:33;6067:49;;6141:2;6131:8;6128:16;6125:36;;;6157:1;6154;6147:12;6125:36;;6180:51;6223:7;6212:8;6201:9;6197:24;6180:51;:::i;:::-;6170:61;;;5294:943;;;;;;;;:::o;6242:332::-;6318:6;6326;6334;6387:2;6375:9;6366:7;6362:23;6358:32;6355:52;;;6403:1;6400;6393:12;6355:52;6426:29;6445:9;6426:29;:::i;:::-;6416:39;;6474:38;6508:2;6497:9;6493:18;6474:38;:::i;:::-;6464:48;;6531:37;6564:2;6553:9;6549:18;6531:37;:::i;:::-;6521:47;;6242:332;;;;;:::o;6579:494::-;6661:6;6669;6677;6685;6738:3;6726:9;6717:7;6713:23;6709:33;6706:53;;;6755:1;6752;6745:12;6706:53;6778:29;6797:9;6778:29;:::i;:::-;6768:39;;6826:38;6860:2;6849:9;6845:18;6826:38;:::i;:::-;6816:48;;6883:37;6916:2;6905:9;6901:18;6883:37;:::i;:::-;6873:47;;6970:2;6959:9;6955:18;6942:32;7017:5;7010:13;7003:21;6996:5;6993:32;6983:60;;7039:1;7036;7029:12;6983:60;6579:494;;;;-1:-1:-1;6579:494:1;;-1:-1:-1;;6579:494:1:o;7078:606::-;7182:6;7190;7198;7206;7214;7267:3;7255:9;7246:7;7242:23;7238:33;7235:53;;;7284:1;7281;7274:12;7235:53;7307:29;7326:9;7307:29;:::i;:::-;7297:39;;7355:38;7389:2;7378:9;7374:18;7355:38;:::i;:::-;7345:48;;7440:2;7429:9;7425:18;7412:32;7402:42;;7491:2;7480:9;7476:18;7463:32;7453:42;;7546:3;7535:9;7531:19;7518:33;7574:18;7566:6;7563:30;7560:50;;;7606:1;7603;7596:12;7560:50;7629:49;7670:7;7661:6;7650:9;7646:22;7629:49;:::i;7689:186::-;7748:6;7801:2;7789:9;7780:7;7776:23;7772:32;7769:52;;;7817:1;7814;7807:12;7769:52;7840:29;7859:9;7840:29;:::i;8435:279::-;8475:4;8503:1;8500;8497:8;8494:188;;;8538:77;8535:1;8528:88;8639:4;8636:1;8629:15;8667:4;8664:1;8657:15;8494:188;-1:-1:-1;8699:9:1;;8435:279::o;8719:271::-;8902:6;8894;8889:3;8876:33;8858:3;8928:16;;8953:13;;;8928:16;8719:271;-1:-1:-1;8719:271:1:o;9327:606::-;9530:2;9519:9;9512:21;9569:6;9564:2;9553:9;9549:18;9542:34;9626:6;9618;9613:2;9602:9;9598:18;9585:48;9682:1;9677:2;9668:6;9657:9;9653:22;9649:31;9642:42;9493:4;9739:66;9734:2;9726:6;9722:15;9718:88;9707:9;9703:104;9869:2;9857:9;9853:2;9849:18;9845:27;9838:4;9827:9;9823:20;9816:57;9890:37;9923:2;9919;9915:11;9907:6;9890:37;:::i;:::-;9882:45;9327:606;-1:-1:-1;;;;;;9327:606:1:o

Swarm Source

ipfs://40baae7ba7d17a7154c2408661b75cada84bdd2dbfcadd8f3fe3bd34c5af3fe7

Block Transaction Difficulty 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
Loading...
Loading
[ Download: CSV Export  ]
[ 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.