Contract 0xF849de01B080aDC3A814FaBE1E2087475cF2E354 1

 
 
Txn Hash
Method
Block
From
To
Value
0xc4774b3db3482b4bea383399702a106fac4901432e3139803b700c51f96e642eTransfer Batch156395962022-09-29 14:28:4722 mins ago0x3ee2ac648815b0dab228cc28b17454ac624b5625 IN  X2Y2: ERC721 Delegate0 Ether0.00238909 15
0xb36a1e3dce1cd231d4eae566c884984e88a293be2f7ff8fbd8a392ec7ecc7691Transfer Batch156395962022-09-29 14:28:4722 mins ago0xf8571ba9fd6d5f151c07d76748d5aa1573dd7880 IN  X2Y2: ERC721 Delegate0 Ether0.01374264 15.92023323
0x6ad10927394985c195ad5d791cf7cf557b14be57b935274914a5a18ec9cdcf58Transfer Batch156394642022-09-29 14:01:5949 mins agoENS Name yuhuihui.eth IN  X2Y2: ERC721 Delegate0 Ether0.00204435 18.36961479
0x8248c5ff647cd2aa33bd1fb8d0de120530a3b200c6fc863c08f12b8b1b776ed8Transfer Batch156394542022-09-29 13:59:5951 mins ago0x20665624710ff8e79b7174306385fbb4b76a098b IN  X2Y2: ERC721 Delegate0 Ether0.00442062 16.86753871
0x7ff3db4b86ca4dc141aac1c4e2aa47d08fba7938babbccd1ed5b01008748117cTransfer Batch156393962022-09-29 13:47:591 hr 3 mins ago0xf78bf349211877e3b186f284e05a3b54d1daf764 IN  X2Y2: ERC721 Delegate0 Ether0.00221647 16.49104576
0x8b86502d2b519bd99b2be44c81aeb391b66abccd1f3bc1572bb3a9cd95ec1318Transfer Batch156393432022-09-29 13:37:111 hr 14 mins ago0x52d0e2c845a83f6bc7d119d22437e71979208352 IN  X2Y2: ERC721 Delegate0 Ether0.00418365 16.87760553
0x50116ae67178498bd6bebbdd048de0bbce8dea40e0d8c903cca644d81c0716faTransfer Batch156393082022-09-29 13:30:111 hr 21 mins ago0x2c80cd854d63fe17999b08c9a2394589c9cc7add IN  X2Y2: ERC721 Delegate0 Ether0.00199831 15.54736703
0xb89a5046f83cb9c19102797e5b2060ace17048ebb4bf74b12daf84b0bbcba412Transfer Batch156390882022-09-29 12:45:472 hrs 5 mins agoENS Name feixie.eth IN  X2Y2: ERC721 Delegate0 Ether0.00218571 12.31821027
0x3773ee97c440e9de45e2ea22bbdac5d124b85949f14098427649ed8168b66264Transfer Batch156390662022-09-29 12:41:112 hrs 10 mins ago0xf78bf349211877e3b186f284e05a3b54d1daf764 IN  X2Y2: ERC721 Delegate0 Ether0.00398818 16.51100222
0x90f4b3a511a8e8193f591375238b43ef99d819d341dbf0d1664089eb677af7f0Transfer Batch156390602022-09-29 12:39:592 hrs 11 mins agoENS Name 1730.eth IN  X2Y2: ERC721 Delegate0 Ether0.00455295 18.4929783
0x8ca6fd524cbe1eba01935bdd794e644ed7fcc8d5a38b5d5bae0d5ce22f1d12d1Transfer Batch156389542022-09-29 12:18:352 hrs 33 mins agoENS Name *.eth IN  X2Y2: ERC721 Delegate0 Ether0.00477955 11.18047321
0x7b0790bb5d17639460ca3ada4a96a2de8c19fd195970b1d7c0f0c64d99d72040Transfer Batch156387362022-09-29 11:34:473 hrs 16 mins agoENS Name amaurieraz.eth IN  X2Y2: ERC721 Delegate0 Ether0.00109542 8.1667349
0xba5b516e34309ce0efcaec5ce346e58559279656eb6365ba7a6d3b2d7cf9ae18Transfer Batch156386352022-09-29 11:14:233 hrs 37 mins ago0x403ad631954bb71f4d5476cd61f395f631bc8824 IN  X2Y2: ERC721 Delegate0 Ether0.00276383 8.16351159
0x3e3d6aaea89b8a1e4ef6b84e11bb805ab68402bb16c27b983469c9d5f2834f5dTransfer Batch156384832022-09-29 10:43:354 hrs 8 mins ago0xf78bf349211877e3b186f284e05a3b54d1daf764 IN  X2Y2: ERC721 Delegate0 Ether0.00331855 7.58231429
0x93de69440c8968b69beef5391cceff2fbd247ef28c8fbda4ebe95c25015b3ff5Transfer Batch156383982022-09-29 10:26:354 hrs 25 mins agoENS Name buttrmytoast.eth IN  X2Y2: ERC721 Delegate0 Ether0.00098742 8.77765348
0x28ed4b7cc9d56b075209fa6d0f32e558055b8bc82b7203bb4b660b27caf8dc71Transfer Batch156382802022-09-29 10:02:594 hrs 48 mins ago0x4461b8ba72c7d65e0fa59e8a448095e1b2e01485 IN  X2Y2: ERC721 Delegate0 Ether0.00094552 10.29991642
0x77667a7a0db003a159f4df77bcb460e179f23115af8c6851cb9d92e33f231998Transfer Batch156382742022-09-29 10:01:354 hrs 50 mins ago0x4461b8ba72c7d65e0fa59e8a448095e1b2e01485 IN  X2Y2: ERC721 Delegate0 Ether0.00156192 10.9452518
0xc646ad4fe8ffd14c69ef9172c9baf710c1c07cc740970133e3709c8e31e080a2Transfer Batch156378252022-09-29 8:31:236 hrs 20 mins ago0x6620ef004a06f251ec0c6ab471a200123e5b36ee IN  X2Y2: ERC721 Delegate0 Ether0.00282535 11.85395464
0xf02e487edc8d24442ff0efdd7bb0ca4c08697612593a41527235e3badad4998dTransfer Batch156378022022-09-29 8:26:476 hrs 24 mins ago0x113a78fb02e67875f781b5b4427730dd7c70ae2d IN  X2Y2: ERC721 Delegate0 Ether0.0009 10.80636007
0xd237661ec315548a2fa2527b7a56ac491af5b93175a3651f32a77eb4270d3b4cTransfer Batch156377802022-09-29 8:22:236 hrs 29 mins agoWomenOnChain: Deployer IN  X2Y2: ERC721 Delegate0 Ether0.00162589 11.06579684
0x5177110fd5693facd195f393b303356ea1ae1172bd79a62e016de0420aab41f9Transfer Batch156374012022-09-29 7:06:237 hrs 45 mins ago0xefa9b7ed0daa994a65eb98b9a8b7690afbcb1ddc IN  X2Y2: ERC721 Delegate0 Ether0.00288181 10.13276749
0x5fcb7bf613372072cebf1bcead6c046735901c6e52a98c3dffc86b092570ea44Transfer Batch156373952022-09-29 7:05:117 hrs 46 mins ago0xefa9b7ed0daa994a65eb98b9a8b7690afbcb1ddc IN  X2Y2: ERC721 Delegate0 Ether0.00942802 11.0296432
0x5725e72917be102218b35ea87b1fa63b56b9eb674ba6c91f3651127e397abbfeTransfer Batch156373862022-09-29 7:03:237 hrs 48 mins ago0xefa9b7ed0daa994a65eb98b9a8b7690afbcb1ddc IN  X2Y2: ERC721 Delegate0 Ether0.01194151 11.17821889
0x6bc0e179918a5a728ee135ecc557a0b9e7db7d379800fa067ba68e2db2592d85Transfer Batch156373762022-09-29 7:01:237 hrs 50 mins ago0xbebf0ab04ea5fd24b07386f1f76e2d6c7c0376a0 IN  X2Y2: ERC721 Delegate0 Ether0.00399005 11.62457106
0x2a511f5995076829fd13d521b6b08b5d33093ce41b8e5fb0b287d3fd5a2c8b5fTransfer Batch156373682022-09-29 6:59:477 hrs 51 mins ago0xbebf0ab04ea5fd24b07386f1f76e2d6c7c0376a0 IN  X2Y2: ERC721 Delegate0 Ether0.00794355 10.14568243
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ERC721Delegate

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion
File 1 of 13 : ERC721Delegate.sol
// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.0;
pragma abicoder v2;

import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/access/AccessControl.sol';
import './MarketConsts.sol';
import './IDelegate.sol';

contract ERC721Delegate is IDelegate, AccessControl, IERC721Receiver {
    bytes32 public constant DELEGATION_CALLER = keccak256('DELEGATION_CALLER');

    struct Pair {
        IERC721 token;
        uint256 tokenId;
    }

    constructor() {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external override returns (bytes4) {
        return this.onERC721Received.selector;
    }

    function decode(bytes calldata data) internal pure returns (Pair[] memory) {
        return abi.decode(data, (Pair[]));
    }

    function delegateType() external view returns (uint256) {
        // return uint256(Market.DelegationType.ERC721);
        return 1;
    }

    function executeSell(
        address seller,
        address buyer,
        bytes calldata data
    ) external onlyRole(DELEGATION_CALLER) returns (bool) {
        Pair[] memory pairs = decode(data);
        for (uint256 i = 0; i < pairs.length; i++) {
            Pair memory p = pairs[i];
            p.token.safeTransferFrom(seller, buyer, p.tokenId);
        }
        return true;
    }

    function executeBuy(
        address seller,
        address buyer,
        bytes calldata data
    ) external onlyRole(DELEGATION_CALLER) returns (bool) {
        Pair[] memory pairs = decode(data);
        for (uint256 i = 0; i < pairs.length; i++) {
            Pair memory p = pairs[i];
            p.token.safeTransferFrom(seller, buyer, p.tokenId);
        }
        return true;
    }

    function executeBid(
        address seller,
        address previousBidder,
        address, // bidder,
        bytes calldata data
    ) external onlyRole(DELEGATION_CALLER) returns (bool) {
        if (previousBidder == address(0)) {
            Pair[] memory pairs = decode(data);
            for (uint256 i = 0; i < pairs.length; i++) {
                Pair memory p = pairs[i];
                p.token.safeTransferFrom(seller, address(this), p.tokenId);
            }
        }
        return true;
    }

    function executeAuctionComplete(
        address, // seller,
        address buyer,
        bytes calldata data
    ) external onlyRole(DELEGATION_CALLER) returns (bool) {
        Pair[] memory pairs = decode(data);
        for (uint256 i = 0; i < pairs.length; i++) {
            Pair memory p = pairs[i];
            p.token.safeTransferFrom(address(this), buyer, p.tokenId);
        }
        return true;
    }

    function executeAuctionRefund(
        address seller,
        address, // lastBidder,
        bytes calldata data
    ) external onlyRole(DELEGATION_CALLER) returns (bool) {
        Pair[] memory pairs = decode(data);
        for (uint256 i = 0; i < pairs.length; i++) {
            Pair memory p = pairs[i];
            p.token.safeTransferFrom(address(this), seller, p.tokenId);
        }
        return true;
    }

    function transferBatch(Pair[] memory pairs, address to) public {
        for (uint256 i = 0; i < pairs.length; i++) {
            Pair memory p = pairs[i];
            p.token.safeTransferFrom(msg.sender, to, p.tokenId);
        }
    }
}

File 2 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 3 of 13 : 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);
}

File 4 of 13 : AccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 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 {
        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 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 5 of 13 : MarketConsts.sol
// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.0;
pragma abicoder v2;

import './IDelegate.sol';
import './IWETHUpgradable.sol';

library Market {
    uint256 constant INTENT_SELL = 1;
    uint256 constant INTENT_AUCTION = 2;
    uint256 constant INTENT_BUY = 3;

    uint8 constant SIGN_V1 = 1;
    uint8 constant SIGN_V3 = 3;

    struct OrderItem {
        uint256 price;
        bytes data;
    }

    struct Order {
        uint256 salt;
        address user;
        uint256 network;
        uint256 intent;
        uint256 delegateType;
        uint256 deadline;
        IERC20Upgradeable currency;
        bytes dataMask;
        OrderItem[] items;
        // signature
        bytes32 r;
        bytes32 s;
        uint8 v;
        uint8 signVersion;
    }

    struct Fee {
        uint256 percentage;
        address to;
    }

    struct SettleDetail {
        Market.Op op;
        uint256 orderIdx;
        uint256 itemIdx;
        uint256 price;
        bytes32 itemHash;
        IDelegate executionDelegate;
        bytes dataReplacement;
        uint256 bidIncentivePct;
        uint256 aucMinIncrementPct;
        uint256 aucIncDurationSecs;
        Fee[] fees;
    }

    struct SettleShared {
        uint256 salt;
        uint256 deadline;
        uint256 amountToEth;
        uint256 amountToWeth;
        address user;
        bool canFail;
    }

    struct RunInput {
        Order[] orders;
        SettleDetail[] details;
        SettleShared shared;
        // signature
        bytes32 r;
        bytes32 s;
        uint8 v;
    }

    struct OngoingAuction {
        uint256 price;
        uint256 netPrice;
        uint256 endAt;
        address bidder;
    }

    enum InvStatus {
        NEW,
        AUCTION,
        COMPLETE,
        CANCELLED,
        REFUNDED
    }

    enum Op {
        INVALID,
        // off-chain
        COMPLETE_SELL_OFFER,
        COMPLETE_BUY_OFFER,
        CANCEL_OFFER,
        // auction
        BID,
        COMPLETE_AUCTION,
        REFUND_AUCTION,
        REFUND_AUCTION_STUCK_ITEM
    }

    enum DelegationType {
        INVALID,
        ERC721,
        ERC1155
    }
}

File 6 of 13 : IDelegate.sol
// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.0;
pragma abicoder v2;

interface IDelegate {
    function delegateType() external view returns (uint256);

    function executeSell(
        address seller,
        address buyer,
        bytes calldata data
    ) external returns (bool);

    function executeBuy(
        address seller,
        address buyer,
        bytes calldata data
    ) external returns (bool);

    function executeBid(
        address seller,
        address previousBidder,
        address bidder,
        bytes calldata data
    ) external returns (bool);

    function executeAuctionComplete(
        address seller,
        address buyer,
        bytes calldata data
    ) external returns (bool);

    function executeAuctionRefund(
        address seller,
        address lastBidder,
        bytes calldata data
    ) external returns (bool);
}

File 7 of 13 : 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 8 of 13 : 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 9 of 13 : 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 10 of 13 : 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 11 of 13 : 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 12 of 13 : IWETHUpgradable.sol
// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.0;
pragma abicoder v2;

import '@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol';

interface IWETHUpgradable is IERC20Upgradeable {
    function deposit() external payable;

    function withdraw(uint256 wad) external;
}

File 13 of 13 : IERC20Upgradeable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20Upgradeable {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DELEGATION_CALLER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegateType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeAuctionComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeAuctionRefund","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"previousBidder","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeBid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeBuy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeSell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"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":[{"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC721","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct ERC721Delegate.Pair[]","name":"pairs","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"}],"name":"transferBatch","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061001c600033610021565b6100c0565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166100bc576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561007b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6110f8806100cf6000396000f3fe608060405234801561001057600080fd5b50600436106100e05760003560e01c80633cbf4f8a116100875780633cbf4f8a146101cb5780638e325979146101de57806391d14854146101f3578063a217fddf14610206578063bc553f0f1461020e578063c23725f914610221578063d547741f14610234578063f477e4fd1461024757600080fd5b806301ffc9a7146100e5578063150b7a021461010d5780631672162614610145578063248a9ca3146101585780632c436e5b146101895780632f2ff15d1461019057806336568abe146101a55780633672c911146101b8575b600080fd5b6100f86100f3366004610b74565b61025a565b60405190151581526020015b60405180910390f35b61012c61011b366004610bfe565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610104565b6100f8610153366004610c70565b610291565b61017b610166366004610cd4565b60009081526020819052604090206001015490565b604051908152602001610104565b600161017b565b6101a361019e366004610ced565b610370565b005b6101a36101b3366004610ced565b61039b565b6100f86101c6366004610c70565b61041e565b6101a36101d9366004610e37565b6104ef565b61017b6000805160206110a383398151915281565b6100f8610201366004610ced565b610597565b61017b600081565b6100f861021c366004610c70565b6105c0565b6100f861022f366004610e7d565b610691565b6101a3610242366004610ced565b610780565b6100f8610255366004610c70565b6107a6565b60006001600160e01b03198216637965db0b60e01b148061028b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006000805160206110a38339815191526102ac8133610877565b60006102b885856108db565b905060005b81518110156103625760008282815181106102da576102da610edb565b6020026020010151905080600001516001600160a01b03166342842e0e8a8a84602001516040518463ffffffff1660e01b815260040161031c93929190610ef1565b600060405180830381600087803b15801561033657600080fd5b505af115801561034a573d6000803e3d6000fd5b5050505050808061035a90610f2b565b9150506102bd565b506001979650505050505050565b60008281526020819052604090206001015461038c8133610877565b61039683836108f0565b505050565b6001600160a01b03811633146104105760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61041a8282610974565b5050565b60006000805160206110a38339815191526104398133610877565b600061044585856108db565b905060005b815181101561036257600082828151811061046757610467610edb565b6020026020010151905080600001516001600160a01b03166342842e0e308a84602001516040518463ffffffff1660e01b81526004016104a993929190610ef1565b600060405180830381600087803b1580156104c357600080fd5b505af11580156104d7573d6000803e3d6000fd5b505050505080806104e790610f2b565b91505061044a565b60005b825181101561039657600083828151811061050f5761050f610edb565b6020026020010151905080600001516001600160a01b03166342842e0e338584602001516040518463ffffffff1660e01b815260040161055193929190610ef1565b600060405180830381600087803b15801561056b57600080fd5b505af115801561057f573d6000803e3d6000fd5b5050505050808061058f90610f2b565b9150506104f2565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60006000805160206110a38339815191526105db8133610877565b60006105e785856108db565b905060005b815181101561036257600082828151811061060957610609610edb565b6020026020010151905080600001516001600160a01b03166342842e0e8a8a84602001516040518463ffffffff1660e01b815260040161064b93929190610ef1565b600060405180830381600087803b15801561066557600080fd5b505af1158015610679573d6000803e3d6000fd5b5050505050808061068990610f2b565b9150506105ec565b60006000805160206110a38339815191526106ac8133610877565b6001600160a01b0386166107735760006106c685856108db565b905060005b81518110156107705760008282815181106106e8576106e8610edb565b6020026020010151905080600001516001600160a01b03166342842e0e8b3084602001516040518463ffffffff1660e01b815260040161072a93929190610ef1565b600060405180830381600087803b15801561074457600080fd5b505af1158015610758573d6000803e3d6000fd5b5050505050808061076890610f2b565b9150506106cb565b50505b5060019695505050505050565b60008281526020819052604090206001015461079c8133610877565b6103968383610974565b60006000805160206110a38339815191526107c18133610877565b60006107cd85856108db565b905060005b81518110156103625760008282815181106107ef576107ef610edb565b6020026020010151905080600001516001600160a01b03166342842e0e308b84602001516040518463ffffffff1660e01b815260040161083193929190610ef1565b600060405180830381600087803b15801561084b57600080fd5b505af115801561085f573d6000803e3d6000fd5b5050505050808061086f90610f2b565b9150506107d2565b6108818282610597565b61041a57610899816001600160a01b031660146109d9565b6108a48360206109d9565b6040516020016108b5929190610f76565b60408051601f198184030181529082905262461bcd60e51b825261040791600401610fe5565b60606108e982840184611018565b9392505050565b6108fa8282610597565b61041a576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556109303390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61097e8282610597565b1561041a576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606060006109e8836002611054565b6109f3906002611073565b6001600160401b03811115610a0a57610a0a610d1d565b6040519080825280601f01601f191660200182016040528015610a34576020820181803683370190505b509050600360fc1b81600081518110610a4f57610a4f610edb565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610a7e57610a7e610edb565b60200101906001600160f81b031916908160001a9053506000610aa2846002611054565b610aad906001611073565b90505b6001811115610b25576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610ae157610ae1610edb565b1a60f81b828281518110610af757610af7610edb565b60200101906001600160f81b031916908160001a90535060049490941c93610b1e8161108b565b9050610ab0565b5083156108e95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610407565b600060208284031215610b8657600080fd5b81356001600160e01b0319811681146108e957600080fd5b6001600160a01b0381168114610bb357600080fd5b50565b60008083601f840112610bc857600080fd5b5081356001600160401b03811115610bdf57600080fd5b602083019150836020828501011115610bf757600080fd5b9250929050565b600080600080600060808688031215610c1657600080fd5b8535610c2181610b9e565b94506020860135610c3181610b9e565b93506040860135925060608601356001600160401b03811115610c5357600080fd5b610c5f88828901610bb6565b969995985093965092949392505050565b60008060008060608587031215610c8657600080fd5b8435610c9181610b9e565b93506020850135610ca181610b9e565b925060408501356001600160401b03811115610cbc57600080fd5b610cc887828801610bb6565b95989497509550505050565b600060208284031215610ce657600080fd5b5035919050565b60008060408385031215610d0057600080fd5b823591506020830135610d1281610b9e565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610d5557610d55610d1d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610d8357610d83610d1d565b604052919050565b600082601f830112610d9c57600080fd5b813560206001600160401b03821115610db757610db7610d1d565b610dc5818360051b01610d5b565b82815260069290921b84018101918181019086841115610de457600080fd5b8286015b84811015610e2c5760408189031215610e015760008081fd5b610e09610d33565b8135610e1481610b9e565b81528185013585820152835291830191604001610de8565b509695505050505050565b60008060408385031215610e4a57600080fd5b82356001600160401b03811115610e6057600080fd5b610e6c85828601610d8b565b9250506020830135610d1281610b9e565b600080600080600060808688031215610e9557600080fd5b8535610ea081610b9e565b94506020860135610eb081610b9e565b93506040860135610ec081610b9e565b925060608601356001600160401b03811115610c5357600080fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b600052601160045260246000fd5b6000600019821415610f3f57610f3f610f15565b5060010190565b60005b83811015610f61578181015183820152602001610f49565b83811115610f70576000848401525b50505050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351610fa8816017850160208801610f46565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351610fd9816028840160208801610f46565b01602801949350505050565b6020815260008251806020840152611004816040850160208701610f46565b601f01601f19169190910160400192915050565b60006020828403121561102a57600080fd5b81356001600160401b0381111561104057600080fd5b61104c84828501610d8b565b949350505050565b600081600019048311821515161561106e5761106e610f15565b500290565b6000821982111561108657611086610f15565b500190565b60008161109a5761109a610f15565b50600019019056fe7630198b183b603be5df16e380207195f2a065102b113930ccb600feaf615331a2646970667358221220db03bef65c54f20aeb6cb9dd941c4156412b9eed733312669059612a27fa9ee464736f6c634300080b0033

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.