ETH Price: $2,811.16 (-10.81%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x75303ea2f193e99f7a4199a28442eb64e8dc0c905f2c039a973b5b10fdb65a81 Grant Approvals(pending)2025-02-02 23:57:571 hr ago1738540677IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0x75981b8e8d330af773533a577db715f05d7042200687712b43f3944071e4b5ce Grant Approvals(pending)2025-01-31 9:47:342 days ago1738316854IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0x5615958105811e01023e5246520f70e0ef3e369861642d669e64dfd9bd2d5d35 Grant Approvals(pending)2025-01-31 9:28:482 days ago1738315728IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0x9b065eeec0400a6e838d4e821954d6d0fae418ab4999b809fc38d35089363f76 Grant Approvals(pending)2025-01-30 21:54:043 days ago1738274044IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
Grant Approvals217625752025-02-03 1:02:3516 mins ago1738544555IN
LooksRare: Transfer Manager
0 ETH0.000757715.33746757
Grant Approvals217625712025-02-03 1:01:4717 mins ago1738544507IN
LooksRare: Transfer Manager
0 ETH0.0007698415.58326994
Grant Approvals217613072025-02-02 20:47:474 hrs ago1738529267IN
LooksRare: Transfer Manager
0 ETH0.0004968210.05669563
Grant Approvals217596812025-02-02 15:20:119 hrs ago1738509611IN
LooksRare: Transfer Manager
0 ETH0.000214454.34106235
Grant Approvals217583512025-02-02 10:52:3514 hrs ago1738493555IN
LooksRare: Transfer Manager
0 ETH0.00007121.44142358
Grant Approvals217579912025-02-02 9:39:5915 hrs ago1738489199IN
LooksRare: Transfer Manager
0 ETH0.000130732.64632418
Grant Approvals217577972025-02-02 9:00:3516 hrs ago1738486835IN
LooksRare: Transfer Manager
0 ETH0.000122832.48641256
Grant Approvals217577012025-02-02 8:41:2316 hrs ago1738485683IN
LooksRare: Transfer Manager
0 ETH0.00018553.75498627
Grant Approvals217564152025-02-02 4:21:4720 hrs ago1738470107IN
LooksRare: Transfer Manager
0 ETH0.000131552.66288359
Grant Approvals217560622025-02-02 3:10:4722 hrs ago1738465847IN
LooksRare: Transfer Manager
0 ETH0.000130652.64463882
Grant Approvals217554142025-02-02 1:00:5924 hrs ago1738458059IN
LooksRare: Transfer Manager
0 ETH0.000089321.80814384
Grant Approvals217549482025-02-01 23:27:3525 hrs ago1738452455IN
LooksRare: Transfer Manager
0 ETH0.000223074.51559408
Grant Approvals217546512025-02-01 22:27:5926 hrs ago1738448879IN
LooksRare: Transfer Manager
0 ETH0.000127322.57728037
Grant Approvals217536672025-02-01 19:09:4730 hrs ago1738436987IN
LooksRare: Transfer Manager
0 ETH0.00012672.56471804
Grant Approvals217484342025-02-01 1:37:5947 hrs ago1738373879IN
LooksRare: Transfer Manager
0 ETH0.0000741.4981157
Grant Approvals217480152025-02-01 0:13:352 days ago1738368815IN
LooksRare: Transfer Manager
0 ETH0.000095831.94
Grant Approvals217476012025-01-31 22:49:592 days ago1738363799IN
LooksRare: Transfer Manager
0 ETH0.000200174.05200543
Grant Approvals217473062025-01-31 21:50:592 days ago1738360259IN
LooksRare: Transfer Manager
0 ETH0.000196463.97683766
Grant Approvals217468642025-01-31 20:22:112 days ago1738354931IN
LooksRare: Transfer Manager
0 ETH0.000214374.33946516
Grant Approvals217457572025-01-31 16:39:592 days ago1738341599IN
LooksRare: Transfer Manager
0 ETH0.0006933514.03490908
Grant Approvals217453102025-01-31 15:09:352 days ago1738336175IN
LooksRare: Transfer Manager
0 ETH0.0006330912.81516073
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
168248902023-03-14 8:06:23691 days ago1678781183  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TransferManager

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 888888 runs

Other Settings:
default evmVersion
File 1 of 14 : TransferManager.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

// LooksRare unopinionated libraries
import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol";
import {LowLevelERC721Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC721Transfer.sol";
import {LowLevelERC1155Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC1155Transfer.sol";

// Interfaces and errors
import {ITransferManager} from "./interfaces/ITransferManager.sol";
import {AmountInvalid, LengthsInvalid} from "./errors/SharedErrors.sol";

// Libraries
import {OrderStructs} from "./libraries/OrderStructs.sol";

// Enums
import {CollectionType} from "./enums/CollectionType.sol";

/**
 * @title TransferManager
 * @notice This contract provides the transfer functions for ERC721/ERC1155 for contracts that require them.
 *         Collection type "0" refers to ERC721 transfer functions.
 *         Collection type "1" refers to ERC1155 transfer functions.
 * @dev "Safe" transfer functions for ERC721 are not implemented since they come with added gas costs
 *       to verify if the recipient is a contract as it requires verifying the receiver interface is valid.
 * @author LooksRare protocol team (👀,💎)
 */
contract TransferManager is ITransferManager, LowLevelERC721Transfer, LowLevelERC1155Transfer, OwnableTwoSteps {
    /**
     * @notice This returns whether the user has approved the operator address.
     * The first address is the user and the second address is the operator (e.g. LooksRareProtocol).
     */
    mapping(address => mapping(address => bool)) public hasUserApprovedOperator;

    /**
     * @notice This returns whether the operator address is allowed by this contract's owner.
     */
    mapping(address => bool) public isOperatorAllowed;

    /**
     * @notice Constructor
     * @param _owner Owner address
     */
    constructor(address _owner) OwnableTwoSteps(_owner) {}

    /**
     * @notice This function transfers items for a single ERC721 collection.
     * @param collection Collection address
     * @param from Sender address
     * @param to Recipient address
     * @param itemIds Array of itemIds
     * @param amounts Array of amounts
     */
    function transferItemsERC721(
        address collection,
        address from,
        address to,
        uint256[] calldata itemIds,
        uint256[] calldata amounts
    ) external {
        uint256 length = itemIds.length;
        if (length == 0) {
            revert LengthsInvalid();
        }

        _isOperatorValidForTransfer(from, msg.sender);

        for (uint256 i; i < length; ) {
            if (amounts[i] != 1) {
                revert AmountInvalid();
            }
            _executeERC721TransferFrom(collection, from, to, itemIds[i]);
            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice This function transfers items for a single ERC1155 collection.
     * @param collection Collection address
     * @param from Sender address
     * @param to Recipient address
     * @param itemIds Array of itemIds
     * @param amounts Array of amounts
     * @dev It does not allow batch transferring if from = msg.sender since native function should be used.
     */
    function transferItemsERC1155(
        address collection,
        address from,
        address to,
        uint256[] calldata itemIds,
        uint256[] calldata amounts
    ) external {
        uint256 length = itemIds.length;

        if (length == 0 || amounts.length != length) {
            revert LengthsInvalid();
        }

        _isOperatorValidForTransfer(from, msg.sender);

        if (length == 1) {
            if (amounts[0] == 0) {
                revert AmountInvalid();
            }
            _executeERC1155SafeTransferFrom(collection, from, to, itemIds[0], amounts[0]);
        } else {
            for (uint256 i; i < length; ) {
                if (amounts[i] == 0) {
                    revert AmountInvalid();
                }

                unchecked {
                    ++i;
                }
            }
            _executeERC1155SafeBatchTransferFrom(collection, from, to, itemIds, amounts);
        }
    }

    /**
     * @notice This function transfers items across an array of collections that can be both ERC721 and ERC1155.
     * @param items Array of BatchTransferItem
     * @param from Sender address
     * @param to Recipient address
     */
    function transferBatchItemsAcrossCollections(
        BatchTransferItem[] calldata items,
        address from,
        address to
    ) external {
        uint256 itemsLength = items.length;

        if (itemsLength == 0) {
            revert LengthsInvalid();
        }

        if (from != msg.sender) {
            _isOperatorValidForTransfer(from, msg.sender);
        }

        for (uint256 i; i < itemsLength; ) {
            uint256[] calldata itemIds = items[i].itemIds;
            uint256 itemIdsLengthForSingleCollection = itemIds.length;
            uint256[] calldata amounts = items[i].amounts;

            if (itemIdsLengthForSingleCollection == 0 || amounts.length != itemIdsLengthForSingleCollection) {
                revert LengthsInvalid();
            }

            CollectionType collectionType = items[i].collectionType;
            if (collectionType == CollectionType.ERC721) {
                for (uint256 j; j < itemIdsLengthForSingleCollection; ) {
                    if (amounts[j] != 1) {
                        revert AmountInvalid();
                    }
                    _executeERC721TransferFrom(items[i].collection, from, to, itemIds[j]);
                    unchecked {
                        ++j;
                    }
                }
            } else if (collectionType == CollectionType.ERC1155) {
                for (uint256 j; j < itemIdsLengthForSingleCollection; ) {
                    if (amounts[j] == 0) {
                        revert AmountInvalid();
                    }

                    unchecked {
                        ++j;
                    }
                }
                _executeERC1155SafeBatchTransferFrom(items[i].collection, from, to, itemIds, amounts);
            }

            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice This function allows a user to grant approvals for an array of operators.
     *         Users cannot grant approvals if the operator is not allowed by this contract's owner.
     * @param operators Array of operator addresses
     * @dev Each operator address must be globally allowed to be approved.
     */
    function grantApprovals(address[] calldata operators) external {
        uint256 length = operators.length;

        if (length == 0) {
            revert LengthsInvalid();
        }

        for (uint256 i; i < length; ) {
            address operator = operators[i];

            if (!isOperatorAllowed[operator]) {
                revert OperatorNotAllowed();
            }

            if (hasUserApprovedOperator[msg.sender][operator]) {
                revert OperatorAlreadyApprovedByUser();
            }

            hasUserApprovedOperator[msg.sender][operator] = true;

            unchecked {
                ++i;
            }
        }

        emit ApprovalsGranted(msg.sender, operators);
    }

    /**
     * @notice This function allows a user to revoke existing approvals for an array of operators.
     * @param operators Array of operator addresses
     * @dev Each operator address must be approved at the user level to be revoked.
     */
    function revokeApprovals(address[] calldata operators) external {
        uint256 length = operators.length;
        if (length == 0) {
            revert LengthsInvalid();
        }

        for (uint256 i; i < length; ) {
            address operator = operators[i];

            if (!hasUserApprovedOperator[msg.sender][operator]) {
                revert OperatorNotApprovedByUser();
            }

            delete hasUserApprovedOperator[msg.sender][operator];
            unchecked {
                ++i;
            }
        }

        emit ApprovalsRemoved(msg.sender, operators);
    }

    /**
     * @notice This function allows an operator to be added for the shared transfer system.
     *         Once the operator is allowed, users can grant NFT approvals to this operator.
     * @param operator Operator address to allow
     * @dev Only callable by owner.
     */
    function allowOperator(address operator) external onlyOwner {
        if (isOperatorAllowed[operator]) {
            revert OperatorAlreadyAllowed();
        }

        isOperatorAllowed[operator] = true;

        emit OperatorAllowed(operator);
    }

    /**
     * @notice This function allows the user to remove an operator for the shared transfer system.
     * @param operator Operator address to remove
     * @dev Only callable by owner.
     */
    function removeOperator(address operator) external onlyOwner {
        if (!isOperatorAllowed[operator]) {
            revert OperatorNotAllowed();
        }

        delete isOperatorAllowed[operator];

        emit OperatorRemoved(operator);
    }

    /**
     * @notice This function is internal and verifies whether the transfer
     *         (by an operator on behalf of a user) is valid. If not, it reverts.
     * @param user User address
     * @param operator Operator address
     */
    function _isOperatorValidForTransfer(address user, address operator) private view {
        if (isOperatorAllowed[operator] && hasUserApprovedOperator[user][operator]) {
            return;
        }

        revert TransferCallerInvalid();
    }
}

File 2 of 14 : CollectionType.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

/**
 * @notice CollectionType is used in OrderStructs.Maker's collectionType to determine the collection type being traded.
 */
enum CollectionType {
    ERC721,
    ERC1155
}

File 3 of 14 : QuoteType.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

/**
 * @notice QuoteType is used in OrderStructs.Maker's quoteType to determine whether the maker order is a bid or an ask.
 */
enum QuoteType {
    Bid,
    Ask
}

File 4 of 14 : SharedErrors.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

/**
 * @notice It is returned if the amount is invalid.
 *         For ERC721, any number that is not 1. For ERC1155, if amount is 0.
 */
error AmountInvalid();

/**
 * @notice It is returned if the ask price is too high for the bid user.
 */
error AskTooHigh();

/**
 * @notice It is returned if the bid price is too low for the ask user.
 */
error BidTooLow();

/**
 * @notice It is returned if the function cannot be called by the sender.
 */
error CallerInvalid();

/**
 * @notice It is returned if the currency is invalid.
 */
error CurrencyInvalid();

/**
 * @notice The function selector is invalid for this strategy implementation.
 */
error FunctionSelectorInvalid();

/**
 * @notice It is returned if there is either a mismatch or an error in the length of the array(s).
 */
error LengthsInvalid();

/**
 * @notice It is returned if the merkle proof provided is invalid.
 */
error MerkleProofInvalid();

/**
 * @notice It is returned if the length of the merkle proof provided is greater than tolerated.
 * @param length Proof length
 */
error MerkleProofTooLarge(uint256 length);

/**
 * @notice It is returned if the order is permanently invalid.
 *         There may be an issue with the order formatting.
 */
error OrderInvalid();

/**
 * @notice It is returned if the maker quote type is invalid.
 */
error QuoteTypeInvalid();

File 5 of 14 : ITransferManager.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

// Libraries
import {OrderStructs} from "../libraries/OrderStructs.sol";

// Enums
import {CollectionType} from "../enums/CollectionType.sol";

/**
 * @title ITransferManager
 * @author LooksRare protocol team (👀,💎)
 */
interface ITransferManager {
    /**
     * @notice This struct is only used for transferBatchItemsAcrossCollections.
     * @param collection Collection address
     * @param collectionType 0 for ERC721, 1 for ERC1155
     * @param itemIds Array of item ids to transfer
     * @param amounts Array of amounts to transfer
     */
    struct BatchTransferItem {
        address collection;
        CollectionType collectionType;
        uint256[] itemIds;
        uint256[] amounts;
    }

    /**
     * @notice It is emitted if operators' approvals to transfer NFTs are granted by a user.
     * @param user Address of the user
     * @param operators Array of operator addresses
     */
    event ApprovalsGranted(address user, address[] operators);

    /**
     * @notice It is emitted if operators' approvals to transfer NFTs are revoked by a user.
     * @param user Address of the user
     * @param operators Array of operator addresses
     */
    event ApprovalsRemoved(address user, address[] operators);

    /**
     * @notice It is emitted if a new operator is added to the global allowlist.
     * @param operator Operator address
     */
    event OperatorAllowed(address operator);

    /**
     * @notice It is emitted if an operator is removed from the global allowlist.
     * @param operator Operator address
     */
    event OperatorRemoved(address operator);

    /**
     * @notice It is returned if the operator to approve has already been approved by the user.
     */
    error OperatorAlreadyApprovedByUser();

    /**
     * @notice It is returned if the operator to revoke has not been previously approved by the user.
     */
    error OperatorNotApprovedByUser();

    /**
     * @notice It is returned if the transfer caller is already allowed by the owner.
     * @dev This error can only be returned for owner operations.
     */
    error OperatorAlreadyAllowed();

    /**
     * @notice It is returned if the operator to approve is not in the global allowlist defined by the owner.
     * @dev This error can be returned if the user tries to grant approval to an operator address not in the
     *      allowlist or if the owner tries to remove the operator from the global allowlist.
     */
    error OperatorNotAllowed();

    /**
     * @notice It is returned if the transfer caller is invalid.
     *         For a transfer called to be valid, the operator must be in the global allowlist and
     *         approved by the 'from' user.
     */
    error TransferCallerInvalid();
}

File 6 of 14 : OrderStructs.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

// Enums
import {CollectionType} from "../enums/CollectionType.sol";
import {QuoteType} from "../enums/QuoteType.sol";

/**
 * @title OrderStructs
 * @notice This library contains all order struct types for the LooksRare protocol (v2).
 * @author LooksRare protocol team (👀,💎)
 */
library OrderStructs {
    /**
     * 1. Maker struct
     */

    /**
     * @notice Maker is the struct for a maker order.
     * @param quoteType Quote type (i.e. 0 = BID, 1 = ASK)
     * @param globalNonce Global user order nonce for maker orders
     * @param subsetNonce Subset nonce (shared across bid/ask maker orders)
     * @param orderNonce Order nonce (it can be shared across bid/ask maker orders)
     * @param strategyId Strategy id
     * @param collectionType Collection type (i.e. 0 = ERC721, 1 = ERC1155)
     * @param collection Collection address
     * @param currency Currency address (@dev address(0) = ETH)
     * @param signer Signer address
     * @param startTime Start timestamp
     * @param endTime End timestamp
     * @param price Minimum price for maker ask, maximum price for maker bid
     * @param itemIds Array of itemIds
     * @param amounts Array of amounts
     * @param additionalParameters Extra data specific for the order
     */
    struct Maker {
        QuoteType quoteType;
        uint256 globalNonce;
        uint256 subsetNonce;
        uint256 orderNonce;
        uint256 strategyId;
        CollectionType collectionType;
        address collection;
        address currency;
        address signer;
        uint256 startTime;
        uint256 endTime;
        uint256 price;
        uint256[] itemIds;
        uint256[] amounts;
        bytes additionalParameters;
    }

    /**
     * 2. Taker struct
     */

    /**
     * @notice Taker is the struct for a taker ask/bid order. It contains the parameters required for a direct purchase.
     * @dev Taker struct is matched against MakerAsk/MakerBid structs at the protocol level.
     * @param recipient Recipient address (to receive NFTs or non-fungible tokens)
     * @param additionalParameters Extra data specific for the order
     */
    struct Taker {
        address recipient;
        bytes additionalParameters;
    }

    /**
     * 3. Merkle tree struct
     */

    enum MerkleTreeNodePosition { Left, Right }

    /**
     * @notice MerkleTreeNode is a MerkleTree's node.
     * @param value It can be an order hash or a proof
     * @param position The node's position in its branch.
     *                 It can be left or right or none
     *                 (before the tree is sorted).
     */
    struct MerkleTreeNode {
        bytes32 value;
        MerkleTreeNodePosition position;
    }

    /**
     * @notice MerkleTree is the struct for a merkle tree of order hashes.
     * @dev A Merkle tree can be computed with order hashes.
     *      It can contain order hashes from both maker bid and maker ask structs.
     * @param root Merkle root
     * @param proof Array containing the merkle proof
     */
    struct MerkleTree {
        bytes32 root;
        MerkleTreeNode[] proof;
    }

    /**
     * 4. Constants
     */

    /**
     * @notice This is the type hash constant used to compute the maker order hash.
     */
    bytes32 internal constant _MAKER_TYPEHASH =
        keccak256(
            "Maker("
                "uint8 quoteType,"
                "uint256 globalNonce,"
                "uint256 subsetNonce,"
                "uint256 orderNonce,"
                "uint256 strategyId,"
                "uint8 collectionType,"
                "address collection,"
                "address currency,"
                "address signer,"
                "uint256 startTime,"
                "uint256 endTime,"
                "uint256 price,"
                "uint256[] itemIds,"
                "uint256[] amounts,"
                "bytes additionalParameters"
            ")"
        );

    /**
     * 5. Hash functions
     */

    /**
     * @notice This function is used to compute the order hash for a maker struct.
     * @param maker Maker order struct
     * @return makerHash Hash of the maker struct
     */
    function hash(Maker memory maker) internal pure returns (bytes32) {
        // Encoding is done into two parts to avoid stack too deep issues
        return
            keccak256(
                bytes.concat(
                    abi.encode(
                        _MAKER_TYPEHASH,
                        maker.quoteType,
                        maker.globalNonce,
                        maker.subsetNonce,
                        maker.orderNonce,
                        maker.strategyId,
                        maker.collectionType,
                        maker.collection,
                        maker.currency
                    ),
                    abi.encode(
                        maker.signer,
                        maker.startTime,
                        maker.endTime,
                        maker.price,
                        keccak256(abi.encodePacked(maker.itemIds)),
                        keccak256(abi.encodePacked(maker.amounts)),
                        keccak256(maker.additionalParameters)
                    )
                )
            );
    }
}

File 7 of 14 : OwnableTwoSteps.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// Interfaces
import {IOwnableTwoSteps} from "./interfaces/IOwnableTwoSteps.sol";

/**
 * @title OwnableTwoSteps
 * @notice This contract offers transfer of ownership in two steps with potential owner
 *         having to confirm the transaction to become the owner.
 *         Renouncement of the ownership is also a two-step process since the next potential owner is the address(0).
 * @author LooksRare protocol team (👀,💎)
 */
abstract contract OwnableTwoSteps is IOwnableTwoSteps {
    /**
     * @notice Address of the current owner.
     */
    address public owner;

    /**
     * @notice Address of the potential owner.
     */
    address public potentialOwner;

    /**
     * @notice Ownership status.
     */
    Status public ownershipStatus;

    /**
     * @notice Modifier to wrap functions for contracts that inherit this contract.
     */
    modifier onlyOwner() {
        _onlyOwner();
        _;
    }

    /**
     * @notice Constructor
     * @param _owner The contract's owner
     */
    constructor(address _owner) {
        owner = _owner;
        emit NewOwner(_owner);
    }

    /**
     * @notice This function is used to cancel the ownership transfer.
     * @dev This function can be used for both cancelling a transfer to a new owner and
     *      cancelling the renouncement of the ownership.
     */
    function cancelOwnershipTransfer() external onlyOwner {
        Status _ownershipStatus = ownershipStatus;
        if (_ownershipStatus == Status.NoOngoingTransfer) {
            revert NoOngoingTransferInProgress();
        }

        if (_ownershipStatus == Status.TransferInProgress) {
            delete potentialOwner;
        }

        delete ownershipStatus;

        emit CancelOwnershipTransfer();
    }

    /**
     * @notice This function is used to confirm the ownership renouncement.
     */
    function confirmOwnershipRenouncement() external onlyOwner {
        if (ownershipStatus != Status.RenouncementInProgress) {
            revert RenouncementNotInProgress();
        }

        delete owner;
        delete ownershipStatus;

        emit NewOwner(address(0));
    }

    /**
     * @notice This function is used to confirm the ownership transfer.
     * @dev This function can only be called by the current potential owner.
     */
    function confirmOwnershipTransfer() external {
        if (ownershipStatus != Status.TransferInProgress) {
            revert TransferNotInProgress();
        }

        if (msg.sender != potentialOwner) {
            revert WrongPotentialOwner();
        }

        owner = msg.sender;
        delete ownershipStatus;
        delete potentialOwner;

        emit NewOwner(msg.sender);
    }

    /**
     * @notice This function is used to initiate the transfer of ownership to a new owner.
     * @param newPotentialOwner New potential owner address
     */
    function initiateOwnershipTransfer(address newPotentialOwner) external onlyOwner {
        if (ownershipStatus != Status.NoOngoingTransfer) {
            revert TransferAlreadyInProgress();
        }

        ownershipStatus = Status.TransferInProgress;
        potentialOwner = newPotentialOwner;

        /**
         * @dev This function can only be called by the owner, so msg.sender is the owner.
         *      We don't have to SLOAD the owner again.
         */
        emit InitiateOwnershipTransfer(msg.sender, newPotentialOwner);
    }

    /**
     * @notice This function is used to initiate the ownership renouncement.
     */
    function initiateOwnershipRenouncement() external onlyOwner {
        if (ownershipStatus != Status.NoOngoingTransfer) {
            revert TransferAlreadyInProgress();
        }

        ownershipStatus = Status.RenouncementInProgress;

        emit InitiateOwnershipRenouncement();
    }

    function _onlyOwner() private view {
        if (msg.sender != owner) revert NotOwner();
    }
}

File 8 of 14 : GenericErrors.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/**
 * @notice It is emitted if the call recipient is not a contract.
 */
error NotAContract();

File 9 of 14 : LowLevelErrors.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/**
 * @notice It is emitted if the ETH transfer fails.
 */
error ETHTransferFail();

/**
 * @notice It is emitted if the ERC20 approval fails.
 */
error ERC20ApprovalFail();

/**
 * @notice It is emitted if the ERC20 transfer fails.
 */
error ERC20TransferFail();

/**
 * @notice It is emitted if the ERC20 transferFrom fails.
 */
error ERC20TransferFromFail();

/**
 * @notice It is emitted if the ERC721 transferFrom fails.
 */
error ERC721TransferFromFail();

/**
 * @notice It is emitted if the ERC1155 safeTransferFrom fails.
 */
error ERC1155SafeTransferFromFail();

/**
 * @notice It is emitted if the ERC1155 safeBatchTransferFrom fails.
 */
error ERC1155SafeBatchTransferFromFail();

File 10 of 14 : IOwnableTwoSteps.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/**
 * @title IOwnableTwoSteps
 * @author LooksRare protocol team (👀,💎)
 */
interface IOwnableTwoSteps {
    /**
     * @notice This enum keeps track of the ownership status.
     * @param NoOngoingTransfer The default status when the owner is set
     * @param TransferInProgress The status when a transfer to a new owner is initialized
     * @param RenouncementInProgress The status when a transfer to address(0) is initialized
     */
    enum Status {
        NoOngoingTransfer,
        TransferInProgress,
        RenouncementInProgress
    }

    /**
     * @notice This is returned when there is no transfer of ownership in progress.
     */
    error NoOngoingTransferInProgress();

    /**
     * @notice This is returned when the caller is not the owner.
     */
    error NotOwner();

    /**
     * @notice This is returned when there is no renouncement in progress but
     *         the owner tries to validate the ownership renouncement.
     */
    error RenouncementNotInProgress();

    /**
     * @notice This is returned when the transfer is already in progress but the owner tries
     *         initiate a new ownership transfer.
     */
    error TransferAlreadyInProgress();

    /**
     * @notice This is returned when there is no ownership transfer in progress but the
     *         ownership change tries to be approved.
     */
    error TransferNotInProgress();

    /**
     * @notice This is returned when the ownership transfer is attempted to be validated by the
     *         a caller that is not the potential owner.
     */
    error WrongPotentialOwner();

    /**
     * @notice This is emitted if the ownership transfer is cancelled.
     */
    event CancelOwnershipTransfer();

    /**
     * @notice This is emitted if the ownership renouncement is initiated.
     */
    event InitiateOwnershipRenouncement();

    /**
     * @notice This is emitted if the ownership transfer is initiated.
     * @param previousOwner Previous/current owner
     * @param potentialOwner Potential/future owner
     */
    event InitiateOwnershipTransfer(address previousOwner, address potentialOwner);

    /**
     * @notice This is emitted when there is a new owner.
     */
    event NewOwner(address newOwner);
}

File 11 of 14 : IERC1155.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IERC1155 {
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    event URI(string value, uint256 indexed id);

    function balanceOf(address account, uint256 id) external view returns (uint256);

    function balanceOfBatch(
        address[] calldata accounts,
        uint256[] calldata ids
    ) external view returns (uint256[] memory);

    function setApprovalForAll(address operator, bool approved) external;

    function isApprovedForAll(address account, address operator) external view returns (bool);

    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 12 of 14 : IERC721.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IERC721 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;

    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    function transferFrom(address from, address to, uint256 tokenId) external;

    function approve(address to, uint256 tokenId) external;

    function setApprovalForAll(address operator, bool _approved) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 13 of 14 : LowLevelERC1155Transfer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// Interfaces
import {IERC1155} from "../interfaces/generic/IERC1155.sol";

// Errors
import {ERC1155SafeTransferFromFail, ERC1155SafeBatchTransferFromFail} from "../errors/LowLevelErrors.sol";
import {NotAContract} from "../errors/GenericErrors.sol";

/**
 * @title LowLevelERC1155Transfer
 * @notice This contract contains low-level calls to transfer ERC1155 tokens.
 * @author LooksRare protocol team (👀,💎)
 */
contract LowLevelERC1155Transfer {
    /**
     * @notice Execute ERC1155 safeTransferFrom
     * @param collection Address of the collection
     * @param from Address of the sender
     * @param to Address of the recipient
     * @param tokenId tokenId to transfer
     * @param amount Amount to transfer
     */
    function _executeERC1155SafeTransferFrom(
        address collection,
        address from,
        address to,
        uint256 tokenId,
        uint256 amount
    ) internal {
        if (collection.code.length == 0) {
            revert NotAContract();
        }

        (bool status, ) = collection.call(abi.encodeCall(IERC1155.safeTransferFrom, (from, to, tokenId, amount, "")));

        if (!status) {
            revert ERC1155SafeTransferFromFail();
        }
    }

    /**
     * @notice Execute ERC1155 safeBatchTransferFrom
     * @param collection Address of the collection
     * @param from Address of the sender
     * @param to Address of the recipient
     * @param tokenIds Array of tokenIds to transfer
     * @param amounts Array of amounts to transfer
     */
    function _executeERC1155SafeBatchTransferFrom(
        address collection,
        address from,
        address to,
        uint256[] calldata tokenIds,
        uint256[] calldata amounts
    ) internal {
        if (collection.code.length == 0) {
            revert NotAContract();
        }

        (bool status, ) = collection.call(
            abi.encodeCall(IERC1155.safeBatchTransferFrom, (from, to, tokenIds, amounts, ""))
        );

        if (!status) {
            revert ERC1155SafeBatchTransferFromFail();
        }
    }
}

File 14 of 14 : LowLevelERC721Transfer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// Interfaces
import {IERC721} from "../interfaces/generic/IERC721.sol";

// Errors
import {ERC721TransferFromFail} from "../errors/LowLevelErrors.sol";
import {NotAContract} from "../errors/GenericErrors.sol";

/**
 * @title LowLevelERC721Transfer
 * @notice This contract contains low-level calls to transfer ERC721 tokens.
 * @author LooksRare protocol team (👀,💎)
 */
contract LowLevelERC721Transfer {
    /**
     * @notice Execute ERC721 transferFrom
     * @param collection Address of the collection
     * @param from Address of the sender
     * @param to Address of the recipient
     * @param tokenId tokenId to transfer
     */
    function _executeERC721TransferFrom(address collection, address from, address to, uint256 tokenId) internal {
        if (collection.code.length == 0) {
            revert NotAContract();
        }

        (bool status, ) = collection.call(abi.encodeCall(IERC721.transferFrom, (from, to, tokenId)));

        if (!status) {
            revert ERC721TransferFromFail();
        }
    }
}

Settings
{
  "remappings": [
    "@chainlink/=node_modules/@chainlink/",
    "@ensdomains/=node_modules/@ensdomains/",
    "@eth-optimism/=node_modules/@eth-optimism/",
    "@looksrare/=node_modules/@looksrare/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "eth-gas-reporter/=node_modules/eth-gas-reporter/",
    "forge-std/=lib/forge-std/src/",
    "hardhat/=node_modules/hardhat/",
    "murky/=lib/murky/src/",
    "openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/",
    "solmate/=node_modules/solmate/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 888888
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountInvalid","type":"error"},{"inputs":[],"name":"ERC1155SafeBatchTransferFromFail","type":"error"},{"inputs":[],"name":"ERC1155SafeTransferFromFail","type":"error"},{"inputs":[],"name":"ERC721TransferFromFail","type":"error"},{"inputs":[],"name":"LengthsInvalid","type":"error"},{"inputs":[],"name":"NoOngoingTransferInProgress","type":"error"},{"inputs":[],"name":"NotAContract","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"OperatorAlreadyAllowed","type":"error"},{"inputs":[],"name":"OperatorAlreadyApprovedByUser","type":"error"},{"inputs":[],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OperatorNotApprovedByUser","type":"error"},{"inputs":[],"name":"RenouncementNotInProgress","type":"error"},{"inputs":[],"name":"TransferAlreadyInProgress","type":"error"},{"inputs":[],"name":"TransferCallerInvalid","type":"error"},{"inputs":[],"name":"TransferNotInProgress","type":"error"},{"inputs":[],"name":"WrongPotentialOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address[]","name":"operators","type":"address[]"}],"name":"ApprovalsGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address[]","name":"operators","type":"address[]"}],"name":"ApprovalsRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"CancelOwnershipTransfer","type":"event"},{"anonymous":false,"inputs":[],"name":"InitiateOwnershipRenouncement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"potentialOwner","type":"address"}],"name":"InitiateOwnershipTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAllowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"allowOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmOwnershipRenouncement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"operators","type":"address[]"}],"name":"grantApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"hasUserApprovedOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateOwnershipRenouncement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"initiateOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperatorAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownershipStatus","outputs":[{"internalType":"enum IOwnableTwoSteps.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"potentialOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"operators","type":"address[]"}],"name":"revokeApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"enum CollectionType","name":"collectionType","type":"uint8"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct ITransferManager.BatchTransferItem[]","name":"items","type":"tuple[]"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferBatchItemsAcrossCollections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"transferItemsERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"transferItemsERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50604051611dc8380380611dc883398101604081905261002f91610089565b600080546001600160a01b0319166001600160a01b03831690811790915560405190815281907f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc9060200160405180910390a150506100b9565b60006020828403121561009b57600080fd5b81516001600160a01b03811681146100b257600080fd5b9392505050565b611d00806100c86000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c80637200b829116100b2578063a0a406c611610081578063ac8a584a11610066578063ac8a584a146102a2578063c0b6f561146102b5578063e8f9f1dc146102c857600080fd5b8063a0a406c61461027c578063a7bc96d31461028f57600080fd5b80637200b829146101ec57806375ccc132146101f45780637762df25146102175780638da5cb5b1461025c57600080fd5b80633cc4cb06116100ee5780633cc4cb061461018b5780633e567539146101c95780635b6ac011146101d15780636cf0859c146101d957600080fd5b80630ca8e8a8146101205780631ba9a4581461013557806323452b9c146101485780632bb5a9e614610150575b600080fd5b61013361012e366004611879565b6102db565b005b6101336101433660046118de565b6105ed565b6101336106db565b6001546101759074010000000000000000000000000000000000000000900460ff1681565b604051610182919061192f565b60405180910390f35b6101b9610199366004611970565b600260209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610182565b6101336107e2565b6101336108d8565b6101336101e73660046119a3565b6109b2565b610133610b2f565b6101b96102023660046118de565b60036020526000908152604090205460ff1681565b6001546102379073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610182565b6000546102379073ffffffffffffffffffffffffffffffffffffffff1681565b61013361028a3660046119e5565b610c6c565b61013361029d3660046119e5565b610dd9565b6101336102b03660046118de565b610ea7565b6101336102c33660046118de565b610f8a565b6101336102d63660046119a3565b61108c565b826000819003610317576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316331461033e5761033e8333611260565b60005b818110156105e55736600087878481811061035e5761035e611a87565b90506020028101906103709190611ab6565b61037e906040810190611af4565b9092509050803660008a8a8781811061039957610399611a87565b90506020028101906103ab9190611ab6565b6103b9906060810190611af4565b9150915082600014806103cc5750808314155b15610403576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008b8b8881811061041757610417611a87565b90506020028101906104299190611ab6565b61043a906040810190602001611b5c565b9050600081600181111561045057610450611900565b036105155760005b8481101561050f5783838281811061047257610472611a87565b905060200201356001146104b2576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105078d8d8a8181106104c7576104c7611a87565b90506020028101906104d99190611ab6565b6104e79060208101906118de565b8c8c8a8a868181106104fb576104fb611a87565b90506020020135611302565b600101610458565b506105d4565b600181600181111561052957610529611900565b036105d45760005b848110156105935783838281811061054b5761054b611a87565b9050602002013560000361058b576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101610531565b506105d48c8c898181106105a9576105a9611a87565b90506020028101906105bb9190611ab6565b6105c99060208101906118de565b8b8b89898888611491565b866001019650505050505050610341565b505050505050565b6105f5611614565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff1615610655576040517f730e0eb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527fdde65206cdee4ea27ef1b170724ba50b41ad09a3bf2dda12935fc40c4dbf6e7591015b60405180910390a150565b6106e3611614565b60015474010000000000000000000000000000000000000000900460ff16600081600281111561071557610715611900565b0361074c576040517fccf69db700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181600281111561076057610760611900565b0361078e57600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae390600090a150565b6107ea611614565b600260015474010000000000000000000000000000000000000000900460ff16600281111561081b5761081b611900565b14610852576040517f045c512200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040519081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc906020015b60405180910390a1565b6108e0611614565b600060015474010000000000000000000000000000000000000000900460ff16600281111561091157610911611900565b14610948576040517f74ed79ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740200000000000000000000000000000000000000001790556040517f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec90600090a1565b8060008190036109ee576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610aee576000848483818110610a0d57610a0d611a87565b9050602002016020810190610a2291906118de565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205490915060ff16610a8f576040517f21d29a8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556001016109f1565b507fcd827905c56d07b7e3668c6d264b27603a45324dd955aadca79cf47eb24ca5fa338484604051610b2293929190611b7d565b60405180910390a1505050565b6001805474010000000000000000000000000000000000000000900460ff166002811115610b5f57610b5f611900565b14610b96576040517f5e4f282600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015473ffffffffffffffffffffffffffffffffffffffff163314610be7576040517fafdcfb9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633908117909155600180547fffffffffffffffffffffff0000000000000000000000000000000000000000001690556040519081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc906020016108ce565b82801580610c7a5750818114155b15610cb1576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbb8733611260565b80600103610d5a5782826000818110610cd657610cd6611a87565b90506020020135600003610d16576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d5588888888886000818110610d2f57610d2f611a87565b9050602002013587876000818110610d4957610d49611a87565b90506020020135611667565b610dcf565b60005b81811015610dbf57838382818110610d7757610d77611a87565b90506020020135600003610db7576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101610d5d565b50610dcf88888888888888611491565b5050505050505050565b826000819003610e15576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1f8733611260565b60005b81811015610e9c57838382818110610e3c57610e3c611a87565b90506020020135600114610e7c576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e948989898989868181106104fb576104fb611a87565b600101610e22565b505050505050505050565b610eaf611614565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff16610f0e576040517f8a10919300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d91016106d0565b610f92611614565b600060015474010000000000000000000000000000000000000000900460ff166002811115610fc357610fc3611900565b14610ffa576040517f74ed79ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffff000000000000000000000000000000000000000000909116811774010000000000000000000000000000000000000000179091556040805133815260208101929092527fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef91016106d0565b8060008190036110c8576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561122c5760008484838181106110e7576110e7611a87565b90506020020160208101906110fc91906118de565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205490915060ff1661115e576040517f8a10919300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156111c9576040517fabb0fc9600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155016110cb565b507f2689e1a312b4212a2eb518d23bfd4c7cc30e3a7bc7a7e2524e8ec16e6a3713ab338484604051610b2293929190611b7d565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff1680156112c7575073ffffffffffffffffffffffffffffffffffffffff80831660009081526002602090815260408083209385168352929052205460ff165b156112d0575050565b6040517fb550954400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163b600003611353576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff848116602483015283811660448301526064820183905260009190861690608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790525161140d9190611be4565b6000604051808303816000865af19150503d806000811461144a576040519150601f19603f3d011682016040523d82523d6000602084013e61144f565b606091505b505090508061148a576040517fe0f5c50800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8673ffffffffffffffffffffffffffffffffffffffff163b6000036114e2576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008773ffffffffffffffffffffffffffffffffffffffff1687878787878760405160240161151696959493929190611c5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2eb2c2d600000000000000000000000000000000000000000000000000000000179052516115979190611be4565b6000604051808303816000865af19150503d80600081146115d4576040519150601f19603f3d011682016040523d82523d6000602084013e6115d9565b606091505b5050905080610dcf576040517f65da8e4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611665576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8473ffffffffffffffffffffffffffffffffffffffff163b6000036116b8576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606482018490526084820183905260a060a4830152600060c48301819052919087169060e401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff242432a00000000000000000000000000000000000000000000000000000000179052516117879190611be4565b6000604051808303816000865af19150503d80600081146117c4576040519150601f19603f3d011682016040523d82523d6000602084013e6117c9565b606091505b50509050806105e5576040517f02f8f11e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008083601f84011261181657600080fd5b50813567ffffffffffffffff81111561182e57600080fd5b6020830191508360208260051b850101111561184957600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461187457600080fd5b919050565b6000806000806060858703121561188f57600080fd5b843567ffffffffffffffff8111156118a657600080fd5b6118b287828801611804565b90955093506118c5905060208601611850565b91506118d360408601611850565b905092959194509250565b6000602082840312156118f057600080fd5b6118f982611850565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061196a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561198357600080fd5b61198c83611850565b915061199a60208401611850565b90509250929050565b600080602083850312156119b657600080fd5b823567ffffffffffffffff8111156119cd57600080fd5b6119d985828601611804565b90969095509350505050565b600080600080600080600060a0888a031215611a0057600080fd5b611a0988611850565b9650611a1760208901611850565b9550611a2560408901611850565b9450606088013567ffffffffffffffff80821115611a4257600080fd5b611a4e8b838c01611804565b909650945060808a0135915080821115611a6757600080fd5b50611a748a828b01611804565b989b979a50959850939692959293505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611aea57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611b2957600080fd5b83018035915067ffffffffffffffff821115611b4457600080fd5b6020019150600581901b360382131561184957600080fd5b600060208284031215611b6e57600080fd5b8135600281106118f957600080fd5b73ffffffffffffffffffffffffffffffffffffffff848116825260406020808401829052908301849052600091859160608501845b87811015611bd75783611bc486611850565b1682529382019390820190600101611bb2565b5098975050505050505050565b6000825160005b81811015611c055760208186018101518583015201611beb565b506000920191825250919050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611c4557600080fd5b8260051b80836020870137939093016020019392505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525060a06040830152611c9860a083018688611c13565b8281036060840152611cab818587611c13565b838103608090940193909352505060008152602001969550505050505056fea2646970667358221220ec79abb2b33ff98b086f6cac43d1edee921c28a427ff821d73f982624ad0c3c764736f6c634300081100330000000000000000000000003ab105f0e4a22ec4a96a9b0ca90c5c534d21f3a7

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061011b5760003560e01c80637200b829116100b2578063a0a406c611610081578063ac8a584a11610066578063ac8a584a146102a2578063c0b6f561146102b5578063e8f9f1dc146102c857600080fd5b8063a0a406c61461027c578063a7bc96d31461028f57600080fd5b80637200b829146101ec57806375ccc132146101f45780637762df25146102175780638da5cb5b1461025c57600080fd5b80633cc4cb06116100ee5780633cc4cb061461018b5780633e567539146101c95780635b6ac011146101d15780636cf0859c146101d957600080fd5b80630ca8e8a8146101205780631ba9a4581461013557806323452b9c146101485780632bb5a9e614610150575b600080fd5b61013361012e366004611879565b6102db565b005b6101336101433660046118de565b6105ed565b6101336106db565b6001546101759074010000000000000000000000000000000000000000900460ff1681565b604051610182919061192f565b60405180910390f35b6101b9610199366004611970565b600260209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610182565b6101336107e2565b6101336108d8565b6101336101e73660046119a3565b6109b2565b610133610b2f565b6101b96102023660046118de565b60036020526000908152604090205460ff1681565b6001546102379073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610182565b6000546102379073ffffffffffffffffffffffffffffffffffffffff1681565b61013361028a3660046119e5565b610c6c565b61013361029d3660046119e5565b610dd9565b6101336102b03660046118de565b610ea7565b6101336102c33660046118de565b610f8a565b6101336102d63660046119a3565b61108c565b826000819003610317576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316331461033e5761033e8333611260565b60005b818110156105e55736600087878481811061035e5761035e611a87565b90506020028101906103709190611ab6565b61037e906040810190611af4565b9092509050803660008a8a8781811061039957610399611a87565b90506020028101906103ab9190611ab6565b6103b9906060810190611af4565b9150915082600014806103cc5750808314155b15610403576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008b8b8881811061041757610417611a87565b90506020028101906104299190611ab6565b61043a906040810190602001611b5c565b9050600081600181111561045057610450611900565b036105155760005b8481101561050f5783838281811061047257610472611a87565b905060200201356001146104b2576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105078d8d8a8181106104c7576104c7611a87565b90506020028101906104d99190611ab6565b6104e79060208101906118de565b8c8c8a8a868181106104fb576104fb611a87565b90506020020135611302565b600101610458565b506105d4565b600181600181111561052957610529611900565b036105d45760005b848110156105935783838281811061054b5761054b611a87565b9050602002013560000361058b576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101610531565b506105d48c8c898181106105a9576105a9611a87565b90506020028101906105bb9190611ab6565b6105c99060208101906118de565b8b8b89898888611491565b866001019650505050505050610341565b505050505050565b6105f5611614565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff1615610655576040517f730e0eb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527fdde65206cdee4ea27ef1b170724ba50b41ad09a3bf2dda12935fc40c4dbf6e7591015b60405180910390a150565b6106e3611614565b60015474010000000000000000000000000000000000000000900460ff16600081600281111561071557610715611900565b0361074c576040517fccf69db700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181600281111561076057610760611900565b0361078e57600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae390600090a150565b6107ea611614565b600260015474010000000000000000000000000000000000000000900460ff16600281111561081b5761081b611900565b14610852576040517f045c512200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040519081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc906020015b60405180910390a1565b6108e0611614565b600060015474010000000000000000000000000000000000000000900460ff16600281111561091157610911611900565b14610948576040517f74ed79ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740200000000000000000000000000000000000000001790556040517f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec90600090a1565b8060008190036109ee576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610aee576000848483818110610a0d57610a0d611a87565b9050602002016020810190610a2291906118de565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205490915060ff16610a8f576040517f21d29a8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556001016109f1565b507fcd827905c56d07b7e3668c6d264b27603a45324dd955aadca79cf47eb24ca5fa338484604051610b2293929190611b7d565b60405180910390a1505050565b6001805474010000000000000000000000000000000000000000900460ff166002811115610b5f57610b5f611900565b14610b96576040517f5e4f282600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015473ffffffffffffffffffffffffffffffffffffffff163314610be7576040517fafdcfb9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633908117909155600180547fffffffffffffffffffffff0000000000000000000000000000000000000000001690556040519081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc906020016108ce565b82801580610c7a5750818114155b15610cb1576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbb8733611260565b80600103610d5a5782826000818110610cd657610cd6611a87565b90506020020135600003610d16576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d5588888888886000818110610d2f57610d2f611a87565b9050602002013587876000818110610d4957610d49611a87565b90506020020135611667565b610dcf565b60005b81811015610dbf57838382818110610d7757610d77611a87565b90506020020135600003610db7576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101610d5d565b50610dcf88888888888888611491565b5050505050505050565b826000819003610e15576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1f8733611260565b60005b81811015610e9c57838382818110610e3c57610e3c611a87565b90506020020135600114610e7c576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e948989898989868181106104fb576104fb611a87565b600101610e22565b505050505050505050565b610eaf611614565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff16610f0e576040517f8a10919300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d91016106d0565b610f92611614565b600060015474010000000000000000000000000000000000000000900460ff166002811115610fc357610fc3611900565b14610ffa576040517f74ed79ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffff000000000000000000000000000000000000000000909116811774010000000000000000000000000000000000000000179091556040805133815260208101929092527fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef91016106d0565b8060008190036110c8576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561122c5760008484838181106110e7576110e7611a87565b90506020020160208101906110fc91906118de565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205490915060ff1661115e576040517f8a10919300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156111c9576040517fabb0fc9600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155016110cb565b507f2689e1a312b4212a2eb518d23bfd4c7cc30e3a7bc7a7e2524e8ec16e6a3713ab338484604051610b2293929190611b7d565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff1680156112c7575073ffffffffffffffffffffffffffffffffffffffff80831660009081526002602090815260408083209385168352929052205460ff165b156112d0575050565b6040517fb550954400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163b600003611353576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff848116602483015283811660448301526064820183905260009190861690608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790525161140d9190611be4565b6000604051808303816000865af19150503d806000811461144a576040519150601f19603f3d011682016040523d82523d6000602084013e61144f565b606091505b505090508061148a576040517fe0f5c50800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8673ffffffffffffffffffffffffffffffffffffffff163b6000036114e2576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008773ffffffffffffffffffffffffffffffffffffffff1687878787878760405160240161151696959493929190611c5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2eb2c2d600000000000000000000000000000000000000000000000000000000179052516115979190611be4565b6000604051808303816000865af19150503d80600081146115d4576040519150601f19603f3d011682016040523d82523d6000602084013e6115d9565b606091505b5050905080610dcf576040517f65da8e4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611665576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8473ffffffffffffffffffffffffffffffffffffffff163b6000036116b8576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606482018490526084820183905260a060a4830152600060c48301819052919087169060e401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff242432a00000000000000000000000000000000000000000000000000000000179052516117879190611be4565b6000604051808303816000865af19150503d80600081146117c4576040519150601f19603f3d011682016040523d82523d6000602084013e6117c9565b606091505b50509050806105e5576040517f02f8f11e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008083601f84011261181657600080fd5b50813567ffffffffffffffff81111561182e57600080fd5b6020830191508360208260051b850101111561184957600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461187457600080fd5b919050565b6000806000806060858703121561188f57600080fd5b843567ffffffffffffffff8111156118a657600080fd5b6118b287828801611804565b90955093506118c5905060208601611850565b91506118d360408601611850565b905092959194509250565b6000602082840312156118f057600080fd5b6118f982611850565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061196a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561198357600080fd5b61198c83611850565b915061199a60208401611850565b90509250929050565b600080602083850312156119b657600080fd5b823567ffffffffffffffff8111156119cd57600080fd5b6119d985828601611804565b90969095509350505050565b600080600080600080600060a0888a031215611a0057600080fd5b611a0988611850565b9650611a1760208901611850565b9550611a2560408901611850565b9450606088013567ffffffffffffffff80821115611a4257600080fd5b611a4e8b838c01611804565b909650945060808a0135915080821115611a6757600080fd5b50611a748a828b01611804565b989b979a50959850939692959293505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611aea57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611b2957600080fd5b83018035915067ffffffffffffffff821115611b4457600080fd5b6020019150600581901b360382131561184957600080fd5b600060208284031215611b6e57600080fd5b8135600281106118f957600080fd5b73ffffffffffffffffffffffffffffffffffffffff848116825260406020808401829052908301849052600091859160608501845b87811015611bd75783611bc486611850565b1682529382019390820190600101611bb2565b5098975050505050505050565b6000825160005b81811015611c055760208186018101518583015201611beb565b506000920191825250919050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611c4557600080fd5b8260051b80836020870137939093016020019392505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525060a06040830152611c9860a083018688611c13565b8281036060840152611cab818587611c13565b838103608090940193909352505060008152602001969550505050505056fea2646970667358221220ec79abb2b33ff98b086f6cac43d1edee921c28a427ff821d73f982624ad0c3c764736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000003ab105f0e4a22ec4a96a9b0ca90c5c534d21f3a7

-----Decoded View---------------
Arg [0] : _owner (address): 0x3ab105F0e4A22ec4A96a9b0Ca90c5C534d21f3a7

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003ab105f0e4a22ec4a96a9b0ca90c5c534d21f3a7


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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