Sepolia Testnet

Contract

0x8B43b6C4601FaCF70Fe17D057b3912Bde0206CFB
Source Code

Overview

ETH Balance

0 ETH

Token Holdings

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Value
Grant Approvals52787042024-02-13 9:02:3614 days 4 hrs ago1707814956IN
0x8B43b6...e0206CFB
0 ETH0.0031260863.1711833
Grant Approvals51826782024-01-30 8:06:3628 days 5 hrs ago1706601996IN
0x8B43b6...e0206CFB
0 ETH0.0019240477.39211777
Grant Approvals51787732024-01-29 18:42:1228 days 18 hrs ago1706553732IN
0x8B43b6...e0206CFB
0 ETH0.000216914.3832988
Allow Operator51771782024-01-29 13:01:3629 days 26 mins ago1706533296IN
0x8B43b6...e0206CFB
0 ETH0.0015449532.70920849
Grant Approvals51167592024-01-19 22:11:0038 days 15 hrs ago1705702260IN
0x8B43b6...e0206CFB
0 ETH0.0027639355.85280872
Grant Approvals51089732024-01-18 15:55:0039 days 21 hrs ago1705593300IN
0x8B43b6...e0206CFB
0 ETH0.0033432967.56043533
Grant Approvals51089732024-01-18 15:55:0039 days 21 hrs ago1705593300IN
0x8B43b6...e0206CFB
0 ETH0.0033432967.56043533
Grant Approvals51089622024-01-18 15:51:4839 days 21 hrs ago1705593108IN
0x8B43b6...e0206CFB
0 ETH0.0031809964.2807
Grant Approvals51089372024-01-18 15:46:1239 days 21 hrs ago1705592772IN
0x8B43b6...e0206CFB
0 ETH0.0028496157.58417394
Grant Approvals51089342024-01-18 15:45:1239 days 21 hrs ago1705592712IN
0x8B43b6...e0206CFB
0 ETH0.0029934360.49063039
Grant Approvals51089292024-01-18 15:44:0039 days 21 hrs ago1705592640IN
0x8B43b6...e0206CFB
0 ETH0.0029683159.98301424
Grant Approvals51089262024-01-18 15:43:2439 days 21 hrs ago1705592604IN
0x8B43b6...e0206CFB
0 ETH0.0032637765.95340638
Grant Approvals51089252024-01-18 15:43:1239 days 21 hrs ago1705592592IN
0x8B43b6...e0206CFB
0 ETH0.0030520961.67583615
Grant Approvals51089212024-01-18 15:42:1239 days 21 hrs ago1705592532IN
0x8B43b6...e0206CFB
0 ETH0.0034485569.68743539
Grant Approvals51089182024-01-18 15:41:2439 days 21 hrs ago1705592484IN
0x8B43b6...e0206CFB
0 ETH0.0032056564.77912632
Grant Approvals51089172024-01-18 15:41:1239 days 21 hrs ago1705592472IN
0x8B43b6...e0206CFB
0 ETH0.0032471265.61702361
Grant Approvals51089152024-01-18 15:40:4839 days 21 hrs ago1705592448IN
0x8B43b6...e0206CFB
0 ETH0.0034239769.19070076
Grant Approvals51088522024-01-18 15:25:4839 days 22 hrs ago1705591548IN
0x8B43b6...e0206CFB
0 ETH0.0029774160.16688061
Grant Approvals51087742024-01-18 15:08:2439 days 22 hrs ago1705590504IN
0x8B43b6...e0206CFB
0 ETH0.004306887.03081115
Grant Approvals51087662024-01-18 15:06:4839 days 22 hrs ago1705590408IN
0x8B43b6...e0206CFB
0 ETH0.0049494100.01634231
Grant Approvals51087602024-01-18 15:05:2439 days 22 hrs ago1705590324IN
0x8B43b6...e0206CFB
0 ETH0.00527429106.58162666
Grant Approvals51087532024-01-18 15:04:0039 days 22 hrs ago1705590240IN
0x8B43b6...e0206CFB
0 ETH0.00585758118.36852486
Grant Approvals51087422024-01-18 15:01:3639 days 22 hrs ago1705590096IN
0x8B43b6...e0206CFB
0 ETH0.00699155141.28354051
Grant Approvals51087382024-01-18 15:00:4839 days 22 hrs ago1705590048IN
0x8B43b6...e0206CFB
0 ETH0.00744205150.38713171
Grant Approvals51087362024-01-18 15:00:2439 days 22 hrs ago1705590024IN
0x8B43b6...e0206CFB
0 ETH0.00809704163.62293937
View all transactions

Advanced mode:
Parent Txn Hash Block From To Value
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TransferManager

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 888888 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 14 : TransferManager.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

// LooksRare unopinionated libraries
import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol";
import {LowLevelERC20Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Transfer.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";

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

/**
 * @title TransferManager
 * @notice This contract provides the transfer functions for ERC20/ERC721/ERC1155 for contracts that require them.
 *         Token type "0" refers to ERC20 transfer functions.
 *         Token type "1" refers to ERC721 transfer functions.
 *         Token type "2" 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,
    LowLevelERC20Transfer,
    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.
     */
    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) {}

    /**
     * @inheritdoc ITransferManager
     */
    function transferERC20(
        address tokenAddress,
        address from,
        address to,
        uint256 amount
    ) external {
        _isOperatorValidForTransfer(from, msg.sender);

        if (amount == 0) {
            revert AmountInvalid();
        }

        _executeERC20TransferFrom(tokenAddress, from, to, amount);
    }

    /**
     * @inheritdoc ITransferManager
     */
    function transferItemERC721(
        address tokenAddress,
        address from,
        address to,
        uint256 itemId
    ) external {
        _isOperatorValidForTransfer(from, msg.sender);
        _executeERC721TransferFrom(tokenAddress, from, to, itemId);
    }

    /**
     * @inheritdoc ITransferManager
     */
    function transferItemsERC721(
        address tokenAddress,
        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);

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

    /**
     * @inheritdoc ITransferManager
     */
    function transferItemERC1155(
        address tokenAddress,
        address from,
        address to,
        uint256 itemId,
        uint256 amount
    ) external {
        _isOperatorValidForTransfer(from, msg.sender);
        if (amount == 0) {
            revert AmountInvalid();
        }
        _executeERC1155SafeTransferFrom(tokenAddress, from, to, itemId, amount);
    }

    /**
     * @inheritdoc ITransferManager
     */
    function transferItemsERC1155(
        address tokenAddress,
        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(tokenAddress, from, to, itemIds[0], amounts[0]);
        } else {
            for (uint256 i; i < length; ) {
                if (amounts[i] == 0) {
                    revert AmountInvalid();
                }

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

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

            TokenType tokenType = items[i].tokenType;

            if (tokenType == TokenType.ERC20) {
                if (itemIdsLengthForSingleCollection != 0 || amounts.length != 1) {
                    revert LengthsInvalid();
                }
            } else {
                if (itemIdsLengthForSingleCollection == 0 || amounts.length != itemIdsLengthForSingleCollection) {
                    revert LengthsInvalid();
                }
            }

            if (tokenType == TokenType.ERC20) {
                uint256 amount = amounts[0];
                if (amount == 0) {
                    revert AmountInvalid();
                }
                _executeERC20TransferFrom(items[i].tokenAddress, from, to, amount);
            } else if (tokenType == TokenType.ERC721) {
                for (uint256 j; j < itemIdsLengthForSingleCollection; ) {
                    if (amounts[j] != 1) {
                        revert AmountInvalid();
                    }
                    _executeERC721TransferFrom(items[i].tokenAddress, from, to, itemIds[j]);
                    unchecked {
                        ++j;
                    }
                }
            } else if (tokenType == TokenType.ERC1155) {
                for (uint256 j; j < itemIdsLengthForSingleCollection; ) {
                    if (amounts[j] == 0) {
                        revert AmountInvalid();
                    }

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

            unchecked {
                ++i;
            }
        }
    }

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

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

    /**
     * @inheritdoc ITransferManager
     */
    function allowOperator(address operator) external onlyOwner {
        if (isOperatorAllowed[operator]) {
            revert OperatorAlreadyAllowed();
        }

        isOperatorAllowed[operator] = true;

        emit OperatorAllowed(operator);
    }

    /**
     * @inheritdoc ITransferManager
     */
    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 : 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 3 of 14 : LowLevelERC20Transfer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

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

// Errors
import {ERC20TransferFail, ERC20TransferFromFail} from "../errors/LowLevelErrors.sol";
import {NotAContract} from "../errors/GenericErrors.sol";

/**
 * @title LowLevelERC20Transfer
 * @notice This contract contains low-level calls to transfer ERC20 tokens.
 * @author LooksRare protocol team (👀,💎)
 */
contract LowLevelERC20Transfer {
    /**
     * @notice Execute ERC20 transferFrom
     * @param currency Currency address
     * @param from Sender address
     * @param to Recipient address
     * @param amount Amount to transfer
     */
    function _executeERC20TransferFrom(address currency, address from, address to, uint256 amount) internal {
        if (currency.code.length == 0) {
            revert NotAContract();
        }

        (bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.transferFrom, (from, to, amount)));

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

        if (data.length > 0) {
            if (!abi.decode(data, (bool))) {
                revert ERC20TransferFromFail();
            }
        }
    }

    /**
     * @notice Execute ERC20 (direct) transfer
     * @param currency Currency address
     * @param to Recipient address
     * @param amount Amount to transfer
     */
    function _executeERC20DirectTransfer(address currency, address to, uint256 amount) internal {
        if (currency.code.length == 0) {
            revert NotAContract();
        }

        (bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.transfer, (to, amount)));

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

        if (data.length > 0) {
            if (!abi.decode(data, (bool))) {
                revert ERC20TransferFail();
            }
        }
    }
}

File 4 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();
        }
    }
}

File 5 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 6 of 14 : ITransferManager.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

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

/**
 * @title ITransferManager
 * @author LooksRare protocol team (👀,💎)
 */
interface ITransferManager {
    /**
     * @notice This struct is only used for transferBatchItemsAcrossCollections.
     * @param tokenAddress Token address
     * @param tokenType 0 for ERC721, 1 for ERC1155
     * @param itemIds Array of item ids to transfer
     * @param amounts Array of amounts to transfer
     */
    struct BatchTransferItem {
        address tokenAddress;
        TokenType tokenType;
        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();

    /**
     * @notice This function transfers ERC20 tokens.
     * @param tokenAddress Token address
     * @param from Sender address
     * @param to Recipient address
     * @param amount amount
     */
    function transferERC20(
        address tokenAddress,
        address from,
        address to,
        uint256 amount
    ) external;

    /**
     * @notice This function transfers a single item for a single ERC721 collection.
     * @param tokenAddress Token address
     * @param from Sender address
     * @param to Recipient address
     * @param itemId Item ID
     */
    function transferItemERC721(
        address tokenAddress,
        address from,
        address to,
        uint256 itemId
    ) external;

    /**
     * @notice This function transfers items for a single ERC721 collection.
     * @param tokenAddress Token address
     * @param from Sender address
     * @param to Recipient address
     * @param itemIds Array of itemIds
     * @param amounts Array of amounts
     */
    function transferItemsERC721(
        address tokenAddress,
        address from,
        address to,
        uint256[] calldata itemIds,
        uint256[] calldata amounts
    ) external;

    /**
     * @notice This function transfers a single item for a single ERC1155 collection.
     * @param tokenAddress Token address
     * @param from Sender address
     * @param to Recipient address
     * @param itemId Item ID
     * @param amount Amount
     */
    function transferItemERC1155(
        address tokenAddress,
        address from,
        address to,
        uint256 itemId,
        uint256 amount
    ) external;

    /**
     * @notice This function transfers items for a single ERC1155 collection.
     * @param tokenAddress Token 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 tokenAddress,
        address from,
        address to,
        uint256[] calldata itemIds,
        uint256[] calldata amounts
    ) external;

    /**
     * @notice This function transfers items across an array of tokens that can be ERC20, 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;

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

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

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

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

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

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

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

File 8 of 14 : TokenType.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

enum TokenType {
    ERC20,
    ERC721,
    ERC1155
}

File 9 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 10 of 14 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);

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

    function transfer(address to, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

File 11 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 12 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 13 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 14 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;
}

Settings
{
  "remappings": [
    "@ensdomains/=node_modules/@ensdomains/",
    "@looksrare/=node_modules/@looksrare/",
    "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/",
    "solmate/=node_modules/solmate/",
    "lib/forge-std:ds-test/=lib/forge-std/lib/ds-test/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 888888
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "viaIR": true,
  "libraries": {}
}

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":"ERC20TransferFromFail","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":"tokenAddress","type":"address"},{"internalType":"enum TokenType","name":"tokenType","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":"tokenAddress","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferItemERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"transferItemERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","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":"tokenAddress","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"}]

60803461009e57601f611d7c38819003918201601f19168301916001600160401b038311848410176100a35780849260209460405283398101031261009e57516001600160a01b0381169081900361009e57600080546001600160a01b031916821790556040519081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc90602090a1604051611cc290816100ba8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060409080825260048036101561001657600080fd5b600091823560e01c9081630ca8e8a814611007575080631ba9a45814610f1457806323452b9c14610e0c5780632bb5a9e614610dc15780633cc4cb0614610d485780633e56753914610c545780635b6ac01114610b785780636cf0859c14610a135780637200b829146108e157806375ccc1321461087a5780637762df25146108275780638da5cb5b146107d6578063a0a406c61461066a578063a7bc96d3146105a4578063ac8a584a146104b3578063c0b6f561146103a8578063cda20f0b14610380578063da3e8ce414610350578063e62edc35146102b75763e8f9f1dc1461010057600080fd5b346102b357602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57803567ffffffffffffffff81116102ab5761014f903690830161136b565b929091831561028457845b84811061019b575050506101957f2689e1a312b4212a2eb518d23bfd4c7cc30e3a7bc7a7e2524e8ec16e6a3713ab9394519283923384611649565b0390a180f35b73ffffffffffffffffffffffffffffffffffffffff6101c36101be838888611555565b611628565b168087526003845260ff8089892054161561025c57338852600290818652898920838a5286528989205416610234573388528452878720908752835286862090600191827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790550161015a565b8389517fabb0fc96000000000000000000000000000000000000000000000000000000008152fd5b8389517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b85517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8380fd5b8280fd5b5080fd5b5091346102b35760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b3576102f06113e7565b6102f86113a1565b6103006113c4565b906084359361030f33836116b5565b841561032857506103259495506064359261185a565b80f35b8690517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b5091346102b357610360366114e9565b9361036e93919333846116b5565b84156103285750610325949550611acc565b82346103a557610325610392366114e9565b926103a092919233836116b5565b611bd6565b80fd5b508290346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af576103e26113e7565b6103ea611741565b6001549160ff8360a01c166103fe8161140a565b61048c5750740100000000000000000000000000000000000000007fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef939273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffff00000000000000000000000000000000000000000093169283911617176001558151903382526020820152a180f35b83517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff6105016113e7565b610509611741565b1691828452600360205260ff82852054161561057d5750816020917f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d938552600383528085207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905551908152a180f35b90517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b508290346102af576105b536611443565b9690959492919788158015610660575b61063a576105d333856116b5565b895b8981106105e0578a80f35b600190816105ef828c8c611555565b35036106125761060c610603828d88611555565b3588888b611bd6565b016105d5565b5050517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50888814156105c5565b5091346102b35761067a36611443565b8295949515928380156107cc575b6107a45761069633876116b5565b6001908082036107415750501561071557359586156106ed57506106c157610325959650359261185a565b6024866032897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8890517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248860328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b969495935099899891989792975b878110610764575050506103259798506119c5565b61076f818b8b611555565b351561077c578b0161074f565b5090517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8a89517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b5080821415610688565b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760209073ffffffffffffffffffffffffffffffffffffffff600154169051908152f35b8284346102b35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff8160209373ffffffffffffffffffffffffffffffffffffffff6108ce6113e7565b1681526003855220541690519015158152f35b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5760015490600160ff8360a01c166109288161140a565b036109ec5773ffffffffffffffffffffffffffffffffffffffff821633036109c557507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff000000000000000000000000000000000000000000602092337fffffffffffffffffffffffff00000000000000000000000000000000000000008754161786551660015551338152a180f35b82517fafdcfb92000000000000000000000000000000000000000000000000000000008152fd5b82517f5e4f2826000000000000000000000000000000000000000000000000000000008152fd5b50346102b3576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57813567ffffffffffffffff81116102ab57610a62903690840161136b565b9290918315610b5057845b848110610aa8575050506101957fcd827905c56d07b7e3668c6d264b27603a45324dd955aadca79cf47eb24ca5fa9394519283923384611649565b610ab66101be828787611555565b338752600280845273ffffffffffffffffffffffffffffffffffffffff898920921691828952845260ff898920541615610b28573388528352878720908752825286862080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610a6d565b8489517f21d29a86000000000000000000000000000000000000000000000000000000008152fd5b5084517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610bb1611741565b6001549160ff8360a01c16610bc58161140a565b610c2e5783740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8516176001557f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec8180a180f35b517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610c8d611741565b60015490600260ff8360a01c16610ca38161140a565b03610d2157507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff6020927fffffffffffffffffffffffff000000000000000000000000000000000000000086541686551660015551838152a180f35b82517f045c5122000000000000000000000000000000000000000000000000000000008152fd5b8284346102b357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff81602093610d866113e7565b610d8e6113a1565b73ffffffffffffffffffffffffffffffffffffffff91821683526002875283832091168252855220549151911615158152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b357600154905160209160a01c60ff16610e088161140a565b8152f35b5082346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610e44611741565b6001549160ff8360a01c1691610e598361140a565b8215610eee57505080610e6d60019261140a565b14610ec3575b507fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600154166001557f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae38180a180f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001660015581610e73565b517fccf69db7000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff610f626113e7565b610f6a611741565b1691828452600360205260ff8285205416610fe05750816020917fdde65206cdee4ea27ef1b170724ba50b41ad09a3bf2dda12935fc40c4dbf6e759385526003835280852060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905551908152a180f35b90517f730e0eb0000000000000000000000000000000000000000000000000000000008152fd5b84929150346102ab57606091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261136757803567ffffffffffffffff81116113635761105a903690830161136b565b906110636113a1565b9261106c6113c4565b94831561133e57503373ffffffffffffffffffffffffffffffffffffffff85160361132f575b875b83811061109f578880f35b6110b66110ad828686611594565b898101906115d4565b6110cd6110c4848888611594565b8a8101906115d4565b91909260206110dd868a8a611594565b013591600383101561132b576110f28361140a565b821580156112eb5781158015906112e0575b6112b8575b6111128461140a565b1561119c5750505015611170573580156111485790611142600192888861113d6101be868b8b611594565b611acc565b01611094565b8289517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248a6032857f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b909193926111a98561140a565b60019480860361123557508d5b8281106111cb57505050505050600190611142565b856111d7828488611555565b350361120d5785906112078c8e6111f46101be8f8f908e91611594565b9161120085898b611555565b3592611bd6565b016111b6565b878e517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8061124760029297939795949561140a565b1461125a575b5050505050600190611142565b89898f8d938b915b878110611294575050916112856101be8a60019b9a98969461128a9a9896611594565b6119c5565b908a80808061124d565b9350935050506112a5818787611555565b351561120d57810189898d938d93611262565b878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b506001851415611104565b81158015611321575b1561110957878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50818514156112f4565b8d80fd5b61133933856116b5565b611092565b7f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8580fd5b8480fd5b9181601f8401121561139c5782359167ffffffffffffffff831161139c576020808501948460051b01011161139c57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6003111561141457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261139c5773ffffffffffffffffffffffffffffffffffffffff90600435828116810361139c5792602435838116810361139c5792604435908116810361139c579167ffffffffffffffff9160643583811161139c57826114cb9160040161136b565b9390939260843591821161139c576114e59160040161136b565b9091565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc608091011261139c5773ffffffffffffffffffffffffffffffffffffffff600435818116810361139c5791602435828116810361139c5791604435908116810361139c579060643590565b91908110156115655760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156115655760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818136030182121561139c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561139c570180359067ffffffffffffffff821161139c57602001918160051b3603831361139c57565b3573ffffffffffffffffffffffffffffffffffffffff8116810361139c5790565b73ffffffffffffffffffffffffffffffffffffffff91821681526040602080830182905290820185905260609091019391600090815b84831061168f5750505050505090565b90919293949586358381168091036102af5781528401958401949392600101919061167f565b9073ffffffffffffffffffffffffffffffffffffffff809116600090808252600360205260ff604083205416928361171d575b505050905061171b5760046040517fb5509544000000000000000000000000000000000000000000000000000000008152fd5b565b6040935060ff941682526002602052828220908252602052205416803880806116e8565b73ffffffffffffffffffffffffffffffffffffffff60005416330361176257565b60046040517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176117cd57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3d15611855573d9067ffffffffffffffff82116117cd576040519161184960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461178c565b82523d6000602084013e565b606090565b92939093833b1561195e576040519460208601937ff242432a00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff80921660248801521660448601526064850152608484015260a060a48401526000928360c482015260c48152610100810181811067ffffffffffffffff8211176119315784939291849160405251925af16118ff6117fc565b501561190757565b60046040517f02f8f11e000000000000000000000000000000000000000000000000000000008152fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60046040517f09ee12d5000000000000000000000000000000000000000000000000000000008152fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161139c5760209260051b809284830137010190565b93919095843b1561195e5760206000979688611a78611a8e94611a467f2eb2c2d60000000000000000000000000000000000000000000000000000000099849c99859a6040519a898c019d8e5273ffffffffffffffffffffffffffffffffffffffff80921660248d01521660448b015260a060648b015260c48a0191611988565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc94858984030160848a0152611988565b85810392830160a487015252808452018261178c565b51925af1611a9a6117fc565b5015611aa257565b60046040517f65da8e40000000000000000000000000000000000000000000000000000000008152fd5b929091833b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff94851660248301529390911660448201526064810191909152611b6481608481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261178c565b600092839283809351925af1611b786117fc565b9015611bac57805180611b8a57505050565b81602091810103126102b35760200151908115918215036103a55750611bac57565b60046040517fe5605213000000000000000000000000000000000000000000000000000000008152fd5b90929192813b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff9283166024830152949091166044820152606481019290925260009283928390611c4e8160848101611b38565b51925af1611c5a6117fc565b5015611c6257565b60046040517fe0f5c508000000000000000000000000000000000000000000000000000000008152fdfea2646970667358221220758704aba68119978fd10ec5d1e3f4596fd5903a757242dbe6c2e0169ce4686a64736f6c63430008140033000000000000000000000000f332533bf5d0ac462dc8511067a8122b4dce2b57

Deployed Bytecode

0x608060409080825260048036101561001657600080fd5b600091823560e01c9081630ca8e8a814611007575080631ba9a45814610f1457806323452b9c14610e0c5780632bb5a9e614610dc15780633cc4cb0614610d485780633e56753914610c545780635b6ac01114610b785780636cf0859c14610a135780637200b829146108e157806375ccc1321461087a5780637762df25146108275780638da5cb5b146107d6578063a0a406c61461066a578063a7bc96d3146105a4578063ac8a584a146104b3578063c0b6f561146103a8578063cda20f0b14610380578063da3e8ce414610350578063e62edc35146102b75763e8f9f1dc1461010057600080fd5b346102b357602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57803567ffffffffffffffff81116102ab5761014f903690830161136b565b929091831561028457845b84811061019b575050506101957f2689e1a312b4212a2eb518d23bfd4c7cc30e3a7bc7a7e2524e8ec16e6a3713ab9394519283923384611649565b0390a180f35b73ffffffffffffffffffffffffffffffffffffffff6101c36101be838888611555565b611628565b168087526003845260ff8089892054161561025c57338852600290818652898920838a5286528989205416610234573388528452878720908752835286862090600191827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790550161015a565b8389517fabb0fc96000000000000000000000000000000000000000000000000000000008152fd5b8389517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b85517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8380fd5b8280fd5b5080fd5b5091346102b35760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b3576102f06113e7565b6102f86113a1565b6103006113c4565b906084359361030f33836116b5565b841561032857506103259495506064359261185a565b80f35b8690517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b5091346102b357610360366114e9565b9361036e93919333846116b5565b84156103285750610325949550611acc565b82346103a557610325610392366114e9565b926103a092919233836116b5565b611bd6565b80fd5b508290346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af576103e26113e7565b6103ea611741565b6001549160ff8360a01c166103fe8161140a565b61048c5750740100000000000000000000000000000000000000007fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef939273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffff00000000000000000000000000000000000000000093169283911617176001558151903382526020820152a180f35b83517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff6105016113e7565b610509611741565b1691828452600360205260ff82852054161561057d5750816020917f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d938552600383528085207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905551908152a180f35b90517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b508290346102af576105b536611443565b9690959492919788158015610660575b61063a576105d333856116b5565b895b8981106105e0578a80f35b600190816105ef828c8c611555565b35036106125761060c610603828d88611555565b3588888b611bd6565b016105d5565b5050517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50888814156105c5565b5091346102b35761067a36611443565b8295949515928380156107cc575b6107a45761069633876116b5565b6001908082036107415750501561071557359586156106ed57506106c157610325959650359261185a565b6024866032897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8890517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248860328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b969495935099899891989792975b878110610764575050506103259798506119c5565b61076f818b8b611555565b351561077c578b0161074f565b5090517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8a89517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b5080821415610688565b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760209073ffffffffffffffffffffffffffffffffffffffff600154169051908152f35b8284346102b35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff8160209373ffffffffffffffffffffffffffffffffffffffff6108ce6113e7565b1681526003855220541690519015158152f35b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5760015490600160ff8360a01c166109288161140a565b036109ec5773ffffffffffffffffffffffffffffffffffffffff821633036109c557507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff000000000000000000000000000000000000000000602092337fffffffffffffffffffffffff00000000000000000000000000000000000000008754161786551660015551338152a180f35b82517fafdcfb92000000000000000000000000000000000000000000000000000000008152fd5b82517f5e4f2826000000000000000000000000000000000000000000000000000000008152fd5b50346102b3576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57813567ffffffffffffffff81116102ab57610a62903690840161136b565b9290918315610b5057845b848110610aa8575050506101957fcd827905c56d07b7e3668c6d264b27603a45324dd955aadca79cf47eb24ca5fa9394519283923384611649565b610ab66101be828787611555565b338752600280845273ffffffffffffffffffffffffffffffffffffffff898920921691828952845260ff898920541615610b28573388528352878720908752825286862080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610a6d565b8489517f21d29a86000000000000000000000000000000000000000000000000000000008152fd5b5084517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610bb1611741565b6001549160ff8360a01c16610bc58161140a565b610c2e5783740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8516176001557f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec8180a180f35b517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610c8d611741565b60015490600260ff8360a01c16610ca38161140a565b03610d2157507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff6020927fffffffffffffffffffffffff000000000000000000000000000000000000000086541686551660015551838152a180f35b82517f045c5122000000000000000000000000000000000000000000000000000000008152fd5b8284346102b357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff81602093610d866113e7565b610d8e6113a1565b73ffffffffffffffffffffffffffffffffffffffff91821683526002875283832091168252855220549151911615158152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b357600154905160209160a01c60ff16610e088161140a565b8152f35b5082346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610e44611741565b6001549160ff8360a01c1691610e598361140a565b8215610eee57505080610e6d60019261140a565b14610ec3575b507fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600154166001557f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae38180a180f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001660015581610e73565b517fccf69db7000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff610f626113e7565b610f6a611741565b1691828452600360205260ff8285205416610fe05750816020917fdde65206cdee4ea27ef1b170724ba50b41ad09a3bf2dda12935fc40c4dbf6e759385526003835280852060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905551908152a180f35b90517f730e0eb0000000000000000000000000000000000000000000000000000000008152fd5b84929150346102ab57606091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261136757803567ffffffffffffffff81116113635761105a903690830161136b565b906110636113a1565b9261106c6113c4565b94831561133e57503373ffffffffffffffffffffffffffffffffffffffff85160361132f575b875b83811061109f578880f35b6110b66110ad828686611594565b898101906115d4565b6110cd6110c4848888611594565b8a8101906115d4565b91909260206110dd868a8a611594565b013591600383101561132b576110f28361140a565b821580156112eb5781158015906112e0575b6112b8575b6111128461140a565b1561119c5750505015611170573580156111485790611142600192888861113d6101be868b8b611594565b611acc565b01611094565b8289517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248a6032857f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b909193926111a98561140a565b60019480860361123557508d5b8281106111cb57505050505050600190611142565b856111d7828488611555565b350361120d5785906112078c8e6111f46101be8f8f908e91611594565b9161120085898b611555565b3592611bd6565b016111b6565b878e517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8061124760029297939795949561140a565b1461125a575b5050505050600190611142565b89898f8d938b915b878110611294575050916112856101be8a60019b9a98969461128a9a9896611594565b6119c5565b908a80808061124d565b9350935050506112a5818787611555565b351561120d57810189898d938d93611262565b878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b506001851415611104565b81158015611321575b1561110957878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50818514156112f4565b8d80fd5b61133933856116b5565b611092565b7f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8580fd5b8480fd5b9181601f8401121561139c5782359167ffffffffffffffff831161139c576020808501948460051b01011161139c57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6003111561141457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261139c5773ffffffffffffffffffffffffffffffffffffffff90600435828116810361139c5792602435838116810361139c5792604435908116810361139c579167ffffffffffffffff9160643583811161139c57826114cb9160040161136b565b9390939260843591821161139c576114e59160040161136b565b9091565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc608091011261139c5773ffffffffffffffffffffffffffffffffffffffff600435818116810361139c5791602435828116810361139c5791604435908116810361139c579060643590565b91908110156115655760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156115655760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818136030182121561139c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561139c570180359067ffffffffffffffff821161139c57602001918160051b3603831361139c57565b3573ffffffffffffffffffffffffffffffffffffffff8116810361139c5790565b73ffffffffffffffffffffffffffffffffffffffff91821681526040602080830182905290820185905260609091019391600090815b84831061168f5750505050505090565b90919293949586358381168091036102af5781528401958401949392600101919061167f565b9073ffffffffffffffffffffffffffffffffffffffff809116600090808252600360205260ff604083205416928361171d575b505050905061171b5760046040517fb5509544000000000000000000000000000000000000000000000000000000008152fd5b565b6040935060ff941682526002602052828220908252602052205416803880806116e8565b73ffffffffffffffffffffffffffffffffffffffff60005416330361176257565b60046040517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176117cd57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3d15611855573d9067ffffffffffffffff82116117cd576040519161184960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461178c565b82523d6000602084013e565b606090565b92939093833b1561195e576040519460208601937ff242432a00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff80921660248801521660448601526064850152608484015260a060a48401526000928360c482015260c48152610100810181811067ffffffffffffffff8211176119315784939291849160405251925af16118ff6117fc565b501561190757565b60046040517f02f8f11e000000000000000000000000000000000000000000000000000000008152fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60046040517f09ee12d5000000000000000000000000000000000000000000000000000000008152fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161139c5760209260051b809284830137010190565b93919095843b1561195e5760206000979688611a78611a8e94611a467f2eb2c2d60000000000000000000000000000000000000000000000000000000099849c99859a6040519a898c019d8e5273ffffffffffffffffffffffffffffffffffffffff80921660248d01521660448b015260a060648b015260c48a0191611988565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc94858984030160848a0152611988565b85810392830160a487015252808452018261178c565b51925af1611a9a6117fc565b5015611aa257565b60046040517f65da8e40000000000000000000000000000000000000000000000000000000008152fd5b929091833b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff94851660248301529390911660448201526064810191909152611b6481608481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261178c565b600092839283809351925af1611b786117fc565b9015611bac57805180611b8a57505050565b81602091810103126102b35760200151908115918215036103a55750611bac57565b60046040517fe5605213000000000000000000000000000000000000000000000000000000008152fd5b90929192813b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff9283166024830152949091166044820152606481019290925260009283928390611c4e8160848101611b38565b51925af1611c5a6117fc565b5015611c6257565b60046040517fe0f5c508000000000000000000000000000000000000000000000000000000008152fdfea2646970667358221220758704aba68119978fd10ec5d1e3f4596fd5903a757242dbe6c2e0169ce4686a64736f6c63430008140033

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

000000000000000000000000f332533bf5d0ac462dc8511067a8122b4dce2b57

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

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f332533bf5d0ac462dc8511067a8122b4dce2b57


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

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