S Price: $0.471122 (-0.22%)
    /

    Contract

    0x598488bEB1dc89914612a1ce9DD51e37AEceFF38

    Overview

    S Balance

    Sonic LogoSonic LogoSonic Logo0.128077240936036698 S

    S Value

    $0.06 (@ $0.47/S)

    Multichain Info

    No addresses found
    Age:90D
    Amount:Between 1-100k
    Reset Filter

    Transaction Hash
    Method
    Block
    Age
    From
    To
    Amount

    There are no matching entries

    2 Internal Transactions and 2 Token Transfers found.

    Latest 2 internal transactions

    Parent Transaction Hash Block Age From To Amount
    144561652025-03-18 14:55:1128 days ago1742309711
    0x598488bE...7AEceFF38
    0.01339241 S
    144561652025-03-18 14:55:1128 days ago1742309711
    0x598488bE...7AEceFF38
    0.13188769 S
    Loading...
    Loading

    Contract Source Code Verified (Exact Match)

    Contract Name:
    RemoteHop

    Compiler Version
    v0.8.23+commit.f704f362

    Optimization Enabled:
    No with 200 runs

    Other Settings:
    shanghai EvmVersion
    File 1 of 53 : RemoteHop.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 { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
    import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
    import { IOAppComposer } from "@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppComposer.sol";
    import { OFTComposeMsgCodec } from "@layerzerolabs/oft-evm/contracts/libs/OFTComposeMsgCodec.sol";
    import { OptionsBuilder } from "@fraxfinance/layerzero-v2-upgradeable/oapp/contracts/oapp/libs/OptionsBuilder.sol";
    import { SendParam, MessagingFee, IOFT } from "@fraxfinance/layerzero-v2-upgradeable/oapp/contracts/oft/interfaces/IOFT.sol";
    import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
    import { IOFT2 } from "./interfaces/IOFT2.sol";
    import { ILayerZeroDVN } from "./interfaces/ILayerZeroDVN.sol";
    import { ILayerZeroTreasury } from "./interfaces/ILayerZeroTreasury.sol";
    import { IExecutor } from "./interfaces/IExecutor.sol";
    import { console } from "frax-std/FraxTest.sol";
    // ====================================================================
    // | ______ _______ |
    // | / _____________ __ __ / ____(_____ ____ _____ ________ |
    // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
    // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
    // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
    // | |
    // ====================================================================
    // ============================ RemoteHop =============================
    // ====================================================================
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    File 4 of 53 : IOAppComposer.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { ILayerZeroComposer } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroComposer.sol";
    /**
    * @title IOAppComposer
    * @dev This interface defines the OApp Composer, allowing developers to inherit only the OApp package without the protocol.
    */
    // solhint-disable-next-line no-empty-blocks
    interface IOAppComposer is ILayerZeroComposer {}
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 5 of 53 : 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 6 of 53 : OptionsBuilder.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 { BytesLib } from "solidity-bytes-utils/contracts/BytesLib.sol";
    import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol";
    import { ExecutorOptions } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/ExecutorOptions.sol";
    import { DVNOptions } from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/libs/DVNOptions.sol";
    /**
    * @title OptionsBuilder
    * @dev Library for building and encoding various message options.
    */
    library OptionsBuilder {
    using SafeCast for uint256;
    using BytesLib for bytes;
    // Constants for options types
    uint16 internal constant TYPE_1 = 1; // legacy options type 1
    uint16 internal constant TYPE_2 = 2; // legacy options type 2
    uint16 internal constant TYPE_3 = 3;
    // Custom error message
    error InvalidSize(uint256 max, uint256 actual);
    error InvalidOptionType(uint16 optionType);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 7 of 53 : 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 "../../oapp/OAppSenderUpgradeable.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 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 8 of 53 : SafeERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)
    pragma solidity ^0.8.20;
    import {IERC20} from "../IERC20.sol";
    import {IERC20Permit} from "../extensions/IERC20Permit.sol";
    import {Address} from "../../../utils/Address.sol";
    /**
    * @title SafeERC20
    * @dev Wrappers around ERC20 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 {
    using Address for address;
    /**
    * @dev An operation with an ERC20 token failed.
    */
    error SafeERC20FailedOperation(address token);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 9 of 53 : IOFT2.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    interface IOFT2 {
    function combineOptions(
    uint32 _eid,
    uint16 _msgType,
    bytes calldata _extraOptions
    ) external view returns (bytes memory);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 10 of 53 : ILayerZeroDVN.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    interface ILayerZeroDVN {
    // @notice query the dvn fee for relaying block information to the destination chain
    // @param _dstEid the destination endpoint identifier
    // @param _confirmations - block confirmation delay before relaying blocks
    // @param _sender - the source sending contract address
    // @param _options - options
    function getFee(
    uint32 _dstEid,
    uint64 _confirmations,
    address _sender,
    bytes calldata _options
    ) external view returns (uint256 fee);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 11 of 53 : ILayerZeroTreasury.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    interface ILayerZeroTreasury {
    function getFee(
    address _sender,
    uint32 _dstEid,
    uint256 _totalNativeFee,
    bool _payInLzToken
    ) external view returns (uint256 fee);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 12 of 53 : IExecutor.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    interface IExecutor {
    // @notice query the executor price for relaying the payload and its proof to the destination chain
    // @param _dstEid - the destination endpoint identifier
    // @param _sender - the source sending contract address. executors may apply price discrimination to senders
    // @param _calldataSize - dynamic data size of message + caller params
    // @param _options - optional parameters for extra service plugins, e.g. sending dust tokens at the destination chain
    function getFee(
    uint32 _dstEid,
    address _sender,
    uint256 _calldataSize,
    bytes calldata _options
    ) external view returns (uint256 price);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 13 of 53 : FraxTest.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: ISC
    pragma solidity >=0.8.0;
    import { console2 as console, StdAssertions, StdChains, StdCheats, stdError, StdInvariant, stdJson, stdMath, StdStorage, stdStorage, StdUtils, Vm,
        StdStyle, TestBase, DSTest, Test } from "forge-std/Test.sol";
    import { VmHelper } from "./VmHelper.sol";
    abstract contract FraxTest is VmHelper, Test {
    uint256[] internal snapShotIds;
    function()[] internal setupFunctions;
    modifier useMultipleSetupFunctions() {
    if (snapShotIds.length == 0) _;
    for (uint256 i = 0; i < snapShotIds.length; i++) {
    uint256 _originalSnapshotId = vm.snapshot();
    if (!vm.revertTo(snapShotIds[i])) {
    revert VmDidNotRevert(snapShotIds[i]);
    }
    _;
    vm.clearMockedCalls();
    vm.revertTo(_originalSnapshotId);
    }
    }
    function addSetupFunctions(function()[] memory _setupFunctions) internal {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    File 15 of 53 : ILayerZeroComposer.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.0;
    /**
    * @title ILayerZeroComposer
    */
    interface ILayerZeroComposer {
    /**
    * @notice Composes a LayerZero message from an OApp.
    * @dev To ensure non-reentrancy, implementers of this interface MUST assert msg.sender is the corresponding EndpointV2 contract (i.e.,
             onlyEndpointV2).
    * @param _from The address initiating the composition, typically the OApp where the lzReceive was called.
    * @param _guid The unique identifier for the corresponding LayerZero src/dst tx.
    * @param _message The composed message payload in bytes. NOT necessarily the same payload passed via lzReceive.
    * @param _executor The address of the executor for the composed message.
    * @param _extraData Additional arbitrary data in bytes passed by the entity who executes the lzCompose.
    */
    function lzCompose(
    address _from,
    bytes32 _guid,
    bytes calldata _message,
    address _executor,
    bytes calldata _extraData
    ) external payable;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 16 of 53 : BytesLib.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: Unlicense
    /*
    * @title Solidity Bytes Arrays Utils
    * @author Gonçalo Sá <goncalo.sa@consensys.net>
    *
    * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
    * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
    */
    pragma solidity >=0.8.0 <0.9.0;
    library BytesLib {
    function concat(
    bytes memory _preBytes,
    bytes memory _postBytes
    )
    internal
    pure
    returns (bytes memory)
    {
    bytes memory tempBytes;
    assembly {
    // Get a location of some free memory and store it in tempBytes as
    // Solidity does for memory variables.
    tempBytes := mload(0x40)
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    File 18 of 53 : ExecutorOptions.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 { CalldataBytesLib } from "../../libs/CalldataBytesLib.sol";
    library ExecutorOptions {
    using CalldataBytesLib for bytes;
    uint8 internal constant WORKER_ID = 1;
    uint8 internal constant OPTION_TYPE_LZRECEIVE = 1;
    uint8 internal constant OPTION_TYPE_NATIVE_DROP = 2;
    uint8 internal constant OPTION_TYPE_LZCOMPOSE = 3;
    uint8 internal constant OPTION_TYPE_ORDERED_EXECUTION = 4;
    error Executor_InvalidLzReceiveOption();
    error Executor_InvalidNativeDropOption();
    error Executor_InvalidLzComposeOption();
    /// @dev decode the next executor option from the options starting from the specified cursor
    /// @param _options [executor_id][executor_option][executor_id][executor_option]...
    /// executor_option = [option_size][option_type][option]
    /// option_size = len(option_type) + len(option)
    /// executor_id: uint8, option_size: uint16, option_type: uint8, option: bytes
    /// @param _cursor the cursor to start decoding from
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 19 of 53 : DVNOptions.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 { BytesLib } from "solidity-bytes-utils/contracts/BytesLib.sol";
    import { BitMap256 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/BitMaps.sol";
    import { CalldataBytesLib } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/CalldataBytesLib.sol";
    library DVNOptions {
    using CalldataBytesLib for bytes;
    using BytesLib for bytes;
    uint8 internal constant WORKER_ID = 2;
    uint8 internal constant OPTION_TYPE_PRECRIME = 1;
    error DVN_InvalidDVNIdx();
    error DVN_InvalidDVNOptions(uint256 cursor);
    /// @dev group dvn options by its idx
    /// @param _options [dvn_id][dvn_option][dvn_id][dvn_option]...
    /// dvn_option = [option_size][dvn_idx][option_type][option]
    /// option_size = len(dvn_idx) + len(option_type) + len(option)
    /// dvn_id: uint8, dvn_idx: uint8, option_size: uint16, option_type: uint8, option: bytes
    /// @return dvnOptions the grouped options, still share the same format of _options
    /// @return dvnIndices the dvn indices
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 20 of 53 : OAppSenderUpgradeable.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 { OAppCoreUpgradeable } from "./OAppCoreUpgradeable.sol";
    /**
    * @title OAppSender
    * @dev Abstract contract implementing the OAppSender functionality for sending messages to a LayerZero endpoint.
    */
    abstract contract OAppSenderUpgradeable is OAppCoreUpgradeable {
    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;
    /**
    * @dev Ownable is not initialized here on purpose. It should be initialized in the child contract to
    * accommodate the different version of Ownable.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 21 of 53 : IERC20Permit.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
    * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
    *
    * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
    * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
    * need to send a transaction, and thus is not required to hold Ether at all.
    *
    * ==== Security Considerations
    *
    * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
    * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
    * considered as an intention to spend the allowance in any specific way. The second is that because permits have
    * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
    * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
    * generally recommended is:
    *
    * ```solidity
    * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
    * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
    * doThing(..., value);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 22 of 53 : Address.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
    pragma solidity ^0.8.20;
    /**
    * @dev Collection of functions related to the address type
    */
    library Address {
    /**
    * @dev The ETH balance of the account is not enough to perform the operation.
    */
    error AddressInsufficientBalance(address account);
    /**
    * @dev There's no code at `target` (it is not a contract).
    */
    error AddressEmptyCode(address target);
    /**
    * @dev A call to an address target failed. The target may have reverted.
    */
    error FailedInnerCall();
    /**
    * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 23 of 53 : Test.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.6.2 <0.9.0;
    pragma experimental ABIEncoderV2;
    // 💬 ABOUT
    // Standard Library's default Test
    // 🧩 MODULES
    import {console} from "./console.sol";
    import {console2} from "./console2.sol";
    import {StdAssertions} from "./StdAssertions.sol";
    import {StdChains} from "./StdChains.sol";
    import {StdCheats} from "./StdCheats.sol";
    import {stdError} from "./StdError.sol";
    import {StdInvariant} from "./StdInvariant.sol";
    import {stdJson} from "./StdJson.sol";
    import {stdMath} from "./StdMath.sol";
    import {StdStorage, stdStorage} from "./StdStorage.sol";
    import {StdUtils} from "./StdUtils.sol";
    import {Vm} from "./Vm.sol";
    import {StdStyle} from "./StdStyle.sol";
    // 📦 BOILERPLATE
    import {TestBase} from "./Base.sol";
    import {DSTest} from "ds-test/test.sol";
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 24 of 53 : VmHelper.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
    pragma solidity >=0.8.0;
    import { CommonBase } from "forge-std/Base.sol";
    contract VmHelper is CommonBase {
    struct MineBlocksResult {
    uint256 timeElapsed;
    uint256 blocksElapsed;
    uint256 currentTimestamp;
    uint256 currentBlockNumber;
    }
    function mineOneBlock() public returns (MineBlocksResult memory result) {
    uint256 timeElapsed = 12;
    uint256 blocksElapsed = 1;
    vm.warp(block.timestamp + timeElapsed);
    vm.roll(block.number + blocksElapsed);
    result.timeElapsed = timeElapsed;
    result.blocksElapsed = blocksElapsed;
    result.currentTimestamp = block.timestamp;
    result.currentBlockNumber = block.number;
    }
    // helper to move forward multiple blocks
    function mineBlocks(uint256 _blocks) public returns (MineBlocksResult memory result) {
    uint256 timeElapsed = (12 * _blocks);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 25 of 53 : CalldataBytesLib.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 CalldataBytesLib {
    function toU8(bytes calldata _bytes, uint256 _start) internal pure returns (uint8) {
    return uint8(_bytes[_start]);
    }
    function toU16(bytes calldata _bytes, uint256 _start) internal pure returns (uint16) {
    unchecked {
    uint256 end = _start + 2;
    return uint16(bytes2(_bytes[_start:end]));
    }
    }
    function toU32(bytes calldata _bytes, uint256 _start) internal pure returns (uint32) {
    unchecked {
    uint256 end = _start + 4;
    return uint32(bytes4(_bytes[_start:end]));
    }
    }
    function toU64(bytes calldata _bytes, uint256 _start) internal pure returns (uint64) {
    unchecked {
    uint256 end = _start + 8;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 26 of 53 : BitMaps.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
    // modified from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/structs/BitMaps.sol
    pragma solidity ^0.8.20;
    type BitMap256 is uint256;
    using BitMaps for BitMap256 global;
    library BitMaps {
    /**
    * @dev Returns whether the bit at `index` is set.
    */
    function get(BitMap256 bitmap, uint8 index) internal pure returns (bool) {
    uint256 mask = 1 << index;
    return BitMap256.unwrap(bitmap) & mask != 0;
    }
    /**
    * @dev Sets the bit at `index`.
    */
    function set(BitMap256 bitmap, uint8 index) internal pure returns (BitMap256) {
    uint256 mask = 1 << index;
    return BitMap256.wrap(BitMap256.unwrap(bitmap) | mask);
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    File 28 of 53 : OAppCoreUpgradeable.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 { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
    import { IOAppCore, ILayerZeroEndpointV2 } from "./interfaces/IOAppCore.sol";
    /**
    * @title OAppCore
    * @dev Abstract contract implementing the IOAppCore interface with basic OApp configurations.
    */
    abstract contract OAppCoreUpgradeable is IOAppCore, OwnableUpgradeable {
    struct OAppCoreStorage {
    mapping(uint32 => bytes32) peers;
    }
    // keccak256(abi.encode(uint256(keccak256("layerzerov2.storage.oappcore")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant OAppCoreStorageLocation =
    0x72ab1bc1039b79dc4724ffca13de82c96834302d3c7e0d4252232d4b2dd8f900;
    function _getOAppCoreStorage() internal pure returns (OAppCoreStorage storage $) {
    assembly {
    $.slot := OAppCoreStorageLocation
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 29 of 53 : console.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.4.22 <0.9.0;
    library console {
    address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
    function _sendLogPayload(bytes memory payload) private view {
    uint256 payloadLength = payload.length;
    address consoleAddress = CONSOLE_ADDRESS;
    /// @solidity memory-safe-assembly
    assembly {
    let payloadStart := add(payload, 32)
    let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
    }
    }
    function log() internal view {
    _sendLogPayload(abi.encodeWithSignature("log()"));
    }
    function logInt(int p0) internal view {
    _sendLogPayload(abi.encodeWithSignature("log(int)", p0));
    }
    function logUint(uint p0) internal view {
    _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 30 of 53 : console2.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.4.22 <0.9.0;
    /// @dev The original console.sol uses `int` and `uint` for computing function selectors, but it should
    /// use `int256` and `uint256`. This modified version fixes that. This version is recommended
    /// over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in
    /// forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`.
    /// Reference: https://github.com/NomicFoundation/hardhat/issues/2178
    library console2 {
    address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
    function _castLogPayloadViewToPure(
    function(bytes memory) internal view fnIn
    ) internal pure returns (function(bytes memory) internal pure fnOut) {
    assembly {
    fnOut := fnIn
    }
    }
    function _sendLogPayload(bytes memory payload) internal pure {
    _castLogPayloadViewToPure(_sendLogPayloadView)(payload);
    }
    function _sendLogPayloadView(bytes memory payload) private view {
    uint256 payloadLength = payload.length;
    address consoleAddress = CONSOLE_ADDRESS;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 31 of 53 : StdAssertions.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.6.2 <0.9.0;
    import {DSTest} from "ds-test/test.sol";
    import {stdMath} from "./StdMath.sol";
    abstract contract StdAssertions is DSTest {
    event log_array(uint256[] val);
    event log_array(int256[] val);
    event log_array(address[] val);
    event log_named_array(string key, uint256[] val);
    event log_named_array(string key, int256[] val);
    event log_named_array(string key, address[] val);
    function fail(string memory err) internal virtual {
    emit log_named_string("Error", err);
    fail();
    }
    function assertFalse(bool data) internal virtual {
    assertTrue(!data);
    }
    function assertFalse(bool data, string memory err) internal virtual {
    assertTrue(!data, err);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 32 of 53 : StdChains.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.6.2 <0.9.0;
    pragma experimental ABIEncoderV2;
    import {VmSafe} from "./Vm.sol";
    /**
    * StdChains provides information about EVM compatible chains that can be used in scripts/tests.
    * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are
    * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of
    * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the
    * alias used in this contract, which can be found as the first argument to the
    * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function.
    *
    * There are two main ways to use this contract:
    * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or
    * `setChain(string memory chainAlias, Chain memory chain)`
    * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`.
    *
    * The first time either of those are used, chains are initialized with the default set of RPC URLs.
    * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in
    * `defaultRpcUrls`.
    *
    * The `setChain` function is straightforward, and it simply saves off the given chain data.
    *
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 33 of 53 : StdCheats.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.6.2 <0.9.0;
    pragma experimental ABIEncoderV2;
    import {StdStorage, stdStorage} from "./StdStorage.sol";
    import {Vm} from "./Vm.sol";
    import {console2} from "./console2.sol";
    abstract contract StdCheatsSafe {
    Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
    bool private gasMeteringOff;
    // Data structures to parse Transaction objects from the broadcast artifact
    // that conform to EIP1559. The Raw structs is what is parsed from the JSON
    // and then converted to the one that is used by the user for better UX.
    struct RawTx1559 {
    string[] arguments;
    address contractAddress;
    string contractName;
    // json value name = function
    string functionSig;
    bytes32 hash;
    // json value name = tx
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 34 of 53 : StdError.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // SPDX-License-Identifier: MIT
    // Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test
    pragma solidity >=0.6.2 <0.9.0;
    library stdError {
    bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01);
    bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11);
    bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12);
    bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21);
    bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22);
    bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31);
    bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32);
    bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41);
    bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 35 of 53 : StdInvariant.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.6.2 <0.9.0;
    pragma experimental ABIEncoderV2;
    contract StdInvariant {
    struct FuzzSelector {
    address addr;
    bytes4[] selectors;
    }
    address[] private _excludedContracts;
    address[] private _excludedSenders;
    address[] private _targetedContracts;
    address[] private _targetedSenders;
    string[] private _excludedArtifacts;
    string[] private _targetedArtifacts;
    FuzzSelector[] private _targetedArtifactSelectors;
    FuzzSelector[] private _targetedSelectors;
    // Functions for users:
    // These are intended to be called in tests.
    function excludeContract(address newExcludedContract_) internal {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 36 of 53 : StdJson.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.6.0 <0.9.0;
    pragma experimental ABIEncoderV2;
    import {VmSafe} from "./Vm.sol";
    // Helpers for parsing and writing JSON files
    // To parse:
    // ```
    // using stdJson for string;
    // string memory json = vm.readFile("some_peth");
    // json.parseUint("<json_path>");
    // ```
    // To write:
    // ```
    // using stdJson for string;
    // string memory json = "deploymentArtifact";
    // Contract contract = new Contract();
    // json.serialize("contractAddress", address(contract));
    // json = json.serialize("deploymentTimes", uint(1));
    // // store the stringified JSON to the 'json' variable we have been using as a key
    // // as we won't need it any longer
    // string memory json2 = "finalArtifact";
    // string memory final = json2.serialize("depArtifact", json);
    // final.write("<some_path>");
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 37 of 53 : StdMath.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.6.2 <0.9.0;
    library stdMath {
    int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;
    function abs(int256 a) internal pure returns (uint256) {
    // Required or it will fail when `a = type(int256).min`
    if (a == INT256_MIN) {
    return 57896044618658097711785492504343953926634992332820282019728792003956564819968;
    }
    return uint256(a > 0 ? a : -a);
    }
    function delta(uint256 a, uint256 b) internal pure returns (uint256) {
    return a > b ? a - b : b - a;
    }
    function delta(int256 a, int256 b) internal pure returns (uint256) {
    // a and b are of the same sign
    // this works thanks to two's complement, the left-most bit is the sign bit
    if ((a ^ b) > -1) {
    return delta(abs(a), abs(b));
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 38 of 53 : StdStorage.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.6.2 <0.9.0;
    import {Vm} from "./Vm.sol";
    struct StdStorage {
    mapping(address => mapping(bytes4 => mapping(bytes32 => uint256))) slots;
    mapping(address => mapping(bytes4 => mapping(bytes32 => bool))) finds;
    bytes32[] _keys;
    bytes4 _sig;
    uint256 _depth;
    address _target;
    bytes32 _set;
    }
    library stdStorageSafe {
    event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot);
    event WARNING_UninitedSlot(address who, uint256 slot);
    Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
    function sigs(string memory sigStr) internal pure returns (bytes4) {
    return bytes4(keccak256(bytes(sigStr)));
    }
    /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 39 of 53 : StdUtils.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.6.2 <0.9.0;
    pragma experimental ABIEncoderV2;
    import {IMulticall3} from "./interfaces/IMulticall3.sol";
    import {VmSafe} from "./Vm.sol";
    abstract contract StdUtils {
    /*//////////////////////////////////////////////////////////////////////////
    CONSTANTS
    //////////////////////////////////////////////////////////////////////////*/
    IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11);
    VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code")))));
    address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;
    uint256 private constant INT256_MIN_ABS =
    57896044618658097711785492504343953926634992332820282019728792003956564819968;
    uint256 private constant SECP256K1_ORDER =
    115792089237316195423570985008687907852837564279074904382605163141518161494337;
    uint256 private constant UINT256_MAX =
    115792089237316195423570985008687907853269984665640564039457584007913129639935;
    // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.
    address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 40 of 53 : Vm.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.6.2 <0.9.0;
    pragma experimental ABIEncoderV2;
    // Cheatcodes are marked as view/pure/none using the following rules:
    // 0. A call's observable behaviour includes its return value, logs, reverts and state writes,
    // 1. If you can influence a later call's observable behaviour, you're neither `view` nor `pure (you are modifying some state be it the EVM,
        interpreter, filesystem, etc),
    // 2. Otherwise if you can be influenced by an earlier call, or if reading some state, you're `view`,
    // 3. Otherwise you're `pure`.
    interface VmSafe {
    struct Log {
    bytes32[] topics;
    bytes data;
    address emitter;
    }
    struct Rpc {
    string key;
    string url;
    }
    struct DirEntry {
    string errorMessage;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 41 of 53 : StdStyle.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.4.22 <0.9.0;
    import {Vm} from "./Vm.sol";
    library StdStyle {
    Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
    string constant RED = "\u001b[91m";
    string constant GREEN = "\u001b[92m";
    string constant YELLOW = "\u001b[93m";
    string constant BLUE = "\u001b[94m";
    string constant MAGENTA = "\u001b[95m";
    string constant CYAN = "\u001b[96m";
    string constant BOLD = "\u001b[1m";
    string constant DIM = "\u001b[2m";
    string constant ITALIC = "\u001b[3m";
    string constant UNDERLINE = "\u001b[4m";
    string constant INVERSE = "\u001b[7m";
    string constant RESET = "\u001b[0m";
    function styleConcat(string memory style, string memory self) private pure returns (string memory) {
    return string(abi.encodePacked(style, self, RESET));
    }
    function red(string memory self) internal pure returns (string memory) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 42 of 53 : Base.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.6.2 <0.9.0;
    import {StdStorage} from "./StdStorage.sol";
    import {Vm, VmSafe} from "./Vm.sol";
    abstract contract CommonBase {
    // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D.
    address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code"))));
    // console.sol and console2.sol work by executing a staticcall to this address.
    address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67;
    // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy.
    address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
    // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38.
    address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256("foundry default caller"))));
    // Address of the test contract, deployed by the DEFAULT_SENDER.
    address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f;
    // Deterministic deployment address of the Multicall3 contract.
    address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11;
    // The order of the secp256k1 curve.
    uint256 internal constant SECP256K1_ORDER =
    115792089237316195423570985008687907852837564279074904382605163141518161494337;
    uint256 internal constant UINT256_MAX =
    115792089237316195423570985008687907853269984665640564039457584007913129639935;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 43 of 53 : test.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: GPL-3.0-or-later
    // This program is free software: you can redistribute it and/or modify
    // it under the terms of the GNU General Public License as published by
    // the Free Software Foundation, either version 3 of the License, or
    // (at your option) any later version.
    // This program is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    // GNU General Public License for more details.
    // You should have received a copy of the GNU General Public License
    // along with this program. If not, see <http://www.gnu.org/licenses/>.
    pragma solidity >=0.5.0;
    contract DSTest {
    event log (string);
    event logs (bytes);
    event log_address (address);
    event log_bytes32 (bytes32);
    event log_int (int);
    event log_uint (uint);
    event log_bytes (bytes);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

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

    File 48 of 53 : OwnableUpgradeable.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 v4.9.0) (access/Ownable.sol)
    pragma solidity ^0.8.0;
    import "../utils/ContextUpgradeable.sol";
    import {Initializable} from "../proxy/utils/Initializable.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.
    *
    * By default, the owner account will be the one that deploys the contract. 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 OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    /**
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    File 50 of 53 : IMulticall3.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.6.2 <0.9.0;
    pragma experimental ABIEncoderV2;
    interface IMulticall3 {
    struct Call {
    address target;
    bytes callData;
    }
    struct Call3 {
    address target;
    bool allowFailure;
    bytes callData;
    }
    struct Call3Value {
    address target;
    bool allowFailure;
    uint256 value;
    bytes callData;
    }
    struct Result {
    bool success;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 51 of 53 : ContextUpgradeable.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 v4.9.4) (utils/Context.sol)
    pragma solidity ^0.8.0;
    import {Initializable} from "../proxy/utils/Initializable.sol";
    /**
    * @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 ContextUpgradeable is Initializable {
    function __Context_init() internal onlyInitializing {
    }
    function __Context_init_unchained() internal onlyInitializing {
    }
    function _msgSender() internal view virtual returns (address) {
    return msg.sender;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 52 of 53 : Initializable.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 v4.9.0) (proxy/utils/Initializable.sol)
    pragma solidity ^0.8.2;
    import "../../utils/AddressUpgradeable.sol";
    /**
    * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
    * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
    * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
    * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
    *
    * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
    * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
    * case an upgrade adds a module that needs to be initialized.
    *
    * For example:
    *
    * [.hljs-theme-light.nopadding]
    * ```solidity
    * contract MyToken is ERC20Upgradeable {
    * function initialize() initializer public {
    * __ERC20_init("MyToken", "MTK");
    * }
    * }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 53 of 53 : AddressUpgradeable.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 v4.9.0) (utils/Address.sol)
    pragma solidity ^0.8.1;
    /**
    * @dev Collection of functions related to the address type
    */
    library AddressUpgradeable {
    /**
    * @dev Returns true if `account` is a contract.
    *
    * [IMPORTANT]
    * ====
    * It is unsafe to assume that an address for which this function returns
    * false is an externally-owned account (EOA) and not a contract.
    *
    * Among others, `isContract` will return false for the following
    * types of addresses:
    *
    * - an externally-owned account
    * - a contract in construction
    * - an address where a contract will be created
    * - an address where a contract lived, but was destroyed
    *
    * Furthermore, `isContract` will also return true if the target contract within
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Settings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    {
    "remappings": [
    "frax-std/=node_modules/frax-standard-solidity/src/",
    "@prb/test/=node_modules/@prb/test/",
    "forge-std/=node_modules/forge-std/src/",
    "ds-test/=node_modules/ds-test/src/",
    "@axelar-network/=node_modules/@axelar-network/",
    "@chainlink/=node_modules/@chainlink/",
    "@eth-optimism/=node_modules/@eth-optimism/",
    "@fraxfinance/=node_modules/@fraxfinance/",
    "@layerzerolabs/=node_modules/@layerzerolabs/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "frax-standard-solidity/=node_modules/frax-standard-solidity/",
    "hardhat-deploy/=node_modules/hardhat-deploy/",
    "solidity-bytes-utils/=node_modules/solidity-bytes-utils/"
    ],
    "optimizer": {
    "enabled": false,
    "runs": 200
    },
    "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": false
    },
    "outputSelection": {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Contract Security Audit

    Contract ABI

    API
    [{"inputs":[{"internalType":"bytes32","name":"_fraxtalHop","type":"bytes32"},{"internalType":"uint256","name":"_noDNVs","type":"uint256"},{"internalType":"address","name":"_EXECUTOR","type":"address"},{"internalType":"address","name":"_DVN","type":"address"},{"internalType":"address","name":"_TREASURY","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"HopPaused","type":"error"},{"inputs":[],"name":"InsufficientFee","type":"error"},{"inputs":[],"name":"InvalidOApp","type":"error"},{"inputs":[{"internalType":"uint16","name":"optionType","type":"uint16"}],"name":"InvalidOptionType","type":"error"},{"inputs":[],"name":"NotEndpoint","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":"uint8","name":"bits","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeCastOverflowedUintDowncast","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"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":"address","name":"oft","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint32","name":"dstEid","type":"uint32"},{"indexed":true,"internalType":"bytes32","name":"to","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amountLD","type":"uint256"}],"name":"SendOFT","type":"event"},{"inputs":[],"name":"DVN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXECUTOR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fraxtalHop","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noDNVs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oft","type":"address"},{"internalType":"uint32","name":"_dstEid","type":"uint32"},{"internalType":"bytes32","name":"_to","type":"bytes32"},{"internalType":"uint256","name":"_amountLD","type":"uint256"}],"name":"quote","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oft","type":"address"},{"internalType":"uint32","name":"_dstEid","type":"uint32"}],"name":"quoteHop","outputs":[{"internalType":"uint256","name":"finalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oft","type":"address"},{"internalType":"uint32","name":"_dstEid","type":"uint32"},{"internalType":"bytes32","name":"_to","type":"bytes32"},{"internalType":"uint256","name":"_amountLD","type":"uint256"}],"name":"sendOFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_fraxtalHop","type":"address"}],"name":"setFraxtalHop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_fraxtalHop","type":"bytes32"}],"name":"setFraxtalHop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_noDNVs","type":"uint256"}],"name":"setNoDNVs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

    60e06040525f8060146101000a81548160ff021916908315150217905550600280553480156200002d575f80fd5b506040516200268e3803806200268e833981810160405281019062000053919062000324565b335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000c7575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000be9190620003b9565b60405180910390fd5b620000d8816200018e60201b60201c565b5084600181905550836002819055508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050505050620003d4565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f819050919050565b620002678162000253565b811462000272575f80fd5b50565b5f8151905062000285816200025c565b92915050565b5f819050919050565b6200029f816200028b565b8114620002aa575f80fd5b50565b5f81519050620002bd8162000294565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620002ee82620002c3565b9050919050565b6200030081620002e2565b81146200030b575f80fd5b50565b5f815190506200031e81620002f5565b92915050565b5f805f805f60a0868803121562000340576200033f6200024f565b5b5f6200034f8882890162000275565b95505060206200036288828901620002ad565b945050604062000375888289016200030e565b935050606062000388888289016200030e565b92505060806200039b888289016200030e565b9150509295509295909350565b620003b381620002e2565b82525050565b5f602082019050620003ce5f830184620003a8565b92915050565b60805160a05160c05161227a620004145f395f81816105e2015261069b01525f8181610425015261044b01525f8181610524015261080a015261227a5ff3fe60806040526004361061010c575f3560e01c8063630dc7cb116100945780638da5cb5b116100635780638da5cb5b1461031f578063d333555314610349578063d393f07214610371578063efb799851461039b578063f2fde38b146103d757610113565b8063630dc7cb1461028f578063715018a6146102b957806377958f87146102cf5780638980f11f146102f757610113565b80633e832c90116100db5780633e832c90146101cf5780634172b57b146101eb57806342a53a5f146102135780635b461c831461023d5780635c975abb1461026557610113565b806302329a2914610117578063104db3801461013f5780631093d5be146101695780632d2c5565146101a557610113565b3661011357005b5f80fd5b348015610122575f80fd5b5061013d6004803603810190610138919061144b565b6103ff565b005b34801561014a575f80fd5b50610153610423565b60405161016091906114b5565b60405180910390f35b348015610174575f80fd5b5061018f600480360381019061018a9190611531565b610447565b60405161019c9190611587565b60405180910390f35b3480156101b0575f80fd5b506101b9610699565b6040516101c691906114b5565b60405180910390f35b6101e960048036038101906101e491906115fd565b6106bd565b005b3480156101f6575f80fd5b50610211600480360381019061020c9190611661565b6107ba565b005b34801561021e575f80fd5b506102276107cc565b6040516102349190611587565b60405180910390f35b348015610248575f80fd5b50610263600480360381019061025e919061168c565b6107d2565b005b348015610270575f80fd5b506102796107f6565b60405161028691906116c6565b60405180910390f35b34801561029a575f80fd5b506102a3610808565b6040516102b091906114b5565b60405180910390f35b3480156102c4575f80fd5b506102cd61082c565b005b3480156102da575f80fd5b506102f560048036038101906102f091906116df565b61083f565b005b348015610302575f80fd5b5061031d6004803603810190610318919061170a565b610851565b005b34801561032a575f80fd5b506103336108d9565b60405161034091906114b5565b60405180910390f35b348015610354575f80fd5b5061036f600480360381019061036a9190611661565b610900565b005b34801561037c575f80fd5b5061038561094f565b6040516103929190611757565b60405180910390f35b3480156103a6575f80fd5b506103c160048036038101906103bc91906115fd565b610955565b6040516103ce91906117ac565b60405180910390f35b3480156103e2575f80fd5b506103fd60048036038101906103f8919061168c565b610a11565b005b610407610a95565b805f60146101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330bb3aac846005306040518463ffffffff1660e01b81526004016104a79392919061185c565b602060405180830381865afa1580156104c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e691906118b8565b90505f6040518060400160405280601481526020017f010011010000000000000000000000000007a12000000000000000000000000081525090505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663709eb66486306028866040518563ffffffff1660e01b81526004016105829493929190611996565b602060405180830381865afa15801561059d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c191906118b8565b90505f81600254856105d39190611a0d565b6105dd9190611a4e565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d42442213089855f6040518563ffffffff1660e01b815260040161063f9493929190611a81565b602060405180830381865afa15801561065a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067e91906118b8565b9050808261068c9190611a4e565b9550505050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60149054906101000a900460ff1615610703576040517f819f993900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61762f8363ffffffff1603610744576040517f7ee14dfd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61075084333084610b1c565b61075c84848484610b9e565b818363ffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbc9ee36b6ca0bdd5b3840e6d329dd19a2490d880c7ce24d9818aa593adfb35be87856040516107ac929190611ac4565b60405180910390a450505050565b6107c2610a95565b8060028190555050565b60025481565b6107f38173ffffffffffffffffffffffffffffffffffffffff165f1b61083f565b50565b5f60149054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b610834610a95565b61083d5f610d63565b565b610847610a95565b8060018190555050565b610859610a95565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610894929190611ac4565b6020604051808303815f875af11580156108b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108d49190611aff565b505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610908610a95565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561094b573d5f803e3d5ffd5b5050565b60015481565b61095d6113af565b5f61096a85858586610e24565b90508573ffffffffffffffffffffffffffffffffffffffff16633b6f743b825f6040518363ffffffff1660e01b81526004016109a7929190611c37565b6040805180830381865afa1580156109c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e59190611d2e565b91506109f18686610447565b825f01818151610a019190611a4e565b9150818152505050949350505050565b610a19610a95565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a89575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610a8091906114b5565b60405180910390fd5b610a9281610d63565b50565b610a9d610ebd565b73ffffffffffffffffffffffffffffffffffffffff16610abb6108d9565b73ffffffffffffffffffffffffffffffffffffffff1614610b1a57610ade610ebd565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610b1191906114b5565b60405180910390fd5b565b610b98848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610b5193929190611d59565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610ec4565b50505050565b5f610bab84848485610e24565b90505f8573ffffffffffffffffffffffffffffffffffffffff16633b6f743b835f6040518363ffffffff1660e01b8152600401610be9929190611c37565b6040805180830381865afa158015610c03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c279190611d2e565b90505f610c348787610447565b825f0151610c429190611a4e565b905034811115610c7e576040517f025dbdd400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff1663c7c7f5b3835f01518585306040518563ffffffff1660e01b8152600401610cbf93929190611d8e565b60c06040518083038185885af1158015610cdb573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610d009190611eb6565b505080341115610d5a573373ffffffffffffffffffffffffffffffffffffffff166108fc8234610d309190611ef4565b90811502906040515f60405180830381858888f19350505050158015610d58573d5f803e3d5ffd5b505b50505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610e2c6113c7565b5f610e35610f59565b9050610e46815f620f42405f610f81565b905061762f825f019063ffffffff16908163ffffffff168152505060015482602001818152505083826040018181525050828260600181815250508082608001819052508486604051602001610e9d929190611f27565b6040516020818303038152906040528260a0018190525050949350505050565b5f33905090565b5f610eee828473ffffffffffffffffffffffffffffffffffffffff1661101b90919063ffffffff16565b90505f815114158015610f12575080806020019051810190610f109190611aff565b155b15610f5457826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401610f4b91906114b5565b60405180910390fd5b505050565b60606003604051602001610f6d9190611f8f565b604051602081830303815290604052905090565b606084600361ffff16610f9d5f8361103090919063ffffffff16565b61ffff1614610ff557610fb95f8261103090919063ffffffff16565b6040517f3a51740d000000000000000000000000000000000000000000000000000000008152600401610fec9190611fb8565b60405180910390fd5b5f611001868686611095565b905061100f87600383611105565b92505050949350505050565b606061102883835f6111c0565b905092915050565b5f60028261103e9190611a4e565b83511015611081576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110789061202b565b60405180910390fd5b5f8260028501015190508091505092915050565b60605f826fffffffffffffffffffffffffffffffff16146110d9578383836040516020016110c593929190612098565b6040516020818303038152906040526110fc565b83836040516020016110ec9291906120d4565b6040516020818303038152906040525b90509392505050565b606083600361ffff166111215f8361103090919063ffffffff16565b61ffff16146111795761113d5f8261103090919063ffffffff16565b6040517f3a51740d0000000000000000000000000000000000000000000000000000000081526004016111709190611fb8565b60405180910390fd5b846001806111878651611289565b61119191906120ff565b86866040516020016111a79594939291906121ae565b6040516020818303038152906040529150509392505050565b60608147101561120757306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016111fe91906114b5565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16848660405161122f9190612204565b5f6040518083038185875af1925050503d805f8114611269576040519150601f19603f3d011682016040523d82523d5f602084013e61126e565b606091505b509150915061127e8683836112de565b925050509392505050565b5f61ffff80168211156112d6576010826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016112cd929190612253565b60405180910390fd5b819050919050565b6060826112f3576112ee8261136b565b611363565b5f825114801561131957505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561135b57836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161135291906114b5565b60405180910390fd5b819050611364565b5b9392505050565b5f8151111561137d5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052805f81526020015f81525090565b6040518060e001604052805f63ffffffff1681526020015f80191681526020015f81526020015f81526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f8115159050919050565b61142a81611416565b8114611434575f80fd5b50565b5f8135905061144581611421565b92915050565b5f602082840312156114605761145f611412565b5b5f61146d84828501611437565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61149f82611476565b9050919050565b6114af81611495565b82525050565b5f6020820190506114c85f8301846114a6565b92915050565b6114d781611495565b81146114e1575f80fd5b50565b5f813590506114f2816114ce565b92915050565b5f63ffffffff82169050919050565b611510816114f8565b811461151a575f80fd5b50565b5f8135905061152b81611507565b92915050565b5f806040838503121561154757611546611412565b5b5f611554858286016114e4565b92505060206115658582860161151d565b9150509250929050565b5f819050919050565b6115818161156f565b82525050565b5f60208201905061159a5f830184611578565b92915050565b5f819050919050565b6115b2816115a0565b81146115bc575f80fd5b50565b5f813590506115cd816115a9565b92915050565b6115dc8161156f565b81146115e6575f80fd5b50565b5f813590506115f7816115d3565b92915050565b5f805f806080858703121561161557611614611412565b5b5f611622878288016114e4565b94505060206116338782880161151d565b9350506040611644878288016115bf565b9250506060611655878288016115e9565b91505092959194509250565b5f6020828403121561167657611675611412565b5b5f611683848285016115e9565b91505092915050565b5f602082840312156116a1576116a0611412565b5b5f6116ae848285016114e4565b91505092915050565b6116c081611416565b82525050565b5f6020820190506116d95f8301846116b7565b92915050565b5f602082840312156116f4576116f3611412565b5b5f611701848285016115bf565b91505092915050565b5f80604083850312156117205761171f611412565b5b5f61172d858286016114e4565b925050602061173e858286016115e9565b9150509250929050565b611751816115a0565b82525050565b5f60208201905061176a5f830184611748565b92915050565b6117798161156f565b82525050565b604082015f8201516117935f850182611770565b5060208201516117a66020850182611770565b50505050565b5f6040820190506117bf5f83018461177f565b92915050565b6117ce816114f8565b82525050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f819050919050565b5f61181361180e611809846117d4565b6117f0565b6117dd565b9050919050565b611823816117f9565b82525050565b5f82825260208201905092915050565b50565b5f6118475f83611829565b915061185282611839565b5f82019050919050565b5f60808201905061186f5f8301866117c5565b61187c602083018561181a565b61188960408301846114a6565b818103606083015261189a8161183c565b9050949350505050565b5f815190506118b2816115d3565b92915050565b5f602082840312156118cd576118cc611412565b5b5f6118da848285016118a4565b91505092915050565b5f819050919050565b5f6119066119016118fc846118e3565b6117f0565b61156f565b9050919050565b611916816118ec565b82525050565b5f81519050919050565b5f5b83811015611943578082015181840152602081019050611928565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6119688261191c565b6119728185611829565b9350611982818560208601611926565b61198b8161194e565b840191505092915050565b5f6080820190506119a95f8301876117c5565b6119b660208301866114a6565b6119c3604083018561190d565b81810360608301526119d5818461195e565b905095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a178261156f565b9150611a228361156f565b9250828202611a308161156f565b91508282048414831517611a4757611a466119e0565b5b5092915050565b5f611a588261156f565b9150611a638361156f565b9250828201905080821115611a7b57611a7a6119e0565b5b92915050565b5f608082019050611a945f8301876114a6565b611aa160208301866117c5565b611aae6040830185611578565b611abb60608301846116b7565b95945050505050565b5f604082019050611ad75f8301856114a6565b611ae46020830184611578565b9392505050565b5f81519050611af981611421565b92915050565b5f60208284031215611b1457611b13611412565b5b5f611b2184828501611aeb565b91505092915050565b611b33816114f8565b82525050565b611b42816115a0565b82525050565b5f82825260208201905092915050565b5f611b628261191c565b611b6c8185611b48565b9350611b7c818560208601611926565b611b858161194e565b840191505092915050565b5f60e083015f830151611ba55f860182611b2a565b506020830151611bb86020860182611b39565b506040830151611bcb6040860182611770565b506060830151611bde6060860182611770565b5060808301518482036080860152611bf68282611b58565b91505060a083015184820360a0860152611c108282611b58565b91505060c083015184820360c0860152611c2a8282611b58565b9150508091505092915050565b5f6040820190508181035f830152611c4f8185611b90565b9050611c5e60208301846116b7565b9392505050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611c9f8261194e565b810181811067ffffffffffffffff82111715611cbe57611cbd611c69565b5b80604052505050565b5f611cd0611409565b9050611cdc8282611c96565b919050565b5f60408284031215611cf657611cf5611c65565b5b611d006040611cc7565b90505f611d0f848285016118a4565b5f830152506020611d22848285016118a4565b60208301525092915050565b5f60408284031215611d4357611d42611412565b5b5f611d5084828501611ce1565b91505092915050565b5f606082019050611d6c5f8301866114a6565b611d7960208301856114a6565b611d866040830184611578565b949350505050565b5f6080820190508181035f830152611da68186611b90565b9050611db5602083018561177f565b611dc260608301846114a6565b949350505050565b5f81519050611dd8816115a9565b92915050565b611de7816117dd565b8114611df1575f80fd5b50565b5f81519050611e0281611dde565b92915050565b5f60808284031215611e1d57611e1c611c65565b5b611e276060611cc7565b90505f611e3684828501611dca565b5f830152506020611e4984828501611df4565b6020830152506040611e5d84828501611ce1565b60408301525092915050565b5f60408284031215611e7e57611e7d611c65565b5b611e886040611cc7565b90505f611e97848285016118a4565b5f830152506020611eaa848285016118a4565b60208301525092915050565b5f8060c08385031215611ecc57611ecb611412565b5b5f611ed985828601611e08565b9250506080611eea85828601611e69565b9150509250929050565b5f611efe8261156f565b9150611f098361156f565b9250828203905081811115611f2157611f206119e0565b5b92915050565b5f604082019050611f3a5f830185611748565b611f4760208301846117c5565b9392505050565b5f61ffff82169050919050565b5f8160f01b9050919050565b5f611f7182611f5b565b9050919050565b611f89611f8482611f4e565b611f67565b82525050565b5f611f9a8284611f78565b60028201915081905092915050565b611fb281611f4e565b82525050565b5f602082019050611fcb5f830184611fa9565b92915050565b5f82825260208201905092915050565b7f746f55696e7431365f6f75744f66426f756e64730000000000000000000000005f82015250565b5f612015601483611fd1565b915061202082611fe1565b602082019050919050565b5f6020820190508181035f83015261204281612009565b9050919050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b5f8160801b9050919050565b5f61207a82612064565b9050919050565b61209261208d82612049565b612070565b82525050565b5f6120a38286611f78565b6002820191506120b38285612081565b6010820191506120c38284612081565b601082019150819050949350505050565b5f6120df8285611f78565b6002820191506120ef8284612081565b6010820191508190509392505050565b5f61210982611f4e565b915061211483611f4e565b9250828201905061ffff81111561212e5761212d6119e0565b5b92915050565b5f81905092915050565b5f6121488261191c565b6121528185612134565b9350612162818560208601611926565b80840191505092915050565b5f60ff82169050919050565b5f8160f81b9050919050565b5f6121908261217a565b9050919050565b6121a86121a38261216e565b612186565b82525050565b5f6121b9828861213e565b91506121c58287612197565b6001820191506121d58286611f78565b6002820191506121e58285612197565b6001820191506121f5828461213e565b91508190509695505050505050565b5f61220f828461213e565b915081905092915050565b5f819050919050565b5f61223d6122386122338461221a565b6117f0565b61216e565b9050919050565b61224d81612223565b82525050565b5f6040820190506122665f830185612244565b6122736020830184611578565b9392505050560000000000000000000000007425526ce2f9494b8d8ecdd7afc37a89a86f3c7b00000000000000000000000000000000000000000000000000000000000000020000000000000000000000004208d6e27538189bb48e603d6123a94b8abe0a0b000000000000000000000000282b3386571f7f794450d5789911a9804fa346b40000000000000000000000004514fc667a944752ee8a29f544c1b20b1a315f25

    Deployed Bytecode

    0x60806040526004361061010c575f3560e01c8063630dc7cb116100945780638da5cb5b116100635780638da5cb5b1461031f578063d333555314610349578063d393f07214610371578063efb799851461039b578063f2fde38b146103d757610113565b8063630dc7cb1461028f578063715018a6146102b957806377958f87146102cf5780638980f11f146102f757610113565b80633e832c90116100db5780633e832c90146101cf5780634172b57b146101eb57806342a53a5f146102135780635b461c831461023d5780635c975abb1461026557610113565b806302329a2914610117578063104db3801461013f5780631093d5be146101695780632d2c5565146101a557610113565b3661011357005b5f80fd5b348015610122575f80fd5b5061013d6004803603810190610138919061144b565b6103ff565b005b34801561014a575f80fd5b50610153610423565b60405161016091906114b5565b60405180910390f35b348015610174575f80fd5b5061018f600480360381019061018a9190611531565b610447565b60405161019c9190611587565b60405180910390f35b3480156101b0575f80fd5b506101b9610699565b6040516101c691906114b5565b60405180910390f35b6101e960048036038101906101e491906115fd565b6106bd565b005b3480156101f6575f80fd5b50610211600480360381019061020c9190611661565b6107ba565b005b34801561021e575f80fd5b506102276107cc565b6040516102349190611587565b60405180910390f35b348015610248575f80fd5b50610263600480360381019061025e919061168c565b6107d2565b005b348015610270575f80fd5b506102796107f6565b60405161028691906116c6565b60405180910390f35b34801561029a575f80fd5b506102a3610808565b6040516102b091906114b5565b60405180910390f35b3480156102c4575f80fd5b506102cd61082c565b005b3480156102da575f80fd5b506102f560048036038101906102f091906116df565b61083f565b005b348015610302575f80fd5b5061031d6004803603810190610318919061170a565b610851565b005b34801561032a575f80fd5b506103336108d9565b60405161034091906114b5565b60405180910390f35b348015610354575f80fd5b5061036f600480360381019061036a9190611661565b610900565b005b34801561037c575f80fd5b5061038561094f565b6040516103929190611757565b60405180910390f35b3480156103a6575f80fd5b506103c160048036038101906103bc91906115fd565b610955565b6040516103ce91906117ac565b60405180910390f35b3480156103e2575f80fd5b506103fd60048036038101906103f8919061168c565b610a11565b005b610407610a95565b805f60146101000a81548160ff02191690831515021790555050565b7f000000000000000000000000282b3386571f7f794450d5789911a9804fa346b481565b5f807f000000000000000000000000282b3386571f7f794450d5789911a9804fa346b473ffffffffffffffffffffffffffffffffffffffff166330bb3aac846005306040518463ffffffff1660e01b81526004016104a79392919061185c565b602060405180830381865afa1580156104c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e691906118b8565b90505f6040518060400160405280601481526020017f010011010000000000000000000000000007a12000000000000000000000000081525090505f7f0000000000000000000000004208d6e27538189bb48e603d6123a94b8abe0a0b73ffffffffffffffffffffffffffffffffffffffff1663709eb66486306028866040518563ffffffff1660e01b81526004016105829493929190611996565b602060405180830381865afa15801561059d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c191906118b8565b90505f81600254856105d39190611a0d565b6105dd9190611a4e565b90505f7f0000000000000000000000004514fc667a944752ee8a29f544c1b20b1a315f2573ffffffffffffffffffffffffffffffffffffffff1663d42442213089855f6040518563ffffffff1660e01b815260040161063f9493929190611a81565b602060405180830381865afa15801561065a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067e91906118b8565b9050808261068c9190611a4e565b9550505050505092915050565b7f0000000000000000000000004514fc667a944752ee8a29f544c1b20b1a315f2581565b5f60149054906101000a900460ff1615610703576040517f819f993900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61762f8363ffffffff1603610744576040517f7ee14dfd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61075084333084610b1c565b61075c84848484610b9e565b818363ffffffff163373ffffffffffffffffffffffffffffffffffffffff167fbc9ee36b6ca0bdd5b3840e6d329dd19a2490d880c7ce24d9818aa593adfb35be87856040516107ac929190611ac4565b60405180910390a450505050565b6107c2610a95565b8060028190555050565b60025481565b6107f38173ffffffffffffffffffffffffffffffffffffffff165f1b61083f565b50565b5f60149054906101000a900460ff1681565b7f0000000000000000000000004208d6e27538189bb48e603d6123a94b8abe0a0b81565b610834610a95565b61083d5f610d63565b565b610847610a95565b8060018190555050565b610859610a95565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610894929190611ac4565b6020604051808303815f875af11580156108b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108d49190611aff565b505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610908610a95565b3373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561094b573d5f803e3d5ffd5b5050565b60015481565b61095d6113af565b5f61096a85858586610e24565b90508573ffffffffffffffffffffffffffffffffffffffff16633b6f743b825f6040518363ffffffff1660e01b81526004016109a7929190611c37565b6040805180830381865afa1580156109c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e59190611d2e565b91506109f18686610447565b825f01818151610a019190611a4e565b9150818152505050949350505050565b610a19610a95565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a89575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610a8091906114b5565b60405180910390fd5b610a9281610d63565b50565b610a9d610ebd565b73ffffffffffffffffffffffffffffffffffffffff16610abb6108d9565b73ffffffffffffffffffffffffffffffffffffffff1614610b1a57610ade610ebd565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610b1191906114b5565b60405180910390fd5b565b610b98848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401610b5193929190611d59565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610ec4565b50505050565b5f610bab84848485610e24565b90505f8573ffffffffffffffffffffffffffffffffffffffff16633b6f743b835f6040518363ffffffff1660e01b8152600401610be9929190611c37565b6040805180830381865afa158015610c03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c279190611d2e565b90505f610c348787610447565b825f0151610c429190611a4e565b905034811115610c7e576040517f025dbdd400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff1663c7c7f5b3835f01518585306040518563ffffffff1660e01b8152600401610cbf93929190611d8e565b60c06040518083038185885af1158015610cdb573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610d009190611eb6565b505080341115610d5a573373ffffffffffffffffffffffffffffffffffffffff166108fc8234610d309190611ef4565b90811502906040515f60405180830381858888f19350505050158015610d58573d5f803e3d5ffd5b505b50505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610e2c6113c7565b5f610e35610f59565b9050610e46815f620f42405f610f81565b905061762f825f019063ffffffff16908163ffffffff168152505060015482602001818152505083826040018181525050828260600181815250508082608001819052508486604051602001610e9d929190611f27565b6040516020818303038152906040528260a0018190525050949350505050565b5f33905090565b5f610eee828473ffffffffffffffffffffffffffffffffffffffff1661101b90919063ffffffff16565b90505f815114158015610f12575080806020019051810190610f109190611aff565b155b15610f5457826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401610f4b91906114b5565b60405180910390fd5b505050565b60606003604051602001610f6d9190611f8f565b604051602081830303815290604052905090565b606084600361ffff16610f9d5f8361103090919063ffffffff16565b61ffff1614610ff557610fb95f8261103090919063ffffffff16565b6040517f3a51740d000000000000000000000000000000000000000000000000000000008152600401610fec9190611fb8565b60405180910390fd5b5f611001868686611095565b905061100f87600383611105565b92505050949350505050565b606061102883835f6111c0565b905092915050565b5f60028261103e9190611a4e565b83511015611081576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110789061202b565b60405180910390fd5b5f8260028501015190508091505092915050565b60605f826fffffffffffffffffffffffffffffffff16146110d9578383836040516020016110c593929190612098565b6040516020818303038152906040526110fc565b83836040516020016110ec9291906120d4565b6040516020818303038152906040525b90509392505050565b606083600361ffff166111215f8361103090919063ffffffff16565b61ffff16146111795761113d5f8261103090919063ffffffff16565b6040517f3a51740d0000000000000000000000000000000000000000000000000000000081526004016111709190611fb8565b60405180910390fd5b846001806111878651611289565b61119191906120ff565b86866040516020016111a79594939291906121ae565b6040516020818303038152906040529150509392505050565b60608147101561120757306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016111fe91906114b5565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16848660405161122f9190612204565b5f6040518083038185875af1925050503d805f8114611269576040519150601f19603f3d011682016040523d82523d5f602084013e61126e565b606091505b509150915061127e8683836112de565b925050509392505050565b5f61ffff80168211156112d6576010826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016112cd929190612253565b60405180910390fd5b819050919050565b6060826112f3576112ee8261136b565b611363565b5f825114801561131957505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561135b57836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161135291906114b5565b60405180910390fd5b819050611364565b5b9392505050565b5f8151111561137d5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052805f81526020015f81525090565b6040518060e001604052805f63ffffffff1681526020015f80191681526020015f81526020015f81526020016060815260200160608152602001606081525090565b5f604051905090565b5f80fd5b5f8115159050919050565b61142a81611416565b8114611434575f80fd5b50565b5f8135905061144581611421565b92915050565b5f602082840312156114605761145f611412565b5b5f61146d84828501611437565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61149f82611476565b9050919050565b6114af81611495565b82525050565b5f6020820190506114c85f8301846114a6565b92915050565b6114d781611495565b81146114e1575f80fd5b50565b5f813590506114f2816114ce565b92915050565b5f63ffffffff82169050919050565b611510816114f8565b811461151a575f80fd5b50565b5f8135905061152b81611507565b92915050565b5f806040838503121561154757611546611412565b5b5f611554858286016114e4565b92505060206115658582860161151d565b9150509250929050565b5f819050919050565b6115818161156f565b82525050565b5f60208201905061159a5f830184611578565b92915050565b5f819050919050565b6115b2816115a0565b81146115bc575f80fd5b50565b5f813590506115cd816115a9565b92915050565b6115dc8161156f565b81146115e6575f80fd5b50565b5f813590506115f7816115d3565b92915050565b5f805f806080858703121561161557611614611412565b5b5f611622878288016114e4565b94505060206116338782880161151d565b9350506040611644878288016115bf565b9250506060611655878288016115e9565b91505092959194509250565b5f6020828403121561167657611675611412565b5b5f611683848285016115e9565b91505092915050565b5f602082840312156116a1576116a0611412565b5b5f6116ae848285016114e4565b91505092915050565b6116c081611416565b82525050565b5f6020820190506116d95f8301846116b7565b92915050565b5f602082840312156116f4576116f3611412565b5b5f611701848285016115bf565b91505092915050565b5f80604083850312156117205761171f611412565b5b5f61172d858286016114e4565b925050602061173e858286016115e9565b9150509250929050565b611751816115a0565b82525050565b5f60208201905061176a5f830184611748565b92915050565b6117798161156f565b82525050565b604082015f8201516117935f850182611770565b5060208201516117a66020850182611770565b50505050565b5f6040820190506117bf5f83018461177f565b92915050565b6117ce816114f8565b82525050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f819050919050565b5f61181361180e611809846117d4565b6117f0565b6117dd565b9050919050565b611823816117f9565b82525050565b5f82825260208201905092915050565b50565b5f6118475f83611829565b915061185282611839565b5f82019050919050565b5f60808201905061186f5f8301866117c5565b61187c602083018561181a565b61188960408301846114a6565b818103606083015261189a8161183c565b9050949350505050565b5f815190506118b2816115d3565b92915050565b5f602082840312156118cd576118cc611412565b5b5f6118da848285016118a4565b91505092915050565b5f819050919050565b5f6119066119016118fc846118e3565b6117f0565b61156f565b9050919050565b611916816118ec565b82525050565b5f81519050919050565b5f5b83811015611943578082015181840152602081019050611928565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6119688261191c565b6119728185611829565b9350611982818560208601611926565b61198b8161194e565b840191505092915050565b5f6080820190506119a95f8301876117c5565b6119b660208301866114a6565b6119c3604083018561190d565b81810360608301526119d5818461195e565b905095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a178261156f565b9150611a228361156f565b9250828202611a308161156f565b91508282048414831517611a4757611a466119e0565b5b5092915050565b5f611a588261156f565b9150611a638361156f565b9250828201905080821115611a7b57611a7a6119e0565b5b92915050565b5f608082019050611a945f8301876114a6565b611aa160208301866117c5565b611aae6040830185611578565b611abb60608301846116b7565b95945050505050565b5f604082019050611ad75f8301856114a6565b611ae46020830184611578565b9392505050565b5f81519050611af981611421565b92915050565b5f60208284031215611b1457611b13611412565b5b5f611b2184828501611aeb565b91505092915050565b611b33816114f8565b82525050565b611b42816115a0565b82525050565b5f82825260208201905092915050565b5f611b628261191c565b611b6c8185611b48565b9350611b7c818560208601611926565b611b858161194e565b840191505092915050565b5f60e083015f830151611ba55f860182611b2a565b506020830151611bb86020860182611b39565b506040830151611bcb6040860182611770565b506060830151611bde6060860182611770565b5060808301518482036080860152611bf68282611b58565b91505060a083015184820360a0860152611c108282611b58565b91505060c083015184820360c0860152611c2a8282611b58565b9150508091505092915050565b5f6040820190508181035f830152611c4f8185611b90565b9050611c5e60208301846116b7565b9392505050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611c9f8261194e565b810181811067ffffffffffffffff82111715611cbe57611cbd611c69565b5b80604052505050565b5f611cd0611409565b9050611cdc8282611c96565b919050565b5f60408284031215611cf657611cf5611c65565b5b611d006040611cc7565b90505f611d0f848285016118a4565b5f830152506020611d22848285016118a4565b60208301525092915050565b5f60408284031215611d4357611d42611412565b5b5f611d5084828501611ce1565b91505092915050565b5f606082019050611d6c5f8301866114a6565b611d7960208301856114a6565b611d866040830184611578565b949350505050565b5f6080820190508181035f830152611da68186611b90565b9050611db5602083018561177f565b611dc260608301846114a6565b949350505050565b5f81519050611dd8816115a9565b92915050565b611de7816117dd565b8114611df1575f80fd5b50565b5f81519050611e0281611dde565b92915050565b5f60808284031215611e1d57611e1c611c65565b5b611e276060611cc7565b90505f611e3684828501611dca565b5f830152506020611e4984828501611df4565b6020830152506040611e5d84828501611ce1565b60408301525092915050565b5f60408284031215611e7e57611e7d611c65565b5b611e886040611cc7565b90505f611e97848285016118a4565b5f830152506020611eaa848285016118a4565b60208301525092915050565b5f8060c08385031215611ecc57611ecb611412565b5b5f611ed985828601611e08565b9250506080611eea85828601611e69565b9150509250929050565b5f611efe8261156f565b9150611f098361156f565b9250828203905081811115611f2157611f206119e0565b5b92915050565b5f604082019050611f3a5f830185611748565b611f4760208301846117c5565b9392505050565b5f61ffff82169050919050565b5f8160f01b9050919050565b5f611f7182611f5b565b9050919050565b611f89611f8482611f4e565b611f67565b82525050565b5f611f9a8284611f78565b60028201915081905092915050565b611fb281611f4e565b82525050565b5f602082019050611fcb5f830184611fa9565b92915050565b5f82825260208201905092915050565b7f746f55696e7431365f6f75744f66426f756e64730000000000000000000000005f82015250565b5f612015601483611fd1565b915061202082611fe1565b602082019050919050565b5f6020820190508181035f83015261204281612009565b9050919050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b5f8160801b9050919050565b5f61207a82612064565b9050919050565b61209261208d82612049565b612070565b82525050565b5f6120a38286611f78565b6002820191506120b38285612081565b6010820191506120c38284612081565b601082019150819050949350505050565b5f6120df8285611f78565b6002820191506120ef8284612081565b6010820191508190509392505050565b5f61210982611f4e565b915061211483611f4e565b9250828201905061ffff81111561212e5761212d6119e0565b5b92915050565b5f81905092915050565b5f6121488261191c565b6121528185612134565b9350612162818560208601611926565b80840191505092915050565b5f60ff82169050919050565b5f8160f81b9050919050565b5f6121908261217a565b9050919050565b6121a86121a38261216e565b612186565b82525050565b5f6121b9828861213e565b91506121c58287612197565b6001820191506121d58286611f78565b6002820191506121e58285612197565b6001820191506121f5828461213e565b91508190509695505050505050565b5f61220f828461213e565b915081905092915050565b5f819050919050565b5f61223d6122386122338461221a565b6117f0565b61216e565b9050919050565b61224d81612223565b82525050565b5f6040820190506122665f830185612244565b6122736020830184611578565b939250505056

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

    0000000000000000000000007425526ce2f9494b8d8ecdd7afc37a89a86f3c7b00000000000000000000000000000000000000000000000000000000000000020000000000000000000000004208d6e27538189bb48e603d6123a94b8abe0a0b000000000000000000000000282b3386571f7f794450d5789911a9804fa346b40000000000000000000000004514fc667a944752ee8a29f544c1b20b1a315f25

    -----Decoded View---------------
    Arg [0] : _fraxtalHop (bytes32): 0x0000000000000000000000007425526ce2f9494b8d8ecdd7afc37a89a86f3c7b
    Arg [1] : _noDNVs (uint256): 2
    Arg [2] : _EXECUTOR (address): 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b
    Arg [3] : _DVN (address): 0x282b3386571f7f794450d5789911a9804FA346b4
    Arg [4] : _TREASURY (address): 0x4514FC667a944752ee8A29F544c1B20b1A315f25

    -----Encoded View---------------
    5 Constructor Arguments found :
    Arg [0] : 0000000000000000000000007425526ce2f9494b8d8ecdd7afc37a89a86f3c7b
    Arg [1] : 0000000000000000000000000000000000000000000000000000000000000002
    Arg [2] : 0000000000000000000000004208d6e27538189bb48e603d6123a94b8abe0a0b
    Arg [3] : 000000000000000000000000282b3386571f7f794450d5789911a9804fa346b4
    Arg [4] : 0000000000000000000000004514fc667a944752ee8a29f544c1b20b1a315f25


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

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

    Validator Index Block Age Amount
    View All Withdrawals

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

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