S Price: $0.73561 (+9.31%)
    /

    Token

    Chips USD (cUSD)

    Overview

    Max Total Supply

    5,000,010 cUSD

    Holders

    4

    Market

    Price

    $0.00 @ 0.000000 S

    Onchain Market Cap

    $0.00

    Circulating Supply Market Cap

    -

    Other Info

    Token Contract (WITH 18 Decimals)

    Balance
    0.000000000000000937 cUSD

    Value
    $0.00
    0xb2b6B8E7aBb934854bcBE0Acf76ed7E996C1b863
    Loading...
    Loading
    Loading...
    Loading
    Loading...
    Loading

    Click here to update the token information / general information

    Contract Source Code Verified (Exact Match)

    Contract Name:
    cUSD

    Compiler Version
    v0.8.23+commit.f704f362

    Optimization Enabled:
    Yes with 200 runs

    Other Settings:
    paris EvmVersion
    File 1 of 40 : MyToken.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 { OFT } from "./OFT.sol";
    import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
    contract cUSD is OFT {
    constructor(
    string memory name,
    string memory symbol,
    address lzEndpoint,
    address delegate,
    address initialOwner
    ) OFT(name, symbol, lzEndpoint, delegate) Ownable(initialOwner) {}
    function mint(address to, uint256 amount) external onlyOwner {
    _mint(to, amount);
    }
    function burn(uint256 amount) public {
    _burn(msg.sender, amount);
    }
    function burnFrom(address account, uint256 amount) public {
    require(allowance(account, msg.sender) >= amount, "Not authorized");
    _spendAllowance(account, msg.sender, amount);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 2 of 40 : 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 3 of 40 : 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 4 of 40 : 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

    File 5 of 40 : 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 6 of 40 : 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 7 of 40 : 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 8 of 40 : 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 9 of 40 : 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 10 of 40 : 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 11 of 40 : 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 12 of 40 : 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 13 of 40 : 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 14 of 40 : 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 15 of 40 : 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 16 of 40 : 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 40 : 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 18 of 40 : 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 19 of 40 : 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 20 of 40 : 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 21 of 40 : 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 22 of 40 : 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 23 of 40 : 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 24 of 40 : 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 25 of 40 : IOFT.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 { MessagingReceipt, MessagingFee } from "@layerzerolabs/oapp-evm/contracts/oapp/OAppSender.sol";
    /**
    * @dev Struct representing token parameters for the OFT send() operation.
    */
    struct SendParam {
    uint32 dstEid; // Destination endpoint ID.
    bytes32 to; // Recipient address.
    uint256 amountLD; // Amount to send in local decimals.
    uint256 minAmountLD; // Minimum amount to send in local decimals.
    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 oftCmd; // The OFT command to be executed, unused in default OFT implementations.
    }
    /**
    * @dev Struct representing OFT limit information.
    * @dev These amounts can change dynamically and are up the specific oft implementation.
    */
    struct OFTLimit {
    uint256 minAmountLD; // Minimum amount in local decimals that can be sent to the recipient.
    uint256 maxAmountLD; // Maximum amount in local decimals that can be sent to the recipient.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 26 of 40 : OFTComposeMsgCodec.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;
    library OFTComposeMsgCodec {
    // Offset constants for decoding composed messages
    uint8 private constant NONCE_OFFSET = 8;
    uint8 private constant SRC_EID_OFFSET = 12;
    uint8 private constant AMOUNT_LD_OFFSET = 44;
    uint8 private constant COMPOSE_FROM_OFFSET = 76;
    /**
    * @dev Encodes a OFT composed message.
    * @param _nonce The nonce value.
    * @param _srcEid The source endpoint ID.
    * @param _amountLD The amount in local decimals.
    * @param _composeMsg The composed message.
    * @return _msg The encoded Composed message.
    */
    function encode(
    uint64 _nonce,
    uint32 _srcEid,
    uint256 _amountLD,
    bytes memory _composeMsg // 0x[composeFrom][composeMsg]
    ) internal pure returns (bytes memory _msg) {
    _msg = abi.encodePacked(_nonce, _srcEid, _amountLD, _composeMsg);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 27 of 40 : OFTMsgCodec.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;
    library OFTMsgCodec {
    // Offset constants for encoding and decoding OFT messages
    uint8 private constant SEND_TO_OFFSET = 32;
    uint8 private constant SEND_AMOUNT_SD_OFFSET = 40;
    /**
    * @dev Encodes an OFT LayerZero message.
    * @param _sendTo The recipient address.
    * @param _amountShared The amount in shared decimals.
    * @param _composeMsg The composed message.
    * @return _msg The encoded message.
    * @return hasCompose A boolean indicating whether the message has a composed payload.
    */
    function encode(
    bytes32 _sendTo,
    uint64 _amountShared,
    bytes memory _composeMsg
    ) internal view returns (bytes memory _msg, bool hasCompose) {
    hasCompose = _composeMsg.length > 0;
    // @dev Remote chains will want to know the composed function caller ie. msg.sender on the src.
    _msg = hasCompose
    ? abi.encodePacked(_sendTo, _amountShared, addressToBytes32(msg.sender), _composeMsg)
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 28 of 40 : OFTCore.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 { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.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 { IOFT, SendParam, OFTLimit, OFTReceipt, OFTFeeDetail, MessagingReceipt, MessagingFee } from "./interfaces/IOFT.sol";
    import { OFTMsgCodec } from "./libs/OFTMsgCodec.sol";
    import { OFTComposeMsgCodec } from "./libs/OFTComposeMsgCodec.sol";
    /**
    * @title OFTCore
    * @dev Abstract contract for the OftChain (OFT) token.
    */
    abstract contract OFTCore is IOFT, OApp, OAppPreCrimeSimulator, OAppOptionsType3 {
    using OFTMsgCodec for bytes;
    using OFTMsgCodec for bytes32;
    // @notice Provides a conversion rate when swapping between denominations of SD and LD
    // - shareDecimals == SD == shared Decimals
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 29 of 40 : 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 30 of 40 : 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 31 of 40 : 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 32 of 40 : 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 33 of 40 : 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 34 of 40 : ERC20.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.2.0) (token/ERC20/ERC20.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "./IERC20.sol";
    import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
    import {Context} from "../../utils/Context.sol";
    import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
    /**
    * @dev Implementation of the {IERC20} interface.
    *
    * This implementation is agnostic to the way tokens are created. This means
    * that a supply mechanism has to be added in a derived contract using {_mint}.
    *
    * TIP: For a detailed writeup see our guide
    * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
    * to implement supply mechanisms].
    *
    * The default value of {decimals} is 18. To change this, you should override
    * this function so it returns a different value.
    *
    * We have followed general OpenZeppelin Contracts guidelines: functions revert
    * instead returning `false` on failure. This behavior is nonetheless
    * conventional and does not conflict with the expectations of ERC-20
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 35 of 40 : IERC20Metadata.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/extensions/IERC20Metadata.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "../IERC20.sol";
    /**
    * @dev Interface for the optional metadata functions from the ERC-20 standard.
    */
    interface IERC20Metadata is IERC20 {
    /**
    * @dev Returns the name of the token.
    */
    function name() external view returns (string memory);
    /**
    * @dev Returns the symbol of the token.
    */
    function symbol() external view returns (string memory);
    /**
    * @dev Returns the decimals places of the token.
    */
    function decimals() external view returns (uint8);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 36 of 40 : 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 37 of 40 : 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.2.0) (token/ERC20/utils/SafeERC20.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "../IERC20.sol";
    import {IERC1363} from "../../../interfaces/IERC1363.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 38 of 40 : 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 39 of 40 : 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 40 of 40 : OFT.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 { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
    import { IOFT, OFTCore } from "@layerzerolabs/oft-evm/contracts/OFTCore.sol";
    /**
    * @title OFT Contract
    * @dev OFT is an ERC-20 token that extends the functionality of the OFTCore contract.
    */
    abstract contract OFT is OFTCore, ERC20 {
    /**
    * @dev Constructor for the OFT contract.
    * @param _name The name of the OFT.
    * @param _symbol The symbol of the OFT.
    * @param _lzEndpoint The LayerZero endpoint address.
    * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
    */
    constructor(
    string memory _name,
    string memory _symbol,
    address _lzEndpoint,
    address _delegate
    ) ERC20(_name, _symbol) OFTCore(decimals(), _lzEndpoint, _delegate) {}
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Settings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    {
    "optimizer": {
    "enabled": true,
    "runs": 200
    },
    "evmVersion": "paris",
    "outputSelection": {
    "*": {
    "*": [
    "evm.bytecode",
    "evm.deployedBytecode",
    "devdoc",
    "userdoc",
    "metadata",
    "abi"
    ]
    }
    },
    "libraries": {}
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Contract Security Audit

    Contract ABI

    [{"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"},{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InvalidDelegate","type":"error"},{"inputs":[],"name":"InvalidEndpointCall","type":"error"},{"inputs":[],"name":"InvalidLocalDecimals","type":"error"},{"inputs":[{"internalType":"bytes","name":"options","type":"bytes"}],"name":"InvalidOptions","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":"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"},{"inputs":[{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"}],"name":"SlippageExceeded","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":"amountReceivedLD","type":"uint256"}],"name":"OFTReceived","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":"amountSentLD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"name":"OFTSent","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":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"SEND","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEND_AND_CALL","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approvalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","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":"decimalConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":[{"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"oftVersion","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":"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":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"}],"name":"quoteOFT","outputs":[{"components":[{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"uint256","name":"maxAmountLD","type":"uint256"}],"internalType":"struct OFTLimit","name":"oftLimit","type":"tuple"},{"components":[{"internalType":"int256","name":"feeAmountLD","type":"int256"},{"internalType":"string","name":"description","type":"string"}],"internalType":"struct OFTFeeDetail[]","name":"oftFeeDetails","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"oftReceipt","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","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":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","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"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"oftReceipt","type":"tuple"}],"stateMutability":"payable","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":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

    60c06040523480156200001157600080fd5b506040516200385a3803806200385a8339810160408190526200003491620002d3565b84848484838360128484818181818d6001600160a01b0381166200007257604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200007d8162000199565b506001600160a01b038083166080528116620000ac57604051632d618d8160e21b815260040160405180910390fd5b60805160405163ca5eb5e160e01b81526001600160a01b0383811660048301529091169063ca5eb5e190602401600060405180830381600087803b158015620000f457600080fd5b505af115801562000109573d6000803e3d6000fd5b505050505050505062000121620001e960201b60201c565b60ff168360ff16101562000148576040516301e9714b60e41b815260040160405180910390fd5b620001556006846200038b565b6200016290600a620004aa565b60a0525060089150620001789050838262000553565b50600962000187828262000553565b5050505050505050505050506200061f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600690565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200021657600080fd5b81516001600160401b0380821115620002335762000233620001ee565b604051601f8301601f19908116603f011681019082821181831017156200025e576200025e620001ee565b81604052838152602092508660208588010111156200027c57600080fd5b600091505b83821015620002a0578582018301518183018401529082019062000281565b6000602085830101528094505050505092915050565b80516001600160a01b0381168114620002ce57600080fd5b919050565b600080600080600060a08688031215620002ec57600080fd5b85516001600160401b03808211156200030457600080fd5b6200031289838a0162000204565b965060208801519150808211156200032957600080fd5b50620003388882890162000204565b9450506200034960408701620002b6565b92506200035960608701620002b6565b91506200036960808701620002b6565b90509295509295909350565b634e487b7160e01b600052601160045260246000fd5b60ff8281168282160390811115620003a757620003a762000375565b92915050565b600181815b80851115620003ee578160001904821115620003d257620003d262000375565b80851615620003e057918102915b93841c9390800290620003b2565b509250929050565b6000826200040757506001620003a7565b816200041657506000620003a7565b81600181146200042f57600281146200043a576200045a565b6001915050620003a7565b60ff8411156200044e576200044e62000375565b50506001821b620003a7565b5060208310610133831016604e8410600b84101617156200047f575081810a620003a7565b6200048b8383620003ad565b8060001904821115620004a257620004a262000375565b029392505050565b6000620004bb60ff841683620003f6565b9392505050565b600181811c90821680620004d757607f821691505b602082108103620004f857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200054e576000816000526020600020601f850160051c81016020861015620005295750805b601f850160051c820191505b818110156200054a5782815560010162000535565b5050505b505050565b81516001600160401b038111156200056f576200056f620001ee565b6200058781620005808454620004c2565b84620004fe565b602080601f831160018114620005bf5760008415620005a65750858301515b600019600386901b1c1916600185901b1785556200054a565b600085815260208120601f198616915b82811015620005f057888601518255948401946001909101908401620005cf565b50858210156200060f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a0516131cf6200068b6000396000818161069f01528181611bf601528181611c6b0152611e6f01526000818161053e01528181610aa801528181611176015281816114150152818161176801528181611f670152818161206b015261212201526131cf6000f3fe6080604052600436106102725760003560e01c8063715018a61161014f578063b98bd070116100c1578063d045a0dc1161007a578063d045a0dc146107d6578063d4243885146107e9578063dd62ed3e14610809578063f2fde38b14610829578063fc0c546a146104c2578063ff7bd03d1461084957600080fd5b8063b98bd07014610715578063bb0b6a5314610735578063bc70b35414610762578063bd815db014610782578063c7c7f5b314610795578063ca5eb5e1146107b657600080fd5b80638da5cb5b116101135780638da5cb5b1461065a57806395d89b4114610678578063963efcaa1461068d5780639f68b964146106c1578063a9059cbb146106d5578063b731ea0a146106f557600080fd5b8063715018a6146105b657806379cc6790146105cb5780637d25a05e146105eb57806382413eac14610626578063857749b01461064657600080fd5b8063313ce567116101e857806352ae2879116101ac57806352ae2879146104c25780635535d461146104d55780635a0dfe4d146104f55780635e280f111461052c5780636fc1b31e1461056057806370a082311461058057600080fd5b8063313ce567146104135780633400288b146104355780633b6f743b1461045557806340c10f191461048257806342966c68146104a257600080fd5b8063134d4f251161023a578063134d4f251461034e578063156a0d0f1461037657806317442b701461039d57806318160ddd146103bf5780631f5e1334146103de57806323b872dd146103f357600080fd5b806306fdde0314610277578063095ea7b3146102a25780630d35b415146102d2578063111ecdad1461030157806313137d6514610339575b600080fd5b34801561028357600080fd5b5061028c610869565b604051610299919061229a565b60405180910390f35b3480156102ae57600080fd5b506102c26102bd3660046122c2565b6108fb565b6040519015158152602001610299565b3480156102de57600080fd5b506102f26102ed366004612306565b610915565b6040516102999392919061233a565b34801561030d57600080fd5b50600454610321906001600160a01b031681565b6040516001600160a01b039091168152602001610299565b61034c61034736600461242d565b610aa6565b005b34801561035a57600080fd5b50610363600281565b60405161ffff9091168152602001610299565b34801561038257600080fd5b506040805162b9270b60e21b81526001602082015201610299565b3480156103a957600080fd5b5060408051600181526002602082015201610299565b3480156103cb57600080fd5b506007545b604051908152602001610299565b3480156103ea57600080fd5b50610363600181565b3480156103ff57600080fd5b506102c261040e3660046124cc565b610b66565b34801561041f57600080fd5b5060125b60405160ff9091168152602001610299565b34801561044157600080fd5b5061034c610450366004612526565b610b8c565b34801561046157600080fd5b50610475610470366004612550565b610ba2565b60405161029991906125a1565b34801561048e57600080fd5b5061034c61049d3660046122c2565b610c09565b3480156104ae57600080fd5b5061034c6104bd3660046125b8565b610c1b565b3480156104ce57600080fd5b5030610321565b3480156104e157600080fd5b5061028c6104f03660046125e3565b610c28565b34801561050157600080fd5b506102c2610510366004612526565b63ffffffff919091166000908152600160205260409020541490565b34801561053857600080fd5b506103217f000000000000000000000000000000000000000000000000000000000000000081565b34801561056c57600080fd5b5061034c61057b366004612616565b610ccd565b34801561058c57600080fd5b506103d061059b366004612616565b6001600160a01b031660009081526005602052604090205490565b3480156105c257600080fd5b5061034c610d2a565b3480156105d757600080fd5b5061034c6105e63660046122c2565b610d3e565b3480156105f757600080fd5b5061060e610606366004612526565b600092915050565b6040516001600160401b039091168152602001610299565b34801561063257600080fd5b506102c2610641366004612633565b610d9d565b34801561065257600080fd5b506006610423565b34801561066657600080fd5b506000546001600160a01b0316610321565b34801561068457600080fd5b5061028c610db2565b34801561069957600080fd5b506103d07f000000000000000000000000000000000000000000000000000000000000000081565b3480156106cd57600080fd5b5060006102c2565b3480156106e157600080fd5b506102c26106f03660046122c2565b610dc1565b34801561070157600080fd5b50600254610321906001600160a01b031681565b34801561072157600080fd5b5061034c6107303660046126dd565b610dcf565b34801561074157600080fd5b506103d061075036600461271e565b60016020526000908152604090205481565b34801561076e57600080fd5b5061028c61077d366004612739565b610de9565b61034c6107903660046126dd565b610f91565b6107a86107a3366004612799565b61111b565b604051610299929190612806565b3480156107c257600080fd5b5061034c6107d1366004612616565b61114f565b61034c6107e436600461242d565b6111d5565b3480156107f557600080fd5b5061034c610804366004612616565b611204565b34801561081557600080fd5b506103d0610824366004612858565b61125a565b34801561083557600080fd5b5061034c610844366004612616565b611285565b34801561085557600080fd5b506102c2610864366004612886565b6112c0565b606060088054610878906128a2565b80601f01602080910402602001604051908101604052809291908181526020018280546108a4906128a2565b80156108f15780601f106108c6576101008083540402835291602001916108f1565b820191906000526020600020905b8154815290600101906020018083116108d457829003601f168201915b5050505050905090565b6000336109098185856112f6565b60019150505b92915050565b60408051808201909152600080825260208201526060610948604051806040016040528060008152602001600081525090565b600080306001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610989573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ad91906128d6565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0e91906128f3565b60408051808201825284815260208082018490528251600080825291810190935290975091925090610a63565b604080518082019091526000815260606020820152815260200190600190039081610a3b5790505b509350600080610a88604089013560608a0135610a8360208c018c61271e565b611308565b60408051808201909152918252602082015296989597505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314610af6576040516391ac5e4f60e01b81523360048201526024015b60405180910390fd5b60208701803590610b1090610b0b908a61271e565b611344565b14610b4e57610b22602088018861271e565b60405163309afaf360e21b815263ffffffff909116600482015260208801356024820152604401610aed565b610b5d87878787878787611380565b50505050505050565b600033610b748582856114e7565b610b7f85858561154e565b60019150505b9392505050565b610b946115ad565b610b9e82826115da565b5050565b60408051808201909152600080825260208201526000610bd260408501356060860135610a83602088018861271e565b915050600080610be2868461162f565b9092509050610bff610bf7602088018861271e565b838388611752565b9695505050505050565b610c116115ad565b610b9e8282611833565b610c253382611869565b50565b600360209081526000928352604080842090915290825290208054610c4c906128a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c78906128a2565b8015610cc55780601f10610c9a57610100808354040283529160200191610cc5565b820191906000526020600020905b815481529060010190602001808311610ca857829003601f168201915b505050505081565b610cd56115ad565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906020015b60405180910390a150565b610d326115ad565b610d3c600061189f565b565b80610d49833361125a565b1015610d885760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610aed565b610d938233836114e7565b610b9e8282611869565b6001600160a01b03811630145b949350505050565b606060098054610878906128a2565b60003361090981858561154e565b610dd76115ad565b610b9e610de482846129c3565b6118ef565b63ffffffff8416600090815260036020908152604080832061ffff87168452909152812080546060929190610e1d906128a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610e49906128a2565b8015610e965780601f10610e6b57610100808354040283529160200191610e96565b820191906000526020600020905b815481529060010190602001808311610e7957829003601f168201915b505050505090508051600003610ee65783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929450610daa9350505050565b6000839003610ef6579050610daa565b60028310610f7457610f3d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119f692505050565b80610f4b8460028188612ad8565b604051602001610f5d93929190612b02565b604051602081830303815290604052915050610daa565b8383604051639a6d49cd60e01b8152600401610aed929190612b53565b60005b8181101561109a5736838383818110610faf57610faf612b67565b9050602002810190610fc19190612b7d565b9050610ff4610fd3602083018361271e565b602083013563ffffffff919091166000908152600160205260409020541490565b610ffe5750611092565b3063d045a0dc60c08301358360a081013561101d610100830183612b9e565b61102e610100890160e08a01612616565b61103c6101208a018a612b9e565b6040518963ffffffff1660e01b815260040161105e9796959493929190612bf9565b6000604051808303818588803b15801561107757600080fd5b505af115801561108b573d6000803e3d6000fd5b5050505050505b600101610f94565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b8152600401600060405180830381865afa1580156110d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111019190810190612c7f565b604051638351eea760e01b8152600401610aed919061229a565b611123612203565b6040805180820190915260008082526020820152611142858585611a22565b915091505b935093915050565b6111576115ad565b60405163ca5eb5e160e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190602401600060405180830381600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b5050505050565b3330146111f55760405163029a949d60e31b815260040160405180910390fd5b610b5d87878787878787610b4e565b61120c6115ad565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090602001610d1f565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b61128d6115ad565b6001600160a01b0381166112b757604051631e4fbdf760e01b815260006004820152602401610aed565b610c258161189f565b60006020820180359060019083906112d8908661271e565b63ffffffff1681526020810191909152604001600020541492915050565b6113038383836001611b1d565b505050565b60008061131485611bf2565b915081905083811015611147576040516371c4efed60e01b81526004810182905260248101859052604401610aed565b63ffffffff81166000908152600160205260408120548061090f5760405163f6ff4fb760e01b815263ffffffff84166004820152602401610aed565b600061139261138f8787611c29565b90565b905060006113be826113ac6113a78a8a611c41565b611c64565b6113b960208d018d61271e565b611c99565b905060288611156114855760006113fb6113de60608c0160408d01612cec565b6113eb60208d018d61271e565b846113f68c8c611cc1565b611d0c565b604051633e5ac80960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb59012906114519086908d906000908790600401612d09565b600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c6114be60208d018d61271e565b6040805163ffffffff9092168252602082018690520160405180910390a3505050505050505050565b60006114f3848461125a565b9050600019811015611548578181101561153957604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610aed565b61154884848484036000611b1d565b50505050565b6001600160a01b03831661157857604051634b637e8f60e11b815260006004820152602401610aed565b6001600160a01b0382166115a25760405163ec442f0560e01b815260006004820152602401610aed565b611303838383611d3e565b6000546001600160a01b03163314610d3c5760405163118cdaa760e01b8152336004820152602401610aed565b63ffffffff8216600081815260016020908152604091829020849055815192835282018390527f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b910160405180910390a15050565b606080600061168c856020013561164586611e68565b61165260a0890189612b9e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e9492505050565b909350905060008161169f5760016116a2565b60025b90506116c26116b4602088018861271e565b8261077d60808a018a612b9e565b6004549093506001600160a01b031680156117485760405163043a78eb60e01b81526001600160a01b0382169063043a78eb906117059088908890600401612d3a565b602060405180830381865afa158015611722573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117469190612d5f565b505b5050509250929050565b60408051808201909152600080825260208201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff1681526020016117b589611344565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b81526004016117ea929190612d7c565b6040805180830381865afa158015611806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182a9190612e25565b95945050505050565b6001600160a01b03821661185d5760405163ec442f0560e01b815260006004820152602401610aed565b610b9e60008383611d3e565b6001600160a01b03821661189357604051634b637e8f60e11b815260006004820152602401610aed565b610b9e82600083611d3e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b81518110156119c65761192182828151811061191057611910612b67565b6020026020010151604001516119f6565b81818151811061193357611933612b67565b6020026020010151604001516003600084848151811061195557611955612b67565b60200260200101516000015163ffffffff1663ffffffff168152602001908152602001600020600084848151811061198f5761198f612b67565b60200260200101516020015161ffff1661ffff16815260200190815260200160002090816119bd9190612e91565b506001016118f2565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67481604051610d1f9190612f50565b600281015161ffff8116600314610b9e5781604051639a6d49cd60e01b8152600401610aed919061229a565b611a2a612203565b6040805180820190915260008082526020820152600080611a6133604089013560608a0135611a5c60208c018c61271e565b611f0e565b91509150600080611a72898461162f565b9092509050611a9e611a8760208b018b61271e565b8383611a98368d90038d018d612fdb565b8b611f34565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a90611aec908d018d61271e565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b6001600160a01b038416611b475760405163e602df0560e01b815260006004820152602401610aed565b6001600160a01b038316611b7157604051634a1406b160e11b815260006004820152602401610aed565b6001600160a01b038085166000908152600660209081526040808320938716835292905220829055801561154857826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611be491815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000611c1f8184613023565b61090f9190613045565b6000611c386020828486612ad8565b610b859161305c565b6000611c51602860208486612ad8565b611c5a9161307a565b60c01c9392505050565b600061090f7f00000000000000000000000000000000000000000000000000000000000000006001600160401b038416613045565b60006001600160a01b038416611caf5761dead93505b611cb98484611833565b509092915050565b6060611cd08260288186612ad8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929695505050505050565b606084848484604051602001611d2594939291906130aa565b6040516020818303038152906040529050949350505050565b6001600160a01b038316611d69578060076000828254611d5e91906130f9565b90915550611ddb9050565b6001600160a01b03831660009081526005602052604090205481811015611dbc5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610aed565b6001600160a01b03841660009081526005602052604090209082900390555b6001600160a01b038216611df757600780548290039055611e16565b6001600160a01b03821660009081526005602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611e5b91815260200190565b60405180910390a3505050565b600061090f7f000000000000000000000000000000000000000000000000000000000000000083613023565b8051606090151580611edd578484604051602001611ec992919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052611f04565b84843385604051602001611ef4949392919061310c565b6040516020818303038152906040525b9150935093915050565b600080611f1c858585611308565b9092509050611f2b8683611869565b94509492505050565b611f3c612203565b6000611f4b846000015161203f565b602085015190915015611f6557611f658460200151612067565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a450826040518060a001604052808b63ffffffff168152602001611fb58c611344565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b8152600401611ff1929190612d7c565b60806040518083038185885af115801561200f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612034919061314f565b979650505050505050565b6000813414612063576040516304fb820960e51b8152346004820152602401610aed565b5090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120eb91906128d6565b90506001600160a01b038116612114576040516329b99a9560e11b815260040160405180910390fd5b6040805133602482018190527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381811660448501526064808501889052855180860390910181526084909401909452602080840180516001600160e01b03166323b872dd60e01b1781528451610b9e96881695899361154893889360009283929091839182885af1806121b5576040513d6000823e3d81fd5b50506000513d915081156121cd5780600114156121da565b6001600160a01b0384163b155b1561154857604051635274afe760e01b81526001600160a01b0385166004820152602401610aed565b60405180606001604052806000801916815260200160006001600160401b03168152602001612245604051806040016040528060008152602001600081525090565b905290565b60005b8381101561226557818101518382015260200161224d565b50506000910152565b6000815180845261228681602086016020860161224a565b601f01601f19169290920160200192915050565b602081526000610b85602083018461226e565b6001600160a01b0381168114610c2557600080fd5b600080604083850312156122d557600080fd5b82356122e0816122ad565b946020939093013593505050565b600060e0828403121561230057600080fd5b50919050565b60006020828403121561231857600080fd5b81356001600160401b0381111561232e57600080fd5b610daa848285016122ee565b8351815260208085015190820152600060a08201604060a0604085015281865180845260c08601915060c08160051b8701019350602080890160005b838110156123b55788870360bf190185528151805188528301518388018790526123a28789018261226e565b9750509382019390820190600101612376565b50508751606088015250505060208501516080850152509050610daa565b60006060828403121561230057600080fd5b60008083601f8401126123f757600080fd5b5081356001600160401b0381111561240e57600080fd5b60208301915083602082850101111561242657600080fd5b9250929050565b600080600080600080600060e0888a03121561244857600080fd5b61245289896123d3565b96506060880135955060808801356001600160401b038082111561247557600080fd5b6124818b838c016123e5565b909750955060a08a01359150612496826122ad565b90935060c089013590808211156124ac57600080fd5b506124b98a828b016123e5565b989b979a50959850939692959293505050565b6000806000606084860312156124e157600080fd5b83356124ec816122ad565b925060208401356124fc816122ad565b929592945050506040919091013590565b803563ffffffff8116811461252157600080fd5b919050565b6000806040838503121561253957600080fd5b6122e08361250d565b8015158114610c2557600080fd5b6000806040838503121561256357600080fd5b82356001600160401b0381111561257957600080fd5b612585858286016122ee565b925050602083013561259681612542565b809150509250929050565b81518152602080830151908201526040810161090f565b6000602082840312156125ca57600080fd5b5035919050565b803561ffff8116811461252157600080fd5b600080604083850312156125f657600080fd5b6125ff8361250d565b915061260d602084016125d1565b90509250929050565b60006020828403121561262857600080fd5b8135610b85816122ad565b60008060008060a0858703121561264957600080fd5b61265386866123d3565b935060608501356001600160401b0381111561266e57600080fd5b61267a878288016123e5565b909450925050608085013561268e816122ad565b939692955090935050565b60008083601f8401126126ab57600080fd5b5081356001600160401b038111156126c257600080fd5b6020830191508360208260051b850101111561242657600080fd5b600080602083850312156126f057600080fd5b82356001600160401b0381111561270657600080fd5b61271285828601612699565b90969095509350505050565b60006020828403121561273057600080fd5b610b858261250d565b6000806000806060858703121561274f57600080fd5b6127588561250d565b9350612766602086016125d1565b925060408501356001600160401b0381111561278157600080fd5b61278d878288016123e5565b95989497509550505050565b600080600083850360808112156127af57600080fd5b84356001600160401b038111156127c557600080fd5b6127d1878288016122ee565b9450506040601f19820112156127e657600080fd5b5060208401915060608401356127fb816122ad565b809150509250925092565b600060c082019050835182526001600160401b0360208501511660208301526040840151612841604084018280518252602090810151910152565b5082516080830152602083015160a0830152610b85565b6000806040838503121561286b57600080fd5b8235612876816122ad565b91506020830135612596816122ad565b60006060828403121561289857600080fd5b610b8583836123d3565b600181811c908216806128b657607f821691505b60208210810361230057634e487b7160e01b600052602260045260246000fd5b6000602082840312156128e857600080fd5b8151610b85816122ad565b60006020828403121561290557600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156129445761294461290c565b60405290565b604080519081016001600160401b03811182821017156129445761294461290c565b604051601f8201601f191681016001600160401b03811182821017156129945761299461290c565b604052919050565b60006001600160401b038211156129b5576129b561290c565b50601f01601f191660200190565b60006001600160401b03808411156129dd576129dd61290c565b8360051b60206129ee81830161296c565b868152918501918181019036841115612a0657600080fd5b865b84811015612acc57803586811115612a205760008081fd5b88016060368290031215612a345760008081fd5b612a3c612922565b612a458261250d565b8152612a528683016125d1565b8682015260408083013589811115612a6a5760008081fd5b929092019136601f840112612a7f5760008081fd5b8235612a92612a8d8261299c565b61296c565b8181523689838701011115612aa75760008081fd5b818986018a830137600091810189019190915290820152845250918301918301612a08565b50979650505050505050565b60008085851115612ae857600080fd5b83861115612af557600080fd5b5050820193919092039150565b60008451612b1481846020890161224a565b8201838582376000930192835250909392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000610daa602083018486612b2a565b634e487b7160e01b600052603260045260246000fd5b6000823561013e19833603018112612b9457600080fd5b9190910192915050565b6000808335601e19843603018112612bb557600080fd5b8301803591506001600160401b03821115612bcf57600080fd5b60200191503681900382131561242657600080fd5b6001600160401b0381168114610c2557600080fd5b63ffffffff612c078961250d565b1681526020880135602082015260006040890135612c2481612be4565b6001600160401b03811660408401525087606083015260e06080830152612c4f60e083018789612b2a565b6001600160a01b03861660a084015282810360c0840152612c71818587612b2a565b9a9950505050505050505050565b600060208284031215612c9157600080fd5b81516001600160401b03811115612ca757600080fd5b8201601f81018413612cb857600080fd5b8051612cc6612a8d8261299c565b818152856020838501011115612cdb57600080fd5b61182a82602083016020860161224a565b600060208284031215612cfe57600080fd5b8135610b8581612be4565b60018060a01b038516815283602082015261ffff83166040820152608060608201526000610bff608083018461226e565b604081526000612d4d604083018561226e565b828103602084015261182a818561226e565b600060208284031215612d7157600080fd5b8151610b8581612542565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a06080840152612db260e084018261226e565b90506060850151603f198483030160a0850152612dcf828261226e565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b600060408284031215612e0757600080fd5b612e0f61294a565b9050815181526020820151602082015292915050565b600060408284031215612e3757600080fd5b610b858383612df5565b601f821115611303576000816000526020600020601f850160051c81016020861015612e6a5750805b601f850160051c820191505b81811015612e8957828155600101612e76565b505050505050565b81516001600160401b03811115612eaa57612eaa61290c565b612ebe81612eb884546128a2565b84612e41565b602080601f831160018114612ef35760008415612edb5750858301515b600019600386901b1c1916600185901b178555612e89565b600085815260208120601f198616915b82811015612f2257888601518255948401946001909101908401612f03565b5085821015612f405787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015612fcd57888303603f190185528151805163ffffffff1684528781015161ffff16888501528601516060878501819052612fb98186018361226e565b968901969450505090860190600101612f79565b509098975050505050505050565b600060408284031215612fed57600080fd5b612ff561294a565b82358152602083013560208201528091505092915050565b634e487b7160e01b600052601160045260246000fd5b60008261304057634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761090f5761090f61300d565b8035602083101561090f57600019602084900360031b1b1692915050565b6001600160c01b031981358181169160088510156130a25780818660080360031b1b83161692505b505092915050565b6001600160401b0360c01b8560c01b16815263ffffffff60e01b8460e01b16600882015282600c820152600082516130e981602c85016020870161224a565b91909101602c0195945050505050565b8082018082111561090f5761090f61300d565b8481526001600160401b0360c01b8460c01b1660208201528260288201526000825161313f81604885016020870161224a565b9190910160480195945050505050565b60006080828403121561316157600080fd5b613169612922565b82518152602083015161317b81612be4565b602082015261318d8460408501612df5565b6040820152939250505056fea26469706673582212209b72c984e5417ea5e6c7d18897310bfc904d390bb97b33c8f4086ddb6289aad064736f6c6343000817003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b000000000000000000000000185732a5578dc91dfa6ba7361262432a178afeae000000000000000000000000185732a5578dc91dfa6ba7361262432a178afeae0000000000000000000000000000000000000000000000000000000000000009436869707320555344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046355534400000000000000000000000000000000000000000000000000000000

    Deployed Bytecode

    0x6080604052600436106102725760003560e01c8063715018a61161014f578063b98bd070116100c1578063d045a0dc1161007a578063d045a0dc146107d6578063d4243885146107e9578063dd62ed3e14610809578063f2fde38b14610829578063fc0c546a146104c2578063ff7bd03d1461084957600080fd5b8063b98bd07014610715578063bb0b6a5314610735578063bc70b35414610762578063bd815db014610782578063c7c7f5b314610795578063ca5eb5e1146107b657600080fd5b80638da5cb5b116101135780638da5cb5b1461065a57806395d89b4114610678578063963efcaa1461068d5780639f68b964146106c1578063a9059cbb146106d5578063b731ea0a146106f557600080fd5b8063715018a6146105b657806379cc6790146105cb5780637d25a05e146105eb57806382413eac14610626578063857749b01461064657600080fd5b8063313ce567116101e857806352ae2879116101ac57806352ae2879146104c25780635535d461146104d55780635a0dfe4d146104f55780635e280f111461052c5780636fc1b31e1461056057806370a082311461058057600080fd5b8063313ce567146104135780633400288b146104355780633b6f743b1461045557806340c10f191461048257806342966c68146104a257600080fd5b8063134d4f251161023a578063134d4f251461034e578063156a0d0f1461037657806317442b701461039d57806318160ddd146103bf5780631f5e1334146103de57806323b872dd146103f357600080fd5b806306fdde0314610277578063095ea7b3146102a25780630d35b415146102d2578063111ecdad1461030157806313137d6514610339575b600080fd5b34801561028357600080fd5b5061028c610869565b604051610299919061229a565b60405180910390f35b3480156102ae57600080fd5b506102c26102bd3660046122c2565b6108fb565b6040519015158152602001610299565b3480156102de57600080fd5b506102f26102ed366004612306565b610915565b6040516102999392919061233a565b34801561030d57600080fd5b50600454610321906001600160a01b031681565b6040516001600160a01b039091168152602001610299565b61034c61034736600461242d565b610aa6565b005b34801561035a57600080fd5b50610363600281565b60405161ffff9091168152602001610299565b34801561038257600080fd5b506040805162b9270b60e21b81526001602082015201610299565b3480156103a957600080fd5b5060408051600181526002602082015201610299565b3480156103cb57600080fd5b506007545b604051908152602001610299565b3480156103ea57600080fd5b50610363600181565b3480156103ff57600080fd5b506102c261040e3660046124cc565b610b66565b34801561041f57600080fd5b5060125b60405160ff9091168152602001610299565b34801561044157600080fd5b5061034c610450366004612526565b610b8c565b34801561046157600080fd5b50610475610470366004612550565b610ba2565b60405161029991906125a1565b34801561048e57600080fd5b5061034c61049d3660046122c2565b610c09565b3480156104ae57600080fd5b5061034c6104bd3660046125b8565b610c1b565b3480156104ce57600080fd5b5030610321565b3480156104e157600080fd5b5061028c6104f03660046125e3565b610c28565b34801561050157600080fd5b506102c2610510366004612526565b63ffffffff919091166000908152600160205260409020541490565b34801561053857600080fd5b506103217f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b81565b34801561056c57600080fd5b5061034c61057b366004612616565b610ccd565b34801561058c57600080fd5b506103d061059b366004612616565b6001600160a01b031660009081526005602052604090205490565b3480156105c257600080fd5b5061034c610d2a565b3480156105d757600080fd5b5061034c6105e63660046122c2565b610d3e565b3480156105f757600080fd5b5061060e610606366004612526565b600092915050565b6040516001600160401b039091168152602001610299565b34801561063257600080fd5b506102c2610641366004612633565b610d9d565b34801561065257600080fd5b506006610423565b34801561066657600080fd5b506000546001600160a01b0316610321565b34801561068457600080fd5b5061028c610db2565b34801561069957600080fd5b506103d07f000000000000000000000000000000000000000000000000000000e8d4a5100081565b3480156106cd57600080fd5b5060006102c2565b3480156106e157600080fd5b506102c26106f03660046122c2565b610dc1565b34801561070157600080fd5b50600254610321906001600160a01b031681565b34801561072157600080fd5b5061034c6107303660046126dd565b610dcf565b34801561074157600080fd5b506103d061075036600461271e565b60016020526000908152604090205481565b34801561076e57600080fd5b5061028c61077d366004612739565b610de9565b61034c6107903660046126dd565b610f91565b6107a86107a3366004612799565b61111b565b604051610299929190612806565b3480156107c257600080fd5b5061034c6107d1366004612616565b61114f565b61034c6107e436600461242d565b6111d5565b3480156107f557600080fd5b5061034c610804366004612616565b611204565b34801561081557600080fd5b506103d0610824366004612858565b61125a565b34801561083557600080fd5b5061034c610844366004612616565b611285565b34801561085557600080fd5b506102c2610864366004612886565b6112c0565b606060088054610878906128a2565b80601f01602080910402602001604051908101604052809291908181526020018280546108a4906128a2565b80156108f15780601f106108c6576101008083540402835291602001916108f1565b820191906000526020600020905b8154815290600101906020018083116108d457829003601f168201915b5050505050905090565b6000336109098185856112f6565b60019150505b92915050565b60408051808201909152600080825260208201526060610948604051806040016040528060008152602001600081525090565b600080306001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610989573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ad91906128d6565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0e91906128f3565b60408051808201825284815260208082018490528251600080825291810190935290975091925090610a63565b604080518082019091526000815260606020820152815260200190600190039081610a3b5790505b509350600080610a88604089013560608a0135610a8360208c018c61271e565b611308565b60408051808201909152918252602082015296989597505050505050565b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b03163314610af6576040516391ac5e4f60e01b81523360048201526024015b60405180910390fd5b60208701803590610b1090610b0b908a61271e565b611344565b14610b4e57610b22602088018861271e565b60405163309afaf360e21b815263ffffffff909116600482015260208801356024820152604401610aed565b610b5d87878787878787611380565b50505050505050565b600033610b748582856114e7565b610b7f85858561154e565b60019150505b9392505050565b610b946115ad565b610b9e82826115da565b5050565b60408051808201909152600080825260208201526000610bd260408501356060860135610a83602088018861271e565b915050600080610be2868461162f565b9092509050610bff610bf7602088018861271e565b838388611752565b9695505050505050565b610c116115ad565b610b9e8282611833565b610c253382611869565b50565b600360209081526000928352604080842090915290825290208054610c4c906128a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c78906128a2565b8015610cc55780601f10610c9a57610100808354040283529160200191610cc5565b820191906000526020600020905b815481529060010190602001808311610ca857829003601f168201915b505050505081565b610cd56115ad565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906020015b60405180910390a150565b610d326115ad565b610d3c600061189f565b565b80610d49833361125a565b1015610d885760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610aed565b610d938233836114e7565b610b9e8282611869565b6001600160a01b03811630145b949350505050565b606060098054610878906128a2565b60003361090981858561154e565b610dd76115ad565b610b9e610de482846129c3565b6118ef565b63ffffffff8416600090815260036020908152604080832061ffff87168452909152812080546060929190610e1d906128a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610e49906128a2565b8015610e965780601f10610e6b57610100808354040283529160200191610e96565b820191906000526020600020905b815481529060010190602001808311610e7957829003601f168201915b505050505090508051600003610ee65783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929450610daa9350505050565b6000839003610ef6579050610daa565b60028310610f7457610f3d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119f692505050565b80610f4b8460028188612ad8565b604051602001610f5d93929190612b02565b604051602081830303815290604052915050610daa565b8383604051639a6d49cd60e01b8152600401610aed929190612b53565b60005b8181101561109a5736838383818110610faf57610faf612b67565b9050602002810190610fc19190612b7d565b9050610ff4610fd3602083018361271e565b602083013563ffffffff919091166000908152600160205260409020541490565b610ffe5750611092565b3063d045a0dc60c08301358360a081013561101d610100830183612b9e565b61102e610100890160e08a01612616565b61103c6101208a018a612b9e565b6040518963ffffffff1660e01b815260040161105e9796959493929190612bf9565b6000604051808303818588803b15801561107757600080fd5b505af115801561108b573d6000803e3d6000fd5b5050505050505b600101610f94565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b8152600401600060405180830381865afa1580156110d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111019190810190612c7f565b604051638351eea760e01b8152600401610aed919061229a565b611123612203565b6040805180820190915260008082526020820152611142858585611a22565b915091505b935093915050565b6111576115ad565b60405163ca5eb5e160e01b81526001600160a01b0382811660048301527f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b169063ca5eb5e190602401600060405180830381600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b5050505050565b3330146111f55760405163029a949d60e31b815260040160405180910390fd5b610b5d87878787878787610b4e565b61120c6115ad565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090602001610d1f565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b61128d6115ad565b6001600160a01b0381166112b757604051631e4fbdf760e01b815260006004820152602401610aed565b610c258161189f565b60006020820180359060019083906112d8908661271e565b63ffffffff1681526020810191909152604001600020541492915050565b6113038383836001611b1d565b505050565b60008061131485611bf2565b915081905083811015611147576040516371c4efed60e01b81526004810182905260248101859052604401610aed565b63ffffffff81166000908152600160205260408120548061090f5760405163f6ff4fb760e01b815263ffffffff84166004820152602401610aed565b600061139261138f8787611c29565b90565b905060006113be826113ac6113a78a8a611c41565b611c64565b6113b960208d018d61271e565b611c99565b905060288611156114855760006113fb6113de60608c0160408d01612cec565b6113eb60208d018d61271e565b846113f68c8c611cc1565b611d0c565b604051633e5ac80960e11b81529091506001600160a01b037f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b1690637cb59012906114519086908d906000908790600401612d09565b600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c6114be60208d018d61271e565b6040805163ffffffff9092168252602082018690520160405180910390a3505050505050505050565b60006114f3848461125a565b9050600019811015611548578181101561153957604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610aed565b61154884848484036000611b1d565b50505050565b6001600160a01b03831661157857604051634b637e8f60e11b815260006004820152602401610aed565b6001600160a01b0382166115a25760405163ec442f0560e01b815260006004820152602401610aed565b611303838383611d3e565b6000546001600160a01b03163314610d3c5760405163118cdaa760e01b8152336004820152602401610aed565b63ffffffff8216600081815260016020908152604091829020849055815192835282018390527f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b910160405180910390a15050565b606080600061168c856020013561164586611e68565b61165260a0890189612b9e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e9492505050565b909350905060008161169f5760016116a2565b60025b90506116c26116b4602088018861271e565b8261077d60808a018a612b9e565b6004549093506001600160a01b031680156117485760405163043a78eb60e01b81526001600160a01b0382169063043a78eb906117059088908890600401612d3a565b602060405180830381865afa158015611722573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117469190612d5f565b505b5050509250929050565b60408051808201909152600080825260208201527f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b031663ddc28c586040518060a001604052808863ffffffff1681526020016117b589611344565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b81526004016117ea929190612d7c565b6040805180830381865afa158015611806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182a9190612e25565b95945050505050565b6001600160a01b03821661185d5760405163ec442f0560e01b815260006004820152602401610aed565b610b9e60008383611d3e565b6001600160a01b03821661189357604051634b637e8f60e11b815260006004820152602401610aed565b610b9e82600083611d3e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b81518110156119c65761192182828151811061191057611910612b67565b6020026020010151604001516119f6565b81818151811061193357611933612b67565b6020026020010151604001516003600084848151811061195557611955612b67565b60200260200101516000015163ffffffff1663ffffffff168152602001908152602001600020600084848151811061198f5761198f612b67565b60200260200101516020015161ffff1661ffff16815260200190815260200160002090816119bd9190612e91565b506001016118f2565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67481604051610d1f9190612f50565b600281015161ffff8116600314610b9e5781604051639a6d49cd60e01b8152600401610aed919061229a565b611a2a612203565b6040805180820190915260008082526020820152600080611a6133604089013560608a0135611a5c60208c018c61271e565b611f0e565b91509150600080611a72898461162f565b9092509050611a9e611a8760208b018b61271e565b8383611a98368d90038d018d612fdb565b8b611f34565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a90611aec908d018d61271e565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b6001600160a01b038416611b475760405163e602df0560e01b815260006004820152602401610aed565b6001600160a01b038316611b7157604051634a1406b160e11b815260006004820152602401610aed565b6001600160a01b038085166000908152600660209081526040808320938716835292905220829055801561154857826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611be491815260200190565b60405180910390a350505050565b60007f000000000000000000000000000000000000000000000000000000e8d4a51000611c1f8184613023565b61090f9190613045565b6000611c386020828486612ad8565b610b859161305c565b6000611c51602860208486612ad8565b611c5a9161307a565b60c01c9392505050565b600061090f7f000000000000000000000000000000000000000000000000000000e8d4a510006001600160401b038416613045565b60006001600160a01b038416611caf5761dead93505b611cb98484611833565b509092915050565b6060611cd08260288186612ad8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929695505050505050565b606084848484604051602001611d2594939291906130aa565b6040516020818303038152906040529050949350505050565b6001600160a01b038316611d69578060076000828254611d5e91906130f9565b90915550611ddb9050565b6001600160a01b03831660009081526005602052604090205481811015611dbc5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610aed565b6001600160a01b03841660009081526005602052604090209082900390555b6001600160a01b038216611df757600780548290039055611e16565b6001600160a01b03821660009081526005602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611e5b91815260200190565b60405180910390a3505050565b600061090f7f000000000000000000000000000000000000000000000000000000e8d4a5100083613023565b8051606090151580611edd578484604051602001611ec992919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052611f04565b84843385604051602001611ef4949392919061310c565b6040516020818303038152906040525b9150935093915050565b600080611f1c858585611308565b9092509050611f2b8683611869565b94509492505050565b611f3c612203565b6000611f4b846000015161203f565b602085015190915015611f6557611f658460200151612067565b7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b0316632637a450826040518060a001604052808b63ffffffff168152602001611fb58c611344565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b8152600401611ff1929190612d7c565b60806040518083038185885af115801561200f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612034919061314f565b979650505050505050565b6000813414612063576040516304fb820960e51b8152346004820152602401610aed565b5090565b60007f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120eb91906128d6565b90506001600160a01b038116612114576040516329b99a9560e11b815260040160405180910390fd5b6040805133602482018190527f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b0381811660448501526064808501889052855180860390910181526084909401909452602080840180516001600160e01b03166323b872dd60e01b1781528451610b9e96881695899361154893889360009283929091839182885af1806121b5576040513d6000823e3d81fd5b50506000513d915081156121cd5780600114156121da565b6001600160a01b0384163b155b1561154857604051635274afe760e01b81526001600160a01b0385166004820152602401610aed565b60405180606001604052806000801916815260200160006001600160401b03168152602001612245604051806040016040528060008152602001600081525090565b905290565b60005b8381101561226557818101518382015260200161224d565b50506000910152565b6000815180845261228681602086016020860161224a565b601f01601f19169290920160200192915050565b602081526000610b85602083018461226e565b6001600160a01b0381168114610c2557600080fd5b600080604083850312156122d557600080fd5b82356122e0816122ad565b946020939093013593505050565b600060e0828403121561230057600080fd5b50919050565b60006020828403121561231857600080fd5b81356001600160401b0381111561232e57600080fd5b610daa848285016122ee565b8351815260208085015190820152600060a08201604060a0604085015281865180845260c08601915060c08160051b8701019350602080890160005b838110156123b55788870360bf190185528151805188528301518388018790526123a28789018261226e565b9750509382019390820190600101612376565b50508751606088015250505060208501516080850152509050610daa565b60006060828403121561230057600080fd5b60008083601f8401126123f757600080fd5b5081356001600160401b0381111561240e57600080fd5b60208301915083602082850101111561242657600080fd5b9250929050565b600080600080600080600060e0888a03121561244857600080fd5b61245289896123d3565b96506060880135955060808801356001600160401b038082111561247557600080fd5b6124818b838c016123e5565b909750955060a08a01359150612496826122ad565b90935060c089013590808211156124ac57600080fd5b506124b98a828b016123e5565b989b979a50959850939692959293505050565b6000806000606084860312156124e157600080fd5b83356124ec816122ad565b925060208401356124fc816122ad565b929592945050506040919091013590565b803563ffffffff8116811461252157600080fd5b919050565b6000806040838503121561253957600080fd5b6122e08361250d565b8015158114610c2557600080fd5b6000806040838503121561256357600080fd5b82356001600160401b0381111561257957600080fd5b612585858286016122ee565b925050602083013561259681612542565b809150509250929050565b81518152602080830151908201526040810161090f565b6000602082840312156125ca57600080fd5b5035919050565b803561ffff8116811461252157600080fd5b600080604083850312156125f657600080fd5b6125ff8361250d565b915061260d602084016125d1565b90509250929050565b60006020828403121561262857600080fd5b8135610b85816122ad565b60008060008060a0858703121561264957600080fd5b61265386866123d3565b935060608501356001600160401b0381111561266e57600080fd5b61267a878288016123e5565b909450925050608085013561268e816122ad565b939692955090935050565b60008083601f8401126126ab57600080fd5b5081356001600160401b038111156126c257600080fd5b6020830191508360208260051b850101111561242657600080fd5b600080602083850312156126f057600080fd5b82356001600160401b0381111561270657600080fd5b61271285828601612699565b90969095509350505050565b60006020828403121561273057600080fd5b610b858261250d565b6000806000806060858703121561274f57600080fd5b6127588561250d565b9350612766602086016125d1565b925060408501356001600160401b0381111561278157600080fd5b61278d878288016123e5565b95989497509550505050565b600080600083850360808112156127af57600080fd5b84356001600160401b038111156127c557600080fd5b6127d1878288016122ee565b9450506040601f19820112156127e657600080fd5b5060208401915060608401356127fb816122ad565b809150509250925092565b600060c082019050835182526001600160401b0360208501511660208301526040840151612841604084018280518252602090810151910152565b5082516080830152602083015160a0830152610b85565b6000806040838503121561286b57600080fd5b8235612876816122ad565b91506020830135612596816122ad565b60006060828403121561289857600080fd5b610b8583836123d3565b600181811c908216806128b657607f821691505b60208210810361230057634e487b7160e01b600052602260045260246000fd5b6000602082840312156128e857600080fd5b8151610b85816122ad565b60006020828403121561290557600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156129445761294461290c565b60405290565b604080519081016001600160401b03811182821017156129445761294461290c565b604051601f8201601f191681016001600160401b03811182821017156129945761299461290c565b604052919050565b60006001600160401b038211156129b5576129b561290c565b50601f01601f191660200190565b60006001600160401b03808411156129dd576129dd61290c565b8360051b60206129ee81830161296c565b868152918501918181019036841115612a0657600080fd5b865b84811015612acc57803586811115612a205760008081fd5b88016060368290031215612a345760008081fd5b612a3c612922565b612a458261250d565b8152612a528683016125d1565b8682015260408083013589811115612a6a5760008081fd5b929092019136601f840112612a7f5760008081fd5b8235612a92612a8d8261299c565b61296c565b8181523689838701011115612aa75760008081fd5b818986018a830137600091810189019190915290820152845250918301918301612a08565b50979650505050505050565b60008085851115612ae857600080fd5b83861115612af557600080fd5b5050820193919092039150565b60008451612b1481846020890161224a565b8201838582376000930192835250909392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000610daa602083018486612b2a565b634e487b7160e01b600052603260045260246000fd5b6000823561013e19833603018112612b9457600080fd5b9190910192915050565b6000808335601e19843603018112612bb557600080fd5b8301803591506001600160401b03821115612bcf57600080fd5b60200191503681900382131561242657600080fd5b6001600160401b0381168114610c2557600080fd5b63ffffffff612c078961250d565b1681526020880135602082015260006040890135612c2481612be4565b6001600160401b03811660408401525087606083015260e06080830152612c4f60e083018789612b2a565b6001600160a01b03861660a084015282810360c0840152612c71818587612b2a565b9a9950505050505050505050565b600060208284031215612c9157600080fd5b81516001600160401b03811115612ca757600080fd5b8201601f81018413612cb857600080fd5b8051612cc6612a8d8261299c565b818152856020838501011115612cdb57600080fd5b61182a82602083016020860161224a565b600060208284031215612cfe57600080fd5b8135610b8581612be4565b60018060a01b038516815283602082015261ffff83166040820152608060608201526000610bff608083018461226e565b604081526000612d4d604083018561226e565b828103602084015261182a818561226e565b600060208284031215612d7157600080fd5b8151610b8581612542565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a06080840152612db260e084018261226e565b90506060850151603f198483030160a0850152612dcf828261226e565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b600060408284031215612e0757600080fd5b612e0f61294a565b9050815181526020820151602082015292915050565b600060408284031215612e3757600080fd5b610b858383612df5565b601f821115611303576000816000526020600020601f850160051c81016020861015612e6a5750805b601f850160051c820191505b81811015612e8957828155600101612e76565b505050505050565b81516001600160401b03811115612eaa57612eaa61290c565b612ebe81612eb884546128a2565b84612e41565b602080601f831160018114612ef35760008415612edb5750858301515b600019600386901b1c1916600185901b178555612e89565b600085815260208120601f198616915b82811015612f2257888601518255948401946001909101908401612f03565b5085821015612f405787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b83811015612fcd57888303603f190185528151805163ffffffff1684528781015161ffff16888501528601516060878501819052612fb98186018361226e565b968901969450505090860190600101612f79565b509098975050505050505050565b600060408284031215612fed57600080fd5b612ff561294a565b82358152602083013560208201528091505092915050565b634e487b7160e01b600052601160045260246000fd5b60008261304057634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761090f5761090f61300d565b8035602083101561090f57600019602084900360031b1b1692915050565b6001600160c01b031981358181169160088510156130a25780818660080360031b1b83161692505b505092915050565b6001600160401b0360c01b8560c01b16815263ffffffff60e01b8460e01b16600882015282600c820152600082516130e981602c85016020870161224a565b91909101602c0195945050505050565b8082018082111561090f5761090f61300d565b8481526001600160401b0360c01b8460c01b1660208201528260288201526000825161313f81604885016020870161224a565b9190910160480195945050505050565b60006080828403121561316157600080fd5b613169612922565b82518152602083015161317b81612be4565b602082015261318d8460408501612df5565b6040820152939250505056fea26469706673582212209b72c984e5417ea5e6c7d18897310bfc904d390bb97b33c8f4086ddb6289aad064736f6c63430008170033

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

    00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b000000000000000000000000185732a5578dc91dfa6ba7361262432a178afeae000000000000000000000000185732a5578dc91dfa6ba7361262432a178afeae0000000000000000000000000000000000000000000000000000000000000009436869707320555344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046355534400000000000000000000000000000000000000000000000000000000

    -----Decoded View---------------
    Arg [0] : name (string): Chips USD
    Arg [1] : symbol (string): cUSD
    Arg [2] : lzEndpoint (address): 0x6F475642a6e85809B1c36Fa62763669b1b48DD5B
    Arg [3] : delegate (address): 0x185732A5578dC91DFA6ba7361262432A178AfeAE
    Arg [4] : initialOwner (address): 0x185732A5578dC91DFA6ba7361262432A178AfeAE

    -----Encoded View---------------
    9 Constructor Arguments found :
    Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
    Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
    Arg [2] : 0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b
    Arg [3] : 000000000000000000000000185732a5578dc91dfa6ba7361262432a178afeae
    Arg [4] : 000000000000000000000000185732a5578dc91dfa6ba7361262432a178afeae
    Arg [5] : 0000000000000000000000000000000000000000000000000000000000000009
    Arg [6] : 4368697073205553440000000000000000000000000000000000000000000000
    Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
    Arg [8] : 6355534400000000000000000000000000000000000000000000000000000000


    [ Download: CSV Export  ]
    [ Download: CSV Export  ]

    A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.