ETH Price: $2,966.93 (-1.77%)
Gas: 2 Gwei

Contract

0x000000000060C4Ca14CfC4325359062ace33Fe3D
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
0x808d0cea90ac2eaca02e50eed7cfb49a90808512ba81044539f2e8d5c8606901 Grant Approvals(pending)2024-07-07 12:25:433 hrs ago1720355143IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0x6fc759c73acf80b0b0797e35c9602d5469cf6c1529a8dbd4a4215bdf23eaa927 Grant Approvals(pending)2024-07-07 10:17:525 hrs ago1720347472IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0xc6565ffba484348f8882b22c8e2686e6318c394c10db11ad210f8143fe9dc9b1 Grant Approvals(pending)2024-07-07 3:16:2712 hrs ago1720322187IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0x7d33a7d5e7d409899773c74ed256dc7411b380d9e8ed54e70512da9c36170c88 Grant Approvals(pending)2024-07-07 3:07:2812 hrs ago1720321648IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0xefc347cffec6cd2cc4f5918b5f360621a84a75299e2b22c1d2bbc980754a9a53 Grant Approvals(pending)2024-07-07 2:21:5113 hrs ago1720318911IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0x832b5a1ff34400b5f5fad4aa5f19a049952fe41050074fd633872955c0a70f1f Grant Approvals(pending)2024-07-07 2:05:2913 hrs ago1720317929IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0x1059f7e7866129efc38ce17f6baefb5f01cc6af73b4cb68fbf900e3cd348bd04 Grant Approvals(pending)2024-07-07 1:49:5513 hrs ago1720316995IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0x265666b91297907c570b53c9169af0eadc8cb1c2d8e68131a48a76ab6ae97b5c Grant Approvals(pending)2024-07-07 1:46:5013 hrs ago1720316810IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0xd7ed3ccf904a57ff63b7ac50c7d0412b4a79036dc9b2239426e8ce3faba2476d Grant Approvals(pending)2024-07-07 1:25:2614 hrs ago1720315526IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
0x0ca1c0c608fa3a77cb9b07a3642116696f523ef535da0e34f84f955e6c85ffc1 0xd85a75d1(pending)2024-06-30 0:56:587 days ago1719709018IN
LooksRare: Transfer Manager
0 ETH(Pending)(Pending)
Grant Approvals202554332024-07-07 15:08:5927 mins ago1720364939IN
LooksRare: Transfer Manager
0 ETH0.000162073.28077249
Grant Approvals202550382024-07-07 13:49:471 hr ago1720360187IN
LooksRare: Transfer Manager
0 ETH0.000116092.35
Grant Approvals202539432024-07-07 10:08:595 hrs ago1720346939IN
LooksRare: Transfer Manager
0 ETH0.000086041.74172801
Grant Approvals202535592024-07-07 8:52:116 hrs ago1720342331IN
LooksRare: Transfer Manager
0 ETH0.000131522.66234999
Grant Approvals202533082024-07-07 8:01:357 hrs ago1720339295IN
LooksRare: Transfer Manager
0 ETH0.000094731.91761744
Grant Approvals202525852024-07-07 5:36:2310 hrs ago1720330583IN
LooksRare: Transfer Manager
0 ETH0.000072531.46832492
Grant Approvals202522312024-07-07 4:24:5911 hrs ago1720326299IN
LooksRare: Transfer Manager
0 ETH0.000074161.50133307
Grant Approvals202521742024-07-07 4:13:2311 hrs ago1720325603IN
LooksRare: Transfer Manager
0 ETH0.000080881.637275
Grant Approvals202510992024-07-07 0:37:1114 hrs ago1720312631IN
LooksRare: Transfer Manager
0 ETH0.000055651.12649463
Grant Approvals202475542024-07-06 12:46:2326 hrs ago1720269983IN
LooksRare: Transfer Manager
0 ETH0.000121482.45902556
Grant Approvals202473112024-07-06 11:57:2327 hrs ago1720267043IN
LooksRare: Transfer Manager
0 ETH0.00012522.53431282
Grant Approvals202470902024-07-06 11:12:5928 hrs ago1720264379IN
LooksRare: Transfer Manager
0 ETH0.000093531.89336143
Grant Approvals202459552024-07-06 7:23:4732 hrs ago1720250627IN
LooksRare: Transfer Manager
0 ETH0.000117532.37912826
Grant Approvals202456012024-07-06 6:12:1133 hrs ago1720246331IN
LooksRare: Transfer Manager
0 ETH0.000105052.12644241
Grant Approvals202448042024-07-06 3:31:5936 hrs ago1720236719IN
LooksRare: Transfer Manager
0 ETH0.000098771.99943914
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
202543932024-07-07 11:39:473 hrs ago1720352387
0x00000000...ace33Fe3D
0 ETH
202543932024-07-07 11:39:473 hrs ago1720352387
0x00000000...ace33Fe3D
0 ETH
202531002024-07-07 7:19:238 hrs ago1720336763
0x00000000...ace33Fe3D
0 ETH
202531002024-07-07 7:19:238 hrs ago1720336763
0x00000000...ace33Fe3D
0 ETH
202493032024-07-06 18:36:3520 hrs ago1720290995
0x00000000...ace33Fe3D
0 ETH
202493032024-07-06 18:36:3520 hrs ago1720290995
0x00000000...ace33Fe3D
0 ETH
202487782024-07-06 16:51:2322 hrs ago1720284683
0x00000000...ace33Fe3D
0 ETH
202487782024-07-06 16:51:2322 hrs ago1720284683
0x00000000...ace33Fe3D
0 ETH
202487572024-07-06 16:47:1122 hrs ago1720284431
0x00000000...ace33Fe3D
0 ETH
202487572024-07-06 16:47:1122 hrs ago1720284431
0x00000000...ace33Fe3D
0 ETH
202485132024-07-06 15:58:2323 hrs ago1720281503
0x00000000...ace33Fe3D
0 ETH
202485132024-07-06 15:58:2323 hrs ago1720281503
0x00000000...ace33Fe3D
0 ETH
202485082024-07-06 15:57:2323 hrs ago1720281443
0x00000000...ace33Fe3D
0 ETH
202485082024-07-06 15:57:2323 hrs ago1720281443
0x00000000...ace33Fe3D
0 ETH
202480652024-07-06 14:28:3525 hrs ago1720276115
0x00000000...ace33Fe3D
0 ETH
202480652024-07-06 14:28:3525 hrs ago1720276115
0x00000000...ace33Fe3D
0 ETH
202474192024-07-06 12:19:2327 hrs ago1720268363
0x00000000...ace33Fe3D
0 ETH
202474192024-07-06 12:19:2327 hrs ago1720268363
0x00000000...ace33Fe3D
0 ETH
202465392024-07-06 9:21:3530 hrs ago1720257695
0x00000000...ace33Fe3D
0 ETH
202465392024-07-06 9:21:3530 hrs ago1720257695
0x00000000...ace33Fe3D
0 ETH
202460492024-07-06 7:42:3531 hrs ago1720251755
0x00000000...ace33Fe3D
0 ETH
202460492024-07-06 7:42:3531 hrs ago1720251755
0x00000000...ace33Fe3D
0 ETH
202446702024-07-06 3:05:1136 hrs ago1720235111
0x00000000...ace33Fe3D
0 ETH
202446702024-07-06 3:05:1136 hrs ago1720235111
0x00000000...ace33Fe3D
0 ETH
202446702024-07-06 3:05:1136 hrs ago1720235111
0x00000000...ace33Fe3D
0 ETH
View All Internal Transactions
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  ]

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.