ETH Price: $2,863.82 (-2.95%)

Contract

0x00000000007FE8d7666BB0da2A5D13f72b8dABaB
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Grant Approvals302017702026-01-24 0:09:152 days ago1769213355IN
0x00000000...72b8dABaB
0 ETH0.000000220.00000025
Grant Approvals300464022026-01-20 9:50:195 days ago1768902619IN
0x00000000...72b8dABaB
0 ETH0.000000290.00000025
Grant Approvals298300092026-01-15 9:37:1310 days ago1768469833IN
0x00000000...72b8dABaB
0 ETH0.000004710.00000025
Grant Approvals296640892026-01-11 13:26:3314 days ago1768137993IN
0x00000000...72b8dABaB
0 ETH0.000001160.0026
Grant Approvals296491912026-01-11 5:09:5714 days ago1768108197IN
0x00000000...72b8dABaB
0 ETH0.00000070.00000025
Grant Approvals293682632026-01-04 17:05:4121 days ago1767546341IN
0x00000000...72b8dABaB
0 ETH0.000000240.00000025
Grant Approvals293261542026-01-03 17:42:0322 days ago1767462123IN
0x00000000...72b8dABaB
0 ETH0.000000140.00000025
Grant Approvals289898412025-12-26 22:51:3730 days ago1766789497IN
0x00000000...72b8dABaB
0 ETH0.000000040.00000027
Grant Approvals287755972025-12-21 23:50:0935 days ago1766361009IN
0x00000000...72b8dABaB
0 ETH0.000000040.00000028
Grant Approvals283623762025-12-12 10:16:0744 days ago1765534567IN
0x00000000...72b8dABaB
0 ETH0.00000040.0012103
Grant Approvals282696562025-12-10 6:45:2746 days ago1765349127IN
0x00000000...72b8dABaB
0 ETH0.00005710.00150037
Grant Approvals277527302025-11-28 7:34:3558 days ago1764315275IN
0x00000000...72b8dABaB
0 ETH0.000000040.00100123
Grant Approvals277030872025-11-27 3:59:4959 days ago1764215989IN
0x00000000...72b8dABaB
0 ETH0.000000040.00100345
Grant Approvals276608762025-11-26 4:32:4760 days ago1764131567IN
0x00000000...72b8dABaB
0 ETH00.00000121
Grant Approvals275647592025-11-23 23:08:5363 days ago1763939333IN
0x00000000...72b8dABaB
0 ETH00.00000109
Grant Approvals273953102025-11-20 1:00:3567 days ago1763600435IN
0x00000000...72b8dABaB
0 ETH0.000000010.0002043
Grant Approvals273840512025-11-19 18:45:1767 days ago1763577917IN
0x00000000...72b8dABaB
0 ETH0.000000050.00102104
Grant Approvals273237632025-11-18 9:15:4168 days ago1763457341IN
0x00000000...72b8dABaB
0 ETH0.000000030.00060048
Grant Approvals273195782025-11-18 6:56:1168 days ago1763448971IN
0x00000000...72b8dABaB
0 ETH0.000000020.00000045
Grant Approvals272750102025-11-17 6:10:3569 days ago1763359835IN
0x00000000...72b8dABaB
0 ETH0.000000010.00020071
Grant Approvals272655112025-11-17 0:53:5770 days ago1763340837IN
0x00000000...72b8dABaB
0 ETH00.00010142
Grant Approvals272375182025-11-16 9:20:5170 days ago1763284851IN
0x00000000...72b8dABaB
0 ETH0.000000010.0003009
Grant Approvals272334982025-11-16 7:06:5170 days ago1763276811IN
0x00000000...72b8dABaB
0 ETH00.00010086
Grant Approvals272279042025-11-16 4:00:2370 days ago1763265623IN
0x00000000...72b8dABaB
0 ETH0.000000040.00080526
Grant Approvals272193212025-11-15 23:14:1771 days ago1763248457IN
0x00000000...72b8dABaB
0 ETH00.00000068
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
302499342026-01-25 2:54:4322 hrs ago1769309683
0x00000000...72b8dABaB
0 ETH
302499342026-01-25 2:54:4322 hrs ago1769309683
0x00000000...72b8dABaB
0 ETH
302017762026-01-24 0:09:272 days ago1769213367
0x00000000...72b8dABaB
0 ETH
302017762026-01-24 0:09:272 days ago1769213367
0x00000000...72b8dABaB
0 ETH
299472722026-01-18 2:45:597 days ago1768704359
0x00000000...72b8dABaB
0 ETH
299472722026-01-18 2:45:597 days ago1768704359
0x00000000...72b8dABaB
0 ETH
297259602026-01-12 23:48:5513 days ago1768261735
0x00000000...72b8dABaB
0 ETH
297259602026-01-12 23:48:5513 days ago1768261735
0x00000000...72b8dABaB
0 ETH
297193262026-01-12 20:07:4713 days ago1768248467
0x00000000...72b8dABaB
0 ETH
297193262026-01-12 20:07:4713 days ago1768248467
0x00000000...72b8dABaB
0 ETH
296967932026-01-12 7:36:4113 days ago1768203401
0x00000000...72b8dABaB
0 ETH
296967932026-01-12 7:36:4113 days ago1768203401
0x00000000...72b8dABaB
0 ETH
296830122026-01-11 23:57:1914 days ago1768175839
0x00000000...72b8dABaB
0 ETH
296830122026-01-11 23:57:1914 days ago1768175839
0x00000000...72b8dABaB
0 ETH
296492612026-01-11 5:12:1714 days ago1768108337
0x00000000...72b8dABaB
0 ETH
296492612026-01-11 5:12:1714 days ago1768108337
0x00000000...72b8dABaB
0 ETH
294503672026-01-06 14:42:2919 days ago1767710549
0x00000000...72b8dABaB
0 ETH
294503672026-01-06 14:42:2919 days ago1767710549
0x00000000...72b8dABaB
0 ETH
294496742026-01-06 14:19:2319 days ago1767709163
0x00000000...72b8dABaB
0 ETH
294496742026-01-06 14:19:2319 days ago1767709163
0x00000000...72b8dABaB
0 ETH
294470162026-01-06 12:50:4719 days ago1767703847
0x00000000...72b8dABaB
0 ETH
294470162026-01-06 12:50:4719 days ago1767703847
0x00000000...72b8dABaB
0 ETH
293682742026-01-04 17:06:0321 days ago1767546363
0x00000000...72b8dABaB
0 ETH
293682742026-01-04 17:06:0321 days ago1767546363
0x00000000...72b8dABaB
0 ETH
293272692026-01-03 18:19:1322 days ago1767464353
0x00000000...72b8dABaB
0 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BlastTransferManager

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 888888 runs

Other Settings:
london EvmVersion, MIT license
File 1 of 16 : BlastTransferManager.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

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";

import {TransferManager} from "./TransferManager.sol";

import {IBlast, YieldMode, GasMode} from "./interfaces/IBlast.sol";

/**
 * @title BlastTransferManager
 * @notice This contract provides the transfer functions for ERC20/ERC721/ERC1155 for contracts on Blast that require them.
 * @author YOLO Games protocol team
 */
contract BlastTransferManager is TransferManager {
    /**
     * @notice Constructor
     * @param _owner Owner address
     * @param _blast Blast yield contract
     */
    constructor(address _owner, address _blast) TransferManager(_owner) {
        IBlast(_blast).configure(YieldMode.CLAIMABLE, GasMode.CLAIMABLE, _owner);
    }
}

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

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

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

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

// 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 YOLO Games 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();
    }
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

enum YieldMode {
    AUTOMATIC,
    VOID,
    CLAIMABLE
}

enum GasMode {
    VOID,
    CLAIMABLE
}

interface IBlast {
    // configure
    function configureContract(
        address contractAddress,
        YieldMode _yield,
        GasMode gasMode,
        address governor
    ) external;

    function configure(
        YieldMode _yield,
        GasMode gasMode,
        address governor
    ) external;

    // base configuration options
    function configureClaimableYield() external;

    function configureClaimableYieldOnBehalf(address contractAddress) external;

    function configureAutomaticYield() external;

    function configureAutomaticYieldOnBehalf(address contractAddress) external;

    function configureVoidYield() external;

    function configureVoidYieldOnBehalf(address contractAddress) external;

    function configureClaimableGas() external;

    function configureClaimableGasOnBehalf(address contractAddress) external;

    function configureVoidGas() external;

    function configureVoidGasOnBehalf(address contractAddress) external;

    function configureGovernor(address _governor) external;

    function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external;

    // claim yield
    function claimYield(
        address contractAddress,
        address recipientOfYield,
        uint256 amount
    ) external returns (uint256);

    function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256);

    // claim gas
    function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256);

    function claimGasAtMinClaimRate(
        address contractAddress,
        address recipientOfGas,
        uint256 minClaimRateBips
    ) external returns (uint256);

    function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256);

    function claimGas(
        address contractAddress,
        address recipientOfGas,
        uint256 gasToClaim,
        uint256 gasSecondsToConsume
    ) external returns (uint256);

    // read functions
    function readClaimableYield(address contractAddress) external view returns (uint256);

    function readYieldConfiguration(address contractAddress) external view returns (uint8);

    function readGasParams(address contractAddress)
        external
        view
        returns (
            uint256 etherSeconds,
            uint256 etherBalance,
            uint256 lastUpdated,
            GasMode
        );
}

File 8 of 16 : 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);
}

// 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 10 of 16 : 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 11 of 16 : 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();

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

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

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

    /**
     * @notice This returns whether the user has approved the operator address.
     * The first address is the user and the second address is the operator.
     */
    function hasUserApprovedOperator(address user, address operator) external view returns (bool);
}

File 15 of 16 : 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 16 of 16 : TokenType.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

enum TokenType {
    ERC20,
    ERC721,
    ERC1155
}

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/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 888888
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_blast","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"}]

608034620001355762001e28906001600160401b03601f38849003908101601f1916830190828211848310176200013a578084916040968794855283398101031262000135576200005e6020620000568462000150565b930162000150565b600080546001600160a01b0319166001600160a01b03948516908117825585518181529194909290917f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc90602090a11690813b156200013157839291606484928751968793849263c8992e6160e01b8452600260048501526001602485015260448401525af18015620001275762000100575b8351611cc29081620001668239f35b82116200011357508152388080620000f1565b634e487b7160e01b81526041600452602490fd5b84513d84823e3d90fd5b8380fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001355756fe608060409080825260048036101561001657600080fd5b600091823560e01c9081630ca8e8a814611007575080631ba9a45814610f1457806323452b9c14610e0c5780632bb5a9e614610dc15780633cc4cb0614610d485780633e56753914610c545780635b6ac01114610b785780636cf0859c14610a135780637200b829146108e157806375ccc1321461087a5780637762df25146108275780638da5cb5b146107d6578063a0a406c61461066a578063a7bc96d3146105a4578063ac8a584a146104b3578063c0b6f561146103a8578063cda20f0b14610380578063da3e8ce414610350578063e62edc35146102b75763e8f9f1dc1461010057600080fd5b346102b357602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57803567ffffffffffffffff81116102ab5761014f903690830161136b565b929091831561028457845b84811061019b575050506101957f2689e1a312b4212a2eb518d23bfd4c7cc30e3a7bc7a7e2524e8ec16e6a3713ab9394519283923384611649565b0390a180f35b73ffffffffffffffffffffffffffffffffffffffff6101c36101be838888611555565b611628565b168087526003845260ff8089892054161561025c57338852600290818652898920838a5286528989205416610234573388528452878720908752835286862090600191827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790550161015a565b8389517fabb0fc96000000000000000000000000000000000000000000000000000000008152fd5b8389517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b85517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8380fd5b8280fd5b5080fd5b5091346102b35760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b3576102f06113e7565b6102f86113a1565b6103006113c4565b906084359361030f33836116b5565b841561032857506103259495506064359261185a565b80f35b8690517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b5091346102b357610360366114e9565b9361036e93919333846116b5565b84156103285750610325949550611acc565b82346103a557610325610392366114e9565b926103a092919233836116b5565b611bd6565b80fd5b508290346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af576103e26113e7565b6103ea611741565b6001549160ff8360a01c166103fe8161140a565b61048c5750740100000000000000000000000000000000000000007fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef939273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffff00000000000000000000000000000000000000000093169283911617176001558151903382526020820152a180f35b83517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff6105016113e7565b610509611741565b1691828452600360205260ff82852054161561057d5750816020917f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d938552600383528085207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905551908152a180f35b90517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b508290346102af576105b536611443565b9690959492919788158015610660575b61063a576105d333856116b5565b895b8981106105e0578a80f35b600190816105ef828c8c611555565b35036106125761060c610603828d88611555565b3588888b611bd6565b016105d5565b5050517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50888814156105c5565b5091346102b35761067a36611443565b8295949515928380156107cc575b6107a45761069633876116b5565b6001908082036107415750501561071557359586156106ed57506106c157610325959650359261185a565b6024866032897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8890517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248860328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b969495935099899891989792975b878110610764575050506103259798506119c5565b61076f818b8b611555565b351561077c578b0161074f565b5090517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8a89517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b5080821415610688565b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760209073ffffffffffffffffffffffffffffffffffffffff600154169051908152f35b8284346102b35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff8160209373ffffffffffffffffffffffffffffffffffffffff6108ce6113e7565b1681526003855220541690519015158152f35b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5760015490600160ff8360a01c166109288161140a565b036109ec5773ffffffffffffffffffffffffffffffffffffffff821633036109c557507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff000000000000000000000000000000000000000000602092337fffffffffffffffffffffffff00000000000000000000000000000000000000008754161786551660015551338152a180f35b82517fafdcfb92000000000000000000000000000000000000000000000000000000008152fd5b82517f5e4f2826000000000000000000000000000000000000000000000000000000008152fd5b50346102b3576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57813567ffffffffffffffff81116102ab57610a62903690840161136b565b9290918315610b5057845b848110610aa8575050506101957fcd827905c56d07b7e3668c6d264b27603a45324dd955aadca79cf47eb24ca5fa9394519283923384611649565b610ab66101be828787611555565b338752600280845273ffffffffffffffffffffffffffffffffffffffff898920921691828952845260ff898920541615610b28573388528352878720908752825286862080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610a6d565b8489517f21d29a86000000000000000000000000000000000000000000000000000000008152fd5b5084517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610bb1611741565b6001549160ff8360a01c16610bc58161140a565b610c2e5783740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8516176001557f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec8180a180f35b517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610c8d611741565b60015490600260ff8360a01c16610ca38161140a565b03610d2157507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff6020927fffffffffffffffffffffffff000000000000000000000000000000000000000086541686551660015551838152a180f35b82517f045c5122000000000000000000000000000000000000000000000000000000008152fd5b8284346102b357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff81602093610d866113e7565b610d8e6113a1565b73ffffffffffffffffffffffffffffffffffffffff91821683526002875283832091168252855220549151911615158152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b357600154905160209160a01c60ff16610e088161140a565b8152f35b5082346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610e44611741565b6001549160ff8360a01c1691610e598361140a565b8215610eee57505080610e6d60019261140a565b14610ec3575b507fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600154166001557f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae38180a180f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001660015581610e73565b517fccf69db7000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff610f626113e7565b610f6a611741565b1691828452600360205260ff8285205416610fe05750816020917fdde65206cdee4ea27ef1b170724ba50b41ad09a3bf2dda12935fc40c4dbf6e759385526003835280852060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905551908152a180f35b90517f730e0eb0000000000000000000000000000000000000000000000000000000008152fd5b84929150346102ab57606091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261136757803567ffffffffffffffff81116113635761105a903690830161136b565b906110636113a1565b9261106c6113c4565b94831561133e57503373ffffffffffffffffffffffffffffffffffffffff85160361132f575b875b83811061109f578880f35b6110b66110ad828686611594565b898101906115d4565b6110cd6110c4848888611594565b8a8101906115d4565b91909260206110dd868a8a611594565b013591600383101561132b576110f28361140a565b821580156112eb5781158015906112e0575b6112b8575b6111128461140a565b1561119c5750505015611170573580156111485790611142600192888861113d6101be868b8b611594565b611acc565b01611094565b8289517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248a6032857f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b909193926111a98561140a565b60019480860361123557508d5b8281106111cb57505050505050600190611142565b856111d7828488611555565b350361120d5785906112078c8e6111f46101be8f8f908e91611594565b9161120085898b611555565b3592611bd6565b016111b6565b878e517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8061124760029297939795949561140a565b1461125a575b5050505050600190611142565b89898f8d938b915b878110611294575050916112856101be8a60019b9a98969461128a9a9896611594565b6119c5565b908a80808061124d565b9350935050506112a5818787611555565b351561120d57810189898d938d93611262565b878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b506001851415611104565b81158015611321575b1561110957878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50818514156112f4565b8d80fd5b61133933856116b5565b611092565b7f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8580fd5b8480fd5b9181601f8401121561139c5782359167ffffffffffffffff831161139c576020808501948460051b01011161139c57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6003111561141457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261139c5773ffffffffffffffffffffffffffffffffffffffff90600435828116810361139c5792602435838116810361139c5792604435908116810361139c579167ffffffffffffffff9160643583811161139c57826114cb9160040161136b565b9390939260843591821161139c576114e59160040161136b565b9091565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc608091011261139c5773ffffffffffffffffffffffffffffffffffffffff600435818116810361139c5791602435828116810361139c5791604435908116810361139c579060643590565b91908110156115655760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156115655760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818136030182121561139c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561139c570180359067ffffffffffffffff821161139c57602001918160051b3603831361139c57565b3573ffffffffffffffffffffffffffffffffffffffff8116810361139c5790565b73ffffffffffffffffffffffffffffffffffffffff91821681526040602080830182905290820185905260609091019391600090815b84831061168f5750505050505090565b90919293949586358381168091036102af5781528401958401949392600101919061167f565b9073ffffffffffffffffffffffffffffffffffffffff809116600090808252600360205260ff604083205416928361171d575b505050905061171b5760046040517fb5509544000000000000000000000000000000000000000000000000000000008152fd5b565b6040935060ff941682526002602052828220908252602052205416803880806116e8565b73ffffffffffffffffffffffffffffffffffffffff60005416330361176257565b60046040517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176117cd57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3d15611855573d9067ffffffffffffffff82116117cd576040519161184960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461178c565b82523d6000602084013e565b606090565b92939093833b1561195e576040519460208601937ff242432a00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff80921660248801521660448601526064850152608484015260a060a48401526000928360c482015260c48152610100810181811067ffffffffffffffff8211176119315784939291849160405251925af16118ff6117fc565b501561190757565b60046040517f02f8f11e000000000000000000000000000000000000000000000000000000008152fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60046040517f09ee12d5000000000000000000000000000000000000000000000000000000008152fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161139c5760209260051b809284830137010190565b93919095843b1561195e5760206000979688611a78611a8e94611a467f2eb2c2d60000000000000000000000000000000000000000000000000000000099849c99859a6040519a898c019d8e5273ffffffffffffffffffffffffffffffffffffffff80921660248d01521660448b015260a060648b015260c48a0191611988565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc94858984030160848a0152611988565b85810392830160a487015252808452018261178c565b51925af1611a9a6117fc565b5015611aa257565b60046040517f65da8e40000000000000000000000000000000000000000000000000000000008152fd5b929091833b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff94851660248301529390911660448201526064810191909152611b6481608481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261178c565b600092839283809351925af1611b786117fc565b9015611bac57805180611b8a57505050565b81602091810103126102b35760200151908115918215036103a55750611bac57565b60046040517fe5605213000000000000000000000000000000000000000000000000000000008152fd5b90929192813b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff9283166024830152949091166044820152606481019290925260009283928390611c4e8160848101611b38565b51925af1611c5a6117fc565b5015611c6257565b60046040517fe0f5c508000000000000000000000000000000000000000000000000000000008152fdfea264697066735822122022e7439513dcb6576f04ababd4e3b55180645db99734c24e1fdcbfc68c27ea4164736f6c634300081400330000000000000000000000002c64e6ee1dd9fc2a0db6a6b1aa2c3f163c7a2c780000000000000000000000004300000000000000000000000000000000000002

Deployed Bytecode

0x608060409080825260048036101561001657600080fd5b600091823560e01c9081630ca8e8a814611007575080631ba9a45814610f1457806323452b9c14610e0c5780632bb5a9e614610dc15780633cc4cb0614610d485780633e56753914610c545780635b6ac01114610b785780636cf0859c14610a135780637200b829146108e157806375ccc1321461087a5780637762df25146108275780638da5cb5b146107d6578063a0a406c61461066a578063a7bc96d3146105a4578063ac8a584a146104b3578063c0b6f561146103a8578063cda20f0b14610380578063da3e8ce414610350578063e62edc35146102b75763e8f9f1dc1461010057600080fd5b346102b357602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57803567ffffffffffffffff81116102ab5761014f903690830161136b565b929091831561028457845b84811061019b575050506101957f2689e1a312b4212a2eb518d23bfd4c7cc30e3a7bc7a7e2524e8ec16e6a3713ab9394519283923384611649565b0390a180f35b73ffffffffffffffffffffffffffffffffffffffff6101c36101be838888611555565b611628565b168087526003845260ff8089892054161561025c57338852600290818652898920838a5286528989205416610234573388528452878720908752835286862090600191827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790550161015a565b8389517fabb0fc96000000000000000000000000000000000000000000000000000000008152fd5b8389517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b85517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8380fd5b8280fd5b5080fd5b5091346102b35760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b3576102f06113e7565b6102f86113a1565b6103006113c4565b906084359361030f33836116b5565b841561032857506103259495506064359261185a565b80f35b8690517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b5091346102b357610360366114e9565b9361036e93919333846116b5565b84156103285750610325949550611acc565b82346103a557610325610392366114e9565b926103a092919233836116b5565b611bd6565b80fd5b508290346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af576103e26113e7565b6103ea611741565b6001549160ff8360a01c166103fe8161140a565b61048c5750740100000000000000000000000000000000000000007fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef939273ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffff00000000000000000000000000000000000000000093169283911617176001558151903382526020820152a180f35b83517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff6105016113e7565b610509611741565b1691828452600360205260ff82852054161561057d5750816020917f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d938552600383528085207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905551908152a180f35b90517f8a109193000000000000000000000000000000000000000000000000000000008152fd5b508290346102af576105b536611443565b9690959492919788158015610660575b61063a576105d333856116b5565b895b8981106105e0578a80f35b600190816105ef828c8c611555565b35036106125761060c610603828d88611555565b3588888b611bd6565b016105d5565b5050517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50888814156105c5565b5091346102b35761067a36611443565b8295949515928380156107cc575b6107a45761069633876116b5565b6001908082036107415750501561071557359586156106ed57506106c157610325959650359261185a565b6024866032897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8890517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248860328b7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b969495935099899891989792975b878110610764575050506103259798506119c5565b61076f818b8b611555565b351561077c578b0161074f565b5090517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8a89517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b5080821415610688565b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760209073ffffffffffffffffffffffffffffffffffffffff600154169051908152f35b8284346102b35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff8160209373ffffffffffffffffffffffffffffffffffffffff6108ce6113e7565b1681526003855220541690519015158152f35b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5760015490600160ff8360a01c166109288161140a565b036109ec5773ffffffffffffffffffffffffffffffffffffffff821633036109c557507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff000000000000000000000000000000000000000000602092337fffffffffffffffffffffffff00000000000000000000000000000000000000008754161786551660015551338152a180f35b82517fafdcfb92000000000000000000000000000000000000000000000000000000008152fd5b82517f5e4f2826000000000000000000000000000000000000000000000000000000008152fd5b50346102b3576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57813567ffffffffffffffff81116102ab57610a62903690840161136b565b9290918315610b5057845b848110610aa8575050506101957fcd827905c56d07b7e3668c6d264b27603a45324dd955aadca79cf47eb24ca5fa9394519283923384611649565b610ab66101be828787611555565b338752600280845273ffffffffffffffffffffffffffffffffffffffff898920921691828952845260ff898920541615610b28573388528352878720908752825286862080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101610a6d565b8489517f21d29a86000000000000000000000000000000000000000000000000000000008152fd5b5084517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610bb1611741565b6001549160ff8360a01c16610bc58161140a565b610c2e5783740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8516176001557f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec8180a180f35b517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b508290346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610c8d611741565b60015490600260ff8360a01c16610ca38161140a565b03610d2157507f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff6020927fffffffffffffffffffffffff000000000000000000000000000000000000000086541686551660015551838152a180f35b82517f045c5122000000000000000000000000000000000000000000000000000000008152fd5b8284346102b357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b35760ff81602093610d866113e7565b610d8e6113a1565b73ffffffffffffffffffffffffffffffffffffffff91821683526002875283832091168252855220549151911615158152f35b8284346102b357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102b357600154905160209160a01c60ff16610e088161140a565b8152f35b5082346102af57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af57610e44611741565b6001549160ff8360a01c1691610e598361140a565b8215610eee57505080610e6d60019261140a565b14610ec3575b507fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600154166001557f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae38180a180f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001660015581610e73565b517fccf69db7000000000000000000000000000000000000000000000000000000008152fd5b5082346102af5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102af5773ffffffffffffffffffffffffffffffffffffffff610f626113e7565b610f6a611741565b1691828452600360205260ff8285205416610fe05750816020917fdde65206cdee4ea27ef1b170724ba50b41ad09a3bf2dda12935fc40c4dbf6e759385526003835280852060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905551908152a180f35b90517f730e0eb0000000000000000000000000000000000000000000000000000000008152fd5b84929150346102ab57606091827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261136757803567ffffffffffffffff81116113635761105a903690830161136b565b906110636113a1565b9261106c6113c4565b94831561133e57503373ffffffffffffffffffffffffffffffffffffffff85160361132f575b875b83811061109f578880f35b6110b66110ad828686611594565b898101906115d4565b6110cd6110c4848888611594565b8a8101906115d4565b91909260206110dd868a8a611594565b013591600383101561132b576110f28361140a565b821580156112eb5781158015906112e0575b6112b8575b6111128461140a565b1561119c5750505015611170573580156111485790611142600192888861113d6101be868b8b611594565b611acc565b01611094565b8289517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b60248a6032857f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b909193926111a98561140a565b60019480860361123557508d5b8281106111cb57505050505050600190611142565b856111d7828488611555565b350361120d5785906112078c8e6111f46101be8f8f908e91611594565b9161120085898b611555565b3592611bd6565b016111b6565b878e517f0f3a948a000000000000000000000000000000000000000000000000000000008152fd5b8061124760029297939795949561140a565b1461125a575b5050505050600190611142565b89898f8d938b915b878110611294575050916112856101be8a60019b9a98969461128a9a9896611594565b6119c5565b908a80808061124d565b9350935050506112a5818787611555565b351561120d57810189898d938d93611262565b878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b506001851415611104565b81158015611321575b1561110957878e517f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b50818514156112f4565b8d80fd5b61133933856116b5565b611092565b7f97983bdb000000000000000000000000000000000000000000000000000000008152fd5b8580fd5b8480fd5b9181601f8401121561139c5782359167ffffffffffffffff831161139c576020808501948460051b01011161139c57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361139c57565b6003111561141457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261139c5773ffffffffffffffffffffffffffffffffffffffff90600435828116810361139c5792602435838116810361139c5792604435908116810361139c579167ffffffffffffffff9160643583811161139c57826114cb9160040161136b565b9390939260843591821161139c576114e59160040161136b565b9091565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc608091011261139c5773ffffffffffffffffffffffffffffffffffffffff600435818116810361139c5791602435828116810361139c5791604435908116810361139c579060643590565b91908110156115655760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156115655760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818136030182121561139c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561139c570180359067ffffffffffffffff821161139c57602001918160051b3603831361139c57565b3573ffffffffffffffffffffffffffffffffffffffff8116810361139c5790565b73ffffffffffffffffffffffffffffffffffffffff91821681526040602080830182905290820185905260609091019391600090815b84831061168f5750505050505090565b90919293949586358381168091036102af5781528401958401949392600101919061167f565b9073ffffffffffffffffffffffffffffffffffffffff809116600090808252600360205260ff604083205416928361171d575b505050905061171b5760046040517fb5509544000000000000000000000000000000000000000000000000000000008152fd5b565b6040935060ff941682526002602052828220908252602052205416803880806116e8565b73ffffffffffffffffffffffffffffffffffffffff60005416330361176257565b60046040517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176117cd57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3d15611855573d9067ffffffffffffffff82116117cd576040519161184960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461178c565b82523d6000602084013e565b606090565b92939093833b1561195e576040519460208601937ff242432a00000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff80921660248801521660448601526064850152608484015260a060a48401526000928360c482015260c48152610100810181811067ffffffffffffffff8211176119315784939291849160405251925af16118ff6117fc565b501561190757565b60046040517f02f8f11e000000000000000000000000000000000000000000000000000000008152fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60046040517f09ee12d5000000000000000000000000000000000000000000000000000000008152fd5b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161139c5760209260051b809284830137010190565b93919095843b1561195e5760206000979688611a78611a8e94611a467f2eb2c2d60000000000000000000000000000000000000000000000000000000099849c99859a6040519a898c019d8e5273ffffffffffffffffffffffffffffffffffffffff80921660248d01521660448b015260a060648b015260c48a0191611988565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc94858984030160848a0152611988565b85810392830160a487015252808452018261178c565b51925af1611a9a6117fc565b5015611aa257565b60046040517f65da8e40000000000000000000000000000000000000000000000000000000008152fd5b929091833b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff94851660248301529390911660448201526064810191909152611b6481608481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261178c565b600092839283809351925af1611b786117fc565b9015611bac57805180611b8a57505050565b81602091810103126102b35760200151908115918215036103a55750611bac57565b60046040517fe5605213000000000000000000000000000000000000000000000000000000008152fd5b90929192813b1561195e576040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff9283166024830152949091166044820152606481019290925260009283928390611c4e8160848101611b38565b51925af1611c5a6117fc565b5015611c6257565b60046040517fe0f5c508000000000000000000000000000000000000000000000000000000008152fdfea264697066735822122022e7439513dcb6576f04ababd4e3b55180645db99734c24e1fdcbfc68c27ea4164736f6c63430008140033

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

0000000000000000000000002c64e6ee1dd9fc2a0db6a6b1aa2c3f163c7a2c780000000000000000000000004300000000000000000000000000000000000002

-----Decoded View---------------
Arg [0] : _owner (address): 0x2C64e6Ee1Dd9Fc2a0Db6a6B1aa2c3f163C7A2C78
Arg [1] : _blast (address): 0x4300000000000000000000000000000000000002

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000002c64e6ee1dd9fc2a0db6a6b1aa2c3f163c7a2c78
Arg [1] : 0000000000000000000000004300000000000000000000000000000000000002


Deployed Bytecode Sourcemap

828:334:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7530:11:1;;;;;7526:65;;7606:9;7617:10;;;;;;828:334:0;;;8073:39:1;;828:334:0;;;7827:10:1;;;;8073:39;;:::i;:::-;;;;828:334:0;;7606:9:1;828:334:0;7664:12:1;;;;;;:::i;:::-;;:::i;:::-;828:334:0;;;;7696:17:1;828:334:0;;;;;;;;;7695:28:1;7691:94;;7827:10;828:334:0;;7803:23:1;828:334:0;;;;;;;;;;;;;;;;;7799:122:1;;7827:10;828:334:0;;;;;;;;;;;;;;;7983:4:1;;828:334:0;;;;;;;;;;7606:9:1;;7799:122;828:334:0;;;7875:31:1;;;;7691:94;828:334:0;;;7750:20:1;;;;7526:65;828:334:0;;7564:16:1;;;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;3780:10:1;;;;;:::i;:::-;3805:11;;3801:64;;828:334:0;3938:6:1;828:334:0;;;;;3938:6:1;;:::i;:::-;828:334:0;;3801:64:1;828:334:0;;;3839:15:1;;;;828:334:0;;;;;;;;;:::i;:::-;2300:10:1;;;;;;;;:::i;:::-;2326:11;;2322:64;;2446:6;;;;;;:::i;828:334:0:-;;;;;2773:6:1;828:334:0;;;:::i;:::-;2701:10:1;;;;;;;;:::i;:::-;2773:6;:::i;828:334:0:-;;;;;;;;;;;;;;;;;;;:::i;:::-;926:61:6;;:::i;:::-;3027:15;828:334:0;;;;;;;;;;:::i;:::-;3023:108:6;;828:334:0;;3415:56:6;828:334:0;;;;;;;;;;;;3027:15:6;828:334:0;;;3441:10:6;;828:334:0;;;;;;3415:56:6;828:334:0;;3023:108:6;828:334:0;;3093:27:6;;;;828:334:0;;;;;;;;;;;;;;;;:::i;:::-;926:61:6;;:::i;:::-;828:334:0;;;;;9218:17:1;828:334:0;;;;;;;;9217:28:1;9213:86;;828:334:0;;;;9359:25:1;828:334:0;;;9218:17:1;828:334:0;;;;;;;;;;;;;;;9359:25:1;828:334:0;;9213:86:1;828:334:0;;9268:20:1;;;;828:334:0;;;;;;;;;;:::i;:::-;3088:11:1;;;;;;;;;:39;;;;828:334:0;3084:93:1;;3221:10;;;;:::i;:::-;3248:9;3259:10;;;;;;828:334:0;;;3248:9:1;3305:1;3291:10;;;;;;;:::i;:::-;828:334:0;3291:15:1;3287:76;;3427:10;;;;;;:::i;:::-;828:334:0;3427:10:1;;;;:::i;:::-;828:334:0;3248:9:1;;3287:76;828:334:0;;;3333:15:1;;;;3084:93;828:334:0;3150:16:1;;;;3088:39;3103:24;;;;;3088:39;;828:334:0;;;;;;;;;:::i;:::-;4255:11:1;;;;;:39;;;;;;828:334:0;4251:93:1;;4388:10;;;;:::i;:::-;4424:1;;4414:11;;;4424:1;;828:334:0;;;;;;4445:15:1;;;4441:76;;828:334:0;;;4598:10:1;828:334:0;;;;4598:10:1;;:::i;828:334:0:-;;;;;;;;;;4441:76:1;828:334:0;;;4487:15:1;;;;828:334:0;;;;;;;;;;4410:550:1;4645:9;;;;;;;;;;;;;4656:10;;;;;;4941:7;;;;;;;;:::i;4645:9::-;4692:10;;;;;:::i;:::-;828:334:0;4692:15:1;4688:84;;828:334:0;;4645:9:1;;4688:84;828:334:0;;;4738:15:1;;;;4251:93;828:334:0;;;4317:16:1;;;;4255:39;4270:24;;;;;4255:39;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;705:29:6;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;1876:49:1;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2427:15:6;828:334:0;;2427:15:6;828:334:0;;;;;;;;:::i;:::-;2427:44:6;2423:105;;828:334:0;;;2542:10:6;:28;2538:87;;2542:10;2732:20;2542:10;828:334:0;;2542:10:6;;828:334:0;;;;;;;;2427:15:6;828:334:0;;2542:10:6;828:334:0;;2732:20:6;828:334:0;;2538:87:6;828:334:0;;2593:21:6;;;;2423:105;828:334:0;;2494:23:6;;;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8298:11:1;;;;;8294:65;;8374:9;8385:10;;;;;;828:334:0;;;8729:39:1;;828:334:0;;;8488:10:1;;;;8729:39;;:::i;8374:9::-;8432:12;;;;;;:::i;:::-;8488:10;828:334:0;;8464:23:1;828:334:0;;;;;;;;;;;;;;;;;;;;;8463:46:1;8459:119;;8488:10;828:334:0;;;;;;;;;;;;;;;;;;;;;;;8374:9:1;;8459:119;828:334:0;;;8536:27:1;;;;8294:65;828:334:0;;;8332:16:1;;;;828:334:0;;;;;;;;;;;;;;926:61:6;;:::i;:::-;3651:15;828:334:0;;;;;;;;;;:::i;:::-;3647:108:6;;828:334:0;;;;;;3651:15:6;828:334:0;3828:31:6;;;;828:334:0;;3647:108:6;828:334:0;3717:27:6;;;;828:334:0;;;;;;;;;;;;;;926:61:6;;:::i;:::-;1991:15;828:334:0;;2010:29:6;828:334:0;;;;;;;;:::i;:::-;1991:48:6;1987:113;;828:334:0;2170:20:6;828:334:0;;;;;;;;;;;1991:15:6;828:334:0;;;;;2170:20:6;828:334:0;;1987:113:6;828:334:0;;2062:27:6;;;;828:334:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;1684:75:1;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;790:29:6;828:334:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;926:61:6;;:::i;:::-;1497:15;828:334:0;;;;;;;;;;;:::i;:::-;1526:44:6;;1522:111;;828:334:0;;;;1497:15:6;828:334:0;;:::i;:::-;1647:45:6;1643:97;;828:334:0;;;1497:15:6;828:334:0;;1497:15:6;828:334:0;1788:25:6;;;;828:334:0;;1643:97:6;828:334:0;;1497:15:6;828:334:0;1643:97:6;;;1522:111;828:334:0;1593:29:6;;;;828:334:0;;;;;;;;;;;;;;;;:::i;:::-;926:61:6;;:::i;:::-;828:334:0;;;;;8907:17:1;828:334:0;;;;;;;;8903:89:1;;828:334:0;;;;9052:25:1;828:334:0;;;8907:17:1;828:334:0;;;;;9032:4:1;828:334:0;;;;;;;;;;;9052:25:1;828:334:0;;8903:89:1;828:334:0;;8957:24:1;;;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::i;:::-;5229:16:1;;;5225:70;;5317:10;;828:334:0;;;5309:18:1;5305:94;;828:334:0;5414:9:1;5425:15;;;;;;828:334:0;;;5414:9:1;5487:16;:8;;;;;:::i;:::-;:16;;;;;:::i;:::-;5617;:8;;;;;:::i;:::-;:16;;;;;:::i;:::-;5670:8;;;828:334:0;5670:8:1;;;;;:::i;:::-;:18;828:334:0;;;;;;;;;;;:::i;:::-;5707:28:1;;;;;;5759:37;;;;:60;;;5703:395;5755:130;;5703:395;828:334:0;;;:::i;:::-;6116:28:1;;;828:334:0;;;;;;;6213:11:1;;6209:80;;6332:8;6365:6;828:334:0;6332:8:1;;;:21;:8;;;;;:::i;:21::-;6365:6;:::i;:::-;828:334:0;5414:9:1;;6209:80;828:334:0;;;6255:15:1;;;;828:334:0;;;;;;;;;;6112:1163:1;828:334:0;;;;;;;:::i;:::-;;;6397:29:1;;;828:334:0;;6451:9:1;;6462:36;;;;;;6393:882;;;;;;828:334:0;6393:882:1;6112:1163;;6451:9;6528:10;;;;;;:::i;:::-;828:334:0;6528:15:1;6524:92;;6664:8;;6697:10;6664:8;;:21;:8;;;;;;;:::i;:21::-;6697:10;;;;;;:::i;:::-;828:334:0;6697:10:1;;:::i;:::-;828:334:0;6451:9:1;;6524:92;828:334:0;;;6578:15:1;;;;6393:882;828:334:0;;6847:17:1;828:334:0;;;;;;;;:::i;:::-;6834:30:1;6830:445;;6393:882;;;;;;828:334:0;6393:882:1;6112:1163;;6830:445;6889:9;;;;;;;6900:36;;;;;;7210:8;;;:21;:8;;828:334:0;7210:8:1;;;;;7252:7;7210:8;;;;:::i;:21::-;7252:7;:::i;:::-;6830:445;;;;;;;6889:9;6966:10;;;;;;;;;;;:::i;:::-;828:334:0;6966:15:1;6962:92;;828:334:0;;6889:9:1;;;;;;;;5755:130;828:334:0;;;5850:16:1;;;;5759:60;5800:19;828:334:0;5800:19:1;;;5759:60;;5703:395;5927:37;;:91;;;;5703:395;5923:161;5703:395;5923:161;828:334:0;;;6049:16:1;;;;5927:91;5968:50;;;;;5927:91;;828:334:0;;;;5305:94:1;5377:10;5317;5377;;:::i;:::-;5305:94;;5225:70;5268:16;;;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;-1:-1:-1;828:334:0;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;828:334:0;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9642:246:1;;828:334:0;;;;-1:-1:-1;828:334:0;;;;9738:17:1;828:334:0;;;;;;;;9738:70:1;;;;9642:246;9734:107;;;;;;;9858:23;828:334:0;;9858:23:1;;;;9734:107;9824:7::o;9738:70::-;828:334:0;;;;;;;;9769:23:1;828:334:0;;;;;;;;;;;;;9738:70:1;;;;;;3872:94:6;828:334:0;3935:5:6;828:334:0;;3921:10:6;:19;3917:42;;3872:94::o;3917:42::-;3949:10;828:334:0;;3949:10:6;;;;828:334:0;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;828:334:0;;;;:::o;:::-;;;:::o;797:474:13:-;;;;;986:22;;:27;982:79;;828:334:0;;1105:74:13;;;;;;;;828:334:0;;;;1105:74:13;;;828:334:0;;;;;;;;;;;;;;;;;;;1012:1:13;828:334:0;;;;;;;1105:74:13;;828:334:0;;;;;;;;;;;;;;;;;;;;1089:91:13;;;;;;:::i;:::-;;1195:7;1191:74;;797:474::o;1191:74::-;1105;828:334:0;;1225:29:13;;;;828:334:0;1105:74:13;828:334:0;;;;;;;;982:79:13;1036:14;828:334:0;;1036:14:13;;;;828:334:0;;;;;;;;;;;;;;;;;;;;;;;;:::o;1584:537:13:-;;;;;1802:22;;:27;1798:79;;1934:81;1828:1;828:334:0;;;;1934:81:13;828:334:0;;1934:81:13;828:334:0;;;;;;;;1934:81:13;;;;;;;828:334:0;;;;1934:81:13;;;828:334:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;1934:81:13;;;;;;:::i;:::-;1905:120;;;;;;:::i;:::-;;2040:7;2036:79;;1584:537::o;2036:79::-;1934:81;828:334:0;;2070:34:13;;;;693:540:14;;;;811:20;;:25;807:77;;828:334:0;;943:55:14;;;;;;;828:334:0;;;;943:55:14;;;828:334:0;;;;;;;;;;;;;;;;943:55:14;828:334:0;;;;943:55:14;;;;;;;;;:::i;:::-;835:1;929:70;;;;;;;;;;;;:::i;:::-;1014:7;;1010:68;;828:334:0;;1092:15:14;1088:139;;693:540;;;:::o;1088:139::-;1128:24;943:55;1128:24;;;828:334:0;;;;943:55:14;1128:24;828:334:0;;;;;;;;;;1123:94:14;;;693:540::o;1123:94::-;943:55;828:334:0;;1179:23:14;;;;708:385:15;;;;;830:22;;:27;826:79;;828:334:0;;949:57:15;;;;;;;828:334:0;;;;949:57:15;;;828:334:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;949:57:15;828:334:0;;;;949:57:15;828:334:0;949:57:15;933:74;;;;;;:::i;:::-;;1022:7;1018:69;;708:385::o;1018:69::-;949:57;828:334:0;;1052:24:15;;;

Swarm Source

ipfs://22e7439513dcb6576f04ababd4e3b55180645db99734c24e1fdcbfc68c27ea41

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.