ETH Price: $2,383.90 (-9.20%)

Contract

0x809e02BE51E6C01e626b252021eAC254B5374b99

Overview

ETH Balance

Linea Mainnet LogoLinea Mainnet LogoLinea Mainnet Logo0.025012546856761085 ETH

ETH Value

$59.63 (@ $2,383.90/ETH)

Token Holdings

More Info

Private Name Tags

Transaction Hash
Block
From
To
Gas Transfer195939792025-06-02 12:30:33244 days ago1748867433IN
Interport: Gas Transfer V2
0.0361201 ETH0.000034360.11296216
Gas Transfer195939782025-06-02 12:30:31244 days ago1748867431IN
Interport: Gas Transfer V2
0.0361201 ETH0.000034360.11296216
Gas Transfer194886692025-05-30 2:19:54247 days ago1748571594IN
Interport: Gas Transfer V2
0.03611335 ETH0.000044240.14544
Gas Transfer194886682025-05-30 2:19:52247 days ago1748571592IN
Interport: Gas Transfer V2
0.03611335 ETH0.000044240.14544
Gas Transfer194886682025-05-30 2:19:52247 days ago1748571592IN
Interport: Gas Transfer V2
0.03611335 ETH0.000044240.14544
Gas Transfer184573492025-04-27 23:12:47279 days ago1745795567IN
Interport: Gas Transfer V2
0.02992985 ETH0.000027230.089523
Gas Transfer184573192025-04-27 23:11:26279 days ago1745795486IN
Interport: Gas Transfer V2
0.00335694 ETH0.000054720.17016531
Gas Transfer184170682025-04-26 18:42:06280 days ago1745692926IN
Interport: Gas Transfer V2
0.0011295 ETH0.000032150.10568229
Gas Transfer183742402025-04-25 12:35:34282 days ago1745584534IN
Interport: Gas Transfer V2
0.02465 ETH0.000059380.195175
Gas Transfer183475982025-04-24 16:50:30282 days ago1745513430IN
Interport: Gas Transfer V2
0.00023068 ETH0.000015730.05169609
Gas Transfer183475982025-04-24 16:50:30282 days ago1745513430IN
Interport: Gas Transfer V2
0.00023068 ETH0.000015730.05169609
Gas Transfer182524172025-04-21 19:32:26285 days ago1745263946IN
Interport: Gas Transfer V2
0.0093704 ETH0.000028780.089523
Gas Transfer182348852025-04-21 7:40:01286 days ago1745221201IN
Interport: Gas Transfer V2
0.0226983 ETH0.000028780.089523
Gas Transfer181955322025-04-19 21:31:47287 days ago1745098307IN
Interport: Gas Transfer V2
0.00144441 ETH0.000027230.089523
Gas Transfer181945702025-04-19 20:32:57287 days ago1745094777IN
Interport: Gas Transfer V2
0.00154251 ETH0.000013790.04308001
Gas Transfer179139982025-04-10 19:50:02296 days ago1744314602IN
Interport: Gas Transfer V2
0.00050102 ETH0.000061090.189857
Gas Transfer176902382025-04-04 2:25:06303 days ago1743733506IN
Interport: Gas Transfer V2
0.0091164 ETH0.000028780.089523
Gas Transfer176436032025-04-02 17:37:44304 days ago1743615464IN
Interport: Gas Transfer V2
0.00027843 ETH0.000014380.04726058
Gas Transfer176434602025-04-02 17:32:07304 days ago1743615127IN
Interport: Gas Transfer V2
0.00027798 ETH0.000014360.04719097
Gas Transfer176356992025-04-02 12:27:04305 days ago1743596824IN
Interport: Gas Transfer V2
0.0015044 ETH0.000026720.08343638
Gas Transfer175591222025-03-31 8:52:39307 days ago1743411159IN
Interport: Gas Transfer V2
0.00688389 ETH0.000028670.089523
Gas Transfer175272322025-03-30 12:02:46308 days ago1743336166IN
Interport: Gas Transfer V2
0.00136517 ETH0.000011950.03928937
Gas Transfer172974912025-03-24 7:11:09314 days ago1742800269IN
Interport: Gas Transfer V2
0.01082926 ETH0.000037780.11749893
Gas Transfer172301282025-03-22 9:26:24316 days ago1742635584IN
Interport: Gas Transfer V2
0.00135338 ETH0.000024670.08110886
Gas Transfer171966242025-03-21 11:04:51317 days ago1742555091IN
Interport: Gas Transfer V2
0.00873556 ETH0.000032620.1074276
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
195939792025-06-02 12:30:33244 days ago1748867433
Interport: Gas Transfer V2
0.03605986 ETH
195939792025-06-02 12:30:33244 days ago1748867433
Interport: Gas Transfer V2
0 ETH
195939782025-06-02 12:30:31244 days ago1748867431
Interport: Gas Transfer V2
0.03605986 ETH
195939782025-06-02 12:30:31244 days ago1748867431
Interport: Gas Transfer V2
0 ETH
195915962025-06-02 10:54:39244 days ago1748861679
Interport: Gas Transfer V2
0 ETH
195839952025-06-02 5:36:49244 days ago1748842609
Interport: Gas Transfer V2
0 ETH
194886692025-05-30 2:19:54247 days ago1748571594
Interport: Gas Transfer V2
0.03605603 ETH
194886692025-05-30 2:19:54247 days ago1748571594
Interport: Gas Transfer V2
0 ETH
194886682025-05-30 2:19:52247 days ago1748571592
Interport: Gas Transfer V2
0.03605603 ETH
194886682025-05-30 2:19:52247 days ago1748571592
Interport: Gas Transfer V2
0 ETH
194886682025-05-30 2:19:52247 days ago1748571592
Interport: Gas Transfer V2
0.03605603 ETH
194886682025-05-30 2:19:52247 days ago1748571592
Interport: Gas Transfer V2
0 ETH
194820832025-05-29 20:26:23247 days ago1748550383
Interport: Gas Transfer V2
0 ETH
194820822025-05-29 20:26:21247 days ago1748550381
Interport: Gas Transfer V2
0 ETH
194820822025-05-29 20:26:21247 days ago1748550381
Interport: Gas Transfer V2
0 ETH
193464342025-05-25 15:35:54251 days ago1748187354
Interport: Gas Transfer V2
0 ETH
193284082025-05-25 2:44:48252 days ago1748141088
Interport: Gas Transfer V2
0 ETH
191879312025-05-20 18:31:15256 days ago1747765875
Interport: Gas Transfer V2
0 ETH
187873842025-05-08 10:02:51269 days ago1746698571
Interport: Gas Transfer V2
0 ETH
186803592025-05-05 2:27:32272 days ago1746412052
Interport: Gas Transfer V2
0 ETH
186253152025-05-03 5:08:52274 days ago1746248932
Interport: Gas Transfer V2
0 ETH
184930102025-04-29 0:19:36278 days ago1745885976
Interport: Gas Transfer V2
0 ETH
184927452025-04-29 0:05:06278 days ago1745885106
Interport: Gas Transfer V2
0 ETH
184875432025-04-28 19:41:47278 days ago1745869307
Interport: Gas Transfer V2
0 ETH
184573492025-04-27 23:12:47279 days ago1745795567
Interport: Gas Transfer V2
0.02984626 ETH
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
InterportLZV2GasTransfer

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: AGPL-3.0-only

pragma solidity 0.8.19;

import { ILayerZeroEndpointV2, MessagingParams, Origin } from '@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol';
import { IExecutor } from '@layerzerolabs/lz-evm-messagelib-v2/contracts/interfaces/IExecutor.sol';
import { OwnerManageable } from '../access/OwnerManageable.sol';
import { SystemVersionId } from '../SystemVersionId.sol';
import '../helpers/AddressHelper.sol' as AddressHelper;

/**
 * @title InterportLZV2GasTransfer
 * @notice Gas transfer contract
 */
contract InterportLZV2GasTransfer is SystemVersionId, OwnerManageable {
    /**
     * @notice Gas transfer item structure
     * @param remoteEid The remote endpoint identifier
     * @param recipient The address of the gas transfer recipient
     * @param amount Gas transfer amount
     * @param settings Gas transfer settings
     */
    struct GasTransferItem {
        uint16 remoteEid;
        address recipient;
        uint128 amount;
        bytes settings;
    }

    /**
     * @notice Endpoint data item structure
     * @param value The endpoint call value
     * @param messagingParams The endpoint messaging parameters
     */
    struct EndpointDataItem {
        uint256 value;
        MessagingParams messagingParams;
    }

    /**
     * @dev The cross-chain endpoint contract reference
     */
    ILayerZeroEndpointV2 public endpoint;

    uint128 private minDstAppGas;
    uint256 private minReserve;

    /**
     * @notice Emitted when the cross-chain endpoint contract reference is set
     * @param endpoint The cross-chain endpoint contract reference
     */
    event SetEndpoint(ILayerZeroEndpointV2 indexed endpoint);

    /**
     * @notice Emitted when the delegate address is set
     * @param delegate The delegate address
     */
    event SetDelegate(address indexed delegate);

    /**
     * @notice Emitted when the parameter validation results in an error
     */
    error ValidationError();

    /**
     * @notice Initializes the contract
     * @param _endpoint The cross-chain endpoint contract reference
     * @param _validation The initial validation data
     * @param _owner The address of the initial owner of the contract
     */
    constructor(ILayerZeroEndpointV2 _endpoint, bytes memory _validation, address _owner) {
        _setEndpoint(_endpoint);
        _setValidation(_validation);

        _initOwner(_owner);
        _setDelegate(_owner);
    }

    /**
     * @notice The standard "receive" function
     */
    receive() external payable {}

    /**
     * @notice Performs a gas transfer action
     * @param _gasTransferData Gas transfer data
     */
    function gasTransfer(
        GasTransferItem[] calldata _gasTransferData
    ) external payable whenNotPaused {
        (EndpointDataItem[] memory endpointData, ) = _getEndpointData(_gasTransferData, true);

        for (uint256 index = 0; index < endpointData.length; index++) {
            EndpointDataItem memory endpointDataItem = endpointData[index];

            endpoint.send{ value: endpointDataItem.value }(
                endpointDataItem.messagingParams,
                address(this)
            );
        }
    }

    /**
     * @notice Entry point for receiving messages or packets from the endpoint
     * @dev _origin The origin information containing the source endpoint and sender address
     * @dev _guid The unique identifier for the received LayerZero message
     * @dev _message The payload of the received message
     * @dev _executor The address of the executor for the received message
     * @dev _extraData Additional arbitrary data provided by the corresponding executor
     */
    function lzReceive(
        Origin calldata /*_origin*/,
        bytes32 /*_guid*/,
        bytes calldata /*_message*/,
        address /*_executor*/,
        bytes calldata /*_extraData*/
    ) external payable {}

    /**
     * @notice Sets the cross-chain endpoint contract reference
     * @param _endpoint The cross-chain endpoint contract reference
     */
    function setEndpoint(ILayerZeroEndpointV2 _endpoint) external onlyOwner {
        _setEndpoint(_endpoint);
    }

    /**
     * @notice Sets the validation data
     * @param _validation The validation data
     */
    function setValidation(bytes memory _validation) external onlyOwner {
        _setValidation(_validation);
    }

    /**
     * @notice Sets the delegate address
     * @param _delegate The delegate address
     */
    function setDelegate(address _delegate) external onlyOwner {
        _setDelegate(_delegate);
    }

    /**
     * @notice Source chain action value estimation
     * @param _gasTransferData Gas transfer data
     * @return value The source chain action value
     */
    function estimateSourceValue(
        GasTransferItem[] calldata _gasTransferData
    ) external view returns (uint256 value) {
        (, value) = _getEndpointData(_gasTransferData, false);
    }

    /**
     * @notice The native token amount cap on the destination chains
     * @param _remoteEids The destination endpoint identifier array
     * @return result The native token amount cap on the destination chains
     */
    function destinationAmountCap(
        uint16[] calldata _remoteEids
    ) external view returns (uint128[] memory result) {
        result = new uint128[](_remoteEids.length);

        uint16 remoteEid;
        address sendLibraryAddress;
        address executorAddress;
        uint128 nativeCap;

        for (uint256 index; index < _remoteEids.length; index++) {
            remoteEid = _remoteEids[index];

            if (endpoint.isSupportedEid(remoteEid)) {
                sendLibraryAddress = endpoint.getSendLibrary(address(this), remoteEid);

                executorAddress = ExecutorConfigProvider(sendLibraryAddress)
                    .getExecutorConfig(address(this), remoteEid)
                    .executor;

                (, , , nativeCap) = IExecutor(executorAddress).dstConfig(remoteEid);

                result[index] = nativeCap;
            }
        }
    }

    /**
     * @notice Checks if the path initialization is allowed based on the provided origin
     * @dev _origin The origin information containing the source endpoint and sender address
     * @return Whether the path has been initialized
     */
    function allowInitializePath(Origin calldata /*_origin*/) external pure returns (bool) {
        return true;
    }

    /**
     * @notice Retrieves the next nonce for a given source endpoint and sender address
     * @dev _srcEid The source endpoint ID
     * @dev _sender The sender address
     * @return nonce The next nonce
     */
    function nextNonce(
        uint32 /*_srcEid*/,
        bytes32 /*_sender*/
    ) external pure returns (uint64 nonce) {
        return 0;
    }

    function _setEndpoint(ILayerZeroEndpointV2 _endpoint) private {
        AddressHelper.requireContract(address(_endpoint));

        endpoint = _endpoint;

        emit SetEndpoint(_endpoint);
    }

    function _setValidation(bytes memory _validation) private {
        (minDstAppGas, minReserve) = abi.decode(_validation, (uint128, uint256));
    }

    function _setDelegate(address _delegate) private {
        endpoint.setDelegate(_delegate);

        emit SetDelegate(_delegate);
    }

    function _getEndpointData(
        GasTransferItem[] calldata _gasTransferData,
        bool _validate
    ) private view returns (EndpointDataItem[] memory endpointData, uint256 value) {
        endpointData = new EndpointDataItem[](_gasTransferData.length);

        for (uint256 index; index < _gasTransferData.length; index++) {
            GasTransferItem calldata gasTransferItem = _gasTransferData[index];

            (address dstApp, uint128 dstAppGas, bytes memory lzOptions) = _decodeParameters(
                gasTransferItem
            );

            if (_validate && dstAppGas < minDstAppGas) {
                revert ValidationError();
            }

            MessagingParams memory itemMessagingParams = MessagingParams(
                gasTransferItem.remoteEid,
                bytes32(uint256(uint160(dstApp))),
                '', // empty message
                lzOptions,
                false
            );

            uint256 itemValue = endpoint.quote(itemMessagingParams, address(this)).nativeFee;
            value += itemValue + (_validate ? minReserve : 0);

            endpointData[index] = EndpointDataItem({
                value: itemValue,
                messagingParams: itemMessagingParams
            });
        }

        if (_validate && msg.value < value) {
            revert ValidationError();
        }
    }

    function _decodeParameters(
        GasTransferItem calldata _parameters
    ) private view returns (address dstApp, uint128 dstAppGas, bytes memory lzOptions) {
        (dstApp, dstAppGas) = abi.decode(_parameters.settings, (address, uint128));

        lzOptions = _prepareOptions(
            dstAppGas,
            _parameters.amount,
            _parameters.recipient == address(0) ? msg.sender : _parameters.recipient
        );
    }

    function _prepareOptions(
        uint128 _dstAppGas,
        uint128 _dstNativeDropAmount,
        address _dstNativeDropRecipient
    ) private pure returns (bytes memory) {
        return
            abi.encodePacked(
                // options type
                uint16(3), // TYPE_3
                // executor LZ receive option
                uint8(1), // WORKER_ID
                uint16(17), // option length in bytes: (optionType -> 1) + (uint128 -> 16)
                uint8(1), // OPTION_TYPE_LZRECEIVE
                _dstAppGas,
                // executor native drop option
                uint8(1), // WORKER_ID
                uint16(49), // option length in bytes: (optionType -> 1) + (uint128 -> 16) + (bytes32 -> 32)
                uint8(2), // OPTION_TYPE_NATIVE_DROP
                _dstNativeDropAmount,
                bytes32(uint256(uint160(_dstNativeDropRecipient)))
            );
    }
}

interface ExecutorConfigProvider {
    struct ExecutorConfig {
        uint32 maxMessageSize;
        address executor;
    }

    function getExecutorConfig(
        address _oapp,
        uint32 _remoteEid
    ) external view returns (ExecutorConfig memory rtnConfig);
}

// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0;

import { Origin } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";

import { IWorker } from "./IWorker.sol";
import { ILayerZeroExecutor } from "./ILayerZeroExecutor.sol";

interface IExecutor is IWorker, ILayerZeroExecutor {
    struct DstConfigParam {
        uint32 dstEid;
        uint64 baseGas;
        uint16 multiplierBps;
        uint128 floorMarginUSD;
        uint128 nativeCap;
    }

    struct DstConfig {
        uint64 baseGas; // for verifying / fixed calldata overhead
        uint16 multiplierBps;
        uint128 floorMarginUSD; // uses priceFeed PRICE_RATIO_DENOMINATOR
        uint128 nativeCap;
    }

    struct ExecutionParams {
        address receiver;
        Origin origin;
        bytes32 guid;
        bytes message;
        bytes extraData;
        uint256 gasLimit;
    }

    struct NativeDropParams {
        address receiver;
        uint256 amount;
    }

    event DstConfigSet(DstConfigParam[] params);
    event NativeDropApplied(Origin origin, uint32 dstEid, address oapp, NativeDropParams[] params, bool[] success);

    function dstConfig(uint32 _dstEid) external view returns (uint64, uint16, uint128, uint128);
}

// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0;

interface ILayerZeroExecutor {
    // @notice query price and assign jobs at the same time
    // @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 assignJob(
        uint32 _dstEid,
        address _sender,
        uint256 _calldataSize,
        bytes calldata _options
    ) external returns (uint256 price);

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0;

interface IWorker {
    event SetWorkerLib(address workerLib);
    event SetPriceFeed(address priceFeed);
    event SetDefaultMultiplierBps(uint16 multiplierBps);
    event SetSupportedOptionTypes(uint32 dstEid, uint8[] optionTypes);
    event Withdraw(address lib, address to, uint256 amount);

    error Worker_NotAllowed();
    error Worker_OnlyMessageLib();
    error Worker_RoleRenouncingDisabled();

    function setPriceFeed(address _priceFeed) external;

    function priceFeed() external view returns (address);

    function setDefaultMultiplierBps(uint16 _multiplierBps) external;

    function defaultMultiplierBps() external view returns (uint16);

    function withdrawFee(address _lib, address _to, uint256 _amount) external;

    function setSupportedOptionTypes(uint32 _eid, uint8[] calldata _optionTypes) external;

    function getSupportedOptionTypes(uint32 _eid) external view returns (uint8[] memory);
}

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

struct Origin {
    uint32 srcEid;
    bytes32 sender;
    uint64 nonce;
}

interface ILayerZeroEndpointV2 is IMessageLibManager, IMessagingComposer, IMessagingChannel, IMessagingContext {
    event PacketSent(bytes encodedPayload, bytes options, address sendLibrary);

    event PacketVerified(Origin origin, address receiver, bytes32 payloadHash);

    event PacketDelivered(Origin origin, address receiver);

    event LzReceiveAlert(
        address indexed receiver,
        address indexed executor,
        Origin origin,
        bytes32 guid,
        uint256 gas,
        uint256 value,
        bytes message,
        bytes extraData,
        bytes reason
    );

    event LzTokenSet(address token);

    event DelegateSet(address sender, address delegate);

    function quote(MessagingParams calldata _params, address _sender) external view returns (MessagingFee memory);

    function send(
        MessagingParams calldata _params,
        address _refundAddress
    ) external payable returns (MessagingReceipt memory);

    function verify(Origin calldata _origin, address _receiver, bytes32 _payloadHash) external;

    function verifiable(Origin calldata _origin, address _receiver) external view returns (bool);

    function initializable(Origin calldata _origin, address _receiver) external view returns (bool);

    function lzReceive(
        Origin calldata _origin,
        address _receiver,
        bytes32 _guid,
        bytes calldata _message,
        bytes calldata _extraData
    ) external payable;

    // oapp can burn messages partially by calling this function with its own business logic if messages are verified in order
    function clear(address _oapp, Origin calldata _origin, bytes32 _guid, bytes calldata _message) external;

    function setLzToken(address _lzToken) external;

    function lzToken() external view returns (address);

    function nativeToken() external view returns (address);

    function setDelegate(address _delegate) external;
}

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

    function isRegisteredLibrary(address _lib) external view returns (bool);

    function getRegisteredLibraries() external view returns (address[] memory);

    function setDefaultSendLibrary(uint32 _eid, address _newLib) external;

    function defaultSendLibrary(uint32 _eid) external view returns (address);

    function setDefaultReceiveLibrary(uint32 _eid, address _newLib, uint256 _timeout) external;

    function defaultReceiveLibrary(uint32 _eid) external view returns (address);

    function setDefaultReceiveLibraryTimeout(uint32 _eid, address _lib, uint256 _expiry) external;

    function defaultReceiveLibraryTimeout(uint32 _eid) external view returns (address lib, uint256 expiry);

    function isSupportedEid(uint32 _eid) external view returns (bool);

    function isValidReceiveLibrary(address _receiver, uint32 _eid, address _lib) external view returns (bool);

    /// ------------------- OApp interfaces -------------------
    function setSendLibrary(address _oapp, uint32 _eid, address _newLib) external;

    function getSendLibrary(address _sender, uint32 _eid) external view returns (address lib);

    function isDefaultSendLibrary(address _sender, uint32 _eid) external view returns (bool);

    function setReceiveLibrary(address _oapp, uint32 _eid, address _newLib, uint256 _gracePeriod) external;

    function getReceiveLibrary(address _receiver, uint32 _eid) external view returns (address lib, bool isDefault);

    function setReceiveLibraryTimeout(address _oapp, uint32 _eid, address _lib, uint256 _gracePeriod) external;

    function receiveLibraryTimeout(address _receiver, uint32 _eid) external view returns (address lib, uint256 expiry);

    function setConfig(address _oapp, address _lib, SetConfigParam[] calldata _params) external;

    function getConfig(
        address _oapp,
        address _lib,
        uint32 _eid,
        uint32 _configType
    ) external view returns (bytes memory config);
}

// 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(
        address _receiver,
        uint32 _srcEid,
        bytes32 _sender,
        uint64 _nonce
    ) external view returns (bytes32);

    function lazyInboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);
}

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

    function sendCompose(address _to, bytes32 _guid, uint16 _index, bytes calldata _message) external;

    function lzCompose(
        address _from,
        address _to,
        bytes32 _guid,
        uint16 _index,
        bytes calldata _message,
        bytes calldata _extraData
    ) external payable;
}

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../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.
 *
 * 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 Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

// SPDX-License-Identifier: AGPL-3.0-only

pragma solidity 0.8.19;

import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol';
import { Pausable } from '@openzeppelin/contracts/security/Pausable.sol';
import { ITokenBalance } from '../interfaces/ITokenBalance.sol';
import '../helpers/TransferHelper.sol' as TransferHelper;
import '../Constants.sol' as Constants;

/**
 * @title OwnerManageable
 * @notice OwnerManageable contract
 */
contract OwnerManageable is Ownable, Pausable {
    /**
     * @notice Enter pause state
     */
    function pause() external virtual onlyOwner whenNotPaused {
        _pause();
    }

    /**
     * @notice Exit pause state
     */
    function unpause() external virtual onlyOwner whenPaused {
        _unpause();
    }

    /**
     * @notice Performs the token cleanup
     * @dev Use the "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" address for the native token
     * @param _tokenAddress The address of the token
     */
    function cleanup(address _tokenAddress) external onlyOwner {
        if (_tokenAddress == Constants.NATIVE_TOKEN_ADDRESS) {
            TransferHelper.safeTransferNative(msg.sender, address(this).balance);
        } else {
            TransferHelper.safeTransfer(
                _tokenAddress,
                msg.sender,
                ITokenBalance(_tokenAddress).balanceOf(address(this))
            );
        }
    }

    /**
     * @notice Performs the token cleanup using the provided amount
     * @dev Use the "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" address for the native token
     * @param _tokenAddress The address of the token
     * @param _tokenAmount The amount of the token
     */
    function cleanupWithAmount(address _tokenAddress, uint256 _tokenAmount) external onlyOwner {
        if (_tokenAddress == Constants.NATIVE_TOKEN_ADDRESS) {
            TransferHelper.safeTransferNative(msg.sender, _tokenAmount);
        } else {
            TransferHelper.safeTransfer(_tokenAddress, msg.sender, _tokenAmount);
        }
    }

    function _initOwner(address _owner) internal {
        if (_owner != _msgSender() && _owner != address(0)) {
            _transferOwnership(_owner);
        }
    }
}

File 14 of 18 : Constants.sol
// SPDX-License-Identifier: AGPL-3.0-only

pragma solidity 0.8.19;

/**
 * @dev The default token decimals value
 */
uint256 constant DECIMALS_DEFAULT = 18;

/**
 * @dev The maximum uint256 value for swap amount limit settings
 */
uint256 constant INFINITY = type(uint256).max;

/**
 * @dev The default limit of account list size
 */
uint256 constant LIST_SIZE_LIMIT_DEFAULT = 100;

/**
 * @dev The limit of swap router list size
 */
uint256 constant LIST_SIZE_LIMIT_ROUTERS = 200;

/**
 * @dev The factor for percentage settings. Example: 100 is 0.1%
 */
uint256 constant MILLIPERCENT_FACTOR = 100_000;

/**
 * @dev The de facto standard address to denote the native token
 */
address constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

File 15 of 18 : AddressHelper.sol
// SPDX-License-Identifier: AGPL-3.0-only

pragma solidity 0.8.19;

/**
 * @notice Emitted when the account is not a contract
 * @param account The account address
 */
error NonContractAddressError(address account);

/**
 * @notice Function to check if the account is a contract
 * @return The account contract status flag
 */
function isContract(address _account) view returns (bool) {
    return _account.code.length > 0;
}

/**
 * @notice Function to require an account to be a contract
 */
function requireContract(address _account) view {
    if (!isContract(_account)) {
        revert NonContractAddressError(_account);
    }
}

/**
 * @notice Function to require an account to be a contract or a zero address
 */
function requireContractOrZeroAddress(address _account) view {
    if (_account != address(0)) {
        requireContract(_account);
    }
}

File 16 of 18 : TransferHelper.sol
// SPDX-License-Identifier: AGPL-3.0-only

pragma solidity 0.8.19;

/**
 * @notice Emitted when an approval action fails
 */
error SafeApproveError();

/**
 * @notice Emitted when a transfer action fails
 */
error SafeTransferError();

/**
 * @notice Emitted when a transferFrom action fails
 */
error SafeTransferFromError();

/**
 * @notice Emitted when a transfer of the native token fails
 */
error SafeTransferNativeError();

/**
 * @notice Safely approve the token to the account
 * @param _token The token address
 * @param _to The token approval recipient address
 * @param _value The token approval amount
 */
function safeApprove(address _token, address _to, uint256 _value) {
    // 0x095ea7b3 is the selector for "approve(address,uint256)"
    (bool success, bytes memory data) = _token.call(
        abi.encodeWithSelector(0x095ea7b3, _to, _value)
    );

    bool condition = success && (data.length == 0 || abi.decode(data, (bool)));

    if (!condition) {
        revert SafeApproveError();
    }
}

/**
 * @notice Safely transfer the token to the account
 * @param _token The token address
 * @param _to The token transfer recipient address
 * @param _value The token transfer amount
 */
function safeTransfer(address _token, address _to, uint256 _value) {
    // 0xa9059cbb is the selector for "transfer(address,uint256)"
    (bool success, bytes memory data) = _token.call(
        abi.encodeWithSelector(0xa9059cbb, _to, _value)
    );

    bool condition = success && (data.length == 0 || abi.decode(data, (bool)));

    if (!condition) {
        revert SafeTransferError();
    }
}

/**
 * @notice Safely transfer the token between the accounts
 * @param _token The token address
 * @param _from The token transfer source address
 * @param _to The token transfer recipient address
 * @param _value The token transfer amount
 */
function safeTransferFrom(address _token, address _from, address _to, uint256 _value) {
    // 0x23b872dd is the selector for "transferFrom(address,address,uint256)"
    (bool success, bytes memory data) = _token.call(
        abi.encodeWithSelector(0x23b872dd, _from, _to, _value)
    );

    bool condition = success && (data.length == 0 || abi.decode(data, (bool)));

    if (!condition) {
        revert SafeTransferFromError();
    }
}

/**
 * @notice Safely transfer the native token to the account
 * @param _to The native token transfer recipient address
 * @param _value The native token transfer amount
 */
function safeTransferNative(address _to, uint256 _value) {
    (bool success, ) = _to.call{ value: _value }(new bytes(0));

    if (!success) {
        revert SafeTransferNativeError();
    }
}

// SPDX-License-Identifier: AGPL-3.0-only

pragma solidity 0.8.19;

/**
 * @title ITokenBalance
 * @notice Token balance interface
 */
interface ITokenBalance {
    /**
     * @notice Getter of the token balance by the account
     * @param _account The account address
     * @return Token balance
     */
    function balanceOf(address _account) external view returns (uint256);
}

File 18 of 18 : SystemVersionId.sol
// SPDX-License-Identifier: AGPL-3.0-only

pragma solidity 0.8.19;

/**
 * @title SystemVersionId
 * @notice Base contract providing the system version identifier
 */
abstract contract SystemVersionId {
    /**
     * @dev The system version identifier
     */
    uint256 public constant SYSTEM_VERSION_ID = uint256(keccak256('Initial'));
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract ILayerZeroEndpointV2","name":"_endpoint","type":"address"},{"internalType":"bytes","name":"_validation","type":"bytes"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"NonContractAddressError","type":"error"},{"inputs":[],"name":"SafeTransferError","type":"error"},{"inputs":[],"name":"SafeTransferNativeError","type":"error"},{"inputs":[],"name":"ValidationError","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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"}],"name":"SetDelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract ILayerZeroEndpointV2","name":"endpoint","type":"address"}],"name":"SetEndpoint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"SYSTEM_VERSION_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"","type":"tuple"}],"name":"allowInitializePath","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"cleanup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"cleanupWithAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_remoteEids","type":"uint16[]"}],"name":"destinationAmountCap","outputs":[{"internalType":"uint128[]","name":"result","type":"uint128[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpointV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"remoteEid","type":"uint16"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"bytes","name":"settings","type":"bytes"}],"internalType":"struct InterportLZV2GasTransfer.GasTransferItem[]","name":"_gasTransferData","type":"tuple[]"}],"name":"estimateSourceValue","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"remoteEid","type":"uint16"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"bytes","name":"settings","type":"bytes"}],"internalType":"struct InterportLZV2GasTransfer.GasTransferItem[]","name":"_gasTransferData","type":"tuple[]"}],"name":"gasTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"","type":"tuple"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"nextNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ILayerZeroEndpointV2","name":"_endpoint","type":"address"}],"name":"setEndpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_validation","type":"bytes"}],"name":"setValidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162001de638038062001de68339810160408190526200003491620002a6565b6200003f3362000081565b6000805460ff60a01b191690556200005783620000d1565b620000628262000126565b6200006d8162000162565b620000788162000198565b505050620003df565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000dc8162000230565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fc8e81a4efc849969069ec6aae575cf7a6bc5f9d3abac59f4ed190a6f7e05fc6f90600090a250565b808060200190518101906200013c9190620003a3565b600355600280546001600160801b0319166001600160801b039290921691909117905550565b6001600160a01b03811633148015906200018457506001600160a01b03811615155b156200019557620001958162000081565b50565b60015460405163ca5eb5e160e01b81526001600160a01b0383811660048301529091169063ca5eb5e190602401600060405180830381600087803b158015620001e057600080fd5b505af1158015620001f5573d6000803e3d6000fd5b50506040516001600160a01b03841692507fe04946a482d4e81124cf46321be733aca4133ddfc19ce89a6106b4de11d33c8b9150600090a250565b6001600160a01b0381163b6200019557604051638c50d7cd60e01b81526001600160a01b038216600482015260240160405180910390fd5b6001600160a01b03811681146200019557600080fd5b634e487b7160e01b600052604160045260246000fd5b8051620002a18162000268565b919050565b600080600060608486031215620002bc57600080fd5b8351620002c98162000268565b602085810151919450906001600160401b0380821115620002e957600080fd5b818701915087601f830112620002fe57600080fd5b8151818111156200031357620003136200027e565b604051601f8201601f19908116603f011681019083821181831017156200033e576200033e6200027e565b816040528281528a868487010111156200035757600080fd5b600093505b828410156200037b57848401860151818501870152928501926200035c565b60008684830101528097505050505050506200039a6040850162000294565b90509250925092565b60008060408385031215620003b757600080fd5b82516001600160801b0381168114620003cf57600080fd5b6020939093015192949293505050565b6119f780620003ef6000396000f3fe6080604052600436106101185760003560e01c80637d25a05e116100a0578063dbbb415511610064578063dbbb41551461032a578063f2fde38b1461034a578063fbacefce1461036a578063fd26f5e01461038a578063ff7bd03d1461039d57600080fd5b80637d25a05e1461027e5780637f42754f146102b75780638456cb59146102d75780638da5cb5b146102ec578063ca5eb5e11461030a57600080fd5b80633f4ba83a116100e75780633f4ba83a146101c45780635c975abb146101d95780635e280f11146102045780636a0b3ad41461023c578063715018a61461026957600080fd5b8063093f0e271461012457806313137d651461016b5780632c16f926146101845780633132bb31146101a457600080fd5b3661011f57005b600080fd5b34801561013057600080fd5b506101587f22ad9585a395edc8067b50da4778cafbb7fa2c4bbd7619fad6aeba403857fd7481565b6040519081526020015b60405180910390f35b6101826101793660046111dd565b50505050505050565b005b34801561019057600080fd5b5061018261019f36600461127d565b6103be565b3480156101b057600080fd5b506101826101bf3660046112e8565b610404565b3480156101d057600080fd5b50610182610418565b3480156101e557600080fd5b50600054600160a01b900460ff165b6040519015158152602001610162565b34801561021057600080fd5b50600154610224906001600160a01b031681565b6040516001600160a01b039091168152602001610162565b34801561024857600080fd5b5061025c6102573660046113de565b610432565b6040516101629190611420565b34801561027557600080fd5b506101826106de565b34801561028a57600080fd5b5061029e61029936600461147f565b6106f0565b60405167ffffffffffffffff9091168152602001610162565b3480156102c357600080fd5b506101586102d23660046113de565b6106f9565b3480156102e357600080fd5b5061018261070f565b3480156102f857600080fd5b506000546001600160a01b0316610224565b34801561031657600080fd5b5061018261032536600461149d565b610727565b34801561033657600080fd5b5061018261034536600461149d565b610738565b34801561035657600080fd5b5061018261036536600461149d565b610749565b34801561037657600080fd5b5061018261038536600461149d565b6107c4565b6101826103983660046113de565b610870565b3480156103a957600080fd5b506101f46103b83660046114c1565b50600190565b6103c661094e565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038316016103f9576103f533826109a8565b5050565b6103f5823383610a3b565b61040c61094e565b61041581610b2d565b50565b61042061094e565b610428610b67565b610430610bb7565b565b60608167ffffffffffffffff81111561044d5761044d6112a9565b604051908082528060200260200182016040528015610476578160200160208202803683370190505b50905060008060008060005b868110156106d35787878281811061049c5761049c6114dd565b90506020020160208101906104b19190611503565b6001546040516319d4335360e21b815261ffff831660048201529196506001600160a01b031690636750cd4c90602401602060405180830381865afa1580156104fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105229190611520565b156106c15760015460405163b96a277f60e01b815230600482015261ffff871660248201526001600160a01b039091169063b96a277f90604401602060405180830381865afa158015610579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059d9190611542565b60405163062060fd60e21b815230600482015261ffff871660248201529094506001600160a01b0385169063188183f4906044016040805180830381865afa1580156105ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610611919061155f565b60200151604051639e94496560e01b815261ffff871660048201529093506001600160a01b03841690639e94496590602401608060405180830381865afa158015610660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068491906115d2565b895190955085935089925084915081106106a0576106a06114dd565b60200260200101906001600160801b031690816001600160801b0316815250505b806106cb81611644565b915050610482565b505050505092915050565b6106e661094e565b6104306000610c0c565b60005b92915050565b600061070783836000610c5c565b949350505050565b61071761094e565b61071f610ea1565b610430610eee565b61072f61094e565b61041581610f31565b61074061094e565b61041581610fc7565b61075161094e565b6001600160a01b0381166107bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61041581610c0c565b6107cc61094e565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038216016107fb5761041533476109a8565b6040516370a0823160e01b815230600482015261041590829033906001600160a01b038316906370a0823190602401602060405180830381865afa158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b919061165d565b610a3b565b610878610ea1565b600061088683836001610c5c565b50905060005b81518110156109485760008282815181106108a9576108a96114dd565b6020908102919091018101516001548151928201516040516302637a4560e41b81529294506001600160a01b0390911692632637a4509290916108f09130906004016116c6565b60806040518083038185885af115801561090e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610933919061176f565b5050808061094090611644565b91505061088c565b50505050565b6000546001600160a01b031633146104305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b2565b604080516000808252602082019092526001600160a01b0384169083906040516109d291906117d5565b60006040518083038185875af1925050503d8060008114610a0f576040519150601f19603f3d011682016040523d82523d6000602084013e610a14565b606091505b5050905080610a3657604051632e05b05360e21b815260040160405180910390fd5b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691610a9791906117d5565b6000604051808303816000865af19150503d8060008114610ad4576040519150601f19603f3d011682016040523d82523d6000602084013e610ad9565b606091505b50915091506000828015610b05575081511580610b05575081806020019051810190610b059190611520565b905080610b2557604051632fdb1b7f60e11b815260040160405180910390fd5b505050505050565b80806020019051810190610b4191906117f1565b600355600280546001600160801b0319166001600160801b039290921691909117905550565b600054600160a01b900460ff166104305760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107b2565b610bbf610b67565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060008367ffffffffffffffff811115610c7957610c796112a9565b604051908082528060200260200182016040528015610cb257816020015b610c9f611113565b815260200190600190039081610c975790505b50915060005b84811015610e6e5736868683818110610cd357610cd36114dd565b9050602002810190610ce5919061181f565b90506000806000610cf58461101a565b925092509250878015610d1657506002546001600160801b03908116908316105b15610d345760405163ae64f5e560e01b815260040160405180910390fd5b6040805160a0810190915260009080610d506020880188611503565b61ffff1681526001600160a01b038087166020808401919091526040805191820181526000808352818501929092526060840187905260809093018190526001549251631bb8518b60e31b81529394509291169063ddc28c5890610dba90859030906004016116c6565b6040805180830381865afa158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfa9190611835565b51905089610e09576000610e0d565b6003545b610e179082611851565b610e219089611851565b9750604051806040016040528082815260200183815250898881518110610e4a57610e4a6114dd565b60200260200101819052505050505050508080610e6690611644565b915050610cb8565b50828015610e7b57508034105b15610e995760405163ae64f5e560e01b815260040160405180910390fd5b935093915050565b600054600160a01b900460ff16156104305760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107b2565b610ef6610ea1565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610bef3390565b60015460405163ca5eb5e160e01b81526001600160a01b0383811660048301529091169063ca5eb5e190602401600060405180830381600087803b158015610f7857600080fd5b505af1158015610f8c573d6000803e3d6000fd5b50506040516001600160a01b03841692507fe04946a482d4e81124cf46321be733aca4133ddfc19ce89a6106b4de11d33c8b9150600090a250565b610fd081611094565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fc8e81a4efc849969069ec6aae575cf7a6bc5f9d3abac59f4ed190a6f7e05fc6f90600090a250565b600080606061102b84820185611864565b81019061103891906118ab565b909350915061108c8261105160608701604088016118e4565b60006110636040890160208a0161149d565b6001600160a01b03161461108657611081604088016020890161149d565b6110c7565b336110c7565b929491935050565b6001600160a01b0381163b61041557604051638c50d7cd60e01b81526001600160a01b03821660048201526024016107b2565b6040516060906110fb906003906001906011908290899082906031906002908c906001600160a01b038d1690602001611901565b60405160208183030381529060405290509392505050565b6040518060400160405280600081526020016111626040518060a00160405280600063ffffffff1681526020016000801916815260200160608152602001606081526020016000151581525090565b905290565b60006060828403121561117957600080fd5b50919050565b60008083601f84011261119157600080fd5b50813567ffffffffffffffff8111156111a957600080fd5b6020830191508360208285010111156111c157600080fd5b9250929050565b6001600160a01b038116811461041557600080fd5b600080600080600080600060e0888a0312156111f857600080fd5b6112028989611167565b965060608801359550608088013567ffffffffffffffff8082111561122657600080fd5b6112328b838c0161117f565b909750955060a08a01359150611247826111c8565b90935060c0890135908082111561125d57600080fd5b5061126a8a828b0161117f565b989b979a50959850939692959293505050565b6000806040838503121561129057600080fd5b823561129b816111c8565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156112e2576112e26112a9565b60405290565b6000602082840312156112fa57600080fd5b813567ffffffffffffffff8082111561131257600080fd5b818401915084601f83011261132657600080fd5b813581811115611338576113386112a9565b604051601f8201601f19908116603f01168101908382118183101715611360576113606112a9565b8160405282815287602084870101111561137957600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008083601f8401126113ab57600080fd5b50813567ffffffffffffffff8111156113c357600080fd5b6020830191508360208260051b85010111156111c157600080fd5b600080602083850312156113f157600080fd5b823567ffffffffffffffff81111561140857600080fd5b61141485828601611399565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156114615783516001600160801b03168352928401929184019160010161143c565b50909695505050505050565b63ffffffff8116811461041557600080fd5b6000806040838503121561149257600080fd5b823561129b8161146d565b6000602082840312156114af57600080fd5b81356114ba816111c8565b9392505050565b6000606082840312156114d357600080fd5b6114ba8383611167565b634e487b7160e01b600052603260045260246000fd5b61ffff8116811461041557600080fd5b60006020828403121561151557600080fd5b81356114ba816114f3565b60006020828403121561153257600080fd5b815180151581146114ba57600080fd5b60006020828403121561155457600080fd5b81516114ba816111c8565b60006040828403121561157157600080fd5b6115796112bf565b82516115848161146d565b81526020830151611594816111c8565b60208201529392505050565b805167ffffffffffffffff811681146115b857600080fd5b919050565b6001600160801b038116811461041557600080fd5b600080600080608085870312156115e857600080fd5b6115f1856115a0565b93506020850151611601816114f3565b6040860151909350611612816115bd565b6060860151909250611623816115bd565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b6000600182016116565761165661162e565b5060010190565b60006020828403121561166f57600080fd5b5051919050565b60005b83811015611691578181015183820152602001611679565b50506000910152565b600081518084526116b2816020860160208601611676565b601f01601f19169290920160200192915050565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a060808401526116fc60e084018261169a565b90506060850151603f198483030160a0850152611719828261169a565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b60006040828403121561175157600080fd5b6117596112bf565b9050815181526020820151602082015292915050565b60006080828403121561178157600080fd5b6040516060810181811067ffffffffffffffff821117156117a4576117a46112a9565b604052825181526117b7602084016115a0565b60208201526117c9846040850161173f565b60408201529392505050565b600082516117e7818460208701611676565b9190910192915050565b6000806040838503121561180457600080fd5b825161180f816115bd565b6020939093015192949293505050565b60008235607e198336030181126117e757600080fd5b60006040828403121561184757600080fd5b6114ba838361173f565b808201808211156106f3576106f361162e565b6000808335601e1984360301811261187b57600080fd5b83018035915067ffffffffffffffff82111561189657600080fd5b6020019150368190038213156111c157600080fd5b600080604083850312156118be57600080fd5b82356118c9816111c8565b915060208301356118d9816115bd565b809150509250929050565b6000602082840312156118f657600080fd5b81356114ba816115bd565b6001600160f01b031960f08c811b821683526001600160f81b031960f88d811b82166002860152918c901b909216600384015289811b821660058401526001600160801b031960808a901b16600684015287901b1660168201526000611976601783018760f01b6001600160f01b0319169052565b61198f601983018660f81b6001600160f81b0319169052565b6119a8601a83018560801b6001600160801b0319169052565b50602a810191909152604a01999850505050505050505056fea26469706673582212203cc8fc6b707871e50c7a822a20f4ab3fc7e1aa517981ee9bb56d89042e485c0f64736f6c634300081300330000000000000000000000001a44076050125825900e736c501f859c50fe728c0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000894634481e0d40f55dbae68b4340d2c051db585e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001b5800000000000000000000000000000000000000000000000000000b3a73cfd8d0

Deployed Bytecode

0x6080604052600436106101185760003560e01c80637d25a05e116100a0578063dbbb415511610064578063dbbb41551461032a578063f2fde38b1461034a578063fbacefce1461036a578063fd26f5e01461038a578063ff7bd03d1461039d57600080fd5b80637d25a05e1461027e5780637f42754f146102b75780638456cb59146102d75780638da5cb5b146102ec578063ca5eb5e11461030a57600080fd5b80633f4ba83a116100e75780633f4ba83a146101c45780635c975abb146101d95780635e280f11146102045780636a0b3ad41461023c578063715018a61461026957600080fd5b8063093f0e271461012457806313137d651461016b5780632c16f926146101845780633132bb31146101a457600080fd5b3661011f57005b600080fd5b34801561013057600080fd5b506101587f22ad9585a395edc8067b50da4778cafbb7fa2c4bbd7619fad6aeba403857fd7481565b6040519081526020015b60405180910390f35b6101826101793660046111dd565b50505050505050565b005b34801561019057600080fd5b5061018261019f36600461127d565b6103be565b3480156101b057600080fd5b506101826101bf3660046112e8565b610404565b3480156101d057600080fd5b50610182610418565b3480156101e557600080fd5b50600054600160a01b900460ff165b6040519015158152602001610162565b34801561021057600080fd5b50600154610224906001600160a01b031681565b6040516001600160a01b039091168152602001610162565b34801561024857600080fd5b5061025c6102573660046113de565b610432565b6040516101629190611420565b34801561027557600080fd5b506101826106de565b34801561028a57600080fd5b5061029e61029936600461147f565b6106f0565b60405167ffffffffffffffff9091168152602001610162565b3480156102c357600080fd5b506101586102d23660046113de565b6106f9565b3480156102e357600080fd5b5061018261070f565b3480156102f857600080fd5b506000546001600160a01b0316610224565b34801561031657600080fd5b5061018261032536600461149d565b610727565b34801561033657600080fd5b5061018261034536600461149d565b610738565b34801561035657600080fd5b5061018261036536600461149d565b610749565b34801561037657600080fd5b5061018261038536600461149d565b6107c4565b6101826103983660046113de565b610870565b3480156103a957600080fd5b506101f46103b83660046114c1565b50600190565b6103c661094e565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038316016103f9576103f533826109a8565b5050565b6103f5823383610a3b565b61040c61094e565b61041581610b2d565b50565b61042061094e565b610428610b67565b610430610bb7565b565b60608167ffffffffffffffff81111561044d5761044d6112a9565b604051908082528060200260200182016040528015610476578160200160208202803683370190505b50905060008060008060005b868110156106d35787878281811061049c5761049c6114dd565b90506020020160208101906104b19190611503565b6001546040516319d4335360e21b815261ffff831660048201529196506001600160a01b031690636750cd4c90602401602060405180830381865afa1580156104fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105229190611520565b156106c15760015460405163b96a277f60e01b815230600482015261ffff871660248201526001600160a01b039091169063b96a277f90604401602060405180830381865afa158015610579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059d9190611542565b60405163062060fd60e21b815230600482015261ffff871660248201529094506001600160a01b0385169063188183f4906044016040805180830381865afa1580156105ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610611919061155f565b60200151604051639e94496560e01b815261ffff871660048201529093506001600160a01b03841690639e94496590602401608060405180830381865afa158015610660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068491906115d2565b895190955085935089925084915081106106a0576106a06114dd565b60200260200101906001600160801b031690816001600160801b0316815250505b806106cb81611644565b915050610482565b505050505092915050565b6106e661094e565b6104306000610c0c565b60005b92915050565b600061070783836000610c5c565b949350505050565b61071761094e565b61071f610ea1565b610430610eee565b61072f61094e565b61041581610f31565b61074061094e565b61041581610fc7565b61075161094e565b6001600160a01b0381166107bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61041581610c0c565b6107cc61094e565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed196001600160a01b038216016107fb5761041533476109a8565b6040516370a0823160e01b815230600482015261041590829033906001600160a01b038316906370a0823190602401602060405180830381865afa158015610847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086b919061165d565b610a3b565b610878610ea1565b600061088683836001610c5c565b50905060005b81518110156109485760008282815181106108a9576108a96114dd565b6020908102919091018101516001548151928201516040516302637a4560e41b81529294506001600160a01b0390911692632637a4509290916108f09130906004016116c6565b60806040518083038185885af115801561090e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610933919061176f565b5050808061094090611644565b91505061088c565b50505050565b6000546001600160a01b031633146104305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b2565b604080516000808252602082019092526001600160a01b0384169083906040516109d291906117d5565b60006040518083038185875af1925050503d8060008114610a0f576040519150601f19603f3d011682016040523d82523d6000602084013e610a14565b606091505b5050905080610a3657604051632e05b05360e21b815260040160405180910390fd5b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691610a9791906117d5565b6000604051808303816000865af19150503d8060008114610ad4576040519150601f19603f3d011682016040523d82523d6000602084013e610ad9565b606091505b50915091506000828015610b05575081511580610b05575081806020019051810190610b059190611520565b905080610b2557604051632fdb1b7f60e11b815260040160405180910390fd5b505050505050565b80806020019051810190610b4191906117f1565b600355600280546001600160801b0319166001600160801b039290921691909117905550565b600054600160a01b900460ff166104305760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107b2565b610bbf610b67565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060008367ffffffffffffffff811115610c7957610c796112a9565b604051908082528060200260200182016040528015610cb257816020015b610c9f611113565b815260200190600190039081610c975790505b50915060005b84811015610e6e5736868683818110610cd357610cd36114dd565b9050602002810190610ce5919061181f565b90506000806000610cf58461101a565b925092509250878015610d1657506002546001600160801b03908116908316105b15610d345760405163ae64f5e560e01b815260040160405180910390fd5b6040805160a0810190915260009080610d506020880188611503565b61ffff1681526001600160a01b038087166020808401919091526040805191820181526000808352818501929092526060840187905260809093018190526001549251631bb8518b60e31b81529394509291169063ddc28c5890610dba90859030906004016116c6565b6040805180830381865afa158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfa9190611835565b51905089610e09576000610e0d565b6003545b610e179082611851565b610e219089611851565b9750604051806040016040528082815260200183815250898881518110610e4a57610e4a6114dd565b60200260200101819052505050505050508080610e6690611644565b915050610cb8565b50828015610e7b57508034105b15610e995760405163ae64f5e560e01b815260040160405180910390fd5b935093915050565b600054600160a01b900460ff16156104305760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107b2565b610ef6610ea1565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610bef3390565b60015460405163ca5eb5e160e01b81526001600160a01b0383811660048301529091169063ca5eb5e190602401600060405180830381600087803b158015610f7857600080fd5b505af1158015610f8c573d6000803e3d6000fd5b50506040516001600160a01b03841692507fe04946a482d4e81124cf46321be733aca4133ddfc19ce89a6106b4de11d33c8b9150600090a250565b610fd081611094565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fc8e81a4efc849969069ec6aae575cf7a6bc5f9d3abac59f4ed190a6f7e05fc6f90600090a250565b600080606061102b84820185611864565b81019061103891906118ab565b909350915061108c8261105160608701604088016118e4565b60006110636040890160208a0161149d565b6001600160a01b03161461108657611081604088016020890161149d565b6110c7565b336110c7565b929491935050565b6001600160a01b0381163b61041557604051638c50d7cd60e01b81526001600160a01b03821660048201526024016107b2565b6040516060906110fb906003906001906011908290899082906031906002908c906001600160a01b038d1690602001611901565b60405160208183030381529060405290509392505050565b6040518060400160405280600081526020016111626040518060a00160405280600063ffffffff1681526020016000801916815260200160608152602001606081526020016000151581525090565b905290565b60006060828403121561117957600080fd5b50919050565b60008083601f84011261119157600080fd5b50813567ffffffffffffffff8111156111a957600080fd5b6020830191508360208285010111156111c157600080fd5b9250929050565b6001600160a01b038116811461041557600080fd5b600080600080600080600060e0888a0312156111f857600080fd5b6112028989611167565b965060608801359550608088013567ffffffffffffffff8082111561122657600080fd5b6112328b838c0161117f565b909750955060a08a01359150611247826111c8565b90935060c0890135908082111561125d57600080fd5b5061126a8a828b0161117f565b989b979a50959850939692959293505050565b6000806040838503121561129057600080fd5b823561129b816111c8565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156112e2576112e26112a9565b60405290565b6000602082840312156112fa57600080fd5b813567ffffffffffffffff8082111561131257600080fd5b818401915084601f83011261132657600080fd5b813581811115611338576113386112a9565b604051601f8201601f19908116603f01168101908382118183101715611360576113606112a9565b8160405282815287602084870101111561137957600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008083601f8401126113ab57600080fd5b50813567ffffffffffffffff8111156113c357600080fd5b6020830191508360208260051b85010111156111c157600080fd5b600080602083850312156113f157600080fd5b823567ffffffffffffffff81111561140857600080fd5b61141485828601611399565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156114615783516001600160801b03168352928401929184019160010161143c565b50909695505050505050565b63ffffffff8116811461041557600080fd5b6000806040838503121561149257600080fd5b823561129b8161146d565b6000602082840312156114af57600080fd5b81356114ba816111c8565b9392505050565b6000606082840312156114d357600080fd5b6114ba8383611167565b634e487b7160e01b600052603260045260246000fd5b61ffff8116811461041557600080fd5b60006020828403121561151557600080fd5b81356114ba816114f3565b60006020828403121561153257600080fd5b815180151581146114ba57600080fd5b60006020828403121561155457600080fd5b81516114ba816111c8565b60006040828403121561157157600080fd5b6115796112bf565b82516115848161146d565b81526020830151611594816111c8565b60208201529392505050565b805167ffffffffffffffff811681146115b857600080fd5b919050565b6001600160801b038116811461041557600080fd5b600080600080608085870312156115e857600080fd5b6115f1856115a0565b93506020850151611601816114f3565b6040860151909350611612816115bd565b6060860151909250611623816115bd565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b6000600182016116565761165661162e565b5060010190565b60006020828403121561166f57600080fd5b5051919050565b60005b83811015611691578181015183820152602001611679565b50506000910152565b600081518084526116b2816020860160208601611676565b601f01601f19169290920160200192915050565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a060808401526116fc60e084018261169a565b90506060850151603f198483030160a0850152611719828261169a565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b60006040828403121561175157600080fd5b6117596112bf565b9050815181526020820151602082015292915050565b60006080828403121561178157600080fd5b6040516060810181811067ffffffffffffffff821117156117a4576117a46112a9565b604052825181526117b7602084016115a0565b60208201526117c9846040850161173f565b60408201529392505050565b600082516117e7818460208701611676565b9190910192915050565b6000806040838503121561180457600080fd5b825161180f816115bd565b6020939093015192949293505050565b60008235607e198336030181126117e757600080fd5b60006040828403121561184757600080fd5b6114ba838361173f565b808201808211156106f3576106f361162e565b6000808335601e1984360301811261187b57600080fd5b83018035915067ffffffffffffffff82111561189657600080fd5b6020019150368190038213156111c157600080fd5b600080604083850312156118be57600080fd5b82356118c9816111c8565b915060208301356118d9816115bd565b809150509250929050565b6000602082840312156118f657600080fd5b81356114ba816115bd565b6001600160f01b031960f08c811b821683526001600160f81b031960f88d811b82166002860152918c901b909216600384015289811b821660058401526001600160801b031960808a901b16600684015287901b1660168201526000611976601783018760f01b6001600160f01b0319169052565b61198f601983018660f81b6001600160f81b0319169052565b6119a8601a83018560801b6001600160801b0319169052565b50602a810191909152604a01999850505050505050505056fea26469706673582212203cc8fc6b707871e50c7a822a20f4ab3fc7e1aa517981ee9bb56d89042e485c0f64736f6c63430008130033

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

0000000000000000000000001a44076050125825900e736c501f859c50fe728c0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000894634481e0d40f55dbae68b4340d2c051db585e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001b5800000000000000000000000000000000000000000000000000000b3a73cfd8d0

-----Decoded View---------------
Arg [0] : _endpoint (address): 0x1a44076050125825900e736c501f859c50fE728c
Arg [1] : _validation (bytes): 0x0000000000000000000000000000000000000000000000000000000000001b5800000000000000000000000000000000000000000000000000000b3a73cfd8d0
Arg [2] : _owner (address): 0x894634481E0d40f55dBAe68b4340D2c051Db585E

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000001a44076050125825900e736c501f859c50fe728c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 000000000000000000000000894634481e0d40f55dbae68b4340d2c051db585e
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [4] : 0000000000000000000000000000000000000000000000000000000000001b58
Arg [5] : 00000000000000000000000000000000000000000000000000000b3a73cfd8d0


Block Transaction Gas Used Reward
view all blocks sequenced

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

Validator Index Block Amount
View All Withdrawals

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

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