ETH Price: $3,250.49 (+4.35%)
Gas: 2 Gwei

Contract

0x26c014149A1F86F010b566FD23C49825FCfBC285
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Ether For ...165436372023-02-02 20:56:59539 days ago1675371419IN
0x26c01414...5FCfBC285
0 ETH0.0075378338.69999875
Claim Ether For ...165434282023-02-02 20:14:35539 days ago1675368875IN
0x26c01414...5FCfBC285
0 ETH0.0068111533.11772068
0x60806040165382032023-02-02 2:40:59540 days ago1675305659IN
 Create: L1TokenClaimBridge
0 ETH0.0207268219.64189999

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
L1TokenClaimBridge

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : L1TokenClaimBridge.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import {ICrossDomainMessenger} from "@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol";

import "../L2/interface/IL2TokenClaimBridge.sol";
import "./interface/IL1EventLogger.sol";
import "./interface/IL1TokenClaimBridge.sol";
import "../lib/storage/L1TokenClaimBridgeStorage.sol";
import "./interface/IRoyaltyEngineV1.sol";
import "../lib/crosschain/CrosschainOrigin.sol";

contract L1TokenClaimBridge is IL1TokenClaimBridge {
    modifier onlyNftOwner(address canonicalNft_, uint256 tokenId_) {
        require(
            IERC721(canonicalNft_).ownerOf(tokenId_) == msg.sender,
            "Message sender does not own NFT"
        );
        _;
    }

    modifier onlyNftsOwner(
        address[] calldata canonicalNfts_,
        uint256[] calldata tokenIds_
    ) {
        require(
            canonicalNfts_.length > 0 &&
                tokenIds_.length > 0 &&
                canonicalNfts_.length == tokenIds_.length,
            "NFT inputs are malformed"
        );

        for (uint8 i = 0; i < canonicalNfts_.length; i++) {
            require(
                IERC721(canonicalNfts_[i]).ownerOf(tokenIds_[i]) == msg.sender,
                "Message sender does not own at least one given NFT"
            );
        }
        _;
    }

    constructor(
        address l1EventLogger_,
        address l2TokenClaimBridge_,
        address royaltyEngine_
    ) {
        L1TokenClaimBridgeStorage.get().l1EventLogger = l1EventLogger_;
        L1TokenClaimBridgeStorage
            .get()
            .l2TokenClaimBridge = l2TokenClaimBridge_;
        L1TokenClaimBridgeStorage.get().royaltyEngine = royaltyEngine_;
    }

    function claimEtherForMultipleNfts(
        address[] calldata canonicalNfts_,
        uint256[] calldata tokenIds_,
        address payable beneficiary_,
        uint256[] calldata amounts_
    ) external override onlyNftsOwner(canonicalNfts_, tokenIds_) {
        require(
            amounts_.length == canonicalNfts_.length,
            "canonicalNfts_, tokenIds_, and amounts_ must be same length"
        );

        (
            address payable[][] memory royaltyRecipientsArray,
            uint256[][] memory royaltyAmountsArray
        ) = _getRoyaltyRecipientsArrayAndRoyaltyAmountsArray(
                canonicalNfts_,
                tokenIds_,
                amounts_
            );

        bytes memory message = abi.encodeCall(
            IL2TokenClaimBridge(address(0)).claimEtherForMultipleNfts,
            (
                canonicalNfts_,
                tokenIds_,
                beneficiary_,
                amounts_,
                royaltyRecipientsArray,
                royaltyAmountsArray
            )
        );

        ICrossDomainMessenger(CrosschainOrigin.crossDomainMessenger())
            .sendMessage(
                L1TokenClaimBridgeStorage.get().l2TokenClaimBridge,
                message,
                1920000
            );

        IL1EventLogger(L1TokenClaimBridgeStorage.get().l1EventLogger)
            .emitClaimEtherForMultipleNftsMessageSent(
                keccak256(abi.encodePacked(canonicalNfts_)),
                keccak256(abi.encodePacked(tokenIds_)),
                beneficiary_
            );
    }

    function markReplicasAsAuthentic(address canonicalNft_, uint256 tokenId_)
        external
        override
        onlyNftOwner(canonicalNft_, tokenId_)
    {
        bytes memory message = abi.encodeCall(
            IL2TokenClaimBridge(address(0)).markReplicasAsAuthentic,
            (canonicalNft_, tokenId_)
        );

        ICrossDomainMessenger(CrosschainOrigin.crossDomainMessenger())
            .sendMessage(
                L1TokenClaimBridgeStorage.get().l2TokenClaimBridge,
                message,
                1000000
            );

        IL1EventLogger(L1TokenClaimBridgeStorage.get().l1EventLogger)
            .emitMarkReplicasAsAuthenticMessageSent(canonicalNft_, tokenId_);
    }

    function l2TokenClaimBridge() external view override returns (address) {
        return L1TokenClaimBridgeStorage.get().l2TokenClaimBridge;
    }

    function l1EventLogger() external view override returns (address) {
        return L1TokenClaimBridgeStorage.get().l1EventLogger;
    }

    function royaltyEngine() external view override returns (address) {
        return L1TokenClaimBridgeStorage.get().royaltyEngine;
    }

    function _getRoyaltyRecipientsArrayAndRoyaltyAmountsArray(
        address[] calldata canonicalNfts_,
        uint256[] calldata tokenIds_,
        uint256[] calldata amounts_
    ) internal view returns (address payable[][] memory, uint256[][] memory) {
        address payable[][]
            memory royaltyRecipientsArray = new address payable[][](
                canonicalNfts_.length
            );
        uint256[][] memory royaltyAmountsArray = new uint256[][](
            canonicalNfts_.length
        );

        for (uint256 i = 0; i < canonicalNfts_.length; i++) {
            (
                address payable[] memory royaltyRecipients,
                uint256[] memory royaltyAmounts
            ) = IRoyaltyEngineV1(L1TokenClaimBridgeStorage.get().royaltyEngine)
                    .getRoyaltyView(
                        canonicalNfts_[i],
                        tokenIds_[i],
                        amounts_[i]
                    );

            royaltyRecipientsArray[i] = royaltyRecipients;
            royaltyAmountsArray[i] = royaltyAmounts;
        }

        return (royaltyRecipientsArray, royaltyAmountsArray);
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 13 : ICrossDomainMessenger.sol
// SPDX-License-Identifier: MIT
pragma solidity >0.5.0 <0.9.0;

/**
 * @title ICrossDomainMessenger
 */
interface ICrossDomainMessenger {
    /**********
     * Events *
     **********/

    event SentMessage(
        address indexed target,
        address sender,
        bytes message,
        uint256 messageNonce,
        uint256 gasLimit
    );
    event RelayedMessage(bytes32 indexed msgHash);
    event FailedRelayedMessage(bytes32 indexed msgHash);

    /*************
     * Variables *
     *************/

    function xDomainMessageSender() external view returns (address);

    /********************
     * Public Functions *
     ********************/

    /**
     * Sends a cross domain message to the target messenger.
     * @param _target Target contract address.
     * @param _message Message to send to the target.
     * @param _gasLimit Gas limit for the provided message.
     */
    function sendMessage(
        address _target,
        bytes calldata _message,
        uint32 _gasLimit
    ) external;
}

File 4 of 13 : IL2TokenClaimBridge.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

import "./IHomageProtocolConfigView.sol";

interface IL2TokenClaimBridge is IHomageProtocolConfigView {
    function initialize(address homageProtocolConfig_) external;

    function claimEtherForMultipleNfts(
        address[] calldata canonicalNfts_,
        uint256[] calldata tokenIds_,
        address payable beneficiary_,
        uint256[] calldata claimAmounts_,
        address payable[][] calldata royaltyRecipientsArray_,
        uint256[][] calldata royaltyAmountsArray_
    ) external returns (uint256);

    function markReplicasAsAuthentic(address canonicalNft_, uint256 tokenId_)
        external;
}

File 5 of 13 : IL1EventLogger.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

import "../../shared/interface/IEventLogger.sol";

interface IL1EventLogger is IEventLogger {
    function emitClaimEtherForMultipleNftsMessageSent(
        bytes32 canonicalNftsHash_,
        bytes32 tokenIdsHash_,
        address beneficiary_
    ) external;

    function emitMarkReplicasAsAuthenticMessageSent(
        address canonicalNft_,
        uint256 tokenId_
    ) external;
}

File 6 of 13 : IL1TokenClaimBridge.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

interface IL1TokenClaimBridge {
    function claimEtherForMultipleNfts(
        address[] calldata canonicalNfts_,
        uint256[] calldata tokenIds_,
        address payable beneficiary_,
        uint256[] calldata amounts_
    ) external;

    function markReplicasAsAuthentic(address canonicalNft_, uint256 tokenId_)
        external;

    function l2TokenClaimBridge() external view returns (address);

    function l1EventLogger() external view returns (address);

    function royaltyEngine() external view returns (address);
}

File 7 of 13 : L1TokenClaimBridgeStorage.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

library L1TokenClaimBridgeStorage {
    bytes32 constant STORAGE_POSITION = keccak256("homage.l1TokenClaimBridge");

    struct Struct {
        address l1EventLogger;
        address l2TokenClaimBridge;
        address royaltyEngine;
    }

    function get() internal pure returns (Struct storage storageStruct) {
        bytes32 position = STORAGE_POSITION;
        assembly {
            storageStruct.slot := position
        }
    }
}

File 8 of 13 : IRoyaltyEngineV1.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

import "@openzeppelin/contracts/interfaces/IERC165.sol";

/**
 * As defined at: https://github.com/manifoldxyz/royalty-registry-solidity/blob/main/contracts/IRoyaltyEngineV1.sol
 * Retrieved 1/26/23
 */
interface IRoyaltyEngineV1 is IERC165 {
    /**
     * View only version of getRoyalty
     *
     * @param tokenAddress - The address of the token
     * @param tokenId      - The id of the token
     * @param value        - The value you wish to get the royalty of
     *
     * returns Two arrays of equal length, royalty recipients and the corresponding amount each recipient should get
     */
    function getRoyaltyView(
        address tokenAddress,
        uint256 tokenId,
        uint256 value
    )
        external
        view
        returns (address payable[] memory recipients, uint256[] memory amounts);
}

File 9 of 13 : CrosschainOrigin.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

// Reference: https://github.com/ethereum-optimism/optimism-tutorial/blob/main/cross-dom-comm/contracts/Greeter.sol

import {ICrossDomainMessenger} from "@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol";

library CrosschainOrigin {
    function crossDomainMessenger() internal view returns (address cdmAddr) {
        // Get the cross domain messenger's address each time.
        // This is less resource intensive than writing to storage.

        if (block.chainid == 1)
            cdmAddr = 0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1;

        // Goerli
        if (block.chainid == 5)
            cdmAddr = 0x5086d1eEF304eb5284A0f6720f79403b4e9bE294;

        // Kovan
        if (block.chainid == 42)
            cdmAddr = 0x4361d0F75A0186C05f971c566dC6bEa5957483fD;

        // L2
        if (block.chainid == 10 || block.chainid == 420 || block.chainid == 69)
            cdmAddr = 0x4200000000000000000000000000000000000007;

        // Local L1 (pre-Bedrock)
        if (block.chainid == 31337) {
            cdmAddr = 0x8A791620dd6260079BF849Dc5567aDC3F2FdC318;
        }

        // Local L1 (Bedrock)
        if (block.chainid == 900) {
            cdmAddr = 0x6900000000000000000000000000000000000002;
        }

        // Local L2 (pre-Bedrock)
        if (block.chainid == 987) {
            cdmAddr = 0x4200000000000000000000000000000000000007;
        }

        // Local L2 (Bedrock)
        if (block.chainid == 901) {
            cdmAddr = 0x4200000000000000000000000000000000000007;
        }
    }

    function getCrosschainMessageSender() internal view returns (address) {
        // Get the cross domain messenger's address each time.
        // This is less resource intensive than writing to storage.
        address cdmAddr = crossDomainMessenger();

        // If this isn't a cross domain message
        if (msg.sender != cdmAddr) {
            revert("Not crosschain call");
        }

        // If it is a cross domain message, find out where it is from
        return ICrossDomainMessenger(cdmAddr).xDomainMessageSender();
    }
}

File 10 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 11 of 13 : IHomageProtocolConfigView.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

interface IHomageProtocolConfigView {
    function homageProtocolConfig() external view returns (address);
}

File 12 of 13 : IEventLogger.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

interface IEventLogger {
    function emitReplicaDeployed(address replica_) external;

    function emitReplicaTransferred(
        uint256 canonicalTokenId_,
        uint256 replicaTokenId_
    ) external;

    function emitReplicaRegistered(
        address canonicalNftContract_,
        uint256 canonicalTokenId_,
        address replica_
    ) external;
}

File 13 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"l1EventLogger_","type":"address"},{"internalType":"address","name":"l2TokenClaimBridge_","type":"address"},{"internalType":"address","name":"royaltyEngine_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address[]","name":"canonicalNfts_","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"address payable","name":"beneficiary_","type":"address"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"claimEtherForMultipleNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"l1EventLogger","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l2TokenClaimBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"canonicalNft_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"markReplicasAsAuthentic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyEngine","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200125738038062001257833981016040819052620000349162000130565b826200004a620000ef60201b620007281760201c565b60000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508162000087620000ef60201b620007281760201c565b60010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080620000c4620000ef60201b620007281760201c565b60020180546001600160a01b0319166001600160a01b0392909216919091179055506200017a915050565b7f1c814000c6f21df8b7924388cbfbf7add87ef32358675e415557c3c5b1d97a0090565b80516001600160a01b03811681146200012b57600080fd5b919050565b6000806000606084860312156200014657600080fd5b620001518462000113565b9250620001616020850162000113565b9150620001716040850162000113565b90509250925092565b6110cd806200018a6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630e111a0f1461005c5780630fd310a8146100805780634c94c90c14610095578063827754321461009d578063c81aadbf146100b0575b600080fd5b6100646100b8565b6040516001600160a01b03909116815260200160405180910390f35b61009361008e366004610a55565b6100d4565b005b6100646102dd565b6100936100ab366004610acd565b6102f9565b61006461070f565b60006100c2610728565b600101546001600160a01b0316919050565b6040516331a9108f60e11b8152600481018290528290829033906001600160a01b03841690636352211e90602401602060405180830381865afa15801561011f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101439190610b7c565b6001600160a01b03161461019e5760405162461bcd60e51b815260206004820152601f60248201527f4d6573736167652073656e64657220646f6573206e6f74206f776e204e46540060448201526064015b60405180910390fd5b604080516001600160a01b038616602482015260448082018690528251808303909101815260649091019091526020810180516001600160e01b03166301fa621560e31b1790526101ed61074c565b6001600160a01b0316633dbb202b610203610728565b600101546040516001600160e01b031960e084901b168152610238916001600160a01b0316908590620f424090600401610bed565b600060405180830381600087803b15801561025257600080fd5b505af1158015610266573d6000803e3d6000fd5b50505050610272610728565b5460405163117ba60160e21b81526001600160a01b03878116600483015260248201879052909116906345ee980490604401600060405180830381600087803b1580156102be57600080fd5b505af11580156102d2573d6000803e3d6000fd5b505050505050505050565b60006102e7610728565b600201546001600160a01b0316919050565b86868686821580159061030b57508015155b801561031657508281145b6103625760405162461bcd60e51b815260206004820152601860248201527f4e465420696e7075747320617265206d616c666f726d656400000000000000006044820152606401610195565b60005b60ff81168411156104a75733858560ff841681811061038657610386610c27565b905060200201602081019061039b9190610c3d565b6001600160a01b0316636352211e85858560ff168181106103be576103be610c27565b905060200201356040518263ffffffff1660e01b81526004016103e391815260200190565b602060405180830381865afa158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610b7c565b6001600160a01b0316146104955760405162461bcd60e51b815260206004820152603260248201527f4d6573736167652073656e64657220646f6573206e6f74206f776e206174206c60448201527119585cdd081bdb994819da5d995b8813919560721b6064820152608401610195565b8061049f81610c70565b915050610365565b50848a1461051d5760405162461bcd60e51b815260206004820152603b60248201527f63616e6f6e6963616c4e6674735f2c20746f6b656e4964735f2c20616e64206160448201527f6d6f756e74735f206d7573742062652073616d65206c656e67746800000000006064820152608401610195565b60008061052e8d8d8d8d8c8c610838565b915091506000806001600160a01b0316632c66c4328f8f8f8f8f8f8f8b8b60405160240161056499989796959493929190610db9565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061059b61074c565b6001600160a01b0316633dbb202b6105b1610728565b600101546040516001600160e01b031960e084901b1681526105e6916001600160a01b0316908590621d4c0090600401610bed565b600060405180830381600087803b15801561060057600080fd5b505af1158015610614573d6000803e3d6000fd5b50505050610620610728565b60000160009054906101000a90046001600160a01b03166001600160a01b0316638d0142878f8f604051602001610658929190610e73565b604051602081830303815290604052805190602001208e8e604051602001610681929190610eb5565b60408051601f198184030181529082905280516020909101206001600160e01b031960e085901b168252600482019290925260248101919091526001600160a01b038d166044820152606401600060405180830381600087803b1580156106e757600080fd5b505af11580156106fb573d6000803e3d6000fd5b505050505050505050505050505050505050565b6000610719610728565b546001600160a01b0316919050565b7f1c814000c6f21df8b7924388cbfbf7add87ef32358675e415557c3c5b1d97a0090565b6000466001141561076e57507325ace71c97b33cc4729cf772ae268934f7ab5fa15b466005141561078e5750735086d1eef304eb5284a0f6720f79403b4e9be2945b46602a14156107ae5750734361d0f75a0186c05f971c566dc6bea5957483fd5b46600a14806107be5750466101a4145b806107c95750466045145b156107d857506007602160991b015b46617a6914156107f95750738a791620dd6260079bf849dc5567adc3f2fdc3185b46610384141561080d57506002606960981b015b466103db141561082157506007602160991b015b46610385141561083557506007602160991b015b90565b60608060008767ffffffffffffffff81111561085657610856610ee1565b60405190808252806020026020018201604052801561088957816020015b60608152602001906001900390816108745790505b50905060008867ffffffffffffffff8111156108a7576108a7610ee1565b6040519080825280602002602001820160405280156108da57816020015b60608152602001906001900390816108c55790505b50905060005b89811015610a2d576000806108f3610728565b600201546001600160a01b0316633e1040148e8e8681811061091757610917610c27565b905060200201602081019061092c9190610c3d565b8d8d8781811061093e5761093e610c27565b905060200201358c8c8881811061095757610957610c27565b6040516001600160e01b031960e088901b1681526001600160a01b039095166004860152602485019390935250602090910201356044820152606401600060405180830381865afa1580156109b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109d89190810190610fb7565b91509150818584815181106109ef576109ef610c27565b602002602001018190525080848481518110610a0d57610a0d610c27565b602002602001018190525050508080610a259061107c565b9150506108e0565b5090999098509650505050505050565b6001600160a01b0381168114610a5257600080fd5b50565b60008060408385031215610a6857600080fd5b8235610a7381610a3d565b946020939093013593505050565b60008083601f840112610a9357600080fd5b50813567ffffffffffffffff811115610aab57600080fd5b6020830191508360208260051b8501011115610ac657600080fd5b9250929050565b60008060008060008060006080888a031215610ae857600080fd5b873567ffffffffffffffff80821115610b0057600080fd5b610b0c8b838c01610a81565b909950975060208a0135915080821115610b2557600080fd5b610b318b838c01610a81565b909750955060408a01359150610b4682610a3d565b90935060608901359080821115610b5c57600080fd5b50610b698a828b01610a81565b989b979a50959850939692959293505050565b600060208284031215610b8e57600080fd5b8151610b9981610a3d565b9392505050565b6000815180845260005b81811015610bc657602081850181015186830182015201610baa565b81811115610bd8576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0384168152606060208201819052600090610c1190830185610ba0565b905063ffffffff83166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610c4f57600080fd5b8135610b9981610a3d565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff811415610c8757610c87610c5a565b60010192915050565b81835260006001600160fb1b03831115610ca957600080fd5b8260051b8083602087013760009401602001938452509192915050565b600082825180855260208086019550808260051b8401018186016000805b85811015610d4057868403601f19018a52825180518086529086019086860190845b81811015610d2b5783516001600160a01b031683529288019291880191600101610d06565b50509a86019a94505091840191600101610ce4565b509198975050505050505050565b6000815180845260208085019450848260051b86018286016000805b86811015610d40578484038a52825180518086529087019087860190845b81811015610da457835183529289019291890191600101610d88565b50509a87019a94505091850191600101610d6a565b60c0808252810189905260008a60e08301825b8c811015610dfc578235610ddf81610a3d565b6001600160a01b0316825260209283019290910190600101610dcc565b508381036020850152610e10818b8d610c90565b915050610e2860408401896001600160a01b03169052565b8281036060840152610e3b818789610c90565b90508281036080840152610e4f8186610cc6565b905082810360a0840152610e638185610d4e565b9c9b505050505050505050505050565b60008184825b85811015610eaa578135610e8c81610a3d565b6001600160a01b031683526020928301929190910190600101610e79565b509095945050505050565b60006001600160fb1b03831115610ecb57600080fd5b8260051b80858437600092019182525092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610f2057610f20610ee1565b604052919050565b600067ffffffffffffffff821115610f4257610f42610ee1565b5060051b60200190565b600082601f830112610f5d57600080fd5b81516020610f72610f6d83610f28565b610ef7565b82815260059290921b84018101918181019086841115610f9157600080fd5b8286015b84811015610fac5780518352918301918301610f95565b509695505050505050565b60008060408385031215610fca57600080fd5b825167ffffffffffffffff80821115610fe257600080fd5b818501915085601f830112610ff657600080fd5b81516020611006610f6d83610f28565b82815260059290921b8401810191818101908984111561102557600080fd5b948201945b8386101561104c57855161103d81610a3d565b8252948201949082019061102a565b9188015191965090935050508082111561106557600080fd5b5061107285828601610f4c565b9150509250929050565b600060001982141561109057611090610c5a565b506001019056fea2646970667358221220afe3aecff89ae85197ecd6aa115a9d6617e05e9b8aac83a9a66f3e68a25dc90c64736f6c634300080c003300000000000000000000000074b92f22bcb3ea996d6b027da62361f02c6a631e0000000000000000000000006f37a09269e67ede41307d359b5b4afaa70d8caf0000000000000000000000000385603ab55642cb4dd5de3ae9e306809991804f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100575760003560e01c80630e111a0f1461005c5780630fd310a8146100805780634c94c90c14610095578063827754321461009d578063c81aadbf146100b0575b600080fd5b6100646100b8565b6040516001600160a01b03909116815260200160405180910390f35b61009361008e366004610a55565b6100d4565b005b6100646102dd565b6100936100ab366004610acd565b6102f9565b61006461070f565b60006100c2610728565b600101546001600160a01b0316919050565b6040516331a9108f60e11b8152600481018290528290829033906001600160a01b03841690636352211e90602401602060405180830381865afa15801561011f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101439190610b7c565b6001600160a01b03161461019e5760405162461bcd60e51b815260206004820152601f60248201527f4d6573736167652073656e64657220646f6573206e6f74206f776e204e46540060448201526064015b60405180910390fd5b604080516001600160a01b038616602482015260448082018690528251808303909101815260649091019091526020810180516001600160e01b03166301fa621560e31b1790526101ed61074c565b6001600160a01b0316633dbb202b610203610728565b600101546040516001600160e01b031960e084901b168152610238916001600160a01b0316908590620f424090600401610bed565b600060405180830381600087803b15801561025257600080fd5b505af1158015610266573d6000803e3d6000fd5b50505050610272610728565b5460405163117ba60160e21b81526001600160a01b03878116600483015260248201879052909116906345ee980490604401600060405180830381600087803b1580156102be57600080fd5b505af11580156102d2573d6000803e3d6000fd5b505050505050505050565b60006102e7610728565b600201546001600160a01b0316919050565b86868686821580159061030b57508015155b801561031657508281145b6103625760405162461bcd60e51b815260206004820152601860248201527f4e465420696e7075747320617265206d616c666f726d656400000000000000006044820152606401610195565b60005b60ff81168411156104a75733858560ff841681811061038657610386610c27565b905060200201602081019061039b9190610c3d565b6001600160a01b0316636352211e85858560ff168181106103be576103be610c27565b905060200201356040518263ffffffff1660e01b81526004016103e391815260200190565b602060405180830381865afa158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610b7c565b6001600160a01b0316146104955760405162461bcd60e51b815260206004820152603260248201527f4d6573736167652073656e64657220646f6573206e6f74206f776e206174206c60448201527119585cdd081bdb994819da5d995b8813919560721b6064820152608401610195565b8061049f81610c70565b915050610365565b50848a1461051d5760405162461bcd60e51b815260206004820152603b60248201527f63616e6f6e6963616c4e6674735f2c20746f6b656e4964735f2c20616e64206160448201527f6d6f756e74735f206d7573742062652073616d65206c656e67746800000000006064820152608401610195565b60008061052e8d8d8d8d8c8c610838565b915091506000806001600160a01b0316632c66c4328f8f8f8f8f8f8f8b8b60405160240161056499989796959493929190610db9565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061059b61074c565b6001600160a01b0316633dbb202b6105b1610728565b600101546040516001600160e01b031960e084901b1681526105e6916001600160a01b0316908590621d4c0090600401610bed565b600060405180830381600087803b15801561060057600080fd5b505af1158015610614573d6000803e3d6000fd5b50505050610620610728565b60000160009054906101000a90046001600160a01b03166001600160a01b0316638d0142878f8f604051602001610658929190610e73565b604051602081830303815290604052805190602001208e8e604051602001610681929190610eb5565b60408051601f198184030181529082905280516020909101206001600160e01b031960e085901b168252600482019290925260248101919091526001600160a01b038d166044820152606401600060405180830381600087803b1580156106e757600080fd5b505af11580156106fb573d6000803e3d6000fd5b505050505050505050505050505050505050565b6000610719610728565b546001600160a01b0316919050565b7f1c814000c6f21df8b7924388cbfbf7add87ef32358675e415557c3c5b1d97a0090565b6000466001141561076e57507325ace71c97b33cc4729cf772ae268934f7ab5fa15b466005141561078e5750735086d1eef304eb5284a0f6720f79403b4e9be2945b46602a14156107ae5750734361d0f75a0186c05f971c566dc6bea5957483fd5b46600a14806107be5750466101a4145b806107c95750466045145b156107d857506007602160991b015b46617a6914156107f95750738a791620dd6260079bf849dc5567adc3f2fdc3185b46610384141561080d57506002606960981b015b466103db141561082157506007602160991b015b46610385141561083557506007602160991b015b90565b60608060008767ffffffffffffffff81111561085657610856610ee1565b60405190808252806020026020018201604052801561088957816020015b60608152602001906001900390816108745790505b50905060008867ffffffffffffffff8111156108a7576108a7610ee1565b6040519080825280602002602001820160405280156108da57816020015b60608152602001906001900390816108c55790505b50905060005b89811015610a2d576000806108f3610728565b600201546001600160a01b0316633e1040148e8e8681811061091757610917610c27565b905060200201602081019061092c9190610c3d565b8d8d8781811061093e5761093e610c27565b905060200201358c8c8881811061095757610957610c27565b6040516001600160e01b031960e088901b1681526001600160a01b039095166004860152602485019390935250602090910201356044820152606401600060405180830381865afa1580156109b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109d89190810190610fb7565b91509150818584815181106109ef576109ef610c27565b602002602001018190525080848481518110610a0d57610a0d610c27565b602002602001018190525050508080610a259061107c565b9150506108e0565b5090999098509650505050505050565b6001600160a01b0381168114610a5257600080fd5b50565b60008060408385031215610a6857600080fd5b8235610a7381610a3d565b946020939093013593505050565b60008083601f840112610a9357600080fd5b50813567ffffffffffffffff811115610aab57600080fd5b6020830191508360208260051b8501011115610ac657600080fd5b9250929050565b60008060008060008060006080888a031215610ae857600080fd5b873567ffffffffffffffff80821115610b0057600080fd5b610b0c8b838c01610a81565b909950975060208a0135915080821115610b2557600080fd5b610b318b838c01610a81565b909750955060408a01359150610b4682610a3d565b90935060608901359080821115610b5c57600080fd5b50610b698a828b01610a81565b989b979a50959850939692959293505050565b600060208284031215610b8e57600080fd5b8151610b9981610a3d565b9392505050565b6000815180845260005b81811015610bc657602081850181015186830182015201610baa565b81811115610bd8576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0384168152606060208201819052600090610c1190830185610ba0565b905063ffffffff83166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610c4f57600080fd5b8135610b9981610a3d565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff811415610c8757610c87610c5a565b60010192915050565b81835260006001600160fb1b03831115610ca957600080fd5b8260051b8083602087013760009401602001938452509192915050565b600082825180855260208086019550808260051b8401018186016000805b85811015610d4057868403601f19018a52825180518086529086019086860190845b81811015610d2b5783516001600160a01b031683529288019291880191600101610d06565b50509a86019a94505091840191600101610ce4565b509198975050505050505050565b6000815180845260208085019450848260051b86018286016000805b86811015610d40578484038a52825180518086529087019087860190845b81811015610da457835183529289019291890191600101610d88565b50509a87019a94505091850191600101610d6a565b60c0808252810189905260008a60e08301825b8c811015610dfc578235610ddf81610a3d565b6001600160a01b0316825260209283019290910190600101610dcc565b508381036020850152610e10818b8d610c90565b915050610e2860408401896001600160a01b03169052565b8281036060840152610e3b818789610c90565b90508281036080840152610e4f8186610cc6565b905082810360a0840152610e638185610d4e565b9c9b505050505050505050505050565b60008184825b85811015610eaa578135610e8c81610a3d565b6001600160a01b031683526020928301929190910190600101610e79565b509095945050505050565b60006001600160fb1b03831115610ecb57600080fd5b8260051b80858437600092019182525092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610f2057610f20610ee1565b604052919050565b600067ffffffffffffffff821115610f4257610f42610ee1565b5060051b60200190565b600082601f830112610f5d57600080fd5b81516020610f72610f6d83610f28565b610ef7565b82815260059290921b84018101918181019086841115610f9157600080fd5b8286015b84811015610fac5780518352918301918301610f95565b509695505050505050565b60008060408385031215610fca57600080fd5b825167ffffffffffffffff80821115610fe257600080fd5b818501915085601f830112610ff657600080fd5b81516020611006610f6d83610f28565b82815260059290921b8401810191818101908984111561102557600080fd5b948201945b8386101561104c57855161103d81610a3d565b8252948201949082019061102a565b9188015191965090935050508082111561106557600080fd5b5061107285828601610f4c565b9150509250929050565b600060001982141561109057611090610c5a565b506001019056fea2646970667358221220afe3aecff89ae85197ecd6aa115a9d6617e05e9b8aac83a9a66f3e68a25dc90c64736f6c634300080c0033

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

00000000000000000000000074b92f22bcb3ea996d6b027da62361f02c6a631e0000000000000000000000006f37a09269e67ede41307d359b5b4afaa70d8caf0000000000000000000000000385603ab55642cb4dd5de3ae9e306809991804f

-----Decoded View---------------
Arg [0] : l1EventLogger_ (address): 0x74B92f22bCb3eA996d6b027dA62361f02C6a631e
Arg [1] : l2TokenClaimBridge_ (address): 0x6F37a09269E67edE41307d359b5B4aFAa70d8caF
Arg [2] : royaltyEngine_ (address): 0x0385603ab55642cb4Dd5De3aE9e306809991804f

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000074b92f22bcb3ea996d6b027da62361f02c6a631e
Arg [1] : 0000000000000000000000006f37a09269e67ede41307d359b5b4afaa70d8caf
Arg [2] : 0000000000000000000000000385603ab55642cb4dd5de3ae9e306809991804f


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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