S Price: $0.488137 (+4.85%)
    /

    Contract

    0xA5aD821Af1A1900D3f823c27B04870Ac235030a6

    Overview

    S Balance

    Sonic LogoSonic LogoSonic Logo0 S

    S Value

    $0.00

    Multichain Info

    No addresses found
    Transaction Hash
    Method
    Block
    Age
    From
    To
    Amount
    Set Approval For...152074212025-03-22 10:49:1029 days ago1742640550IN
    0xA5aD821A...c235030a6
    0 S0.0014152955.01
    Set Approval For...140919712025-03-16 16:46:0635 days ago1742143566IN
    0xA5aD821A...c235030a6
    0 S0.0026677655.01
    Send126312212025-03-09 11:28:2842 days ago1741519708IN
    0xA5aD821A...c235030a6
    0.09221711 S0.0125252250.0001
    Set Approval For...126311972025-03-09 11:28:1942 days ago1741519699IN
    0xA5aD821A...c235030a6
    0 S0.0023099550.0001
    Approve109126822025-03-01 5:27:1451 days ago1740806834IN
    0xA5aD821A...c235030a6
    0 S0.0028121555
    Approve109015792025-03-01 4:14:3251 days ago1740802472IN
    0xA5aD821A...c235030a6
    0 S0.0028121555
    Send107519482025-02-28 12:03:5451 days ago1740744234IN
    0xA5aD821A...c235030a6
    0.07565079 S0.014719755
    Set Base URI95102652025-02-23 6:00:4257 days ago1740290442IN
    0xA5aD821A...c235030a6
    0 S0.0051894755
    Set Peer95082872025-02-23 5:43:4357 days ago1740289423IN
    0xA5aD821A...c235030a6
    0 S0.00714550

    Latest 2 internal transactions

    Parent Transaction Hash Block Age From To Amount
    126312212025-03-09 11:28:2842 days ago1741519708
    0xA5aD821A...c235030a6
    0.09221711 S
    107519482025-02-28 12:03:5451 days ago1740744234
    0xA5aD821A...c235030a6
    0.07565079 S
    Loading...
    Loading

    Contract Source Code Verified (Exact Match)

    Contract Name:
    Onft

    Compiler Version
    v0.8.28+commit.7893614a

    Optimization Enabled:
    Yes with 200 runs

    Other Settings:
    paris EvmVersion
    File 1 of 53 : Onft.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.22;
    import { ONFT721 } from "../lib/devtools/packages/onft-evm/contracts/onft721/ONFT721.sol";
    import { ERC721Enumerable } from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
    import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
    contract Onft is ONFT721, ERC721Enumerable {
    constructor(
    string memory _name,
    string memory _symbol,
    address _lzEndpoint,
    address _delegate
    ) ONFT721(_name, _symbol, _lzEndpoint, _delegate) {}
    function _baseURI() internal view virtual override(ERC721) returns (string memory) {
    return baseTokenURI;
    }
    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
    uint256 tokenCount = balanceOf(owner);
    uint256[] memory tokens = new uint256[](tokenCount);
    for(uint256 i = 0; i < tokenCount; i++) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 2 of 53 : ONFT721.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.22;
    import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
    import { ONFT721Core } from "./ONFT721Core.sol";
    /**
    * @title ONFT721 Contract
    * @dev ONFT721 is an ERC-721 token that extends the functionality of the ONFT721Core contract.
    */
    abstract contract ONFT721 is ONFT721Core, ERC721 {
    string internal baseTokenURI;
    event BaseURISet(string baseURI);
    /**
    * @dev Constructor for the ONFT721 contract.
    * @param _name The name of the ONFT.
    * @param _symbol The symbol of the ONFT.
    * @param _lzEndpoint The LayerZero endpoint address.
    * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
    */
    constructor(
    string memory _name,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 3 of 53 : ERC721Enumerable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/extensions/ERC721Enumerable.sol)
    pragma solidity ^0.8.20;
    import {ERC721} from "../ERC721.sol";
    import {IERC721Enumerable} from "./IERC721Enumerable.sol";
    import {IERC165} from "../../../utils/introspection/ERC165.sol";
    /**
    * @dev This implements an optional extension of {ERC721} defined in the ERC that adds enumerability
    * of all the token ids in the contract as well as all token ids owned by each account.
    *
    * CAUTION: {ERC721} extensions that implement custom `balanceOf` logic, such as {ERC721Consecutive},
    * interfere with enumerability and should not be used together with {ERC721Enumerable}.
    */
    abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    mapping(address owner => mapping(uint256 index => uint256)) private _ownedTokens;
    mapping(uint256 tokenId => uint256) private _ownedTokensIndex;
    uint256[] private _allTokens;
    mapping(uint256 tokenId => uint256) private _allTokensIndex;
    /**
    * @dev An `owner`'s token query was out of bounds for `index`.
    *
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 4 of 53 : ERC721.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/ERC721.sol)
    pragma solidity ^0.8.20;
    import {IERC721} from "./IERC721.sol";
    import {IERC721Metadata} from "./extensions/IERC721Metadata.sol";
    import {ERC721Utils} from "./utils/ERC721Utils.sol";
    import {Context} from "../../utils/Context.sol";
    import {Strings} from "../../utils/Strings.sol";
    import {IERC165, ERC165} from "../../utils/introspection/ERC165.sol";
    import {IERC721Errors} from "../../interfaces/draft-IERC6093.sol";
    /**
    * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC-721] Non-Fungible Token Standard, including
    * the Metadata extension, but not including the Enumerable extension, which is available separately as
    * {ERC721Enumerable}.
    */
    abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {
    using Strings for uint256;
    // Token name
    string private _name;
    // Token symbol
    string private _symbol;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 5 of 53 : ONFT721Core.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.22;
    import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
    import { OApp, Origin } from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol";
    import { OAppOptionsType3 } from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OAppOptionsType3.sol";
    import { IOAppMsgInspector } from "@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppMsgInspector.sol";
    import { OAppPreCrimeSimulator } from "@layerzerolabs/oapp-evm/contracts/precrime/OAppPreCrimeSimulator.sol";
    import { IONFT721, MessagingFee, MessagingReceipt, SendParam } from "./interfaces/IONFT721.sol";
    import { ONFT721MsgCodec } from "./libs/ONFT721MsgCodec.sol";
    import { ONFTComposeMsgCodec } from "../libs/ONFTComposeMsgCodec.sol";
    /**
    * @title ONFT721Core
    * @dev Abstract contract for an ONFT721 token.
    */
    abstract contract ONFT721Core is IONFT721, OApp, OAppPreCrimeSimulator, OAppOptionsType3 {
    using ONFT721MsgCodec for bytes;
    using ONFT721MsgCodec for bytes32;
    // @notice Msg types that are used to identify the various OFT operations.
    // @dev This can be extended in child contracts for non-default oft operations
    // @dev These values are used in things like combineOptions() in OAppOptionsType3.sol.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 6 of 53 : IERC721Enumerable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Enumerable.sol)
    pragma solidity ^0.8.20;
    import {IERC721} from "../IERC721.sol";
    /**
    * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
    * @dev See https://eips.ethereum.org/EIPS/eip-721
    */
    interface IERC721Enumerable is IERC721 {
    /**
    * @dev Returns the total amount of tokens stored by the contract.
    */
    function totalSupply() external view returns (uint256);
    /**
    * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
    * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
    */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
    /**
    * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
    * Use along with {totalSupply} to enumerate all tokens.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 7 of 53 : ERC165.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)
    pragma solidity ^0.8.20;
    import {IERC165} from "./IERC165.sol";
    /**
    * @dev Implementation of the {IERC165} interface.
    *
    * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
    * for the additional interface id that will be supported. For example:
    *
    * ```solidity
    * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
    * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
    * }
    * ```
    */
    abstract contract ERC165 is IERC165 {
    /**
    * @dev See {IERC165-supportsInterface}.
    */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
    return interfaceId == type(IERC165).interfaceId;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 8 of 53 : IERC721.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721.sol)
    pragma solidity ^0.8.20;
    import {IERC165} from "../../utils/introspection/IERC165.sol";
    /**
    * @dev Required interface of an ERC-721 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);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 9 of 53 : IERC721Metadata.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)
    pragma solidity ^0.8.20;
    import {IERC721} from "../IERC721.sol";
    /**
    * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
    * @dev See https://eips.ethereum.org/EIPS/eip-721
    */
    interface IERC721Metadata is IERC721 {
    /**
    * @dev Returns the token collection name.
    */
    function name() external view returns (string memory);
    /**
    * @dev Returns the token collection symbol.
    */
    function symbol() external view returns (string memory);
    /**
    * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
    */
    function tokenURI(uint256 tokenId) external view returns (string memory);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 10 of 53 : ERC721Utils.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/utils/ERC721Utils.sol)
    pragma solidity ^0.8.20;
    import {IERC721Receiver} from "../IERC721Receiver.sol";
    import {IERC721Errors} from "../../../interfaces/draft-IERC6093.sol";
    /**
    * @dev Library that provide common ERC-721 utility functions.
    *
    * See https://eips.ethereum.org/EIPS/eip-721[ERC-721].
    *
    * _Available since v5.1._
    */
    library ERC721Utils {
    /**
    * @dev Performs an acceptance check for the provided `operator` by calling {IERC721-onERC721Received}
    * on the `to` address. The `operator` is generally the address that initiated the token transfer (i.e. `msg.sender`).
    *
    * The acceptance call is not executed and treated as a no-op if the target address doesn't contain code (i.e. an EOA).
    * Otherwise, the recipient must implement {IERC721Receiver-onERC721Received} and return the acceptance magic value to accept
    * the transfer.
    */
    function checkOnERC721Received(
    address operator,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 11 of 53 : Context.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Provides information about the current execution context, including the
    * sender of the transaction and its data. While these are generally available
    * via msg.sender and msg.data, they should not be accessed in such a direct
    * manner, since when dealing with meta-transactions the account sending and
    * paying for execution may not be the actual sender (as far as an application
    * is concerned).
    *
    * This contract is only required for intermediate, library-like contracts.
    */
    abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
    return msg.sender;
    }
    function _msgData() internal view virtual returns (bytes calldata) {
    return msg.data;
    }
    function _contextSuffixLength() internal view virtual returns (uint256) {
    return 0;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 12 of 53 : Strings.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/Strings.sol)
    pragma solidity ^0.8.20;
    import {Math} from "./math/Math.sol";
    import {SignedMath} from "./math/SignedMath.sol";
    /**
    * @dev String operations.
    */
    library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;
    /**
    * @dev The `value` string doesn't fit in the specified `length`.
    */
    error StringsInsufficientHexLength(uint256 value, uint256 length);
    /**
    * @dev Converts a `uint256` to its ASCII `string` decimal representation.
    */
    function toString(uint256 value) internal pure returns (string memory) {
    unchecked {
    uint256 length = Math.log10(value) + 1;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 13 of 53 : draft-IERC6093.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Standard ERC-20 Errors
    * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
    */
    interface IERC20Errors {
    /**
    * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
    * @param sender Address whose tokens are being transferred.
    * @param balance Current balance for the interacting account.
    * @param needed Minimum amount required to perform a transfer.
    */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
    /**
    * @dev Indicates a failure with the token `sender`. Used in transfers.
    * @param sender Address whose tokens are being transferred.
    */
    error ERC20InvalidSender(address sender);
    /**
    * @dev Indicates a failure with the token `receiver`. Used in transfers.
    * @param receiver Address to which tokens are being transferred.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 14 of 53 : Ownable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
    pragma solidity ^0.8.20;
    import {Context} from "../utils/Context.sol";
    /**
    * @dev Contract module which provides a basic access control mechanism, where
    * there is an account (an owner) that can be granted exclusive access to
    * specific functions.
    *
    * The initial owner is set to the address provided by the deployer. This can
    * later be changed with {transferOwnership}.
    *
    * This module is used through inheritance. It will make available the modifier
    * `onlyOwner`, which can be applied to your functions to restrict their use to
    * the owner.
    */
    abstract contract Ownable is Context {
    address private _owner;
    /**
    * @dev The caller account is not authorized to perform an operation.
    */
    error OwnableUnauthorizedAccount(address account);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 15 of 53 : OApp.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    // @dev Import the 'MessagingFee' and 'MessagingReceipt' so it's exposed to OApp implementers
    // solhint-disable-next-line no-unused-import
    import { OAppSender, MessagingFee, MessagingReceipt } from "./OAppSender.sol";
    // @dev Import the 'Origin' so it's exposed to OApp implementers
    // solhint-disable-next-line no-unused-import
    import { OAppReceiver, Origin } from "./OAppReceiver.sol";
    import { OAppCore } from "./OAppCore.sol";
    /**
    * @title OApp
    * @dev Abstract contract serving as the base for OApp implementation, combining OAppSender and OAppReceiver functionality.
    */
    abstract contract OApp is OAppSender, OAppReceiver {
    /**
    * @dev Constructor to initialize the OApp with the provided endpoint and owner.
    * @param _endpoint The address of the LOCAL LayerZero endpoint.
    * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
    */
    constructor(address _endpoint, address _delegate) OAppCore(_endpoint, _delegate) {}
    /**
    * @notice Retrieves the OApp version information.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 16 of 53 : OAppOptionsType3.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
    import { IOAppOptionsType3, EnforcedOptionParam } from "../interfaces/IOAppOptionsType3.sol";
    /**
    * @title OAppOptionsType3
    * @dev Abstract contract implementing the IOAppOptionsType3 interface with type 3 options.
    */
    abstract contract OAppOptionsType3 is IOAppOptionsType3, Ownable {
    uint16 internal constant OPTION_TYPE_3 = 3;
    // @dev The "msgType" should be defined in the child contract.
    mapping(uint32 eid => mapping(uint16 msgType => bytes enforcedOption)) public enforcedOptions;
    /**
    * @dev Sets the enforced options for specific endpoint and message type combinations.
    * @param _enforcedOptions An array of EnforcedOptionParam structures specifying enforced options.
    *
    * @dev Only the owner/admin of the OApp can call this function.
    * @dev Provides a way for the OApp to enforce things like paying for PreCrime, AND/OR minimum dst lzReceive gas amounts etc.
    * @dev These enforced options can vary as the potential options/execution on the remote may differ as per the msgType.
    * eg. Amount of lzReceive() gas necessary to deliver a lzCompose() message adds overhead you dont want to pay
    * if you are only making a standard LayerZero message ie. lzReceive() WITHOUT sendCompose().
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 17 of 53 : IOAppMsgInspector.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    /**
    * @title IOAppMsgInspector
    * @dev Interface for the OApp Message Inspector, allowing examination of message and options contents.
    */
    interface IOAppMsgInspector {
    // Custom error message for inspection failure
    error InspectionFailed(bytes message, bytes options);
    /**
    * @notice Allows the inspector to examine LayerZero message contents and optionally throw a revert if invalid.
    * @param _message The message payload to be inspected.
    * @param _options Additional options or parameters for inspection.
    * @return valid A boolean indicating whether the inspection passed (true) or failed (false).
    *
    * @dev Optionally done as a revert, OR use the boolean provided to handle the failure.
    */
    function inspect(bytes calldata _message, bytes calldata _options) external view returns (bool valid);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 18 of 53 : OAppPreCrimeSimulator.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
    import { IPreCrime } from "./interfaces/IPreCrime.sol";
    import { IOAppPreCrimeSimulator, InboundPacket, Origin } from "./interfaces/IOAppPreCrimeSimulator.sol";
    /**
    * @title OAppPreCrimeSimulator
    * @dev Abstract contract serving as the base for preCrime simulation functionality in an OApp.
    */
    abstract contract OAppPreCrimeSimulator is IOAppPreCrimeSimulator, Ownable {
    // The address of the preCrime implementation.
    address public preCrime;
    /**
    * @dev Retrieves the address of the OApp contract.
    * @return The address of the OApp contract.
    *
    * @dev The simulator contract is the base contract for the OApp by default.
    * @dev If the simulator is a separate contract, override this function.
    */
    function oApp() external view virtual returns (address) {
    return address(this);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 19 of 53 : IONFT721.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.22;
    import { MessagingFee, MessagingReceipt } from "@layerzerolabs/oapp-evm/contracts/oapp/OAppSender.sol";
    /**
    * @dev Struct representing token parameters for the ONFT send() operation.
    */
    struct SendParam {
    uint32 dstEid; // Destination LayerZero EndpointV2 ID.
    bytes32 to; // Recipient address.
    uint256 tokenId;
    bytes extraOptions; // Additional options supplied by the caller to be used in the LayerZero message.
    bytes composeMsg; // The composed message for the send() operation.
    bytes onftCmd; // The ONFT command to be executed, unused in default ONFT implementations.
    }
    /**
    * @title IONFT
    * @dev Interface for the ONFT721 token.
    * @dev Does not inherit ERC721 to accommodate usage by OFT721Adapter.
    */
    interface IONFT721 {
    // Custom error messages
    error InvalidReceiver();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 20 of 53 : ONFT721MsgCodec.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.22;
    /**
    * @title ONFT721MsgCodec
    * @notice Library for encoding and decoding ONFT721 LayerZero messages.
    */
    library ONFT721MsgCodec {
    uint8 private constant SEND_TO_OFFSET = 32;
    uint8 private constant TOKEN_ID_OFFSET = 64;
    /**
    * @dev Encodes an ONFT721 LayerZero message payload.
    * @param _sendTo The recipient address.
    * @param _tokenId The ID of the token to transfer.
    * @param _composeMsg The composed payload.
    * @return payload The encoded message payload.
    * @return hasCompose A boolean indicating whether the message payload contains a composed payload.
    */
    function encode(
    bytes32 _sendTo,
    uint256 _tokenId,
    bytes memory _composeMsg
    ) internal view returns (bytes memory payload, bool hasCompose) {
    hasCompose = _composeMsg.length > 0;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 21 of 53 : ONFTComposeMsgCodec.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.22;
    /**
    * @title ONFT Composed Message Codec
    * @notice Library for encoding and decoding ONFT composed messages.
    */
    library ONFTComposeMsgCodec {
    // Offset constants for decoding composed messages
    uint8 private constant NONCE_OFFSET = 8;
    uint8 private constant SRC_EID_OFFSET = 12;
    uint8 private constant COMPOSE_FROM_OFFSET = 44;
    /**
    * @dev Encodes a ONFT721 composed message.
    * @param _nonce The nonce value.
    * @param _srcEid The source LayerZero endpoint ID.
    * @param _composeMsg The composed message.
    * @return The encoded payload, including the composed message.
    */
    function encode(
    uint64 _nonce,
    uint32 _srcEid,
    bytes memory _composeMsg // 0x[composeFrom][composeMsg]
    ) internal pure returns (bytes memory) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 22 of 53 : IERC165.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Interface of the ERC-165 standard, as defined in the
    * https://eips.ethereum.org/EIPS/eip-165[ERC].
    *
    * 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[ERC 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);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 23 of 53 : IERC721Receiver.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721Receiver.sol)
    pragma solidity ^0.8.20;
    /**
    * @title ERC-721 token receiver interface
    * @dev Interface for any contract that wants to support safeTransfers
    * from ERC-721 asset contracts.
    */
    interface IERC721Receiver {
    /**
    * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
    * by `operator` from `from`, this function is called.
    *
    * It must return its Solidity selector to confirm the token transfer.
    * If any other value is returned or the interface is not implemented by the recipient, the transfer will be
    * reverted.
    *
    * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
    */
    function onERC721Received(
    address operator,
    address from,
    uint256 tokenId,
    bytes calldata data
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 24 of 53 : Math.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/math/Math.sol)
    pragma solidity ^0.8.20;
    import {Panic} from "../Panic.sol";
    import {SafeCast} from "./SafeCast.sol";
    /**
    * @dev Standard math utilities missing in the Solidity language.
    */
    library Math {
    enum Rounding {
    Floor, // Toward negative infinity
    Ceil, // Toward positive infinity
    Trunc, // Toward zero
    Expand // Away from zero
    }
    /**
    * @dev Returns the addition of two unsigned integers, with an success flag (no overflow).
    */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
    unchecked {
    uint256 c = a + b;
    if (c < a) return (false, 0);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 25 of 53 : SignedMath.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)
    pragma solidity ^0.8.20;
    import {SafeCast} from "./SafeCast.sol";
    /**
    * @dev Standard signed math utilities missing in the Solidity language.
    */
    library SignedMath {
    /**
    * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.
    *
    * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.
    * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute
    * one branch when needed, making this function more expensive.
    */
    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {
    unchecked {
    // branchless ternary works because:
    // b ^ (a ^ b) == a
    // b ^ 0 == b
    return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 26 of 53 : OAppSender.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
    import { MessagingParams, MessagingFee, MessagingReceipt } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
    import { OAppCore } from "./OAppCore.sol";
    /**
    * @title OAppSender
    * @dev Abstract contract implementing the OAppSender functionality for sending messages to a LayerZero endpoint.
    */
    abstract contract OAppSender is OAppCore {
    using SafeERC20 for IERC20;
    // Custom error messages
    error NotEnoughNative(uint256 msgValue);
    error LzTokenUnavailable();
    // @dev The version of the OAppSender implementation.
    // @dev Version is bumped when changes are made to this contract.
    uint64 internal constant SENDER_VERSION = 1;
    /**
    * @notice Retrieves the OApp version information.
    * @return senderVersion The version of the OAppSender.sol contract.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 27 of 53 : OAppReceiver.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { IOAppReceiver, Origin } from "./interfaces/IOAppReceiver.sol";
    import { OAppCore } from "./OAppCore.sol";
    /**
    * @title OAppReceiver
    * @dev Abstract contract implementing the ILayerZeroReceiver interface and extending OAppCore for OApp receivers.
    */
    abstract contract OAppReceiver is IOAppReceiver, OAppCore {
    // Custom error message for when the caller is not the registered endpoint/
    error OnlyEndpoint(address addr);
    // @dev The version of the OAppReceiver implementation.
    // @dev Version is bumped when changes are made to this contract.
    uint64 internal constant RECEIVER_VERSION = 2;
    /**
    * @notice Retrieves the OApp version information.
    * @return senderVersion The version of the OAppSender.sol contract.
    * @return receiverVersion The version of the OAppReceiver.sol contract.
    *
    * @dev Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented.
    * ie. this is a RECEIVE only OApp.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 28 of 53 : OAppCore.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
    import { IOAppCore, ILayerZeroEndpointV2 } from "./interfaces/IOAppCore.sol";
    /**
    * @title OAppCore
    * @dev Abstract contract implementing the IOAppCore interface with basic OApp configurations.
    */
    abstract contract OAppCore is IOAppCore, Ownable {
    // The LayerZero endpoint associated with the given OApp
    ILayerZeroEndpointV2 public immutable endpoint;
    // Mapping to store peers associated with corresponding endpoints
    mapping(uint32 eid => bytes32 peer) public peers;
    /**
    * @dev Constructor to initialize the OAppCore with the provided endpoint and delegate.
    * @param _endpoint The address of the LOCAL Layer Zero endpoint.
    * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
    *
    * @dev The delegate typically should be set as the owner of the contract.
    */
    constructor(address _endpoint, address _delegate) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 29 of 53 : IOAppOptionsType3.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    /**
    * @dev Struct representing enforced option parameters.
    */
    struct EnforcedOptionParam {
    uint32 eid; // Endpoint ID
    uint16 msgType; // Message Type
    bytes options; // Additional options
    }
    /**
    * @title IOAppOptionsType3
    * @dev Interface for the OApp with Type 3 Options, allowing the setting and combining of enforced options.
    */
    interface IOAppOptionsType3 {
    // Custom error message for invalid options
    error InvalidOptions(bytes options);
    // Event emitted when enforced options are set
    event EnforcedOptionSet(EnforcedOptionParam[] _enforcedOptions);
    /**
    * @notice Sets enforced options for specific endpoint and message type combinations.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 30 of 53 : IPreCrime.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    struct PreCrimePeer {
    uint32 eid;
    bytes32 preCrime;
    bytes32 oApp;
    }
    // TODO not done yet
    interface IPreCrime {
    error OnlyOffChain();
    // for simulate()
    error PacketOversize(uint256 max, uint256 actual);
    error PacketUnsorted();
    error SimulationFailed(bytes reason);
    // for preCrime()
    error SimulationResultNotFound(uint32 eid);
    error InvalidSimulationResult(uint32 eid, bytes reason);
    error CrimeFound(bytes crime);
    function getConfig(bytes[] calldata _packets, uint256[] calldata _packetMsgValues) external returns (bytes memory);
    function simulate(
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 31 of 53 : IOAppPreCrimeSimulator.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    // @dev Import the Origin so it's exposed to OAppPreCrimeSimulator implementers.
    // solhint-disable-next-line no-unused-import
    import { InboundPacket, Origin } from "../libs/Packet.sol";
    /**
    * @title IOAppPreCrimeSimulator Interface
    * @dev Interface for the preCrime simulation functionality in an OApp.
    */
    interface IOAppPreCrimeSimulator {
    // @dev simulation result used in PreCrime implementation
    error SimulationResult(bytes result);
    error OnlySelf();
    /**
    * @dev Emitted when the preCrime contract address is set.
    * @param preCrimeAddress The address of the preCrime contract.
    */
    event PreCrimeSet(address preCrimeAddress);
    /**
    * @dev Retrieves the address of the preCrime contract implementation.
    * @return The address of the preCrime contract.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 32 of 53 : Panic.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Helper library for emitting standardized panic codes.
    *
    * ```solidity
    * contract Example {
    * using Panic for uint256;
    *
    * // Use any of the declared internal constants
    * function foo() { Panic.GENERIC.panic(); }
    *
    * // Alternatively
    * function foo() { Panic.panic(Panic.GENERIC); }
    * }
    * ```
    *
    * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].
    *
    * _Available since v5.1._
    */
    // slither-disable-next-line unused-state
    library Panic {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 33 of 53 : SafeCast.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)
    // This file was procedurally generated from scripts/generate/templates/SafeCast.js.
    pragma solidity ^0.8.20;
    /**
    * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow
    * checks.
    *
    * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
    * easily result in undesired exploitation or bugs, since developers usually
    * assume that overflows raise errors. `SafeCast` restores this intuition by
    * reverting the transaction when such an operation overflows.
    *
    * Using this library instead of the unchecked operations eliminates an entire
    * class of bugs, so it's recommended to use it always.
    */
    library SafeCast {
    /**
    * @dev Value doesn't fit in an uint of `bits` size.
    */
    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);
    /**
    * @dev An int value doesn't fit in an uint of `bits` size.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 34 of 53 : SafeERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/utils/SafeERC20.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "../IERC20.sol";
    import {IERC1363} from "../../../interfaces/IERC1363.sol";
    import {Address} from "../../../utils/Address.sol";
    /**
    * @title SafeERC20
    * @dev Wrappers around ERC-20 operations that throw on failure (when the token
    * contract returns false). Tokens that return no value (and instead revert or
    * throw on failure) are also supported, non-reverting calls are assumed to be
    * successful.
    * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
    * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
    */
    library SafeERC20 {
    /**
    * @dev An operation with an ERC-20 token failed.
    */
    error SafeERC20FailedOperation(address token);
    /**
    * @dev Indicates a failed `decreaseAllowance` request.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 35 of 53 : ILayerZeroEndpointV2.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    import { IMessageLibManager } from "./IMessageLibManager.sol";
    import { IMessagingComposer } from "./IMessagingComposer.sol";
    import { IMessagingChannel } from "./IMessagingChannel.sol";
    import { IMessagingContext } from "./IMessagingContext.sol";
    struct MessagingParams {
    uint32 dstEid;
    bytes32 receiver;
    bytes message;
    bytes options;
    bool payInLzToken;
    }
    struct MessagingReceipt {
    bytes32 guid;
    uint64 nonce;
    MessagingFee fee;
    }
    struct MessagingFee {
    uint256 nativeFee;
    uint256 lzTokenFee;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 36 of 53 : IOAppReceiver.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { ILayerZeroReceiver, Origin } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroReceiver.sol";
    interface IOAppReceiver is ILayerZeroReceiver {
    /**
    * @notice Indicates whether an address is an approved composeMsg sender to the Endpoint.
    * @param _origin The origin information containing the source endpoint and sender address.
    * - srcEid: The source chain endpoint ID.
    * - sender: The sender address on the src chain.
    * - nonce: The nonce of the message.
    * @param _message The lzReceive payload.
    * @param _sender The sender address.
    * @return isSender Is a valid sender.
    *
    * @dev Applications can optionally choose to implement a separate composeMsg sender that is NOT the bridging layer.
    * @dev The default sender IS the OAppReceiver implementer.
    */
    function isComposeMsgSender(
    Origin calldata _origin,
    bytes calldata _message,
    address _sender
    ) external view returns (bool isSender);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 37 of 53 : IOAppCore.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
    /**
    * @title IOAppCore
    */
    interface IOAppCore {
    // Custom error messages
    error OnlyPeer(uint32 eid, bytes32 sender);
    error NoPeer(uint32 eid);
    error InvalidEndpointCall();
    error InvalidDelegate();
    // Event emitted when a peer (OApp) is set for a corresponding endpoint
    event PeerSet(uint32 eid, bytes32 peer);
    /**
    * @notice Retrieves the OApp version information.
    * @return senderVersion The version of the OAppSender.sol contract.
    * @return receiverVersion The version of the OAppReceiver.sol contract.
    */
    function oAppVersion() external view returns (uint64 senderVersion, uint64 receiverVersion);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 38 of 53 : Packet.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { Origin } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
    import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol";
    /**
    * @title InboundPacket
    * @dev Structure representing an inbound packet received by the contract.
    */
    struct InboundPacket {
    Origin origin; // Origin information of the packet.
    uint32 dstEid; // Destination endpointId of the packet.
    address receiver; // Receiver address for the packet.
    bytes32 guid; // Unique identifier of the packet.
    uint256 value; // msg.value of the packet.
    address executor; // Executor address for the packet.
    bytes message; // Message payload of the packet.
    bytes extraData; // Additional arbitrary data for the packet.
    }
    /**
    * @title PacketDecoder
    * @dev Library for decoding LayerZero packets.
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 39 of 53 : IERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Interface of the ERC-20 standard as defined in the ERC.
    */
    interface IERC20 {
    /**
    * @dev Emitted when `value` tokens are moved from one account (`from`) to
    * another (`to`).
    *
    * Note that `value` may be zero.
    */
    event Transfer(address indexed from, address indexed to, uint256 value);
    /**
    * @dev Emitted when the allowance of a `spender` for an `owner` is set by
    * a call to {approve}. `value` is the new allowance.
    */
    event Approval(address indexed owner, address indexed spender, uint256 value);
    /**
    * @dev Returns the value of tokens in existence.
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 40 of 53 : IERC1363.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "./IERC20.sol";
    import {IERC165} from "./IERC165.sol";
    /**
    * @title IERC1363
    * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
    *
    * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
    * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
    */
    interface IERC1363 is IERC20, IERC165 {
    /*
    * Note: the ERC-165 identifier for this interface is 0xb0202a11.
    * 0xb0202a11 ===
    * bytes4(keccak256('transferAndCall(address,uint256)')) ^
    * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
    * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
    * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
    * bytes4(keccak256('approveAndCall(address,uint256)')) ^
    * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 41 of 53 : Address.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol)
    pragma solidity ^0.8.20;
    import {Errors} from "./Errors.sol";
    /**
    * @dev Collection of functions related to the address type
    */
    library Address {
    /**
    * @dev There's no code at `target` (it is not a contract).
    */
    error AddressEmptyCode(address target);
    /**
    * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
    * `recipient`, forwarding all available gas and reverting on errors.
    *
    * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
    * of certain opcodes, possibly making contracts go over the 2300 gas limit
    * imposed by `transfer`, making them unable to receive funds via
    * `transfer`. {sendValue} removes this limitation.
    *
    * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 42 of 53 : IMessageLibManager.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    struct SetConfigParam {
    uint32 eid;
    uint32 configType;
    bytes config;
    }
    interface IMessageLibManager {
    struct Timeout {
    address lib;
    uint256 expiry;
    }
    event LibraryRegistered(address newLib);
    event DefaultSendLibrarySet(uint32 eid, address newLib);
    event DefaultReceiveLibrarySet(uint32 eid, address newLib);
    event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);
    event SendLibrarySet(address sender, uint32 eid, address newLib);
    event ReceiveLibrarySet(address receiver, uint32 eid, address newLib);
    event ReceiveLibraryTimeoutSet(address receiver, uint32 eid, address oldLib, uint256 timeout);
    function registerLibrary(address _lib) external;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 43 of 53 : IMessagingComposer.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface IMessagingComposer {
    event ComposeSent(address from, address to, bytes32 guid, uint16 index, bytes message);
    event ComposeDelivered(address from, address to, bytes32 guid, uint16 index);
    event LzComposeAlert(
    address indexed from,
    address indexed to,
    address indexed executor,
    bytes32 guid,
    uint16 index,
    uint256 gas,
    uint256 value,
    bytes message,
    bytes extraData,
    bytes reason
    );
    function composeQueue(
    address _from,
    address _to,
    bytes32 _guid,
    uint16 _index
    ) external view returns (bytes32 messageHash);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 44 of 53 : IMessagingChannel.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface IMessagingChannel {
    event InboundNonceSkipped(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce);
    event PacketNilified(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
    event PacketBurnt(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
    function eid() external view returns (uint32);
    // this is an emergency function if a message cannot be verified for some reasons
    // required to provide _nextNonce to avoid race condition
    function skip(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce) external;
    function nilify(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
    function burn(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
    function nextGuid(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (bytes32);
    function inboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);
    function outboundNonce(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (uint64);
    function inboundPayloadHash(
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 45 of 53 : IMessagingContext.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface IMessagingContext {
    function isSendingMessage() external view returns (bool);
    function getSendContext() external view returns (uint32 dstEid, address sender);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 46 of 53 : ILayerZeroReceiver.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    import { Origin } from "./ILayerZeroEndpointV2.sol";
    interface ILayerZeroReceiver {
    function allowInitializePath(Origin calldata _origin) external view returns (bool);
    function nextNonce(uint32 _eid, bytes32 _sender) external view returns (uint64);
    function lzReceive(
    Origin calldata _origin,
    bytes32 _guid,
    bytes calldata _message,
    address _executor,
    bytes calldata _extraData
    ) external payable;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 47 of 53 : PacketV1Codec.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    import { Packet } from "../../interfaces/ISendLib.sol";
    import { AddressCast } from "../../libs/AddressCast.sol";
    library PacketV1Codec {
    using AddressCast for address;
    using AddressCast for bytes32;
    uint8 internal constant PACKET_VERSION = 1;
    // header (version + nonce + path)
    // version
    uint256 private constant PACKET_VERSION_OFFSET = 0;
    // nonce
    uint256 private constant NONCE_OFFSET = 1;
    // path
    uint256 private constant SRC_EID_OFFSET = 9;
    uint256 private constant SENDER_OFFSET = 13;
    uint256 private constant DST_EID_OFFSET = 45;
    uint256 private constant RECEIVER_OFFSET = 49;
    // payload (guid + message)
    uint256 private constant GUID_OFFSET = 81; // keccak256(nonce + path)
    uint256 private constant MESSAGE_OFFSET = 113;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 48 of 53 : IERC20.sol
    1
    2
    3
    4
    5
    6
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "../token/ERC20/IERC20.sol";
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 49 of 53 : IERC165.sol
    1
    2
    3
    4
    5
    6
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)
    pragma solidity ^0.8.20;
    import {IERC165} from "../utils/introspection/IERC165.sol";
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 50 of 53 : Errors.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Collection of common custom errors used in multiple contracts
    *
    * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
    * It is recommended to avoid relying on the error API for critical functionality.
    *
    * _Available since v5.1._
    */
    library Errors {
    /**
    * @dev The ETH balance of the account is not enough to perform the operation.
    */
    error InsufficientBalance(uint256 balance, uint256 needed);
    /**
    * @dev A call to an address target failed. The target may have reverted.
    */
    error FailedCall();
    /**
    * @dev The deployment failed.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 51 of 53 : ISendLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    import { MessagingFee } from "./ILayerZeroEndpointV2.sol";
    import { IMessageLib } from "./IMessageLib.sol";
    struct Packet {
    uint64 nonce;
    uint32 srcEid;
    address sender;
    uint32 dstEid;
    bytes32 receiver;
    bytes32 guid;
    bytes message;
    }
    interface ISendLib is IMessageLib {
    function send(
    Packet calldata _packet,
    bytes calldata _options,
    bool _payInLzToken
    ) external returns (MessagingFee memory, bytes memory encodedPacket);
    function quote(
    Packet calldata _packet,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 52 of 53 : AddressCast.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: LZBL-1.2
    pragma solidity ^0.8.20;
    library AddressCast {
    error AddressCast_InvalidSizeForAddress();
    error AddressCast_InvalidAddress();
    function toBytes32(bytes calldata _addressBytes) internal pure returns (bytes32 result) {
    if (_addressBytes.length > 32) revert AddressCast_InvalidAddress();
    result = bytes32(_addressBytes);
    unchecked {
    uint256 offset = 32 - _addressBytes.length;
    result = result >> (offset * 8);
    }
    }
    function toBytes32(address _address) internal pure returns (bytes32 result) {
    result = bytes32(uint256(uint160(_address)));
    }
    function toBytes(bytes32 _addressBytes32, uint256 _size) internal pure returns (bytes memory result) {
    if (_size == 0 || _size > 32) revert AddressCast_InvalidSizeForAddress();
    result = new bytes(_size);
    unchecked {
    uint256 offset = 256 - _size * 8;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 53 of 53 : IMessageLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
    import { SetConfigParam } from "./IMessageLibManager.sol";
    enum MessageLibType {
    Send,
    Receive,
    SendAndReceive
    }
    interface IMessageLib is IERC165 {
    function setConfig(address _oapp, SetConfigParam[] calldata _config) external;
    function getConfig(uint32 _eid, address _oapp, uint32 _configType) external view returns (bytes memory config);
    function isSupportedEid(uint32 _eid) external view returns (bool);
    // message libs of same major version are compatible
    function version() external view returns (uint64 major, uint8 minor, uint8 endpointVersion);
    function messageLibType() external view returns (MessageLibType);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Settings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    {
    "remappings": [
    "@layerzerolabs/onft-evm/=lib/devtools/packages/onft-evm/",
    "@layerzerolabs/oft-evm/=lib/devtools/packages/oft-evm/",
    "@layerzerolabs/oapp-evm/=lib/devtools/packages/oapp-evm/",
    "@layerzerolabs/lz-evm-protocol-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/protocol/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "layerzero-v2/=lib/layerzero-v2/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
    ],
    "optimizer": {
    "enabled": true,
    "runs": 200
    },
    "metadata": {
    "useLiteralContent": true,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
    },
    "outputSelection": {
    "*": {
    "*": [
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Contract Security Audit

    Contract ABI

    API
    [{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"address","name":"_delegate","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC721EnumerableForbiddenBatchMint","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"ERC721OutOfBoundsIndex","type":"error"},{"inputs":[],"name":"InvalidDelegate","type":"error"},{"inputs":[],"name":"InvalidEndpointCall","type":"error"},{"inputs":[{"internalType":"bytes","name":"options","type":"bytes"}],"name":"InvalidOptions","type":"error"},{"inputs":[],"name":"InvalidReceiver","type":"error"},{"inputs":[],"name":"LzTokenUnavailable","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"NoPeer","type":"error"},{"inputs":[{"internalType":"uint256","name":"msgValue","type":"uint256"}],"name":"NotEnoughNative","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"OnlyEndpoint","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"OnlyNFTOwner","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"}],"name":"OnlyPeer","type":"error"},{"inputs":[],"name":"OnlySelf","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"name":"SimulationResult","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURISet","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"},{"internalType":"bytes","name":"options","type":"bytes"}],"indexed":false,"internalType":"struct EnforcedOptionParam[]","name":"_enforcedOptions","type":"tuple[]"}],"name":"EnforcedOptionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"inspector","type":"address"}],"name":"MsgInspectorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"srcEid","type":"uint32"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ONFTReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"dstEid","type":"uint32"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ONFTSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"peer","type":"bytes32"}],"name":"PeerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"preCrimeAddress","type":"address"}],"name":"PreCrimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"SEND","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEND_AND_COMPOSE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"origin","type":"tuple"}],"name":"allowInitializePath","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approvalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"uint16","name":"_msgType","type":"uint16"},{"internalType":"bytes","name":"_extraOptions","type":"bytes"}],"name":"combineOptions","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpointV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"}],"name":"enforcedOptions","outputs":[{"internalType":"bytes","name":"enforcedOption","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"_sender","type":"address"}],"name":"isComposeMsgSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"bytes32","name":"_peer","type":"bytes32"}],"name":"isPeer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"origin","type":"tuple"},{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct InboundPacket[]","name":"_packets","type":"tuple[]"}],"name":"lzReceiveAndRevert","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceiveSimulate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"msgInspector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"nextNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oApp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oAppVersion","outputs":[{"internalType":"uint64","name":"senderVersion","type":"uint64"},{"internalType":"uint64","name":"receiverVersion","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"onftVersion","outputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"},{"internalType":"uint64","name":"version","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"peers","outputs":[{"internalType":"bytes32","name":"peer","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preCrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"onftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"quoteSend","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"msgFee","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"onftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"_fee","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"send","outputs":[{"components":[{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"internalType":"struct MessagingReceipt","name":"msgReceipt","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"},{"internalType":"bytes","name":"options","type":"bytes"}],"internalType":"struct EnforcedOptionParam[]","name":"_enforcedOptions","type":"tuple[]"}],"name":"setEnforcedOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_msgInspector","type":"address"}],"name":"setMsgInspector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"bytes32","name":"_peer","type":"bytes32"}],"name":"setPeer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_preCrime","type":"address"}],"name":"setPreCrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

    60a060405234801561001057600080fd5b50604051613ea3380380613ea383398101604081905261002f91610257565b838383838383838381818181806001600160a01b03811661006a57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61007381610132565b506001600160a01b0380831660805281166100a157604051632d618d8160e21b815260040160405180910390fd5b60805160405163ca5eb5e160e01b81526001600160a01b0383811660048301529091169063ca5eb5e190602401600060405180830381600087803b1580156100e857600080fd5b505af11580156100fc573d6000803e3d6000fd5b505050505050505050508160059081610115919061036a565b506006610122828261036a565b5050505050505050505050610428565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101a957600080fd5b81516001600160401b038111156101c2576101c2610182565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101f0576101f0610182565b60405281815283820160200185101561020857600080fd5b60005b828110156102275760208186018101518383018201520161020b565b506000918101602001919091529392505050565b80516001600160a01b038116811461025257600080fd5b919050565b6000806000806080858703121561026d57600080fd5b84516001600160401b0381111561028357600080fd5b61028f87828801610198565b602087015190955090506001600160401b038111156102ad57600080fd5b6102b987828801610198565b9350506102c86040860161023b565b91506102d66060860161023b565b905092959194509250565b600181811c908216806102f557607f821691505b60208210810361031557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561036557806000526020600020601f840160051c810160208510156103425750805b601f840160051c820191505b81811015610362576000815560010161034e565b50505b505050565b81516001600160401b0381111561038357610383610182565b6103978161039184546102e1565b8461031b565b6020601f8211600181146103cb57600083156103b35750848201515b600019600385901b1c1916600184901b178455610362565b600084815260208120601f198516915b828110156103fb57878501518255602094850194600190920191016103db565b50848210156104195786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b608051613a2f61047460003960008181610541015281816109a10152818161134d01528181611607015281816118ab01528181611d6d0152818161219e01526122570152613a2f6000f3fe6080604052600436106102935760003560e01c80637d25a05e1161015a578063bb0b6a53116100c1578063d045a0dc1161007a578063d045a0dc14610831578063d424388514610844578063e985e9c514610864578063f2fde38b14610884578063fc0c546a146104a5578063ff7bd03d146108a457600080fd5b8063bb0b6a5314610764578063bc70b35414610791578063bd815db0146107b1578063c6414e7b146107c4578063c87b56dd146107f1578063ca5eb5e11461081157600080fd5b8063a22cb46511610113578063a22cb465146106a7578063a72f5dd8146106c7578063b21a33e4146106ef578063b731ea0a14610704578063b88d4fde14610724578063b98bd0701461074457600080fd5b80637d25a05e146105d857806382413eac146106135780638462151c146106335780638da5cb5b1461066057806395d89b411461067e5780639f68b9641461069357600080fd5b80633400288b116101fe5780635a0dfe4d116101b75780635a0dfe4d146104f85780635e280f111461052f5780636352211e146105635780636fc1b31e1461058357806370a08231146105a3578063715018a6146105c357600080fd5b80633400288b1461044557806342842e0e146104655780634f6ccce71461048557806352ae2879146104a55780635535d461146104b857806355f804b3146104d857600080fd5b806317442b701161025057806317442b701461037c57806318160ddd1461039e5780631f5e1334146103bd57806321eb730b146103e557806323b872dd146104055780632f745c591461042557600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b314610327578063111ecdad1461034957806313137d6514610369575b600080fd5b3480156102a457600080fd5b506102b86102b33660046128ee565b6108c4565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26108d5565b6040516102c4919061295b565b3480156102fb57600080fd5b5061030f61030a36600461296e565b610967565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b5061034761034236600461299c565b610990565b005b34801561035557600080fd5b5060045461030f906001600160a01b031681565b610347610377366004612a28565b61099f565b34801561038857600080fd5b50604080516001815260026020820152016102c4565b3480156103aa57600080fd5b50600e545b6040519081526020016102c4565b3480156103c957600080fd5b506103d2600181565b60405161ffff90911681526020016102c4565b6103f86103f3366004612adb565b610a5f565b6040516102c49190612b48565b34801561041157600080fd5b50610347610420366004612b8a565b610b18565b34801561043157600080fd5b506103af61044036600461299c565b610ba3565b34801561045157600080fd5b50610347610460366004612be4565b610c08565b34801561047157600080fd5b50610347610480366004612b8a565b610c1a565b34801561049157600080fd5b506103af6104a036600461296e565b610c3a565b3480156104b157600080fd5b503061030f565b3480156104c457600080fd5b506102e26104d3366004612c12565b610c93565b3480156104e457600080fd5b506103476104f3366004612c45565b610d38565b34801561050457600080fd5b506102b8610513366004612be4565b63ffffffff919091166000908152600160205260409020541490565b34801561053b57600080fd5b5061030f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561056f57600080fd5b5061030f61057e36600461296e565b610d8a565b34801561058f57600080fd5b5061034761059e366004612c86565b610d95565b3480156105af57600080fd5b506103af6105be366004612c86565b610df2565b3480156105cf57600080fd5b50610347610e3a565b3480156105e457600080fd5b506105fb6105f3366004612be4565b600092915050565b6040516001600160401b0390911681526020016102c4565b34801561061f57600080fd5b506102b861062e366004612ca3565b610e4e565b34801561063f57600080fd5b5061065361064e366004612c86565b610e63565b6040516102c49190612d09565b34801561066c57600080fd5b506000546001600160a01b031661030f565b34801561068a57600080fd5b506102e2610efa565b34801561069f57600080fd5b5060006102b8565b3480156106b357600080fd5b506103476106c2366004612d5a565b610f09565b3480156106d357600080fd5b50604080516311f0c6d360e11b815260016020820152016102c4565b3480156106fb57600080fd5b506103d2600281565b34801561071057600080fd5b5060025461030f906001600160a01b031681565b34801561073057600080fd5b5061034761073f366004612ea0565b610f14565b34801561075057600080fd5b5061034761075f366004612f4f565b610f2c565b34801561077057600080fd5b506103af61077f366004612f84565b60016020526000908152604090205481565b34801561079d57600080fd5b506102e26107ac366004612f9f565b610f46565b6103476107bf366004612f4f565b6110ee565b3480156107d057600080fd5b506107e46107df366004612fff565b611278565b6040516102c49190613045565b3480156107fd57600080fd5b506102e261080c36600461296e565b6112be565b34801561081d57600080fd5b5061034761082c366004612c86565b611326565b61034761083f366004612a28565b6113ac565b34801561085057600080fd5b5061034761085f366004612c86565b6113db565b34801561087057600080fd5b506102b861087f36600461305c565b611431565b34801561089057600080fd5b5061034761089f366004612c86565b61145f565b3480156108b057600080fd5b506102b86108bf36600461308a565b61149d565b60006108cf826114d3565b92915050565b6060600580546108e4906130a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610910906130a6565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b5050505050905090565b6000610972826114f8565b506000828152600960205260409020546001600160a01b03166108cf565b61099b828233611531565b5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146109ef576040516391ac5e4f60e01b81523360048201526024015b60405180910390fd5b60208701803590610a0990610a04908a612f84565b61153e565b14610a4757610a1b6020880188612f84565b60405163309afaf360e21b815263ffffffff9091166004820152602088013560248201526044016109e6565b610a568787878787878761157a565b50505050505050565b610a67612891565b610a82336040860135610a7d6020880188612f84565b6116d9565b600080610a8e86611739565b9092509050610aba610aa36020880188612f84565b8383610ab4368a90038a018a6130da565b88611878565b805190935033907f986156872b2ee0022b9585231dbbfde457f87f8a16b6c45e1a81c54c4ad8351f610aef60208a018a612f84565b6040805163ffffffff9092168252808b013560208301520160405180910390a350509392505050565b6001600160a01b038216610b4257604051633250574960e11b8152600060048201526024016109e6565b6000610b4f838333611983565b9050836001600160a01b0316816001600160a01b031614610b9d576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016109e6565b50505050565b6000610bae83610df2565b8210610bdf5760405163295f44f760e21b81526001600160a01b0384166004820152602481018390526044016109e6565b506001600160a01b03919091166000908152600c60209081526040808320938352929052205490565b610c10611990565b61099b82826119bd565b610c3583838360405180602001604052806000815250610f14565b505050565b6000610c45600e5490565b8210610c6e5760405163295f44f760e21b815260006004820152602481018390526044016109e6565b600e8281548110610c8157610c8161310d565b90600052602060002001549050919050565b600360209081526000928352604080842090915290825290208054610cb7906130a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce3906130a6565b8015610d305780601f10610d0557610100808354040283529160200191610d30565b820191906000526020600020905b815481529060010190602001808311610d1357829003601f168201915b505050505081565b610d40611990565b600b610d4d82848361316a565b507ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f6600b604051610d7e9190613229565b60405180910390a15050565b60006108cf826114f8565b610d9d611990565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906020015b60405180910390a150565b60006001600160a01b038216610e1e576040516322718ad960e21b8152600060048201526024016109e6565b506001600160a01b031660009081526008602052604090205490565b610e42611990565b610e4c6000611a0b565b565b6001600160a01b03811630145b949350505050565b60606000610e7083610df2565b90506000816001600160401b03811115610e8c57610e8c612d93565b604051908082528060200260200182016040528015610eb5578160200160208202803683370190505b50905060005b82811015610ef257610ecd8582610ba3565b828281518110610edf57610edf61310d565b6020908102919091010152600101610ebb565b509392505050565b6060600680546108e4906130a6565b61099b338383611a5b565b610f1f848484610b18565b610b9d3385858585611afa565b610f34611990565b61099b610f4182846132b5565b611c24565b63ffffffff8416600090815260036020908152604080832061ffff87168452909152812080546060929190610f7a906130a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa6906130a6565b8015610ff35780601f10610fc857610100808354040283529160200191610ff3565b820191906000526020600020905b815481529060010190602001808311610fd657829003601f168201915b5050505050905080516000036110435783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929450610e5b9350505050565b6000839003611053579050610e5b565b600283106110d15761109a84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d2b92505050565b806110a88460028188613392565b6040516020016110ba939291906133bc565b604051602081830303815290604052915050610e5b565b8383604051639a6d49cd60e01b81526004016109e692919061340d565b60005b818110156111f7573683838381811061110c5761110c61310d565b905060200281019061111e9190613421565b90506111516111306020830183612f84565b602083013563ffffffff919091166000908152600160205260409020541490565b61115b57506111ef565b3063d045a0dc60c08301358360a081013561117a610100830183613442565b61118b610100890160e08a01612c86565b6111996101208a018a613442565b6040518963ffffffff1660e01b81526004016111bb979695949392919061349d565b6000604051808303818588803b1580156111d457600080fd5b505af11580156111e8573d6000803e3d6000fd5b5050505050505b6001016110f1565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b8152600401600060405180830381865afa158015611236573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261125e9190810190613523565b604051638351eea760e01b81526004016109e6919061295b565b604080518082019091526000808252602082015260008061129885611739565b90925090506112b56112ad6020870187612f84565b838387611d57565b95945050505050565b60606112c9826114f8565b5060006112d4611e2f565b905060008151116112f4576040518060200160405280600081525061131f565b806112fe84611e3e565b60405160200161130f929190613590565b6040516020818303038152906040525b9392505050565b61132e611990565b60405163ca5eb5e160e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190602401600060405180830381600087803b15801561139157600080fd5b505af11580156113a5573d6000803e3d6000fd5b5050505050565b3330146113cc5760405163029a949d60e31b815260040160405180910390fd5b610a5687878787878787610a47565b6113e3611990565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090602001610de7565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b611467611990565b6001600160a01b03811661149157604051631e4fbdf760e01b8152600060048201526024016109e6565b61149a81611a0b565b50565b60006020820180359060019083906114b59086612f84565b63ffffffff1681526020810191909152604001600020541492915050565b60006001600160e01b0319821663780e9d6360e01b14806108cf57506108cf82611ed0565b6000818152600760205260408120546001600160a01b0316806108cf57604051637e27328960e01b8152600481018490526024016109e6565b610c358383836001611f20565b63ffffffff8116600090815260016020526040812054806108cf5760405163f6ff4fb760e01b815263ffffffff841660048201526024016109e6565b600061158c6115898787612026565b90565b9050600061159a878761203e565b90506115b382826115ae60208d018d612f84565b61204e565b60408611156116775760006115ed6115d160608c0160408d016135bf565b6115de60208d018d612f84565b6115e88b8b612058565b6120a3565b604051633e5ac80960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb59012906116439086908d9060009087906004016135dc565b600060405180830381600087803b15801561165d57600080fd5b505af1158015611671573d6000803e3d6000fd5b50505050505b6001600160a01b038216887f7883fa30ea56937810e36990b0bbb8d629d0cf59f68baf8431ff657cebe7eef56116b060208d018d612f84565b6040805163ffffffff9092168252602082018690520160405180910390a3505050505050505050565b6116e282610d8a565b6001600160a01b0316836001600160a01b031614611730578261170483610d8a565b604051634342715b60e11b81526001600160a01b039283166004820152911660248201526044016109e6565b610c35826120d2565b606080602083013561175e57604051631e4ec46b60e01b815260040160405180910390fd5b60006117b46020850135604086013561177a6080880188613442565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061210d92505050565b90935090506000816117c75760016117ca565b60025b90506117ea6117dc6020870187612f84565b826107ac6060890189613442565b6004549093506001600160a01b031680156118705760405163043a78eb60e01b81526001600160a01b0382169063043a78eb9061182d9088908890600401613617565b602060405180830381865afa15801561184a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186e919061363c565b505b505050915091565b611880612891565b600061188f8460000151612172565b6020850151909150156118a9576118a9846020015161219a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a450826040518060a001604052808b63ffffffff1681526020016118f98c61153e565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b8152600401611935929190613659565b60806040518083038185885af1158015611953573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906119789190613703565b979650505050505050565b6000610e5b84848461227c565b6000546001600160a01b03163314610e4c5760405163118cdaa760e01b81523360048201526024016109e6565b63ffffffff8216600081815260016020908152604091829020849055815192835282018390527f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b9101610d7e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216611a8d57604051630b61174360e31b81526001600160a01b03831660048201526024016109e6565b6001600160a01b038381166000818152600a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b156113a557604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611b3c90889088908790879060040161374f565b6020604051808303816000875af1925050508015611b77575060408051601f3d908101601f19168201909252611b7491810190613782565b60015b611be0573d808015611ba5576040519150601f19603f3d011682016040523d82523d6000602084013e611baa565b606091505b508051600003611bd857604051633250574960e11b81526001600160a01b03851660048201526024016109e6565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14611c1c57604051633250574960e11b81526001600160a01b03851660048201526024016109e6565b505050505050565b60005b8151811015611cfb57611c56828281518110611c4557611c4561310d565b602002602001015160400151611d2b565b818181518110611c6857611c6861310d565b60200260200101516040015160036000848481518110611c8a57611c8a61310d565b60200260200101516000015163ffffffff1663ffffffff1681526020019081526020016000206000848481518110611cc457611cc461310d565b60200260200101516020015161ffff1661ffff1681526020019081526020016000209081611cf2919061379f565b50600101611c27565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67481604051610de7919061385d565b600281015161ffff811660031461099b5781604051639a6d49cd60e01b81526004016109e6919061295b565b60408051808201909152600080825260208201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff168152602001611dba8961153e565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401611def929190613659565b6040805180830381865afa158015611e0b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b591906138ed565b6060600b80546108e4906130a6565b60606000611e4b83612349565b60010190506000816001600160401b03811115611e6a57611e6a612d93565b6040519080825280601f01601f191660200182016040528015611e94576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611e9e57509392505050565b60006001600160e01b031982166380ac58cd60e01b1480611f0157506001600160e01b03198216635b5e139f60e01b145b806108cf57506301ffc9a760e01b6001600160e01b03198316146108cf565b8080611f3457506001600160a01b03821615155b15611ff6576000611f44846114f8565b90506001600160a01b03831615801590611f705750826001600160a01b0316816001600160a01b031614155b8015611f835750611f818184611431565b155b15611fac5760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016109e6565b8115611ff45783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260096020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b60006120356020828486613392565b61131f91613909565b6000612035604060208486613392565b610c358383612421565b60606120678260408186613392565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929695505050505050565b60608383836040516020016120ba93929190613927565b60405160208183030381529060405290509392505050565b60006120e16000836000611983565b90506001600160a01b03811661099b57604051637e27328960e01b8152600481018390526024016109e6565b8051606090151580612141576040805160208101879052908101859052606001604051602081830303815290604052612168565b848433856040516020016121589493929190613971565b6040516020818303038152906040525b9150935093915050565b6000813414612196576040516304fb820960e51b81523460048201526024016109e6565b5090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221e91906139a5565b90506001600160a01b038116612247576040516329b99a9560e11b815260040160405180910390fd5b61099b6001600160a01b038216337f000000000000000000000000000000000000000000000000000000000000000085612486565b60008061228a8585856124e0565b90506001600160a01b0381166122e7576122e284600e80546000838152600f60205260408120829055600182018355919091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0155565b61230a565b846001600160a01b0316816001600160a01b03161461230a5761230a81856125d9565b6001600160a01b038516612326576123218461265a565b610e5b565b846001600160a01b0316816001600160a01b031614610e5b57610e5b8585612709565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106123885772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106123b4576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106123d257662386f26fc10000830492506010015b6305f5e10083106123ea576305f5e100830492506008015b61271083106123fe57612710830492506004015b60648310612410576064830492506002015b600a83106108cf5760010192915050565b6001600160a01b03821661244b57604051633250574960e11b8152600060048201526024016109e6565b600061245983836000611983565b90506001600160a01b03811615610c35576040516339e3563760e11b8152600060048201526024016109e6565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610b9d908590612759565b6000828152600760205260408120546001600160a01b039081169083161561250d5761250d8184866127ca565b6001600160a01b0381161561254b5761252a600085600080611f20565b6001600160a01b038116600090815260086020526040902080546000190190555b6001600160a01b0385161561257a576001600160a01b0385166000908152600860205260409020805460010190555b60008481526007602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b60006125e483610df2565b6000838152600d60209081526040808320546001600160a01b0388168452600c9092529091209192509081831461263b57600083815260208281526040808320548584528184208190558352600d90915290208290555b6000938452600d60209081526040808620869055938552525081205550565b600e5460009061266c906001906139c2565b6000838152600f6020526040812054600e80549394509092849081106126945761269461310d565b9060005260206000200154905080600e83815481106126b5576126b561310d565b6000918252602080832090910192909255828152600f9091526040808220849055858252812055600e8054806126ed576126ed6139e3565b6001900381819060005260206000200160009055905550505050565b6000600161271684610df2565b61272091906139c2565b6001600160a01b039093166000908152600c602090815260408083208684528252808320859055938252600d9052919091209190915550565b600080602060008451602086016000885af18061277c576040513d6000823e3d81fd5b50506000513d915081156127945780600114156127a1565b6001600160a01b0384163b155b15610b9d57604051635274afe760e01b81526001600160a01b03851660048201526024016109e6565b6127d583838361282e565b610c35576001600160a01b03831661280357604051637e27328960e01b8152600481018290526024016109e6565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016109e6565b60006001600160a01b03831615801590610e5b5750826001600160a01b0316846001600160a01b0316148061286857506128688484611431565b80610e5b5750506000908152600960205260409020546001600160a01b03908116911614919050565b60405180606001604052806000801916815260200160006001600160401b031681526020016128d3604051806040016040528060008152602001600081525090565b905290565b6001600160e01b03198116811461149a57600080fd5b60006020828403121561290057600080fd5b813561131f816128d8565b60005b8381101561292657818101518382015260200161290e565b50506000910152565b6000815180845261294781602086016020860161290b565b601f01601f19169290920160200192915050565b60208152600061131f602083018461292f565b60006020828403121561298057600080fd5b5035919050565b6001600160a01b038116811461149a57600080fd5b600080604083850312156129af57600080fd5b82356129ba81612987565b946020939093013593505050565b6000606082840312156129da57600080fd5b50919050565b60008083601f8401126129f257600080fd5b5081356001600160401b03811115612a0957600080fd5b602083019150836020828501011115612a2157600080fd5b9250929050565b600080600080600080600060e0888a031215612a4357600080fd5b612a4d89896129c8565b96506060880135955060808801356001600160401b03811115612a6f57600080fd5b612a7b8a828b016129e0565b90965094505060a0880135612a8f81612987565b925060c08801356001600160401b03811115612aaa57600080fd5b612ab68a828b016129e0565b989b979a50959850939692959293505050565b600060c082840312156129da57600080fd5b60008060008385036080811215612af157600080fd5b84356001600160401b03811115612b0757600080fd5b612b1387828801612ac9565b9450506040601f1982011215612b2857600080fd5b506020840191506060840135612b3d81612987565b809150509250925092565b6000608082019050825182526001600160401b0360208401511660208301526040830151612b83604084018280518252602090810151910152565b5092915050565b600080600060608486031215612b9f57600080fd5b8335612baa81612987565b92506020840135612bba81612987565b929592945050506040919091013590565b803563ffffffff81168114612bdf57600080fd5b919050565b60008060408385031215612bf757600080fd5b6129ba83612bcb565b803561ffff81168114612bdf57600080fd5b60008060408385031215612c2557600080fd5b612c2e83612bcb565b9150612c3c60208401612c00565b90509250929050565b60008060208385031215612c5857600080fd5b82356001600160401b03811115612c6e57600080fd5b612c7a858286016129e0565b90969095509350505050565b600060208284031215612c9857600080fd5b813561131f81612987565b60008060008060a08587031215612cb957600080fd5b612cc386866129c8565b935060608501356001600160401b03811115612cde57600080fd5b612cea878288016129e0565b9094509250506080850135612cfe81612987565b939692955090935050565b602080825282518282018190526000918401906040840190835b81811015612d41578351835260209384019390920191600101612d23565b509095945050505050565b801515811461149a57600080fd5b60008060408385031215612d6d57600080fd5b8235612d7881612987565b91506020830135612d8881612d4c565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612dcb57612dcb612d93565b60405290565b604051606081016001600160401b0381118282101715612dcb57612dcb612d93565b604051601f8201601f191681016001600160401b0381118282101715612e1b57612e1b612d93565b604052919050565b60006001600160401b03821115612e3c57612e3c612d93565b50601f01601f191660200190565b600082601f830112612e5b57600080fd5b8135612e6e612e6982612e23565b612df3565b818152846020838601011115612e8357600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612eb657600080fd5b8435612ec181612987565b93506020850135612ed181612987565b92506040850135915060608501356001600160401b03811115612ef357600080fd5b612eff87828801612e4a565b91505092959194509250565b60008083601f840112612f1d57600080fd5b5081356001600160401b03811115612f3457600080fd5b6020830191508360208260051b8501011115612a2157600080fd5b60008060208385031215612f6257600080fd5b82356001600160401b03811115612f7857600080fd5b612c7a85828601612f0b565b600060208284031215612f9657600080fd5b61131f82612bcb565b60008060008060608587031215612fb557600080fd5b612fbe85612bcb565b9350612fcc60208601612c00565b925060408501356001600160401b03811115612fe757600080fd5b612ff3878288016129e0565b95989497509550505050565b6000806040838503121561301257600080fd5b82356001600160401b0381111561302857600080fd5b61303485828601612ac9565b9250506020830135612d8881612d4c565b8151815260208083015190820152604081016108cf565b6000806040838503121561306f57600080fd5b823561307a81612987565b91506020830135612d8881612987565b60006060828403121561309c57600080fd5b61131f83836129c8565b600181811c908216806130ba57607f821691505b6020821081036129da57634e487b7160e01b600052602260045260246000fd5b600060408284031280156130ed57600080fd5b506130f6612da9565b823581526020928301359281019290925250919050565b634e487b7160e01b600052603260045260246000fd5b601f821115610c3557806000526020600020601f840160051c8101602085101561314a5750805b601f840160051c820191505b818110156113a55760008155600101613156565b6001600160401b0383111561318157613181612d93565b6131958361318f83546130a6565b83613123565b6000601f8411600181146131c957600085156131b15750838201355b600019600387901b1c1916600186901b1783556113a5565b600083815260209020601f19861690835b828110156131fa57868501358255602094850194600190920191016131da565b50868210156132175760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152600080835461323b816130a6565b806020860152600182166000811461325a5760018114613276576132aa565b60ff1983166040870152604082151560051b87010193506132aa565b86600052602060002060005b838110156132a157815488820160400152600190910190602001613282565b87016040019450505b509195945050505050565b60006001600160401b038311156132ce576132ce612d93565b8260051b6132de60208201612df3565b848152908301906020810190368311156132f757600080fd5b845b838110156133885780356001600160401b0381111561331757600080fd5b8601606036829003121561332a57600080fd5b613332612dd1565b61333b82612bcb565b815261334960208301612c00565b602082015260408201356001600160401b0381111561336757600080fd5b61337336828501612e4a565b604083015250845250602092830192016132f9565b5095945050505050565b600080858511156133a257600080fd5b838611156133af57600080fd5b5050820193919092039150565b600084516133ce81846020890161290b565b8201838582376000930192835250909392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000610e5b6020830184866133e4565b6000823561013e1983360301811261343857600080fd5b9190910192915050565b6000808335601e1984360301811261345957600080fd5b8301803591506001600160401b0382111561347357600080fd5b602001915036819003821315612a2157600080fd5b6001600160401b038116811461149a57600080fd5b63ffffffff6134ab89612bcb565b16815260208881013590820152600060408901356134c881613488565b6001600160401b03811660408401525087606083015260e060808301526134f360e0830187896133e4565b6001600160a01b03861660a084015282810360c08401526135158185876133e4565b9a9950505050505050505050565b60006020828403121561353557600080fd5b81516001600160401b0381111561354b57600080fd5b8201601f8101841361355c57600080fd5b805161356a612e6982612e23565b81815285602083850101111561357f57600080fd5b6112b582602083016020860161290b565b600083516135a281846020880161290b565b8351908301906135b681836020880161290b565b01949350505050565b6000602082840312156135d157600080fd5b813561131f81613488565b60018060a01b038516815283602082015261ffff8316604082015260806060820152600061360d608083018461292f565b9695505050505050565b60408152600061362a604083018561292f565b82810360208401526112b5818561292f565b60006020828403121561364e57600080fd5b815161131f81612d4c565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a0608084015261368f60e084018261292f565b90506060850151603f198483030160a08501526136ac828261292f565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b6000604082840312156136e457600080fd5b6136ec612da9565b825181526020928301519281019290925250919050565b6000608082840312801561371657600080fd5b5061371f612dd1565b82518152602083015161373181613488565b602082015261374384604085016136d2565b60408201529392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061360d9083018461292f565b60006020828403121561379457600080fd5b815161131f816128d8565b81516001600160401b038111156137b8576137b8612d93565b6137cc816137c684546130a6565b84613123565b6020601f82116001811461380057600083156137e85750848201515b600019600385901b1c1916600184901b1784556113a5565b600084815260208120601f198516915b828110156138305787850151825560209485019460019092019101613810565b508482101561384e5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156138e157603f19878603018452815163ffffffff815116865261ffff602082015116602087015260408101519050606060408701526138cb606087018261292f565b9550506020938401939190910190600101613885565b50929695505050505050565b6000604082840312156138ff57600080fd5b61131f83836136d2565b803560208310156108cf57600019602084900360031b1b1692915050565b60c084901b6001600160c01b031916815260e083901b6001600160e01b0319166008820152815160009061396281600c85016020870161290b565b91909101600c01949350505050565b8481528360208201528260408201526000825161399581606085016020870161290b565b9190910160600195945050505050565b6000602082840312156139b757600080fd5b815161131f81612987565b818103818111156108cf57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fdfea264697066735822122019e7a84d89c0531d16f18ab00f09616d334053d7a50ce71105af00d424c90fbf64736f6c634300081c0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b000000000000000000000000b1ade4d54a1dbff321ea5db9e161e44f9fd08d2c000000000000000000000000000000000000000000000000000000000000000b426974566f7961676572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007564f594147455200000000000000000000000000000000000000000000000000

    Deployed Bytecode

    0x6080604052600436106102935760003560e01c80637d25a05e1161015a578063bb0b6a53116100c1578063d045a0dc1161007a578063d045a0dc14610831578063d424388514610844578063e985e9c514610864578063f2fde38b14610884578063fc0c546a146104a5578063ff7bd03d146108a457600080fd5b8063bb0b6a5314610764578063bc70b35414610791578063bd815db0146107b1578063c6414e7b146107c4578063c87b56dd146107f1578063ca5eb5e11461081157600080fd5b8063a22cb46511610113578063a22cb465146106a7578063a72f5dd8146106c7578063b21a33e4146106ef578063b731ea0a14610704578063b88d4fde14610724578063b98bd0701461074457600080fd5b80637d25a05e146105d857806382413eac146106135780638462151c146106335780638da5cb5b1461066057806395d89b411461067e5780639f68b9641461069357600080fd5b80633400288b116101fe5780635a0dfe4d116101b75780635a0dfe4d146104f85780635e280f111461052f5780636352211e146105635780636fc1b31e1461058357806370a08231146105a3578063715018a6146105c357600080fd5b80633400288b1461044557806342842e0e146104655780634f6ccce71461048557806352ae2879146104a55780635535d461146104b857806355f804b3146104d857600080fd5b806317442b701161025057806317442b701461037c57806318160ddd1461039e5780631f5e1334146103bd57806321eb730b146103e557806323b872dd146104055780632f745c591461042557600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b314610327578063111ecdad1461034957806313137d6514610369575b600080fd5b3480156102a457600080fd5b506102b86102b33660046128ee565b6108c4565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26108d5565b6040516102c4919061295b565b3480156102fb57600080fd5b5061030f61030a36600461296e565b610967565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b5061034761034236600461299c565b610990565b005b34801561035557600080fd5b5060045461030f906001600160a01b031681565b610347610377366004612a28565b61099f565b34801561038857600080fd5b50604080516001815260026020820152016102c4565b3480156103aa57600080fd5b50600e545b6040519081526020016102c4565b3480156103c957600080fd5b506103d2600181565b60405161ffff90911681526020016102c4565b6103f86103f3366004612adb565b610a5f565b6040516102c49190612b48565b34801561041157600080fd5b50610347610420366004612b8a565b610b18565b34801561043157600080fd5b506103af61044036600461299c565b610ba3565b34801561045157600080fd5b50610347610460366004612be4565b610c08565b34801561047157600080fd5b50610347610480366004612b8a565b610c1a565b34801561049157600080fd5b506103af6104a036600461296e565b610c3a565b3480156104b157600080fd5b503061030f565b3480156104c457600080fd5b506102e26104d3366004612c12565b610c93565b3480156104e457600080fd5b506103476104f3366004612c45565b610d38565b34801561050457600080fd5b506102b8610513366004612be4565b63ffffffff919091166000908152600160205260409020541490565b34801561053b57600080fd5b5061030f7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b81565b34801561056f57600080fd5b5061030f61057e36600461296e565b610d8a565b34801561058f57600080fd5b5061034761059e366004612c86565b610d95565b3480156105af57600080fd5b506103af6105be366004612c86565b610df2565b3480156105cf57600080fd5b50610347610e3a565b3480156105e457600080fd5b506105fb6105f3366004612be4565b600092915050565b6040516001600160401b0390911681526020016102c4565b34801561061f57600080fd5b506102b861062e366004612ca3565b610e4e565b34801561063f57600080fd5b5061065361064e366004612c86565b610e63565b6040516102c49190612d09565b34801561066c57600080fd5b506000546001600160a01b031661030f565b34801561068a57600080fd5b506102e2610efa565b34801561069f57600080fd5b5060006102b8565b3480156106b357600080fd5b506103476106c2366004612d5a565b610f09565b3480156106d357600080fd5b50604080516311f0c6d360e11b815260016020820152016102c4565b3480156106fb57600080fd5b506103d2600281565b34801561071057600080fd5b5060025461030f906001600160a01b031681565b34801561073057600080fd5b5061034761073f366004612ea0565b610f14565b34801561075057600080fd5b5061034761075f366004612f4f565b610f2c565b34801561077057600080fd5b506103af61077f366004612f84565b60016020526000908152604090205481565b34801561079d57600080fd5b506102e26107ac366004612f9f565b610f46565b6103476107bf366004612f4f565b6110ee565b3480156107d057600080fd5b506107e46107df366004612fff565b611278565b6040516102c49190613045565b3480156107fd57600080fd5b506102e261080c36600461296e565b6112be565b34801561081d57600080fd5b5061034761082c366004612c86565b611326565b61034761083f366004612a28565b6113ac565b34801561085057600080fd5b5061034761085f366004612c86565b6113db565b34801561087057600080fd5b506102b861087f36600461305c565b611431565b34801561089057600080fd5b5061034761089f366004612c86565b61145f565b3480156108b057600080fd5b506102b86108bf36600461308a565b61149d565b60006108cf826114d3565b92915050565b6060600580546108e4906130a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610910906130a6565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b5050505050905090565b6000610972826114f8565b506000828152600960205260409020546001600160a01b03166108cf565b61099b828233611531565b5050565b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b031633146109ef576040516391ac5e4f60e01b81523360048201526024015b60405180910390fd5b60208701803590610a0990610a04908a612f84565b61153e565b14610a4757610a1b6020880188612f84565b60405163309afaf360e21b815263ffffffff9091166004820152602088013560248201526044016109e6565b610a568787878787878761157a565b50505050505050565b610a67612891565b610a82336040860135610a7d6020880188612f84565b6116d9565b600080610a8e86611739565b9092509050610aba610aa36020880188612f84565b8383610ab4368a90038a018a6130da565b88611878565b805190935033907f986156872b2ee0022b9585231dbbfde457f87f8a16b6c45e1a81c54c4ad8351f610aef60208a018a612f84565b6040805163ffffffff9092168252808b013560208301520160405180910390a350509392505050565b6001600160a01b038216610b4257604051633250574960e11b8152600060048201526024016109e6565b6000610b4f838333611983565b9050836001600160a01b0316816001600160a01b031614610b9d576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016109e6565b50505050565b6000610bae83610df2565b8210610bdf5760405163295f44f760e21b81526001600160a01b0384166004820152602481018390526044016109e6565b506001600160a01b03919091166000908152600c60209081526040808320938352929052205490565b610c10611990565b61099b82826119bd565b610c3583838360405180602001604052806000815250610f14565b505050565b6000610c45600e5490565b8210610c6e5760405163295f44f760e21b815260006004820152602481018390526044016109e6565b600e8281548110610c8157610c8161310d565b90600052602060002001549050919050565b600360209081526000928352604080842090915290825290208054610cb7906130a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce3906130a6565b8015610d305780601f10610d0557610100808354040283529160200191610d30565b820191906000526020600020905b815481529060010190602001808311610d1357829003601f168201915b505050505081565b610d40611990565b600b610d4d82848361316a565b507ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f6600b604051610d7e9190613229565b60405180910390a15050565b60006108cf826114f8565b610d9d611990565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906020015b60405180910390a150565b60006001600160a01b038216610e1e576040516322718ad960e21b8152600060048201526024016109e6565b506001600160a01b031660009081526008602052604090205490565b610e42611990565b610e4c6000611a0b565b565b6001600160a01b03811630145b949350505050565b60606000610e7083610df2565b90506000816001600160401b03811115610e8c57610e8c612d93565b604051908082528060200260200182016040528015610eb5578160200160208202803683370190505b50905060005b82811015610ef257610ecd8582610ba3565b828281518110610edf57610edf61310d565b6020908102919091010152600101610ebb565b509392505050565b6060600680546108e4906130a6565b61099b338383611a5b565b610f1f848484610b18565b610b9d3385858585611afa565b610f34611990565b61099b610f4182846132b5565b611c24565b63ffffffff8416600090815260036020908152604080832061ffff87168452909152812080546060929190610f7a906130a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa6906130a6565b8015610ff35780601f10610fc857610100808354040283529160200191610ff3565b820191906000526020600020905b815481529060010190602001808311610fd657829003601f168201915b5050505050905080516000036110435783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929450610e5b9350505050565b6000839003611053579050610e5b565b600283106110d15761109a84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d2b92505050565b806110a88460028188613392565b6040516020016110ba939291906133bc565b604051602081830303815290604052915050610e5b565b8383604051639a6d49cd60e01b81526004016109e692919061340d565b60005b818110156111f7573683838381811061110c5761110c61310d565b905060200281019061111e9190613421565b90506111516111306020830183612f84565b602083013563ffffffff919091166000908152600160205260409020541490565b61115b57506111ef565b3063d045a0dc60c08301358360a081013561117a610100830183613442565b61118b610100890160e08a01612c86565b6111996101208a018a613442565b6040518963ffffffff1660e01b81526004016111bb979695949392919061349d565b6000604051808303818588803b1580156111d457600080fd5b505af11580156111e8573d6000803e3d6000fd5b5050505050505b6001016110f1565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b8152600401600060405180830381865afa158015611236573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261125e9190810190613523565b604051638351eea760e01b81526004016109e6919061295b565b604080518082019091526000808252602082015260008061129885611739565b90925090506112b56112ad6020870187612f84565b838387611d57565b95945050505050565b60606112c9826114f8565b5060006112d4611e2f565b905060008151116112f4576040518060200160405280600081525061131f565b806112fe84611e3e565b60405160200161130f929190613590565b6040516020818303038152906040525b9392505050565b61132e611990565b60405163ca5eb5e160e01b81526001600160a01b0382811660048301527f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b169063ca5eb5e190602401600060405180830381600087803b15801561139157600080fd5b505af11580156113a5573d6000803e3d6000fd5b5050505050565b3330146113cc5760405163029a949d60e31b815260040160405180910390fd5b610a5687878787878787610a47565b6113e3611990565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090602001610de7565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b611467611990565b6001600160a01b03811661149157604051631e4fbdf760e01b8152600060048201526024016109e6565b61149a81611a0b565b50565b60006020820180359060019083906114b59086612f84565b63ffffffff1681526020810191909152604001600020541492915050565b60006001600160e01b0319821663780e9d6360e01b14806108cf57506108cf82611ed0565b6000818152600760205260408120546001600160a01b0316806108cf57604051637e27328960e01b8152600481018490526024016109e6565b610c358383836001611f20565b63ffffffff8116600090815260016020526040812054806108cf5760405163f6ff4fb760e01b815263ffffffff841660048201526024016109e6565b600061158c6115898787612026565b90565b9050600061159a878761203e565b90506115b382826115ae60208d018d612f84565b61204e565b60408611156116775760006115ed6115d160608c0160408d016135bf565b6115de60208d018d612f84565b6115e88b8b612058565b6120a3565b604051633e5ac80960e11b81529091506001600160a01b037f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b1690637cb59012906116439086908d9060009087906004016135dc565b600060405180830381600087803b15801561165d57600080fd5b505af1158015611671573d6000803e3d6000fd5b50505050505b6001600160a01b038216887f7883fa30ea56937810e36990b0bbb8d629d0cf59f68baf8431ff657cebe7eef56116b060208d018d612f84565b6040805163ffffffff9092168252602082018690520160405180910390a3505050505050505050565b6116e282610d8a565b6001600160a01b0316836001600160a01b031614611730578261170483610d8a565b604051634342715b60e11b81526001600160a01b039283166004820152911660248201526044016109e6565b610c35826120d2565b606080602083013561175e57604051631e4ec46b60e01b815260040160405180910390fd5b60006117b46020850135604086013561177a6080880188613442565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061210d92505050565b90935090506000816117c75760016117ca565b60025b90506117ea6117dc6020870187612f84565b826107ac6060890189613442565b6004549093506001600160a01b031680156118705760405163043a78eb60e01b81526001600160a01b0382169063043a78eb9061182d9088908890600401613617565b602060405180830381865afa15801561184a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186e919061363c565b505b505050915091565b611880612891565b600061188f8460000151612172565b6020850151909150156118a9576118a9846020015161219a565b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b0316632637a450826040518060a001604052808b63ffffffff1681526020016118f98c61153e565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b8152600401611935929190613659565b60806040518083038185885af1158015611953573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906119789190613703565b979650505050505050565b6000610e5b84848461227c565b6000546001600160a01b03163314610e4c5760405163118cdaa760e01b81523360048201526024016109e6565b63ffffffff8216600081815260016020908152604091829020849055815192835282018390527f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b9101610d7e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216611a8d57604051630b61174360e31b81526001600160a01b03831660048201526024016109e6565b6001600160a01b038381166000818152600a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b156113a557604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611b3c90889088908790879060040161374f565b6020604051808303816000875af1925050508015611b77575060408051601f3d908101601f19168201909252611b7491810190613782565b60015b611be0573d808015611ba5576040519150601f19603f3d011682016040523d82523d6000602084013e611baa565b606091505b508051600003611bd857604051633250574960e11b81526001600160a01b03851660048201526024016109e6565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14611c1c57604051633250574960e11b81526001600160a01b03851660048201526024016109e6565b505050505050565b60005b8151811015611cfb57611c56828281518110611c4557611c4561310d565b602002602001015160400151611d2b565b818181518110611c6857611c6861310d565b60200260200101516040015160036000848481518110611c8a57611c8a61310d565b60200260200101516000015163ffffffff1663ffffffff1681526020019081526020016000206000848481518110611cc457611cc461310d565b60200260200101516020015161ffff1661ffff1681526020019081526020016000209081611cf2919061379f565b50600101611c27565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67481604051610de7919061385d565b600281015161ffff811660031461099b5781604051639a6d49cd60e01b81526004016109e6919061295b565b60408051808201909152600080825260208201527f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b031663ddc28c586040518060a001604052808863ffffffff168152602001611dba8961153e565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401611def929190613659565b6040805180830381865afa158015611e0b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b591906138ed565b6060600b80546108e4906130a6565b60606000611e4b83612349565b60010190506000816001600160401b03811115611e6a57611e6a612d93565b6040519080825280601f01601f191660200182016040528015611e94576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611e9e57509392505050565b60006001600160e01b031982166380ac58cd60e01b1480611f0157506001600160e01b03198216635b5e139f60e01b145b806108cf57506301ffc9a760e01b6001600160e01b03198316146108cf565b8080611f3457506001600160a01b03821615155b15611ff6576000611f44846114f8565b90506001600160a01b03831615801590611f705750826001600160a01b0316816001600160a01b031614155b8015611f835750611f818184611431565b155b15611fac5760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016109e6565b8115611ff45783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260096020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b60006120356020828486613392565b61131f91613909565b6000612035604060208486613392565b610c358383612421565b60606120678260408186613392565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929695505050505050565b60608383836040516020016120ba93929190613927565b60405160208183030381529060405290509392505050565b60006120e16000836000611983565b90506001600160a01b03811661099b57604051637e27328960e01b8152600481018390526024016109e6565b8051606090151580612141576040805160208101879052908101859052606001604051602081830303815290604052612168565b848433856040516020016121589493929190613971565b6040516020818303038152906040525b9150935093915050565b6000813414612196576040516304fb820960e51b81523460048201526024016109e6565b5090565b60007f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221e91906139a5565b90506001600160a01b038116612247576040516329b99a9560e11b815260040160405180910390fd5b61099b6001600160a01b038216337f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b85612486565b60008061228a8585856124e0565b90506001600160a01b0381166122e7576122e284600e80546000838152600f60205260408120829055600182018355919091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0155565b61230a565b846001600160a01b0316816001600160a01b03161461230a5761230a81856125d9565b6001600160a01b038516612326576123218461265a565b610e5b565b846001600160a01b0316816001600160a01b031614610e5b57610e5b8585612709565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106123885772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106123b4576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106123d257662386f26fc10000830492506010015b6305f5e10083106123ea576305f5e100830492506008015b61271083106123fe57612710830492506004015b60648310612410576064830492506002015b600a83106108cf5760010192915050565b6001600160a01b03821661244b57604051633250574960e11b8152600060048201526024016109e6565b600061245983836000611983565b90506001600160a01b03811615610c35576040516339e3563760e11b8152600060048201526024016109e6565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610b9d908590612759565b6000828152600760205260408120546001600160a01b039081169083161561250d5761250d8184866127ca565b6001600160a01b0381161561254b5761252a600085600080611f20565b6001600160a01b038116600090815260086020526040902080546000190190555b6001600160a01b0385161561257a576001600160a01b0385166000908152600860205260409020805460010190555b60008481526007602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b60006125e483610df2565b6000838152600d60209081526040808320546001600160a01b0388168452600c9092529091209192509081831461263b57600083815260208281526040808320548584528184208190558352600d90915290208290555b6000938452600d60209081526040808620869055938552525081205550565b600e5460009061266c906001906139c2565b6000838152600f6020526040812054600e80549394509092849081106126945761269461310d565b9060005260206000200154905080600e83815481106126b5576126b561310d565b6000918252602080832090910192909255828152600f9091526040808220849055858252812055600e8054806126ed576126ed6139e3565b6001900381819060005260206000200160009055905550505050565b6000600161271684610df2565b61272091906139c2565b6001600160a01b039093166000908152600c602090815260408083208684528252808320859055938252600d9052919091209190915550565b600080602060008451602086016000885af18061277c576040513d6000823e3d81fd5b50506000513d915081156127945780600114156127a1565b6001600160a01b0384163b155b15610b9d57604051635274afe760e01b81526001600160a01b03851660048201526024016109e6565b6127d583838361282e565b610c35576001600160a01b03831661280357604051637e27328960e01b8152600481018290526024016109e6565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016109e6565b60006001600160a01b03831615801590610e5b5750826001600160a01b0316846001600160a01b0316148061286857506128688484611431565b80610e5b5750506000908152600960205260409020546001600160a01b03908116911614919050565b60405180606001604052806000801916815260200160006001600160401b031681526020016128d3604051806040016040528060008152602001600081525090565b905290565b6001600160e01b03198116811461149a57600080fd5b60006020828403121561290057600080fd5b813561131f816128d8565b60005b8381101561292657818101518382015260200161290e565b50506000910152565b6000815180845261294781602086016020860161290b565b601f01601f19169290920160200192915050565b60208152600061131f602083018461292f565b60006020828403121561298057600080fd5b5035919050565b6001600160a01b038116811461149a57600080fd5b600080604083850312156129af57600080fd5b82356129ba81612987565b946020939093013593505050565b6000606082840312156129da57600080fd5b50919050565b60008083601f8401126129f257600080fd5b5081356001600160401b03811115612a0957600080fd5b602083019150836020828501011115612a2157600080fd5b9250929050565b600080600080600080600060e0888a031215612a4357600080fd5b612a4d89896129c8565b96506060880135955060808801356001600160401b03811115612a6f57600080fd5b612a7b8a828b016129e0565b90965094505060a0880135612a8f81612987565b925060c08801356001600160401b03811115612aaa57600080fd5b612ab68a828b016129e0565b989b979a50959850939692959293505050565b600060c082840312156129da57600080fd5b60008060008385036080811215612af157600080fd5b84356001600160401b03811115612b0757600080fd5b612b1387828801612ac9565b9450506040601f1982011215612b2857600080fd5b506020840191506060840135612b3d81612987565b809150509250925092565b6000608082019050825182526001600160401b0360208401511660208301526040830151612b83604084018280518252602090810151910152565b5092915050565b600080600060608486031215612b9f57600080fd5b8335612baa81612987565b92506020840135612bba81612987565b929592945050506040919091013590565b803563ffffffff81168114612bdf57600080fd5b919050565b60008060408385031215612bf757600080fd5b6129ba83612bcb565b803561ffff81168114612bdf57600080fd5b60008060408385031215612c2557600080fd5b612c2e83612bcb565b9150612c3c60208401612c00565b90509250929050565b60008060208385031215612c5857600080fd5b82356001600160401b03811115612c6e57600080fd5b612c7a858286016129e0565b90969095509350505050565b600060208284031215612c9857600080fd5b813561131f81612987565b60008060008060a08587031215612cb957600080fd5b612cc386866129c8565b935060608501356001600160401b03811115612cde57600080fd5b612cea878288016129e0565b9094509250506080850135612cfe81612987565b939692955090935050565b602080825282518282018190526000918401906040840190835b81811015612d41578351835260209384019390920191600101612d23565b509095945050505050565b801515811461149a57600080fd5b60008060408385031215612d6d57600080fd5b8235612d7881612987565b91506020830135612d8881612d4c565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612dcb57612dcb612d93565b60405290565b604051606081016001600160401b0381118282101715612dcb57612dcb612d93565b604051601f8201601f191681016001600160401b0381118282101715612e1b57612e1b612d93565b604052919050565b60006001600160401b03821115612e3c57612e3c612d93565b50601f01601f191660200190565b600082601f830112612e5b57600080fd5b8135612e6e612e6982612e23565b612df3565b818152846020838601011115612e8357600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612eb657600080fd5b8435612ec181612987565b93506020850135612ed181612987565b92506040850135915060608501356001600160401b03811115612ef357600080fd5b612eff87828801612e4a565b91505092959194509250565b60008083601f840112612f1d57600080fd5b5081356001600160401b03811115612f3457600080fd5b6020830191508360208260051b8501011115612a2157600080fd5b60008060208385031215612f6257600080fd5b82356001600160401b03811115612f7857600080fd5b612c7a85828601612f0b565b600060208284031215612f9657600080fd5b61131f82612bcb565b60008060008060608587031215612fb557600080fd5b612fbe85612bcb565b9350612fcc60208601612c00565b925060408501356001600160401b03811115612fe757600080fd5b612ff3878288016129e0565b95989497509550505050565b6000806040838503121561301257600080fd5b82356001600160401b0381111561302857600080fd5b61303485828601612ac9565b9250506020830135612d8881612d4c565b8151815260208083015190820152604081016108cf565b6000806040838503121561306f57600080fd5b823561307a81612987565b91506020830135612d8881612987565b60006060828403121561309c57600080fd5b61131f83836129c8565b600181811c908216806130ba57607f821691505b6020821081036129da57634e487b7160e01b600052602260045260246000fd5b600060408284031280156130ed57600080fd5b506130f6612da9565b823581526020928301359281019290925250919050565b634e487b7160e01b600052603260045260246000fd5b601f821115610c3557806000526020600020601f840160051c8101602085101561314a5750805b601f840160051c820191505b818110156113a55760008155600101613156565b6001600160401b0383111561318157613181612d93565b6131958361318f83546130a6565b83613123565b6000601f8411600181146131c957600085156131b15750838201355b600019600387901b1c1916600186901b1783556113a5565b600083815260209020601f19861690835b828110156131fa57868501358255602094850194600190920191016131da565b50868210156132175760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208152600080835461323b816130a6565b806020860152600182166000811461325a5760018114613276576132aa565b60ff1983166040870152604082151560051b87010193506132aa565b86600052602060002060005b838110156132a157815488820160400152600190910190602001613282565b87016040019450505b509195945050505050565b60006001600160401b038311156132ce576132ce612d93565b8260051b6132de60208201612df3565b848152908301906020810190368311156132f757600080fd5b845b838110156133885780356001600160401b0381111561331757600080fd5b8601606036829003121561332a57600080fd5b613332612dd1565b61333b82612bcb565b815261334960208301612c00565b602082015260408201356001600160401b0381111561336757600080fd5b61337336828501612e4a565b604083015250845250602092830192016132f9565b5095945050505050565b600080858511156133a257600080fd5b838611156133af57600080fd5b5050820193919092039150565b600084516133ce81846020890161290b565b8201838582376000930192835250909392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000610e5b6020830184866133e4565b6000823561013e1983360301811261343857600080fd5b9190910192915050565b6000808335601e1984360301811261345957600080fd5b8301803591506001600160401b0382111561347357600080fd5b602001915036819003821315612a2157600080fd5b6001600160401b038116811461149a57600080fd5b63ffffffff6134ab89612bcb565b16815260208881013590820152600060408901356134c881613488565b6001600160401b03811660408401525087606083015260e060808301526134f360e0830187896133e4565b6001600160a01b03861660a084015282810360c08401526135158185876133e4565b9a9950505050505050505050565b60006020828403121561353557600080fd5b81516001600160401b0381111561354b57600080fd5b8201601f8101841361355c57600080fd5b805161356a612e6982612e23565b81815285602083850101111561357f57600080fd5b6112b582602083016020860161290b565b600083516135a281846020880161290b565b8351908301906135b681836020880161290b565b01949350505050565b6000602082840312156135d157600080fd5b813561131f81613488565b60018060a01b038516815283602082015261ffff8316604082015260806060820152600061360d608083018461292f565b9695505050505050565b60408152600061362a604083018561292f565b82810360208401526112b5818561292f565b60006020828403121561364e57600080fd5b815161131f81612d4c565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a0608084015261368f60e084018261292f565b90506060850151603f198483030160a08501526136ac828261292f565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b6000604082840312156136e457600080fd5b6136ec612da9565b825181526020928301519281019290925250919050565b6000608082840312801561371657600080fd5b5061371f612dd1565b82518152602083015161373181613488565b602082015261374384604085016136d2565b60408201529392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061360d9083018461292f565b60006020828403121561379457600080fd5b815161131f816128d8565b81516001600160401b038111156137b8576137b8612d93565b6137cc816137c684546130a6565b84613123565b6020601f82116001811461380057600083156137e85750848201515b600019600385901b1c1916600184901b1784556113a5565b600084815260208120601f198516915b828110156138305787850151825560209485019460019092019101613810565b508482101561384e5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156138e157603f19878603018452815163ffffffff815116865261ffff602082015116602087015260408101519050606060408701526138cb606087018261292f565b9550506020938401939190910190600101613885565b50929695505050505050565b6000604082840312156138ff57600080fd5b61131f83836136d2565b803560208310156108cf57600019602084900360031b1b1692915050565b60c084901b6001600160c01b031916815260e083901b6001600160e01b0319166008820152815160009061396281600c85016020870161290b565b91909101600c01949350505050565b8481528360208201528260408201526000825161399581606085016020870161290b565b9190910160600195945050505050565b6000602082840312156139b757600080fd5b815161131f81612987565b818103818111156108cf57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fdfea264697066735822122019e7a84d89c0531d16f18ab00f09616d334053d7a50ce71105af00d424c90fbf64736f6c634300081c0033

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

    000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b000000000000000000000000b1ade4d54a1dbff321ea5db9e161e44f9fd08d2c000000000000000000000000000000000000000000000000000000000000000b426974566f7961676572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007564f594147455200000000000000000000000000000000000000000000000000

    -----Decoded View---------------
    Arg [0] : _name (string): BitVoyagers
    Arg [1] : _symbol (string): VOYAGER
    Arg [2] : _lzEndpoint (address): 0x6F475642a6e85809B1c36Fa62763669b1b48DD5B
    Arg [3] : _delegate (address): 0xb1ade4D54a1DBff321eA5dB9e161e44f9fd08d2C

    -----Encoded View---------------
    8 Constructor Arguments found :
    Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
    Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
    Arg [2] : 0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b
    Arg [3] : 000000000000000000000000b1ade4d54a1dbff321ea5db9e161e44f9fd08d2c
    Arg [4] : 000000000000000000000000000000000000000000000000000000000000000b
    Arg [5] : 426974566f796167657273000000000000000000000000000000000000000000
    Arg [6] : 0000000000000000000000000000000000000000000000000000000000000007
    Arg [7] : 564f594147455200000000000000000000000000000000000000000000000000


    Block Age Transaction Gas Used Reward
    view all blocks ##produced##

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

    Validator Index Block Age Amount
    View All Withdrawals

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

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