MATIC Price: $0.54004 (+1.99%)
Gas: 30.9 GWei
 

Overview

Max Total Supply

0

Holders

0

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
PolygonBridge

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : PolygonBridge.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {ILayerZeroEndpoint} from "./interfaces/ILayerZeroEndpoint.sol";
import {ILayerZeroReceiver} from "./interfaces/ILayerZeroReceiver.sol";

/// @dev the bridge contract to deploy on the main-chain where the token is deployed
contract PolygonBridge is Ownable, ILayerZeroReceiver {
    /*///////////////////////////////////////////////////////////////
                            STATE VARIABLES
    //////////////////////////////////////////////////////////////*/
    /// the MCT_TOKEN contract representing the token being bridged.
    IERC20 public constant MCT_TOKEN = IERC20(0x13eFAA3D5E2C86E7ABa168F925FeF9827648Cff4);

    /// the chain ID of the LayerZero chain where this contract is deployed.
    uint16 public constant LZ_CHAIN_ID = 109;

    /// @dev not declared as constant to prevent vendor lock-in
    ILayerZeroEndpoint public endpoint = ILayerZeroEndpoint(0x3c2269811836af69497E5F486A85D7316753cf62);

    /// @dev mapping trusted remote
    mapping(uint16 => bytes) public trustedRemote;

    /// @dev total src chain tx counter
    uint256 public txCounter;

    /// @dev map nonce to processed state to prevent replay attack
    mapping(bytes => mapping(uint16 => mapping(uint64 => bool))) public nonceStatus;

    /// @dev transfer fees per tx
    uint256 public transferFeePercent = 50;

    /*///////////////////////////////////////////////////////////////
                                MODIFIER
    //////////////////////////////////////////////////////////////*/

    /// @dev ensures only the endpoint contract can call the function.
    modifier onlyEndpoint() {
        require(msg.sender == address(endpoint), "bridge/caller-not-endpoint");
        _;
    }

    /*///////////////////////////////////////////////////////////////
                                EVENTS
    //////////////////////////////////////////////////////////////*/

    /// @dev emitted when a bridging operation is initiated.
    event BridgingInitiated(
        uint16 srcChainId, uint16 dstChainId, uint256 srcTxIndex, address indexed receiver, uint256 amount, uint256 fees
    );

    /// @dev emitted when a bridging operation is completed.
    event BridgingCompleted(
        uint16 srcChainId, uint16 dstChainId, uint256 srcTxIndex, address indexed receiver, uint256 amount
    );

    /// @dev emitted when the LayerZero endpoint address is updated.
    event EndpointUpdated(address indexed oldEndpoint, address indexed newEndpoint);

    /// @dev emitted when trusted remote addresses are updated.
    event TrustedRemoteUpdated(uint16 indexed dstChainId, bytes trustedRemote);

    /// @dev emitted when transfer fees are updated.
    event TransferFeeUpdated(uint256 oldFees, uint256 newFees);

    /*///////////////////////////////////////////////////////////////
                                CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/
    constructor() Ownable(msg.sender) {}

    /*///////////////////////////////////////////////////////////////
                            EXTERNAL FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    /// @notice Initiates a cross-chain token transfer.
    /// @param _receiver The recipient's address on the destination chain.
    /// @param _amount The amount of tokens to transfer.
    /// @param _dstChainId The destination chain's ID.
    /// @param _adapterParams Additional adapter parameters.
    function xChainTransfer(address _receiver, uint256 _amount, uint16 _dstChainId, bytes memory _adapterParams)
        external
        payable
    {
        require(trustedRemote[_dstChainId].length > 0, "bridge/invalid-dst-chain-id");
        require(MCT_TOKEN.balanceOf(msg.sender) >= _amount, "bridge/insufficient-balance");
        require(MCT_TOKEN.allowance(msg.sender, address(this)) >= _amount, "bridge/insufficient-allowance");

        uint256 balanceBefore = MCT_TOKEN.balanceOf(address(this));
        MCT_TOKEN.transferFrom(msg.sender, address(this), _amount);
        uint256 balanceAfter = MCT_TOKEN.balanceOf(address(this));

        require(balanceAfter - balanceBefore == _amount, "bridge/transfer-from-failed");

        uint256 fees = (_amount * transferFeePercent) / 10000;
        uint256 finalAmount = _amount - fees;

        if (fees > 0) {
            /// @dev moves to this address (effectively burn it)
            MCT_TOKEN.transfer(0x000000000000000000000000000000000000dEaD, fees);
        }

        ++txCounter;
        endpoint.send{value: msg.value}(
            _dstChainId,
            trustedRemote[_dstChainId],
            abi.encode(_receiver, finalAmount, txCounter),
            payable(msg.sender),
            address(0),
            _adapterParams
        );
        emit BridgingInitiated(LZ_CHAIN_ID, _dstChainId, txCounter, _receiver, finalAmount, fees);
    }

    /*///////////////////////////////////////////////////////////////
                              AUTH FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    /// @notice Updates the LayerZero endpoint contract address.
    /// @param _newEndpoint The new endpoint contract address.
    function updateEndpoint(address _newEndpoint) external onlyOwner {
        address oldEndpoint = address(endpoint);
        endpoint = ILayerZeroEndpoint(_newEndpoint);

        emit EndpointUpdated(oldEndpoint, _newEndpoint);
    }

    /// @notice Sets a trusted remote address for a destination chain.
    /// @param _dstChainId The destination chain's ID.
    /// @param _trustedRemote The trusted remote address.
    function setTrustedRemote(uint16 _dstChainId, bytes memory _trustedRemote) external onlyOwner {
        trustedRemote[_dstChainId] = _trustedRemote;

        emit TrustedRemoteUpdated(_dstChainId, _trustedRemote);
    }

    /// @notice Sets the transfer fee per transaction
    /// @param _transferFeePercent the transfer fee percent (eg: 100% = 10000)
    function setTransferFees(uint256 _transferFeePercent) external onlyOwner {
        uint256 oldFees = transferFeePercent;
        transferFeePercent = _transferFeePercent;

        emit TransferFeeUpdated(oldFees, _transferFeePercent);
    }

    /// @dev generic config for LayerZero user Application
    function setConfig(uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config)
        external
        onlyOwner
    {
        endpoint.setConfig(_version, _chainId, _configType, _config);
    }

    function setSendVersion(uint16 _version) external onlyOwner {
        endpoint.setSendVersion(_version);
    }

    function setReceiveVersion(uint16 _version) external onlyOwner {
        endpoint.setReceiveVersion(_version);
    }

    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external onlyOwner {
        endpoint.forceResumeReceive(_srcChainId, _srcAddress);
    }

    /*///////////////////////////////////////////////////////////////
                        EXTERNAL VIEW FUNCTIONS
    //////////////////////////////////////////////////////////////*/
    function estimateFees(address _receiver, uint256 _amount, uint16 _dstChainId, bytes memory _adapterParams)
        external
        view
        returns (uint256)
    {
        bytes memory message = abi.encode(_receiver, _amount, txCounter);
        (uint256 fees,) = endpoint.estimateFees(_dstChainId, address(this), message, false, _adapterParams);
        return fees;
    }

    /*///////////////////////////////////////////////////////////////
                            INTERNAL FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    /// @notice Handles the reception of tokens on the LayerZero chain.
    /// @param _srcChainId The source chain's ID.
    /// @param _srcAddress The source address on the source chain.
    /// @param _nonce The nonce of the transaction.
    /// @param _payload The payload containing receiver, amount, and transaction ID.
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload)
        external
        onlyEndpoint
    {
        require(trustedRemote[_srcChainId].length > 0, "bridge/invalid-remote-chain");
        require(_srcAddress.length == trustedRemote[_srcChainId].length, "bridge/invalid-src-sender-length");
        require(keccak256(_srcAddress) == keccak256(trustedRemote[_srcChainId]), "bridge/invalid-src-sender");
        require(!nonceStatus[_srcAddress][_srcChainId][_nonce], "bridge/invalid-nonce");

        nonceStatus[_srcAddress][_srcChainId][_nonce] = true;
        (address receiver, uint256 amount, uint256 srcTxId) = abi.decode(_payload, (address, uint256, uint256));
        MCT_TOKEN.transfer(receiver, amount);

        emit BridgingCompleted(_srcChainId, LZ_CHAIN_ID, srcTxId, receiver, amount);
    }
}

File 2 of 6 : Ownable.sol
// 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);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

File 3 of 6 : IERC20.sol
// 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.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

File 4 of 6 : ILayerZeroEndpoint.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}

interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param dstChainId_ - the destination chain identifier
    // @param destination_ - the address on destination chain (in bytes). address length/format may vary by chains
    // @param payload_ - a custom bytes payload to send to the destination contract
    // @param refundAddress_ - if the source transaction is cheaper than the amount of value passed, refund the
    // additional amount to this address
    // @param zroPaymentAddress_ - the address of the ZRO token holder who would pay for the transaction
    // @param adapterParams_ - parameters for custom functionality. e.g. receive airdropped native gas from the relayer
    // on destination
    function send(
        uint16 dstChainId_,
        bytes calldata destination_,
        bytes calldata payload_,
        address payable refundAddress_,
        address zroPaymentAddress_,
        bytes calldata adapterParams_
    ) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param srcChainId_ - the source chain identifier
    // @param srcAddress_ - the source contract (as bytes) at the source chain
    // @param dstAddress_ - the address on destination chain
    // @param nonce_ - the unbound message ordering nonce
    // @param gasLimit_ - the gas limit for external contract execution
    // @param payload_ - verified payload to send to the destination contract
    function receivePayload(
        uint16 srcChainId_,
        bytes calldata srcAddress_,
        address dstAddress_,
        uint64 nonce_,
        uint256 gasLimit_,
        bytes calldata payload_
    ) external;

    // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain
    // @param srcChainId_ - the source chain identifier
    // @param srcAddress_ - the source chain contract address
    function getInboundNonce(uint16 srcChainId_, bytes calldata srcAddress_) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param srcAddress_ - the source chain contract address
    function getOutboundNonce(uint16 dstChainId_, address srcAddress_) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param dstChainId_ - the destination chain identifier
    // @param userApplication_ - the user app address on this EVM chain
    // @param payload_ - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(
        uint16 dstChainId_,
        address userApplication_,
        bytes calldata payload_,
        bool _payInZRO,
        bytes calldata _adapterParam
    ) external view returns (uint256 nativeFee, uint256 zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param srcChainId_ - the source chain identifier
    // @param srcAddress_ - the source chain contract address
    // @param payload_ - the payload to be retried
    function retryPayload(uint16 srcChainId_, bytes calldata srcAddress_, bytes calldata payload_) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param srcChainId_ - the source chain identifier
    // @param srcAddress_ - the source chain contract address
    function hasStoredPayload(uint16 srcChainId_, bytes calldata srcAddress_) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param userApplication_ - the user app address on this EVM chain
    function getSendLibraryAddress(address userApplication_) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param userApplication_ - the user app address on this EVM chain
    function getReceiveLibraryAddress(address userApplication_) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param version_ - messaging library version
    // @param chainId_ - the chainId for the pending config change
    // @param userApplication_ - the contract address of the user application
    // @param configType_ - type of configuration. every messaging library has its own convention.
    function getConfig(uint16 version_, uint16 chainId_, address userApplication_, uint256 configType_)
        external
        view
        returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param userApplication_ - the contract address of the user application
    function getSendVersion(address userApplication_) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param userApplication_ - the contract address of the user application
    function getReceiveVersion(address userApplication_) external view returns (uint16);
}

File 5 of 6 : ILayerZeroReceiver.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.21;

/// @dev is imported from
/// (https://github.com/LayerZero-Labs/LayerZero/blob/main/contracts/interfaces/ILayerZeroReceiver.sol)
interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload)
        external;
}

File 6 of 6 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (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;
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "pigeon/=lib/pigeon/src/",
    "solady/=lib/pigeon/lib/solady/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"srcTxIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BridgingCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"srcTxIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fees","type":"uint256"}],"name":"BridgingInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldEndpoint","type":"address"},{"indexed":true,"internalType":"address","name":"newEndpoint","type":"address"}],"name":"EndpointUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFees","type":"uint256"}],"name":"TransferFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"dstChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"trustedRemote","type":"bytes"}],"name":"TrustedRemoteUpdated","type":"event"},{"inputs":[],"name":"LZ_CHAIN_ID","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCT_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"nonceStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferFeePercent","type":"uint256"}],"name":"setTransferFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemote","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"txCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newEndpoint","type":"address"}],"name":"updateEndpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"xChainTransfer","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600180546001600160a01b031916733c2269811836af69497e5f486a85d7316753cf62179055603260055534801561003b57600080fd5b50338061006257604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61006b81610071565b506100c1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611b38806100d06000396000f3fe60806040526004361061011e5760003560e01c8063935ec990116100a0578063d26ed3e311610064578063d26ed3e31461031f578063e38c68021461033f578063e776ac5e146103a0578063eb8d72b7146103c0578063f2fde38b146103e057600080fd5b8063935ec9901461027457806394544e641461029c578063a7170d48146102b2578063ac447944146102d2578063cbed8b9c146102ff57600080fd5b80635e280f11116100e75780635e280f11146101ea5780636f0e74701461020a578063715018a61461021d57806374f079b8146102325780638da5cb5b1461025657600080fd5b80621d35671461012357806307e0db171461014557806310ddb13714610165578063404311b01461018557806342d65a8d146101ca575b600080fd5b34801561012f57600080fd5b5061014361013e366004611287565b610400565b005b34801561015157600080fd5b5061014361016036600461131b565b6107aa565b34801561017157600080fd5b5061014361018036600461131b565b610817565b34801561019157600080fd5b506101ad7313efaa3d5e2c86e7aba168f925fef9827648cff481565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101d657600080fd5b506101436101e536600461133d565b610853565b3480156101f657600080fd5b506001546101ad906001600160a01b031681565b610143610218366004611448565b6108c6565b34801561022957600080fd5b50610143610e69565b34801561023e57600080fd5b5061024860035481565b6040519081526020016101c1565b34801561026257600080fd5b506000546001600160a01b03166101ad565b34801561028057600080fd5b50610289606d81565b60405161ffff90911681526020016101c1565b3480156102a857600080fd5b5061024860055481565b3480156102be57600080fd5b506101436102cd3660046114b2565b610e7d565b3480156102de57600080fd5b506102f26102ed36600461131b565b610ed7565b6040516101c19190611515565b34801561030b57600080fd5b5061014361031a366004611528565b610f71565b34801561032b57600080fd5b5061014361033a366004611597565b610fea565b34801561034b57600080fd5b5061039061035a3660046115b0565b82516020818501810180516004825292820195820195909520919094528352600091825260408083209093528152205460ff1681565b60405190151581526020016101c1565b3480156103ac57600080fd5b506102486103bb366004611448565b611037565b3480156103cc57600080fd5b506101436103db36600461160e565b6110ee565b3480156103ec57600080fd5b506101436103fb3660046114b2565b611154565b6001546001600160a01b0316331461045f5760405162461bcd60e51b815260206004820152601a60248201527f6272696467652f63616c6c65722d6e6f742d656e64706f696e7400000000000060448201526064015b60405180910390fd5b61ffff86166000908152600260205260408120805461047d9061165c565b9050116104cc5760405162461bcd60e51b815260206004820152601b60248201527f6272696467652f696e76616c69642d72656d6f74652d636861696e00000000006044820152606401610456565b61ffff8616600090815260026020526040902080546104ea9061165c565b8514905061053a5760405162461bcd60e51b815260206004820181905260248201527f6272696467652f696e76616c69642d7372632d73656e6465722d6c656e6774686044820152606401610456565b61ffff861660009081526002602052604090819020905161055b9190611696565b6040518091039020858560405161057392919061170c565b6040518091039020146105c85760405162461bcd60e51b815260206004820152601960248201527f6272696467652f696e76616c69642d7372632d73656e646572000000000000006044820152606401610456565b600485856040516105da92919061170c565b908152604080516020928190038301902061ffff8916600090815290835281812067ffffffffffffffff8716825290925290205460ff16156106555760405162461bcd60e51b81526020600482015260146024820152736272696467652f696e76616c69642d6e6f6e636560601b6044820152606401610456565b60016004868660405161066992919061170c565b908152604080516020928190038301902061ffff8a16600090815290835281812067ffffffffffffffff881682529092528120805460ff19169215159290921790915580806106ba8585018661171c565b60405163a9059cbb60e01b81526001600160a01b03841660048201526024810183905292955090935091507313efaa3d5e2c86e7aba168f925fef9827648cff49063a9059cbb906044016020604051808303816000875af1158015610723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107479190611751565b506040805161ffff8b168152606d6020820152908101829052606081018390526001600160a01b038416907ff540e2fcb9906dcfcfd5aea0f902da16ba5630b30f63f3acf6abe376f9e476a89060800160405180910390a2505050505050505050565b6107b2611192565b6001546040516307e0db1760e01b815261ffff831660048201526001600160a01b03909116906307e0db17906024015b600060405180830381600087803b1580156107fc57600080fd5b505af1158015610810573d6000803e3d6000fd5b5050505050565b61081f611192565b6001546040516310ddb13760e01b815261ffff831660048201526001600160a01b03909116906310ddb137906024016107e2565b61085b611192565b6001546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d9061088f9086908690869060040161179c565b600060405180830381600087803b1580156108a957600080fd5b505af11580156108bd573d6000803e3d6000fd5b50505050505050565b61ffff8216600090815260026020526040812080546108e49061165c565b9050116109335760405162461bcd60e51b815260206004820152601b60248201527f6272696467652f696e76616c69642d6473742d636861696e2d696400000000006044820152606401610456565b6040516370a0823160e01b815233600482015283907313efaa3d5e2c86e7aba168f925fef9827648cff4906370a0823190602401602060405180830381865afa158015610984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a891906117c3565b10156109f65760405162461bcd60e51b815260206004820152601b60248201527f6272696467652f696e73756666696369656e742d62616c616e636500000000006044820152606401610456565b604051636eb1769f60e11b815233600482015230602482015283907313efaa3d5e2c86e7aba168f925fef9827648cff49063dd62ed3e90604401602060405180830381865afa158015610a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7191906117c3565b1015610abf5760405162461bcd60e51b815260206004820152601d60248201527f6272696467652f696e73756666696369656e742d616c6c6f77616e63650000006044820152606401610456565b6040516370a0823160e01b81523060048201526000907313efaa3d5e2c86e7aba168f925fef9827648cff4906370a0823190602401602060405180830381865afa158015610b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3591906117c3565b6040516323b872dd60e01b8152336004820152306024820152604481018690529091507313efaa3d5e2c86e7aba168f925fef9827648cff4906323b872dd906064016020604051808303816000875af1158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba9190611751565b506040516370a0823160e01b81523060048201526000907313efaa3d5e2c86e7aba168f925fef9827648cff4906370a0823190602401602060405180830381865afa158015610c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3191906117c3565b905084610c3e83836117f2565b14610c8b5760405162461bcd60e51b815260206004820152601b60248201527f6272696467652f7472616e736665722d66726f6d2d6661696c656400000000006044820152606401610456565b600061271060055487610c9e919061180b565b610ca89190611822565b90506000610cb682886117f2565b90508115610d3e5760405163a9059cbb60e01b815261dead6004820152602481018390527313efaa3d5e2c86e7aba168f925fef9827648cff49063a9059cbb906044016020604051808303816000875af1158015610d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3c9190611751565b505b600360008154610d4d90611844565b9091555060015461ffff8716600090815260026020908152604080832060035482516001600160a01b038f81169582019590955280840188905260608082019290925283518082039092018252608081019384905262c5803160e81b909352929094169363c5803100933493610dcc938d939233918e9060840161185d565b6000604051808303818588803b158015610de557600080fd5b505af1158015610df9573d6000803e3d6000fd5b505060035460408051606d815261ffff8c166020820152808201929092526060820186905260808201879052516001600160a01b038d1694507fbd36451ab3b0e9fe414dea95544d2a3d68944d949c8af5b4a2bdfa0f269b02f093509081900360a0019150a25050505050505050565b610e71611192565b610e7b60006111bf565b565b610e85611192565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f241827194635b544bceb965d0e124305c0968051403ae83cb99d1ef86bd65f5890600090a35050565b60026020526000908152604090208054610ef09061165c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1c9061165c565b8015610f695780601f10610f3e57610100808354040283529160200191610f69565b820191906000526020600020905b815481529060010190602001808311610f4c57829003601f168201915b505050505081565b610f79611192565b6001546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c90610fb19088908890889088908890600401611942565b600060405180830381600087803b158015610fcb57600080fd5b505af1158015610fdf573d6000803e3d6000fd5b505050505050505050565b610ff2611192565b600580549082905560408051828152602081018490527f940334a9f5c76529ad9447ac490c2073b06d880209383a3d3e4b0ecab72a0d99910160405180910390a15050565b600354604080516001600160a01b03878116602083015281830187905260608083019490945282518083039094018452608082019283905260015463040a7bb160e41b9093526000939284929116906340a7bb10906110a29088903090879087908b9060840161197b565b6040805180830381865afa1580156110be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e291906119cf565b50979650505050505050565b6110f6611192565b61ffff821660009081526002602052604090206111138282611a42565b508161ffff167f35450a645fc8b8dcb5150ad335b4577eb182ab7e57024b8777eed53677a9fc9d826040516111489190611515565b60405180910390a25050565b61115c611192565b6001600160a01b03811661118657604051631e4fbdf760e01b815260006004820152602401610456565b61118f816111bf565b50565b6000546001600160a01b03163314610e7b5760405163118cdaa760e01b8152336004820152602401610456565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803561ffff8116811461122157600080fd5b919050565b60008083601f84011261123857600080fd5b50813567ffffffffffffffff81111561125057600080fd5b60208301915083602082850101111561126857600080fd5b9250929050565b803567ffffffffffffffff8116811461122157600080fd5b600080600080600080608087890312156112a057600080fd5b6112a98761120f565b9550602087013567ffffffffffffffff808211156112c657600080fd5b6112d28a838b01611226565b90975095508591506112e660408a0161126f565b945060608901359150808211156112fc57600080fd5b5061130989828a01611226565b979a9699509497509295939492505050565b60006020828403121561132d57600080fd5b6113368261120f565b9392505050565b60008060006040848603121561135257600080fd5b61135b8461120f565b9250602084013567ffffffffffffffff81111561137757600080fd5b61138386828701611226565b9497909650939450505050565b6001600160a01b038116811461118f57600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f8301126113cc57600080fd5b813567ffffffffffffffff808211156113e7576113e76113a5565b604051601f8301601f19908116603f0116810190828211818310171561140f5761140f6113a5565b8160405283815286602085880101111561142857600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561145e57600080fd5b843561146981611390565b93506020850135925061147e6040860161120f565b9150606085013567ffffffffffffffff81111561149a57600080fd5b6114a6878288016113bb565b91505092959194509250565b6000602082840312156114c457600080fd5b813561133681611390565b6000815180845260005b818110156114f5576020818501810151868301820152016114d9565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061133660208301846114cf565b60008060008060006080868803121561154057600080fd5b6115498661120f565b94506115576020870161120f565b935060408601359250606086013567ffffffffffffffff81111561157a57600080fd5b61158688828901611226565b969995985093965092949392505050565b6000602082840312156115a957600080fd5b5035919050565b6000806000606084860312156115c557600080fd5b833567ffffffffffffffff8111156115dc57600080fd5b6115e8868287016113bb565b9350506115f76020850161120f565b91506116056040850161126f565b90509250925092565b6000806040838503121561162157600080fd5b61162a8361120f565b9150602083013567ffffffffffffffff81111561164657600080fd5b611652858286016113bb565b9150509250929050565b600181811c9082168061167057607f821691505b60208210810361169057634e487b7160e01b600052602260045260246000fd5b50919050565b60008083546116a48161165c565b600182811680156116bc57600181146116d157611700565b60ff1984168752821515830287019450611700565b8760005260208060002060005b858110156116f75781548a8201529084019082016116de565b50505082870194505b50929695505050505050565b8183823760009101908152919050565b60008060006060848603121561173157600080fd5b833561173c81611390565b95602085013595506040909401359392505050565b60006020828403121561176357600080fd5b8151801515811461133657600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff841681526040602082015260006117ba604083018486611773565b95945050505050565b6000602082840312156117d557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611805576118056117dc565b92915050565b8082028115828204841417611805576118056117dc565b60008261183f57634e487b7160e01b600052601260045260246000fd5b500490565b600060018201611856576118566117dc565b5060010190565b61ffff871681526000602060c0818401526000885461187b8161165c565b8060c087015260e060018084166000811461189d57600181146118b7576118e5565b60ff1985168984015283151560051b8901830195506118e5565b8d6000528660002060005b858110156118dd5781548b82018601529083019088016118c2565b8a0184019650505b505050505083810360408501526118fc81896114cf565b91505061191460608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a084015261193581856114cf565b9998505050505050505050565b600061ffff808816835280871660208401525084604083015260806060830152611970608083018486611773565b979650505050505050565b61ffff861681526001600160a01b038516602082015260a0604082018190526000906119a9908301866114cf565b841515606084015282810360808401526119c381856114cf565b98975050505050505050565b600080604083850312156119e257600080fd5b505080516020909101519092909150565b601f821115611a3d57600081815260208120601f850160051c81016020861015611a1a5750805b601f850160051c820191505b81811015611a3957828155600101611a26565b5050505b505050565b815167ffffffffffffffff811115611a5c57611a5c6113a5565b611a7081611a6a845461165c565b846119f3565b602080601f831160018114611aa55760008415611a8d5750858301515b600019600386901b1c1916600185901b178555611a39565b600085815260208120601f198616915b82811015611ad457888601518255948401946001909101908401611ab5565b5085821015611af25787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220cbd124f0768c0b117884e5610b99b7e49d410989bea212cbc849ea50e5dbe13a64736f6c63430008150033

Deployed Bytecode

0x60806040526004361061011e5760003560e01c8063935ec990116100a0578063d26ed3e311610064578063d26ed3e31461031f578063e38c68021461033f578063e776ac5e146103a0578063eb8d72b7146103c0578063f2fde38b146103e057600080fd5b8063935ec9901461027457806394544e641461029c578063a7170d48146102b2578063ac447944146102d2578063cbed8b9c146102ff57600080fd5b80635e280f11116100e75780635e280f11146101ea5780636f0e74701461020a578063715018a61461021d57806374f079b8146102325780638da5cb5b1461025657600080fd5b80621d35671461012357806307e0db171461014557806310ddb13714610165578063404311b01461018557806342d65a8d146101ca575b600080fd5b34801561012f57600080fd5b5061014361013e366004611287565b610400565b005b34801561015157600080fd5b5061014361016036600461131b565b6107aa565b34801561017157600080fd5b5061014361018036600461131b565b610817565b34801561019157600080fd5b506101ad7313efaa3d5e2c86e7aba168f925fef9827648cff481565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101d657600080fd5b506101436101e536600461133d565b610853565b3480156101f657600080fd5b506001546101ad906001600160a01b031681565b610143610218366004611448565b6108c6565b34801561022957600080fd5b50610143610e69565b34801561023e57600080fd5b5061024860035481565b6040519081526020016101c1565b34801561026257600080fd5b506000546001600160a01b03166101ad565b34801561028057600080fd5b50610289606d81565b60405161ffff90911681526020016101c1565b3480156102a857600080fd5b5061024860055481565b3480156102be57600080fd5b506101436102cd3660046114b2565b610e7d565b3480156102de57600080fd5b506102f26102ed36600461131b565b610ed7565b6040516101c19190611515565b34801561030b57600080fd5b5061014361031a366004611528565b610f71565b34801561032b57600080fd5b5061014361033a366004611597565b610fea565b34801561034b57600080fd5b5061039061035a3660046115b0565b82516020818501810180516004825292820195820195909520919094528352600091825260408083209093528152205460ff1681565b60405190151581526020016101c1565b3480156103ac57600080fd5b506102486103bb366004611448565b611037565b3480156103cc57600080fd5b506101436103db36600461160e565b6110ee565b3480156103ec57600080fd5b506101436103fb3660046114b2565b611154565b6001546001600160a01b0316331461045f5760405162461bcd60e51b815260206004820152601a60248201527f6272696467652f63616c6c65722d6e6f742d656e64706f696e7400000000000060448201526064015b60405180910390fd5b61ffff86166000908152600260205260408120805461047d9061165c565b9050116104cc5760405162461bcd60e51b815260206004820152601b60248201527f6272696467652f696e76616c69642d72656d6f74652d636861696e00000000006044820152606401610456565b61ffff8616600090815260026020526040902080546104ea9061165c565b8514905061053a5760405162461bcd60e51b815260206004820181905260248201527f6272696467652f696e76616c69642d7372632d73656e6465722d6c656e6774686044820152606401610456565b61ffff861660009081526002602052604090819020905161055b9190611696565b6040518091039020858560405161057392919061170c565b6040518091039020146105c85760405162461bcd60e51b815260206004820152601960248201527f6272696467652f696e76616c69642d7372632d73656e646572000000000000006044820152606401610456565b600485856040516105da92919061170c565b908152604080516020928190038301902061ffff8916600090815290835281812067ffffffffffffffff8716825290925290205460ff16156106555760405162461bcd60e51b81526020600482015260146024820152736272696467652f696e76616c69642d6e6f6e636560601b6044820152606401610456565b60016004868660405161066992919061170c565b908152604080516020928190038301902061ffff8a16600090815290835281812067ffffffffffffffff881682529092528120805460ff19169215159290921790915580806106ba8585018661171c565b60405163a9059cbb60e01b81526001600160a01b03841660048201526024810183905292955090935091507313efaa3d5e2c86e7aba168f925fef9827648cff49063a9059cbb906044016020604051808303816000875af1158015610723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107479190611751565b506040805161ffff8b168152606d6020820152908101829052606081018390526001600160a01b038416907ff540e2fcb9906dcfcfd5aea0f902da16ba5630b30f63f3acf6abe376f9e476a89060800160405180910390a2505050505050505050565b6107b2611192565b6001546040516307e0db1760e01b815261ffff831660048201526001600160a01b03909116906307e0db17906024015b600060405180830381600087803b1580156107fc57600080fd5b505af1158015610810573d6000803e3d6000fd5b5050505050565b61081f611192565b6001546040516310ddb13760e01b815261ffff831660048201526001600160a01b03909116906310ddb137906024016107e2565b61085b611192565b6001546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d9061088f9086908690869060040161179c565b600060405180830381600087803b1580156108a957600080fd5b505af11580156108bd573d6000803e3d6000fd5b50505050505050565b61ffff8216600090815260026020526040812080546108e49061165c565b9050116109335760405162461bcd60e51b815260206004820152601b60248201527f6272696467652f696e76616c69642d6473742d636861696e2d696400000000006044820152606401610456565b6040516370a0823160e01b815233600482015283907313efaa3d5e2c86e7aba168f925fef9827648cff4906370a0823190602401602060405180830381865afa158015610984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a891906117c3565b10156109f65760405162461bcd60e51b815260206004820152601b60248201527f6272696467652f696e73756666696369656e742d62616c616e636500000000006044820152606401610456565b604051636eb1769f60e11b815233600482015230602482015283907313efaa3d5e2c86e7aba168f925fef9827648cff49063dd62ed3e90604401602060405180830381865afa158015610a4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7191906117c3565b1015610abf5760405162461bcd60e51b815260206004820152601d60248201527f6272696467652f696e73756666696369656e742d616c6c6f77616e63650000006044820152606401610456565b6040516370a0823160e01b81523060048201526000907313efaa3d5e2c86e7aba168f925fef9827648cff4906370a0823190602401602060405180830381865afa158015610b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3591906117c3565b6040516323b872dd60e01b8152336004820152306024820152604481018690529091507313efaa3d5e2c86e7aba168f925fef9827648cff4906323b872dd906064016020604051808303816000875af1158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba9190611751565b506040516370a0823160e01b81523060048201526000907313efaa3d5e2c86e7aba168f925fef9827648cff4906370a0823190602401602060405180830381865afa158015610c0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3191906117c3565b905084610c3e83836117f2565b14610c8b5760405162461bcd60e51b815260206004820152601b60248201527f6272696467652f7472616e736665722d66726f6d2d6661696c656400000000006044820152606401610456565b600061271060055487610c9e919061180b565b610ca89190611822565b90506000610cb682886117f2565b90508115610d3e5760405163a9059cbb60e01b815261dead6004820152602481018390527313efaa3d5e2c86e7aba168f925fef9827648cff49063a9059cbb906044016020604051808303816000875af1158015610d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3c9190611751565b505b600360008154610d4d90611844565b9091555060015461ffff8716600090815260026020908152604080832060035482516001600160a01b038f81169582019590955280840188905260608082019290925283518082039092018252608081019384905262c5803160e81b909352929094169363c5803100933493610dcc938d939233918e9060840161185d565b6000604051808303818588803b158015610de557600080fd5b505af1158015610df9573d6000803e3d6000fd5b505060035460408051606d815261ffff8c166020820152808201929092526060820186905260808201879052516001600160a01b038d1694507fbd36451ab3b0e9fe414dea95544d2a3d68944d949c8af5b4a2bdfa0f269b02f093509081900360a0019150a25050505050505050565b610e71611192565b610e7b60006111bf565b565b610e85611192565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f241827194635b544bceb965d0e124305c0968051403ae83cb99d1ef86bd65f5890600090a35050565b60026020526000908152604090208054610ef09061165c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1c9061165c565b8015610f695780601f10610f3e57610100808354040283529160200191610f69565b820191906000526020600020905b815481529060010190602001808311610f4c57829003601f168201915b505050505081565b610f79611192565b6001546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c90610fb19088908890889088908890600401611942565b600060405180830381600087803b158015610fcb57600080fd5b505af1158015610fdf573d6000803e3d6000fd5b505050505050505050565b610ff2611192565b600580549082905560408051828152602081018490527f940334a9f5c76529ad9447ac490c2073b06d880209383a3d3e4b0ecab72a0d99910160405180910390a15050565b600354604080516001600160a01b03878116602083015281830187905260608083019490945282518083039094018452608082019283905260015463040a7bb160e41b9093526000939284929116906340a7bb10906110a29088903090879087908b9060840161197b565b6040805180830381865afa1580156110be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e291906119cf565b50979650505050505050565b6110f6611192565b61ffff821660009081526002602052604090206111138282611a42565b508161ffff167f35450a645fc8b8dcb5150ad335b4577eb182ab7e57024b8777eed53677a9fc9d826040516111489190611515565b60405180910390a25050565b61115c611192565b6001600160a01b03811661118657604051631e4fbdf760e01b815260006004820152602401610456565b61118f816111bf565b50565b6000546001600160a01b03163314610e7b5760405163118cdaa760e01b8152336004820152602401610456565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803561ffff8116811461122157600080fd5b919050565b60008083601f84011261123857600080fd5b50813567ffffffffffffffff81111561125057600080fd5b60208301915083602082850101111561126857600080fd5b9250929050565b803567ffffffffffffffff8116811461122157600080fd5b600080600080600080608087890312156112a057600080fd5b6112a98761120f565b9550602087013567ffffffffffffffff808211156112c657600080fd5b6112d28a838b01611226565b90975095508591506112e660408a0161126f565b945060608901359150808211156112fc57600080fd5b5061130989828a01611226565b979a9699509497509295939492505050565b60006020828403121561132d57600080fd5b6113368261120f565b9392505050565b60008060006040848603121561135257600080fd5b61135b8461120f565b9250602084013567ffffffffffffffff81111561137757600080fd5b61138386828701611226565b9497909650939450505050565b6001600160a01b038116811461118f57600080fd5b634e487b7160e01b600052604160045260246000fd5b600082601f8301126113cc57600080fd5b813567ffffffffffffffff808211156113e7576113e76113a5565b604051601f8301601f19908116603f0116810190828211818310171561140f5761140f6113a5565b8160405283815286602085880101111561142857600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561145e57600080fd5b843561146981611390565b93506020850135925061147e6040860161120f565b9150606085013567ffffffffffffffff81111561149a57600080fd5b6114a6878288016113bb565b91505092959194509250565b6000602082840312156114c457600080fd5b813561133681611390565b6000815180845260005b818110156114f5576020818501810151868301820152016114d9565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061133660208301846114cf565b60008060008060006080868803121561154057600080fd5b6115498661120f565b94506115576020870161120f565b935060408601359250606086013567ffffffffffffffff81111561157a57600080fd5b61158688828901611226565b969995985093965092949392505050565b6000602082840312156115a957600080fd5b5035919050565b6000806000606084860312156115c557600080fd5b833567ffffffffffffffff8111156115dc57600080fd5b6115e8868287016113bb565b9350506115f76020850161120f565b91506116056040850161126f565b90509250925092565b6000806040838503121561162157600080fd5b61162a8361120f565b9150602083013567ffffffffffffffff81111561164657600080fd5b611652858286016113bb565b9150509250929050565b600181811c9082168061167057607f821691505b60208210810361169057634e487b7160e01b600052602260045260246000fd5b50919050565b60008083546116a48161165c565b600182811680156116bc57600181146116d157611700565b60ff1984168752821515830287019450611700565b8760005260208060002060005b858110156116f75781548a8201529084019082016116de565b50505082870194505b50929695505050505050565b8183823760009101908152919050565b60008060006060848603121561173157600080fd5b833561173c81611390565b95602085013595506040909401359392505050565b60006020828403121561176357600080fd5b8151801515811461133657600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff841681526040602082015260006117ba604083018486611773565b95945050505050565b6000602082840312156117d557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611805576118056117dc565b92915050565b8082028115828204841417611805576118056117dc565b60008261183f57634e487b7160e01b600052601260045260246000fd5b500490565b600060018201611856576118566117dc565b5060010190565b61ffff871681526000602060c0818401526000885461187b8161165c565b8060c087015260e060018084166000811461189d57600181146118b7576118e5565b60ff1985168984015283151560051b8901830195506118e5565b8d6000528660002060005b858110156118dd5781548b82018601529083019088016118c2565b8a0184019650505b505050505083810360408501526118fc81896114cf565b91505061191460608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a084015261193581856114cf565b9998505050505050505050565b600061ffff808816835280871660208401525084604083015260806060830152611970608083018486611773565b979650505050505050565b61ffff861681526001600160a01b038516602082015260a0604082018190526000906119a9908301866114cf565b841515606084015282810360808401526119c381856114cf565b98975050505050505050565b600080604083850312156119e257600080fd5b505080516020909101519092909150565b601f821115611a3d57600081815260208120601f850160051c81016020861015611a1a5750805b601f850160051c820191505b81811015611a3957828155600101611a26565b5050505b505050565b815167ffffffffffffffff811115611a5c57611a5c6113a5565b611a7081611a6a845461165c565b846119f3565b602080601f831160018114611aa55760008415611a8d5750858301515b600019600386901b1c1916600185901b178555611a39565b600085815260208120601f198616915b82811015611ad457888601518255948401946001909101908401611ab5565b5085821015611af25787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220cbd124f0768c0b117884e5610b99b7e49d410989bea212cbc849ea50e5dbe13a64736f6c63430008150033

Loading...
Loading
[ Download: CSV Export  ]

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