MATIC Price: $0.581257 (+2.96%)
Gas: 30 GWei
 

Overview

MATIC Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 MATIC

MATIC Value

$0.00

Token Holdings

Sponsored

Transaction Hash
Method
Block
From
To
Value
Bulk Transfer Fr...585025072024-06-23 8:13:4726 mins ago1719130427IN
0x86D6f907...e9cF190E2
0 MATIC0.1482183450
Bulk Transfer Fr...585011672024-06-23 7:24:091 hr ago1719127449IN
0x86D6f907...e9cF190E2
0 MATIC0.06126075450
Bulk Transfer Fr...585010382024-06-23 7:19:351 hr ago1719127175IN
0x86D6f907...e9cF190E2
0 MATIC0.05572575450
Bulk Transfer Fr...585009852024-06-23 7:17:381 hr ago1719127058IN
0x86D6f907...e9cF190E2
0 MATIC0.12126555450
Bulk Transfer Fr...585006732024-06-23 7:06:361 hr ago1719126396IN
0x86D6f907...e9cF190E2
0 MATIC0.05577345450
Bulk Transfer Fr...585002972024-06-23 6:52:121 hr ago1719125532IN
0x86D6f907...e9cF190E2
0 MATIC0.05667075450
Bulk Transfer Fr...585002792024-06-23 6:51:341 hr ago1719125494IN
0x86D6f907...e9cF190E2
0 MATIC0.05576805450
Bulk Transfer Fr...585001022024-06-23 6:45:121 hr ago1719125112IN
0x86D6f907...e9cF190E2
0 MATIC0.05576805450
Bulk Transfer Fr...585000872024-06-23 6:44:401 hr ago1719125080IN
0x86D6f907...e9cF190E2
0 MATIC0.05576265450
Bulk Transfer Fr...585000842024-06-23 6:44:341 hr ago1719125074IN
0x86D6f907...e9cF190E2
0 MATIC0.06130305450
Bulk Transfer Fr...584995792024-06-23 6:25:352 hrs ago1719123935IN
0x86D6f907...e9cF190E2
0 MATIC0.0820044450
Bulk Transfer Fr...584992872024-06-23 6:15:112 hrs ago1719123311IN
0x86D6f907...e9cF190E2
0 MATIC0.083259450
Bulk Transfer Fr...584991562024-06-23 6:10:332 hrs ago1719123033IN
0x86D6f907...e9cF190E2
0 MATIC0.16313445450
Bulk Transfer Fr...584990102024-06-23 6:05:232 hrs ago1719122723IN
0x86D6f907...e9cF190E2
0 MATIC0.0832644450
Bulk Transfer Fr...584987652024-06-23 5:55:372 hrs ago1719122137IN
0x86D6f907...e9cF190E2
0 MATIC0.05577345450
Bulk Transfer Fr...584979922024-06-23 5:27:113 hrs ago1719120431IN
0x86D6f907...e9cF190E2
0 MATIC0.05576805450
Bulk Transfer Fr...584979652024-06-23 5:26:133 hrs ago1719120373IN
0x86D6f907...e9cF190E2
0 MATIC0.09301545450
Bulk Transfer Fr...584979372024-06-23 5:25:153 hrs ago1719120315IN
0x86D6f907...e9cF190E2
0 MATIC0.05572575450
Bulk Transfer Fr...584975802024-06-23 5:12:313 hrs ago1719119551IN
0x86D6f907...e9cF190E2
0 MATIC0.13026285450
Bulk Transfer Fr...584973872024-06-23 5:05:373 hrs ago1719119137IN
0x86D6f907...e9cF190E2
0 MATIC0.05572035450
Bulk Transfer Fr...584972502024-06-23 4:59:493 hrs ago1719118789IN
0x86D6f907...e9cF190E2
0 MATIC0.05577345450
Bulk Transfer Fr...584957732024-06-23 4:07:164 hrs ago1719115636IN
0x86D6f907...e9cF190E2
0 MATIC0.0832644450
Bulk Transfer Fr...584956372024-06-23 4:02:284 hrs ago1719115348IN
0x86D6f907...e9cF190E2
0 MATIC0.05577885450
Bulk Transfer Fr...584948812024-06-23 3:35:385 hrs ago1719113738IN
0x86D6f907...e9cF190E2
0 MATIC0.05577345450
Bulk Transfer Fr...584932072024-06-23 2:34:316 hrs ago1719110071IN
0x86D6f907...e9cF190E2
0 MATIC0.06126075450
View all transactions

Parent Transaction Hash Block From To Value
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Gateway

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 12 : Gateway.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.6;

import "./roles/AccessOperatable.sol";
import "./token/IERC721Gateway.sol";
import "./utils/TransactedEventHash.sol";
import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";

contract Gateway is
    IERC721Gateway,
    AccessOperatable,
    ERC721Holder,
    TransactedEventHash
{
    function transferFrom(
        address _assetContract,
        address payable _from,
        address payable _to,
        uint256 _tokenId,
        bytes32 _eventHash
    ) public payable override onlyRole(OPERATOR) {
        if (isTransactedEventHash(_eventHash)) return;

        IERC721Asset assetContract = IERC721Asset(_assetContract);

        try assetContract.exists(_tokenId) returns (bool isExist) {
            if (isExist) {
                assetContract.safeTransferFrom(_from, _to, _tokenId);
            } else {
                assetContract.mint(_to, _tokenId);
            }
            // if assetContract doesn't have "exists" function
        } catch (bytes memory) {
            try assetContract.ownerOf(_tokenId) {
                assetContract.safeTransferFrom(_from, _to, _tokenId);
                // catch ownerOf error
            } catch Error(string memory) {
                assetContract.mint(_to, _tokenId);
            }
        }

        setTransactedEventHash(_eventHash, true);
    }

    function bulkTransferFrom(
        address[] calldata _assetContracts,
        address payable[] calldata _froms,
        address payable[] calldata _tos,
        uint256[] calldata _tokenIds,
        bytes32[] calldata _eventHashes
    ) public payable override onlyRole(OPERATOR) {
        require(
            _tokenIds.length == _assetContracts.length &&
                _tokenIds.length == _froms.length &&
                _tokenIds.length == _tos.length &&
                _tokenIds.length == _eventHashes.length,
            "invalid length"
        );
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            transferFrom(
                _assetContracts[i],
                _froms[i],
                _tos[i],
                _tokenIds[i],
                _eventHashes[i]
            );
        }
    }

    //override
    function isTransactedEventHash(bytes32 _eventHash)
        public
        view
        override(IERC721Gateway, TransactedEventHash)
        returns (bool)
    {
        return super.isTransactedEventHash(_eventHash);
    }

    function setTransactedEventHash(bytes32 _eventHash, bool _desired)
        public
        override(IERC721Gateway, TransactedEventHash)
        onlyRole(OPERATOR)
    {
        super.setTransactedEventHash(_eventHash, _desired);
    }
}

File 2 of 12 : AccessOperatable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/AccessControl.sol";

abstract contract AccessOperatable is AccessControl {

    bytes32 public constant OPERATOR = keccak256("OPERATOR");

    event Paused(address account);
    event Unpaused(address account);

    bool public _paused;

    constructor() {
        _setRoleAdmin(OPERATOR, DEFAULT_ADMIN_ROLE);
        _setupRole(OPERATOR, msg.sender);
        _paused = false;
    }

    function addOperator(address account) public onlyOperator() {
        _setupRole(OPERATOR, account);
    }

    modifier onlyOperator() {
        require(hasRole(OPERATOR, msg.sender), "Must be operator");
        _;
    }

    modifier whenNotPaused() {
        require(!_paused, "Pausable: paused");
        _;
    }

    modifier whenPaused() {
        require(_paused, "Pausable: not paused");
        _;
    }

    function pause() public onlyOperator() whenNotPaused() {
        _paused = true;
        emit Paused(msg.sender);
    }

    function unpause() public onlyOperator() whenPaused() {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

File 3 of 12 : IERC721Gateway.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IERC721Asset {
    function balanceOf(address _owner) external view returns (uint256);

    function ownerOf(uint256 _tokenId) external view returns (address);

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes calldata data
    ) external payable;

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external payable;

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external payable;

    function approve(address _approved, uint256 _tokenId) external payable;

    function setApprovalForAll(address _operator, bool _approved) external;

    function getApproved(uint256 _tokenId) external view returns (address);

    function isApprovedForAll(address _owner, address _operator)
        external
        view
        returns (bool);

    function exists(uint256 _tokenId) external view returns (bool);

    function mint(address _to, uint256 _tokenId) external;
}

interface IERC721Gateway {
    function isTransactedEventHash(bytes32 _eventHash)
        external
        view
        returns (bool);

    function setTransactedEventHash(bytes32 _eventHash, bool _desired) external;

    function transferFrom(
        address _assetContract,
        address payable _from,
        address payable _to,
        uint256 _valueOrTokenId,
        bytes32 _eventHash
    ) external payable;

    function bulkTransferFrom(
        address[] calldata _assetContracts,
        address payable[] calldata _froms,
        address payable[] calldata _tos,
        uint256[] calldata _tokenIds,
        bytes32[] calldata _eventHashes
    ) external payable;
}

File 4 of 12 : TransactedEventHash.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../roles/AccessOperatable.sol";

abstract contract TransactedEventHash is AccessOperatable {
    mapping(bytes32 => bool) private transactedEventHash;

    event SetTransactedEventHash(bytes32 _eventHash, bool _desired);

    function isTransactedEventHash(bytes32 _eventHash)
        virtual
        public
        view
        returns (bool)
    {
        return transactedEventHash[_eventHash];
    }

    function setTransactedEventHash(bytes32 _eventHash, bool _desired)
        virtual
        public
        onlyRole(OPERATOR)
    {
        transactedEventHash[_eventHash] = _desired;
        emit SetTransactedEventHash(_eventHash, _desired);
    }

}

File 5 of 12 : ERC721Holder.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol)

pragma solidity ^0.8.0;

import "../IERC721Receiver.sol";

/**
 * @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;
    }
}

File 6 of 12 : AccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 7 of 12 : IAccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

File 8 of 12 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 9 of 12 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 10 of 12 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.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;
    }
}

File 11 of 12 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @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);
}

File 12 of 12 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_eventHash","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"_desired","type":"bool"}],"name":"SetTransactedEventHash","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_assetContracts","type":"address[]"},{"internalType":"address payable[]","name":"_froms","type":"address[]"},{"internalType":"address payable[]","name":"_tos","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bytes32[]","name":"_eventHashes","type":"bytes32[]"}],"name":"bulkTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_eventHash","type":"bytes32"}],"name":"isTransactedEventHash","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_eventHash","type":"bytes32"},{"internalType":"bool","name":"_desired","type":"bool"}],"name":"setTransactedEventHash","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":"_assetContract","type":"address"},{"internalType":"address payable","name":"_from","type":"address"},{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes32","name":"_eventHash","type":"bytes32"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506200002e6000805160206200161d833981519152600062000059565b620000496000805160206200161d83398151915233620000a4565b6001805460ff1916905562000154565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b620000b08282620000b4565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620000b0576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001103390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6114b980620001646000396000f3fe6080604052600436106100fe5760003560e01c806345711ecd11610095578063983d273711610064578063983d2737146102b35780639870d7fe146102d5578063a217fddf146102f5578063d547741f1461030a578063d9d600131461032a57600080fd5b806345711ecd1461024b578063538651651461026b5780638456cb591461027e57806391d148541461029357600080fd5b80632f2ff15d116100d15780632f2ff15d146101d457806336568abe146101f65780633f4ba83a1461021657806344c7d8c21461022b57600080fd5b806301ffc9a714610103578063150b7a021461013857806316c61ccc1461017c578063248a9ca314610196575b600080fd5b34801561010f57600080fd5b5061012361011e366004611196565b61033d565b60405190151581526020015b60405180910390f35b34801561014457600080fd5b50610163610153366004610f52565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161012f565b34801561018857600080fd5b506001546101239060ff1681565b3480156101a257600080fd5b506101c66101b1366004611128565b60009081526020819052604090206001015490565b60405190815260200161012f565b3480156101e057600080fd5b506101f46101ef366004611141565b610374565b005b34801561020257600080fd5b506101f4610211366004611141565b61039f565b34801561022257600080fd5b506101f4610422565b34801561023757600080fd5b50610123610246366004611128565b6104df565b34801561025757600080fd5b506101f4610266366004611171565b6104f6565b6101f4610279366004610ef7565b610519565b34801561028a57600080fd5b506101f461085c565b34801561029f57600080fd5b506101236102ae366004611141565b610912565b3480156102bf57600080fd5b506101c660008051602061146483398151915281565b3480156102e157600080fd5b506101f46102f0366004610ebd565b61093b565b34801561030157600080fd5b506101c6600081565b34801561031657600080fd5b506101f4610325366004611141565b61098a565b6101f461033836600461101a565b6109b0565b60006001600160e01b03198216637965db0b60e01b148061036e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000828152602081905260409020600101546103908133610b04565b61039a8383610b68565b505050565b6001600160a01b03811633146104145760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61041e8282610bec565b5050565b61043a60008051602061146483398151915233610912565b6104565760405162461bcd60e51b815260040161040b90611268565b60015460ff1661049f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161040b565b6001805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b60008181526002602052604081205460ff1661036e565b60008051602061146483398151915261050f8133610b04565b61039a8383610c51565b6000805160206114648339815191526105328133610b04565b61053b826104df565b1561054557610854565b604051634f558e7960e01b81526004810184905286906001600160a01b03821690634f558e799060240160206040518083038186803b15801561058757600080fd5b505afa9250505080156105b7575060408051601f3d908101601f191682019092526105b49181019061110b565b60015b61076d573d8080156105e5576040519150601f19603f3d011682016040523d82523d6000602084013e6105ea565b606091505b506040516331a9108f60e11b8152600481018690526001600160a01b03831690636352211e9060240160206040518083038186803b15801561062b57600080fd5b505afa92505050801561065b575060408051601f3d908101601f1916820190925261065891810190610eda565b60015b6106fb5761066761139a565b806308c379a014156106ef575061067c6113b6565b8061068757506106f1565b6040516340c10f1960e01b81526001600160a01b038881166004830152602482018890528416906340c10f1990604401600060405180830381600087803b1580156106d157600080fd5b505af11580156106e5573d6000803e3d6000fd5b5050505050610767565b505b3d6000803e3d6000fd5b50604051632142170760e11b81526001600160a01b0388811660048301528781166024830152604482018790528316906342842e0e90606401600060405180830381600087803b15801561074e57600080fd5b505af1158015610762573d6000803e3d6000fd5b505050505b50610847565b80156107e257604051632142170760e11b81526001600160a01b0388811660048301528781166024830152604482018790528316906342842e0e90606401600060405180830381600087803b1580156107c557600080fd5b505af11580156107d9573d6000803e3d6000fd5b50505050610845565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528316906340c10f1990604401600060405180830381600087803b15801561082c57600080fd5b505af1158015610840573d6000803e3d6000fd5b505050505b505b6108528360016104f6565b505b505050505050565b61087460008051602061146483398151915233610912565b6108905760405162461bcd60e51b815260040161040b90611268565b60015460ff16156108d65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161040b565b6001805460ff1916811790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016104d5565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b61095360008051602061146483398151915233610912565b61096f5760405162461bcd60e51b815260040161040b90611268565b61098760008051602061146483398151915282610cc4565b50565b6000828152602081905260409020600101546109a68133610b04565b61039a8383610bec565b6000805160206114648339815191526109c98133610b04565b838a1480156109d757508388145b80156109e257508386145b80156109ed57508382145b610a2a5760405162461bcd60e51b815260206004820152600e60248201526d0d2dcecc2d8d2c840d8cadccee8d60931b604482015260640161040b565b60005b84811015610af657610ae48c8c83818110610a4a57610a4a61136e565b9050602002016020810190610a5f9190610ebd565b8b8b84818110610a7157610a7161136e565b9050602002016020810190610a869190610ebd565b8a8a85818110610a9857610a9861136e565b9050602002016020810190610aad9190610ebd565b898986818110610abf57610abf61136e565b90506020020135888887818110610ad857610ad861136e565b90506020020135610519565b80610aee8161133d565b915050610a2d565b505050505050505050505050565b610b0e8282610912565b61041e57610b26816001600160a01b03166014610cce565b610b31836020610cce565b604051602001610b429291906111c0565b60408051601f198184030181529082905262461bcd60e51b825261040b91600401611235565b610b728282610912565b61041e576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610ba83390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610bf68282610912565b1561041e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600080516020611464833981519152610c6a8133610b04565b600083815260026020908152604091829020805460ff19168515159081179091558251868152918201527fc16bb22154b526af5bbbc6cb4e913c17ddbd901aca5352dc86ff36eec1a467d6910160405180910390a1505050565b61041e8282610b68565b60606000610cdd8360026112aa565b610ce8906002611292565b67ffffffffffffffff811115610d0057610d00611384565b6040519080825280601f01601f191660200182016040528015610d2a576020820181803683370190505b509050600360fc1b81600081518110610d4557610d4561136e565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d7457610d7461136e565b60200101906001600160f81b031916908160001a9053506000610d988460026112aa565b610da3906001611292565b90505b6001811115610e1b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610dd757610dd761136e565b1a60f81b828281518110610ded57610ded61136e565b60200101906001600160f81b031916908160001a90535060049490941c93610e14816112f9565b9050610da6565b508315610e6a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161040b565b9392505050565b60008083601f840112610e8357600080fd5b50813567ffffffffffffffff811115610e9b57600080fd5b6020830191508360208260051b8501011115610eb657600080fd5b9250929050565b600060208284031215610ecf57600080fd5b8135610e6a81611440565b600060208284031215610eec57600080fd5b8151610e6a81611440565b600080600080600060a08688031215610f0f57600080fd5b8535610f1a81611440565b94506020860135610f2a81611440565b93506040860135610f3a81611440565b94979396509394606081013594506080013592915050565b60008060008060808587031215610f6857600080fd5b8435610f7381611440565b9350602085810135610f8481611440565b935060408601359250606086013567ffffffffffffffff80821115610fa857600080fd5b818801915088601f830112610fbc57600080fd5b813581811115610fce57610fce611384565b6040519150610fe6601f8201601f1916850183611310565b8082528984828501011115610ffa57600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060008060008060008060008060a08b8d03121561103957600080fd5b8a3567ffffffffffffffff8082111561105157600080fd5b61105d8e838f01610e71565b909c509a5060208d013591508082111561107657600080fd5b6110828e838f01610e71565b909a50985060408d013591508082111561109b57600080fd5b6110a78e838f01610e71565b909850965060608d01359150808211156110c057600080fd5b6110cc8e838f01610e71565b909650945060808d01359150808211156110e557600080fd5b506110f28d828e01610e71565b915080935050809150509295989b9194979a5092959850565b60006020828403121561111d57600080fd5b8151610e6a81611455565b60006020828403121561113a57600080fd5b5035919050565b6000806040838503121561115457600080fd5b82359150602083013561116681611440565b809150509250929050565b6000806040838503121561118457600080fd5b82359150602083013561116681611455565b6000602082840312156111a857600080fd5b81356001600160e01b031981168114610e6a57600080fd5b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516111f88160178501602088016112c9565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516112298160288401602088016112c9565b01602801949350505050565b60208152600082518060208401526112548160408501602087016112c9565b601f01601f19169190910160400192915050565b60208082526010908201526f26bab9ba1031329037b832b930ba37b960811b604082015260600190565b600082198211156112a5576112a5611358565b500190565b60008160001904831182151516156112c4576112c4611358565b500290565b60005b838110156112e45781810151838201526020016112cc565b838111156112f3576000848401525b50505050565b60008161130857611308611358565b506000190190565b601f8201601f1916810167ffffffffffffffff8111828210171561133657611336611384565b6040525050565b600060001982141561135157611351611358565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156113b35760046000803e5060005160e01c5b90565b600060443d10156113c45790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156113f457505050505090565b828501915081518181111561140c5750505050505090565b843d87010160208285010111156114265750505050505090565b61143560208286010187611310565b509095945050505050565b6001600160a01b038116811461098757600080fd5b801515811461098757600080fdfe523a704056dcd17bcf83bed8b68c59416dac1119be77755efe3bde0a64e46e0ca264697066735822122050bb08bd070a02c91293d8ec721492ad614fba5f70a28354b0ae3f7d200294f164736f6c63430008060033523a704056dcd17bcf83bed8b68c59416dac1119be77755efe3bde0a64e46e0c

Deployed Bytecode

0x6080604052600436106100fe5760003560e01c806345711ecd11610095578063983d273711610064578063983d2737146102b35780639870d7fe146102d5578063a217fddf146102f5578063d547741f1461030a578063d9d600131461032a57600080fd5b806345711ecd1461024b578063538651651461026b5780638456cb591461027e57806391d148541461029357600080fd5b80632f2ff15d116100d15780632f2ff15d146101d457806336568abe146101f65780633f4ba83a1461021657806344c7d8c21461022b57600080fd5b806301ffc9a714610103578063150b7a021461013857806316c61ccc1461017c578063248a9ca314610196575b600080fd5b34801561010f57600080fd5b5061012361011e366004611196565b61033d565b60405190151581526020015b60405180910390f35b34801561014457600080fd5b50610163610153366004610f52565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161012f565b34801561018857600080fd5b506001546101239060ff1681565b3480156101a257600080fd5b506101c66101b1366004611128565b60009081526020819052604090206001015490565b60405190815260200161012f565b3480156101e057600080fd5b506101f46101ef366004611141565b610374565b005b34801561020257600080fd5b506101f4610211366004611141565b61039f565b34801561022257600080fd5b506101f4610422565b34801561023757600080fd5b50610123610246366004611128565b6104df565b34801561025757600080fd5b506101f4610266366004611171565b6104f6565b6101f4610279366004610ef7565b610519565b34801561028a57600080fd5b506101f461085c565b34801561029f57600080fd5b506101236102ae366004611141565b610912565b3480156102bf57600080fd5b506101c660008051602061146483398151915281565b3480156102e157600080fd5b506101f46102f0366004610ebd565b61093b565b34801561030157600080fd5b506101c6600081565b34801561031657600080fd5b506101f4610325366004611141565b61098a565b6101f461033836600461101a565b6109b0565b60006001600160e01b03198216637965db0b60e01b148061036e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000828152602081905260409020600101546103908133610b04565b61039a8383610b68565b505050565b6001600160a01b03811633146104145760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61041e8282610bec565b5050565b61043a60008051602061146483398151915233610912565b6104565760405162461bcd60e51b815260040161040b90611268565b60015460ff1661049f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161040b565b6001805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b60008181526002602052604081205460ff1661036e565b60008051602061146483398151915261050f8133610b04565b61039a8383610c51565b6000805160206114648339815191526105328133610b04565b61053b826104df565b1561054557610854565b604051634f558e7960e01b81526004810184905286906001600160a01b03821690634f558e799060240160206040518083038186803b15801561058757600080fd5b505afa9250505080156105b7575060408051601f3d908101601f191682019092526105b49181019061110b565b60015b61076d573d8080156105e5576040519150601f19603f3d011682016040523d82523d6000602084013e6105ea565b606091505b506040516331a9108f60e11b8152600481018690526001600160a01b03831690636352211e9060240160206040518083038186803b15801561062b57600080fd5b505afa92505050801561065b575060408051601f3d908101601f1916820190925261065891810190610eda565b60015b6106fb5761066761139a565b806308c379a014156106ef575061067c6113b6565b8061068757506106f1565b6040516340c10f1960e01b81526001600160a01b038881166004830152602482018890528416906340c10f1990604401600060405180830381600087803b1580156106d157600080fd5b505af11580156106e5573d6000803e3d6000fd5b5050505050610767565b505b3d6000803e3d6000fd5b50604051632142170760e11b81526001600160a01b0388811660048301528781166024830152604482018790528316906342842e0e90606401600060405180830381600087803b15801561074e57600080fd5b505af1158015610762573d6000803e3d6000fd5b505050505b50610847565b80156107e257604051632142170760e11b81526001600160a01b0388811660048301528781166024830152604482018790528316906342842e0e90606401600060405180830381600087803b1580156107c557600080fd5b505af11580156107d9573d6000803e3d6000fd5b50505050610845565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528316906340c10f1990604401600060405180830381600087803b15801561082c57600080fd5b505af1158015610840573d6000803e3d6000fd5b505050505b505b6108528360016104f6565b505b505050505050565b61087460008051602061146483398151915233610912565b6108905760405162461bcd60e51b815260040161040b90611268565b60015460ff16156108d65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161040b565b6001805460ff1916811790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016104d5565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b61095360008051602061146483398151915233610912565b61096f5760405162461bcd60e51b815260040161040b90611268565b61098760008051602061146483398151915282610cc4565b50565b6000828152602081905260409020600101546109a68133610b04565b61039a8383610bec565b6000805160206114648339815191526109c98133610b04565b838a1480156109d757508388145b80156109e257508386145b80156109ed57508382145b610a2a5760405162461bcd60e51b815260206004820152600e60248201526d0d2dcecc2d8d2c840d8cadccee8d60931b604482015260640161040b565b60005b84811015610af657610ae48c8c83818110610a4a57610a4a61136e565b9050602002016020810190610a5f9190610ebd565b8b8b84818110610a7157610a7161136e565b9050602002016020810190610a869190610ebd565b8a8a85818110610a9857610a9861136e565b9050602002016020810190610aad9190610ebd565b898986818110610abf57610abf61136e565b90506020020135888887818110610ad857610ad861136e565b90506020020135610519565b80610aee8161133d565b915050610a2d565b505050505050505050505050565b610b0e8282610912565b61041e57610b26816001600160a01b03166014610cce565b610b31836020610cce565b604051602001610b429291906111c0565b60408051601f198184030181529082905262461bcd60e51b825261040b91600401611235565b610b728282610912565b61041e576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610ba83390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610bf68282610912565b1561041e576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600080516020611464833981519152610c6a8133610b04565b600083815260026020908152604091829020805460ff19168515159081179091558251868152918201527fc16bb22154b526af5bbbc6cb4e913c17ddbd901aca5352dc86ff36eec1a467d6910160405180910390a1505050565b61041e8282610b68565b60606000610cdd8360026112aa565b610ce8906002611292565b67ffffffffffffffff811115610d0057610d00611384565b6040519080825280601f01601f191660200182016040528015610d2a576020820181803683370190505b509050600360fc1b81600081518110610d4557610d4561136e565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d7457610d7461136e565b60200101906001600160f81b031916908160001a9053506000610d988460026112aa565b610da3906001611292565b90505b6001811115610e1b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610dd757610dd761136e565b1a60f81b828281518110610ded57610ded61136e565b60200101906001600160f81b031916908160001a90535060049490941c93610e14816112f9565b9050610da6565b508315610e6a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161040b565b9392505050565b60008083601f840112610e8357600080fd5b50813567ffffffffffffffff811115610e9b57600080fd5b6020830191508360208260051b8501011115610eb657600080fd5b9250929050565b600060208284031215610ecf57600080fd5b8135610e6a81611440565b600060208284031215610eec57600080fd5b8151610e6a81611440565b600080600080600060a08688031215610f0f57600080fd5b8535610f1a81611440565b94506020860135610f2a81611440565b93506040860135610f3a81611440565b94979396509394606081013594506080013592915050565b60008060008060808587031215610f6857600080fd5b8435610f7381611440565b9350602085810135610f8481611440565b935060408601359250606086013567ffffffffffffffff80821115610fa857600080fd5b818801915088601f830112610fbc57600080fd5b813581811115610fce57610fce611384565b6040519150610fe6601f8201601f1916850183611310565b8082528984828501011115610ffa57600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060008060008060008060008060a08b8d03121561103957600080fd5b8a3567ffffffffffffffff8082111561105157600080fd5b61105d8e838f01610e71565b909c509a5060208d013591508082111561107657600080fd5b6110828e838f01610e71565b909a50985060408d013591508082111561109b57600080fd5b6110a78e838f01610e71565b909850965060608d01359150808211156110c057600080fd5b6110cc8e838f01610e71565b909650945060808d01359150808211156110e557600080fd5b506110f28d828e01610e71565b915080935050809150509295989b9194979a5092959850565b60006020828403121561111d57600080fd5b8151610e6a81611455565b60006020828403121561113a57600080fd5b5035919050565b6000806040838503121561115457600080fd5b82359150602083013561116681611440565b809150509250929050565b6000806040838503121561118457600080fd5b82359150602083013561116681611455565b6000602082840312156111a857600080fd5b81356001600160e01b031981168114610e6a57600080fd5b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516111f88160178501602088016112c9565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516112298160288401602088016112c9565b01602801949350505050565b60208152600082518060208401526112548160408501602087016112c9565b601f01601f19169190910160400192915050565b60208082526010908201526f26bab9ba1031329037b832b930ba37b960811b604082015260600190565b600082198211156112a5576112a5611358565b500190565b60008160001904831182151516156112c4576112c4611358565b500290565b60005b838110156112e45781810151838201526020016112cc565b838111156112f3576000848401525b50505050565b60008161130857611308611358565b506000190190565b601f8201601f1916810167ffffffffffffffff8111828210171561133657611336611384565b6040525050565b600060001982141561135157611351611358565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156113b35760046000803e5060005160e01c5b90565b600060443d10156113c45790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156113f457505050505090565b828501915081518181111561140c5750505050505090565b843d87010160208285010111156114265750505050505090565b61143560208286010187611310565b509095945050505050565b6001600160a01b038116811461098757600080fd5b801515811461098757600080fdfe523a704056dcd17bcf83bed8b68c59416dac1119be77755efe3bde0a64e46e0ca264697066735822122050bb08bd070a02c91293d8ec721492ad614fba5f70a28354b0ae3f7d200294f164736f6c63430008060033

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
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.