ETH Price: $3,138.80 (+0.78%)
Gas: 5 Gwei

Contract

0x45BF3c737e57B059a5855280CA1ADb8e9606AC68
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Xcall197986152024-05-04 18:45:231 hr ago1714848323IN
0x45BF3c73...e9606AC68
0.00000305 ETH0.00201435.52
Xcall197978542024-05-04 16:12:354 hrs ago1714839155IN
0x45BF3c73...e9606AC68
0.00003252 ETH0.002912517.98078827
Xcall197976532024-05-04 15:32:115 hrs ago1714836731IN
0x45BF3c73...e9606AC68
0.00000304 ETH0.002923787.51541552
Xcall197976072024-05-04 15:22:475 hrs ago1714836167IN
0x45BF3c73...e9606AC68
0.00000304 ETH0.00232056.35862078
Xcall197975452024-05-04 15:10:115 hrs ago1714835411IN
0x45BF3c73...e9606AC68
0.00002031 ETH0.002553187
Xcall197970832024-05-04 13:36:476 hrs ago1714829807IN
0x45BF3c73...e9606AC68
0.00002029 ETH0.002663347.22988153
Xcall197969792024-05-04 13:15:477 hrs ago1714828547IN
0x45BF3c73...e9606AC68
0.00002032 ETH0.002373516.50383347
Xcall197967252024-05-04 12:24:358 hrs ago1714825475IN
0x45BF3c73...e9606AC68
0.00002033 ETH0.002870427.86975174
Xcall197966672024-05-04 12:12:598 hrs ago1714824779IN
0x45BF3c73...e9606AC68
0.00000304 ETH0.002505016.90082145
Xcall197960782024-05-04 10:14:3510 hrs ago1714817675IN
0x45BF3c73...e9606AC68
0.00002032 ETH0.001880135.1506682
Xcall197960212024-05-04 10:03:1110 hrs ago1714816991IN
0x45BF3c73...e9606AC68
0.00002032 ETH0.002156225.54042637
Xcall197959632024-05-04 9:51:2310 hrs ago1714816283IN
0x45BF3c73...e9606AC68
0.00002032 ETH0.002188446
Xcall197958622024-05-04 9:31:1111 hrs ago1714815071IN
0x45BF3c73...e9606AC68
0.00000304 ETH0.002472716.36043466
Xcall197958122024-05-04 9:21:1111 hrs ago1714814471IN
0x45BF3c73...e9606AC68
0.00002032 ETH0.002038325.58554838
Xcall197957202024-05-04 9:02:3511 hrs ago1714813355IN
0x45BF3c73...e9606AC68
0.00002032 ETH0.002529876.50363475
Xcall197947402024-05-04 5:45:5914 hrs ago1714801559IN
0x45BF3c73...e9606AC68
0.0002146 ETH0.00184415.05606399
Xcall197946982024-05-04 5:37:3514 hrs ago1714801055IN
0x45BF3c73...e9606AC68
0.00000492 ETH0.001816464.82430998
Xcall197945642024-05-04 5:10:4715 hrs ago1714799447IN
0x45BF3c73...e9606AC68
0.00003744 ETH0.001983855.43920922
Xcall197945612024-05-04 5:10:1115 hrs ago1714799411IN
0x45BF3c73...e9606AC68
0.00002032 ETH0.00179114.90929715
Xcall197945592024-05-04 5:09:4715 hrs ago1714799387IN
0x45BF3c73...e9606AC68
0.00002032 ETH0.001891975.14404822
Xcall197945572024-05-04 5:09:2315 hrs ago1714799363IN
0x45BF3c73...e9606AC68
0.00002032 ETH0.002120595.8110395
Xcall197945512024-05-04 5:08:1115 hrs ago1714799291IN
0x45BF3c73...e9606AC68
0.00002032 ETH0.00204045.5476366
Xcall197945472024-05-04 5:07:1115 hrs ago1714799231IN
0x45BF3c73...e9606AC68
0.00002032 ETH0.001782484.84790275
Xcall197945432024-05-04 5:06:2315 hrs ago1714799183IN
0x45BF3c73...e9606AC68
0.00002033 ETH0.001842965.0041359
Xcall197940922024-05-04 3:34:5916 hrs ago1714793699IN
0x45BF3c73...e9606AC68
0.00002031 ETH0.001966695.39600935
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
197986152024-05-04 18:45:231 hr ago1714848323
0x45BF3c73...e9606AC68
0.00000305 ETH
197978542024-05-04 16:12:354 hrs ago1714839155
0x45BF3c73...e9606AC68
0.00003252 ETH
197976532024-05-04 15:32:115 hrs ago1714836731
0x45BF3c73...e9606AC68
0.00000304 ETH
197976072024-05-04 15:22:475 hrs ago1714836167
0x45BF3c73...e9606AC68
0.00000304 ETH
197975452024-05-04 15:10:115 hrs ago1714835411
0x45BF3c73...e9606AC68
0.00002031 ETH
197970832024-05-04 13:36:476 hrs ago1714829807
0x45BF3c73...e9606AC68
0.00002029 ETH
197969792024-05-04 13:15:477 hrs ago1714828547
0x45BF3c73...e9606AC68
0.00002032 ETH
197967252024-05-04 12:24:358 hrs ago1714825475
0x45BF3c73...e9606AC68
0.00002033 ETH
197966672024-05-04 12:12:598 hrs ago1714824779
0x45BF3c73...e9606AC68
0.00000304 ETH
197960782024-05-04 10:14:3510 hrs ago1714817675
0x45BF3c73...e9606AC68
0.00002032 ETH
197960212024-05-04 10:03:1110 hrs ago1714816991
0x45BF3c73...e9606AC68
0.00002032 ETH
197959632024-05-04 9:51:2310 hrs ago1714816283
0x45BF3c73...e9606AC68
0.00002032 ETH
197958622024-05-04 9:31:1111 hrs ago1714815071
0x45BF3c73...e9606AC68
0.00000304 ETH
197958122024-05-04 9:21:1111 hrs ago1714814471
0x45BF3c73...e9606AC68
0.00002032 ETH
197957202024-05-04 9:02:3511 hrs ago1714813355
0x45BF3c73...e9606AC68
0.00002032 ETH
197947402024-05-04 5:45:5914 hrs ago1714801559
0x45BF3c73...e9606AC68
0.0002146 ETH
197946982024-05-04 5:37:3514 hrs ago1714801055
0x45BF3c73...e9606AC68
0.00000492 ETH
197945642024-05-04 5:10:4715 hrs ago1714799447
0x45BF3c73...e9606AC68
0.00003744 ETH
197945612024-05-04 5:10:1115 hrs ago1714799411
0x45BF3c73...e9606AC68
0.00002032 ETH
197945592024-05-04 5:09:4715 hrs ago1714799387
0x45BF3c73...e9606AC68
0.00002032 ETH
197945572024-05-04 5:09:2315 hrs ago1714799363
0x45BF3c73...e9606AC68
0.00002032 ETH
197945512024-05-04 5:08:1115 hrs ago1714799291
0x45BF3c73...e9606AC68
0.00002032 ETH
197945472024-05-04 5:07:1115 hrs ago1714799231
0x45BF3c73...e9606AC68
0.00002032 ETH
197945432024-05-04 5:06:2315 hrs ago1714799183
0x45BF3c73...e9606AC68
0.00002033 ETH
197940922024-05-04 3:34:5916 hrs ago1714793699
0x45BF3c73...e9606AC68
0.00002031 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LockboxAdapter

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 11 : LockboxAdapter.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IXERC20} from "../shared/IXERC20/IXERC20.sol";
import {IXERC20Lockbox} from "../shared/IXERC20/IXERC20Lockbox.sol";
import {IConnext} from "@connext/interfaces/core/IConnext.sol";
import {IXReceiver} from "@connext/interfaces/core/IXReceiver.sol";

interface IXERC20Registry {
  function getXERC20(address erc20) external view returns (address xerc20);

  function getERC20(address xerc20) external view returns (address erc20);

  function getLockbox(address erc20) external view returns (address xerc20);
}

contract LockboxAdapter is IXReceiver {
  address immutable connext;
  address immutable registry;

  // EVENTS
  event LockBoxWithdrawFailed(bytes _lowLevelData);

  // ERRORS
  error Forwarder__is__not__Adapter(address sender);
  error IXERC20Adapter_WithdrawFailed();
  error NotConnext(address sender);
  error AmountLessThanZero();
  error ValueLessThanAmount(uint256 value, uint256 amount);

  modifier onlyConnext() {
    if (msg.sender != connext) {
      revert NotConnext(msg.sender);
    }
    _;
  }

  constructor(address _connext, address _registry) {
    connext = _connext;
    registry = _registry;
  }

  /// @dev Combines Lockbox deposit and xcall using native asset as relayer fee.
  /// @param _destination The destination domain ID.
  /// @param _to The recipient or contract address on destination.
  /// @param _asset The address of the asset to be sent (ERC20 or native).
  /// @param _delegate The address on destination allowed to update slippage.
  /// @param _amount The amount of asset to bridge.
  /// @param _slippage The maximum slippage a user is willing to take, in BPS.
  /// @param _callData The data that will be sent to the target contract.
  function xcall(
    uint32 _destination,
    address _to,
    address _asset,
    address _delegate,
    uint256 _amount,
    uint256 _slippage,
    bytes calldata _callData
  ) external payable returns (bytes32) {
    if (_amount <= 0) {
      revert AmountLessThanZero();
    }

    address xerc20 = IXERC20Registry(registry).getXERC20(_asset);
    address lockbox = IXERC20Registry(registry).getLockbox(xerc20);
    bool isNative = IXERC20Lockbox(lockbox).IS_NATIVE();

    uint256 _relayerFee;
    if (isNative) {
      if (msg.value < _amount) {
        revert ValueLessThanAmount(msg.value, _amount);
      }

      // Assume the rest of msg.value is the relayer fee
      _relayerFee = msg.value - _amount;
      IXERC20Lockbox(lockbox).depositNative{value: _amount}();
    } else {
      // IERC20(_asset).transferFrom(msg.sender, address(this), _amount);
      SafeERC20.safeTransferFrom(IERC20(_asset), msg.sender, address(this), _amount);
      IERC20(_asset).approve(lockbox, _amount);

      // The entirety of msg.value is the relayer fee
      _relayerFee = msg.value;
      IXERC20Lockbox(lockbox).deposit(_amount);
    }

    IERC20(xerc20).approve(connext, _amount);
    return
      IConnext(connext).xcall{value: _relayerFee}(_destination, _to, xerc20, _delegate, _amount, _slippage, _callData);
  }

  /// @dev Receives xERC20s from Connext and withdraws ERC20 from Lockbox.
  /// @param _amount The amount of funds that will be received.
  /// @param _asset The address of the XERC20 that will be received.
  /// @param _callData The data which should contain the recipient's address.
  function xReceive(
    bytes32 /* _transferId */,
    uint256 _amount,
    address _asset,
    address /* _originSender */,
    uint32 /* _origin */,
    bytes memory _callData
  ) external onlyConnext returns (bytes memory) {
    address recipient = abi.decode(_callData, (address));

    try this.handlexReceive(_amount, _asset, recipient) {} catch (bytes memory _lowLevelData) {
      // This is executed in case revert() was used.
      IERC20(_asset).transfer(recipient, _amount);
      emit LockBoxWithdrawFailed(_lowLevelData);
    }

    return "";
  }

  function handlexReceive(uint256 _amount, address _asset, address _recipient) public {
    if (msg.sender != address(this)) {
      revert Forwarder__is__not__Adapter(msg.sender);
    }
    address lockbox = IXERC20Registry(registry).getLockbox(_asset);
    address erc20 = IXERC20Registry(registry).getERC20(_asset);
    bool isNative = IXERC20Lockbox(lockbox).IS_NATIVE();
    IERC20(_asset).approve(lockbox, _amount);
    IXERC20Lockbox(lockbox).withdraw(_amount);

    if (isNative) {
      (bool _success, ) = payable(_recipient).call{value: _amount}("");
      if (!_success) revert IXERC20Adapter_WithdrawFailed();
    } else {
      SafeERC20.safeTransfer(IERC20(erc20), _recipient, _amount);
    }
  }

  receive() external payable {}
}

File 3 of 11 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 4 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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 amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` 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 amount
    ) external returns (bool);
}

File 5 of 11 : IXERC20.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.4 <0.9.0;

interface IXERC20 {
  /**
   * @notice Emits when a lockbox is set
   *
   * @param _lockbox The address of the lockbox
   */

  event LockboxSet(address _lockbox);

  /**
   * @notice Emits when a limit is set
   *
   * @param _mintingLimit The updated minting limit we are setting to the bridge
   * @param _burningLimit The updated burning limit we are setting to the bridge
   * @param _bridge The address of the bridge we are setting the limit too
   */
  event BridgeLimitsSet(uint256 _mintingLimit, uint256 _burningLimit, address indexed _bridge);

  /**
   * @notice Reverts when a user with too low of a limit tries to call mint/burn
   */

  error IXERC20_NotHighEnoughLimits();

  /**
   * @notice Reverts when caller is not the factory
   */

  error IXERC20_NotFactory();

  struct Bridge {
    BridgeParameters minterParams;
    BridgeParameters burnerParams;
  }

  struct BridgeParameters {
    uint256 timestamp;
    uint256 ratePerSecond;
    uint256 maxLimit;
    uint256 currentLimit;
  }

  /**
   * @notice Sets the lockbox address
   *
   * @param _lockbox The address of the lockbox
   */

  function setLockbox(address _lockbox) external;

  /**
   * @notice Updates the limits of any bridge
   * @dev Can only be called by the owner
   * @param _mintingLimit The updated minting limit we are setting to the bridge
   * @param _burningLimit The updated burning limit we are setting to the bridge
   * @param _bridge The address of the bridge we are setting the limits too
   */
  function setLimits(address _bridge, uint256 _mintingLimit, uint256 _burningLimit) external;

  /**
   * @notice The address of the lockbox contract
   */
  function lockbox() external view returns (address);

  /**
   * @notice Returns the max limit of a minter
   *
   * @param _minter The minter we are viewing the limits of
   *  @return _limit The limit the minter has
   */
  function mintingMaxLimitOf(address _minter) external view returns (uint256 _limit);

  /**
   * @notice Returns the max limit of a bridge
   *
   * @param _bridge the bridge we are viewing the limits of
   * @return _limit The limit the bridge has
   */

  function burningMaxLimitOf(address _bridge) external view returns (uint256 _limit);

  /**
   * @notice Returns the current limit of a minter
   *
   * @param _minter The minter we are viewing the limits of
   * @return _limit The limit the minter has
   */

  function mintingCurrentLimitOf(address _minter) external view returns (uint256 _limit);

  /**
   * @notice Returns the current limit of a bridge
   *
   * @param _bridge the bridge we are viewing the limits of
   * @return _limit The limit the bridge has
   */

  function burningCurrentLimitOf(address _bridge) external view returns (uint256 _limit);

  /**
   * @notice Mints tokens for a user
   * @dev Can only be called by a minter
   * @param _user The address of the user who needs tokens minted
   * @param _amount The amount of tokens being minted
   */

  function mint(address _user, uint256 _amount) external;

  /**
   * @notice Burns tokens for a user
   * @dev Can only be called by a minter
   * @param _user The address of the user who needs tokens burned
   * @param _amount The amount of tokens being burned
   */

  function burn(address _user, uint256 _amount) external;
}

File 6 of 11 : IXERC20Lockbox.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.4 <0.9.0;

interface IXERC20Lockbox {
  /**
   * @notice Emitted when tokens are deposited into the lockbox
   */

  event Deposit(address _sender, uint256 _amount);

  /**
   * @notice Emitted when tokens are withdrawn from the lockbox
   */

  event Withdraw(address _sender, uint256 _amount);

  /**
   * @notice Reverts when a user tries to deposit native tokens on a non-native lockbox
   */

  error IXERC20Lockbox_NotNative();

  /**
   * @notice Reverts when a user tries to deposit non-native tokens on a native lockbox
   */

  error IXERC20Lockbox_Native();

  /**
   * @notice Reverts when a user tries to withdraw and the call fails
   */

  error IXERC20Lockbox_WithdrawFailed();

  /**
   * @notice The XERC20 token of this contract
   */

  function XERC20() external view returns (address);

  /**
   * @notice The ERC20 token of this contract
   */

  function ERC20() external view returns (address);

  /**
   * @notice Whether the ERC20 token is the native gas token of this chain
   */

  function IS_NATIVE() external view returns (bool);

  /**
   * @notice Deposit ERC20 tokens into the lockbox
   *
   * @param _amount The amount of tokens to deposit
   */

  function deposit(uint256 _amount) external;

  /**
   * @notice Deposit native tokens into the lockbox
   */

  function depositNative() external payable;

  /**
   * @notice Deposit ERC20 tokens into the lockbox, and send the XERC20 to a user
   *
   * @param _user The user to send the XERC20 to
   * @param _amount The amount of tokens to deposit
   */

  function depositTo(address _user, uint256 _amount) external;

  /**
   * @notice Deposit the native asset into the lockbox, and send the XERC20 to a user
   *
   * @param _user The user to send the XERC20 to
   */

  function depositNativeTo(address _user) external payable;

  /**
   * @notice Withdraw ERC20 tokens from the lockbox
   *
   * @param _amount The amount of tokens to withdraw
   */

  function withdraw(uint256 _amount) external;

  /**
   * @notice Withdraw ERC20 tokens from the lockbox
   *
   * @param _user The user to withdraw to
   * @param _amount The amount of tokens to withdraw
   */

  function withdrawTo(address _user, uint256 _amount) external;
}

File 7 of 11 : IConnext.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import {ExecuteArgs, TransferInfo, DestinationTransferStatus} from "../libraries/LibConnextStorage.sol";
import {TokenId} from "../libraries/TokenId.sol";

interface IConnext {

  // ============ BRIDGE ==============

  function xcall(
    uint32 _destination,
    address _to,
    address _asset,
    address _delegate,
    uint256 _amount,
    uint256 _slippage,
    bytes calldata _callData
  ) external payable returns (bytes32);

  function xcallIntoLocal(
    uint32 _destination,
    address _to,
    address _asset,
    address _delegate,
    uint256 _amount,
    uint256 _slippage,
    bytes calldata _callData
  ) external payable returns (bytes32);

  function execute(ExecuteArgs calldata _args) external returns (bytes32 transferId);

  function forceUpdateSlippage(TransferInfo calldata _params, uint256 _slippage) external;

  function forceReceiveLocal(TransferInfo calldata _params) external;

  function bumpTransfer(bytes32 _transferId) external payable;

  function routedTransfers(bytes32 _transferId) external view returns (address[] memory);

  function transferStatus(bytes32 _transferId) external view returns (DestinationTransferStatus);

  function remote(uint32 _domain) external view returns (address);

  function domain() external view returns (uint256);

  function nonce() external view returns (uint256);

  function approvedSequencers(address _sequencer) external view returns (bool);

  function xAppConnectionManager() external view returns (address);

  // ============ ROUTERS ==============

  function LIQUIDITY_FEE_NUMERATOR() external view returns (uint256);

  function LIQUIDITY_FEE_DENOMINATOR() external view returns (uint256);

  function getRouterApproval(address _router) external view returns (bool);

  function getRouterRecipient(address _router) external view returns (address);

  function getRouterOwner(address _router) external view returns (address);

  function getProposedRouterOwner(address _router) external view returns (address);

  function getProposedRouterOwnerTimestamp(address _router) external view returns (uint256);

  function maxRoutersPerTransfer() external view returns (uint256);

  function routerBalances(address _router, address _asset) external view returns (uint256);

  function getRouterApprovalForPortal(address _router) external view returns (bool);

  function initializeRouter(address _owner, address _recipient) external;

  function setRouterRecipient(address _router, address _recipient) external;

  function proposeRouterOwner(address _router, address _proposed) external;

  function acceptProposedRouterOwner(address _router) external;

  function addRouterLiquidityFor(
    uint256 _amount,
    address _local,
    address _router
  ) external payable;

  function addRouterLiquidity(uint256 _amount, address _local) external payable;

  function removeRouterLiquidityFor(
    TokenId memory _canonical,
    uint256 _amount,
    address payable _to,
    address _router
  ) external;

  function removeRouterLiquidity(TokenId memory _canonical, uint256 _amount, address payable _to) external;

  // ============ TOKEN_FACET ==============
  function adoptedToCanonical(address _adopted) external view returns (TokenId memory);

  function approvedAssets(TokenId calldata _canonical) external view returns (bool);
}

File 8 of 11 : IXReceiver.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

interface IXReceiver {
  function xReceive(
    bytes32 _transferId,
    uint256 _amount,
    address _asset,
    address _originSender,
    uint32 _origin,
    bytes memory _callData
  ) external returns (bytes memory);
}

File 9 of 11 : draft-IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

File 10 of 11 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 11 of 11 : LibConnextStorage.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

/**
 * @notice Enum representing status of destination transfer
 * @dev Status is only assigned on the destination domain, will always be "none" for the
 * origin domains
 * @return uint - Index of value in enum
 */
enum DestinationTransferStatus {
  None, // 0
  Reconciled, // 1
  Executed, // 2
  Completed // 3 - executed + reconciled
}

/**
 * @notice These are the parameters that will remain constant between the
 * two chains. They are supplied on `xcall` and should be asserted on `execute`
 * @property to - The account that receives funds, in the event of a crosschain call,
 * will receive funds if the call fails.
 *
 * @param originDomain - The originating domain (i.e. where `xcall` is called)
 * @param destinationDomain - The final domain (i.e. where `execute` / `reconcile` are called)\
 * @param canonicalDomain - The canonical domain of the asset you are bridging
 * @param to - The address you are sending funds (and potentially data) to
 * @param delegate - An address who can execute txs on behalf of `to`, in addition to allowing relayers
 * @param receiveLocal - If true, will use the local asset on the destination instead of adopted.
 * @param callData - The data to execute on the receiving chain. If no crosschain call is needed, then leave empty.
 * @param slippage - Slippage user is willing to accept from original amount in expressed in BPS (i.e. if
 * a user takes 1% slippage, this is expressed as 1_000)
 * @param originSender - The msg.sender of the xcall
 * @param bridgedAmt - The amount sent over the bridge (after potential AMM on xcall)
 * @param normalizedIn - The amount sent to `xcall`, normalized to 18 decimals
 * @param nonce - The nonce on the origin domain used to ensure the transferIds are unique
 * @param canonicalId - The unique identifier of the canonical token corresponding to bridge assets
 */
struct TransferInfo {
  uint32 originDomain;
  uint32 destinationDomain;
  uint32 canonicalDomain;
  address to;
  address delegate;
  bool receiveLocal;
  bytes callData;
  uint256 slippage;
  address originSender;
  uint256 bridgedAmt;
  uint256 normalizedIn;
  uint256 nonce;
  bytes32 canonicalId;
}

/**
 * @notice
 * @param params - The TransferInfo. These are consistent across sending and receiving chains.
 * @param routers - The routers who you are sending the funds on behalf of.
 * @param routerSignatures - Signatures belonging to the routers indicating permission to use funds
 * for the signed transfer ID.
 * @param sequencer - The sequencer who assigned the router path to this transfer.
 * @param sequencerSignature - Signature produced by the sequencer for path assignment accountability
 * for the path that was signed.
 */
struct ExecuteArgs {
  TransferInfo params;
  address[] routers;
  bytes[] routerSignatures;
  address sequencer;
  bytes sequencerSignature;
}

File 12 of 11 : TokenId.sol
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity ^0.8.0;

// ============= Structs =============

// Tokens are identified by a TokenId:
// domain - 4 byte chain ID of the chain from which the token originates
// id - 32 byte identifier of the token address on the origin chain, in that chain's address format
struct TokenId {
  uint32 domain;
  bytes32 id;
}

Settings
{
  "remappings": [
    "@defi-wonderland/xerc20/=lib/xerc20/",
    "@0xged/=node_modules/@0xged/",
    "@chainlink/=node_modules/@chainlink/",
    "@connext/=node_modules/@connext/",
    "@ensdomains/=node_modules/@ensdomains/",
    "@eth-optimism/=node_modules/@eth-optimism/",
    "@mean-finance/=node_modules/@mean-finance/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "@rari-capital/=node_modules/@rari-capital/",
    "@uniswap/=node_modules/@uniswap/",
    "base64-sol/=node_modules/base64-sol/",
    "connext-interfaces/=lib/connext-interfaces/",
    "ds-test/=lib/xerc20/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "eth-gas-reporter/=node_modules/eth-gas-reporter/",
    "forge-gas-snapshot/=lib/xerc20/lib/permit2/lib/forge-gas-snapshot/src/",
    "forge-std/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/",
    "hardhat-deploy/=node_modules/hardhat-deploy/",
    "hardhat/=node_modules/hardhat/",
    "isolmate/=lib/xerc20/lib/isolmate/src/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/xerc20/lib/openzeppelin-contracts/",
    "openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "permit2/=lib/xerc20/lib/permit2/",
    "prb-test/=lib/xerc20/lib/prb-test/src/",
    "prb/test/=lib/xerc20/lib/prb-test/src/",
    "solmate/=lib/xerc20/lib/permit2/lib/solmate/",
    "xerc20/=lib/xerc20/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_connext","type":"address"},{"internalType":"address","name":"_registry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountLessThanZero","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"Forwarder__is__not__Adapter","type":"error"},{"inputs":[],"name":"IXERC20Adapter_WithdrawFailed","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"NotConnext","type":"error"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ValueLessThanAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"_lowLevelData","type":"bytes"}],"name":"LockBoxWithdrawFailed","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"handlexReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"bytes","name":"_callData","type":"bytes"}],"name":"xReceive","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_destination","type":"uint32"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_delegate","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_slippage","type":"uint256"},{"internalType":"bytes","name":"_callData","type":"bytes"}],"name":"xcall","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c03461009557601f610ebe38819003918201601f19168301916001600160401b0383118484101761009a57808492604094855283398101031261009557610052602061004b836100b0565b92016100b0565b9060805260a052604051610df990816100c5823960805181818160e7015281816104ab015261059a015260a051818181610376015281816103d301526108b90152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100955756fe608080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c908163479d955714610867575080638aac16ba146102c45763fd614f410361000f57346102c15760c03660031901126102c157602490813590610066610b15565b61006e610b2b565b5060843563ffffffff8116036102bc5760a43567ffffffffffffffff918282116102b857366023830112156102b8578160040135946100ac86610b77565b926100ba6040519485610b55565b86845260209687850191368a83830101116102b4578188928b8b93018537860101526001600160a01b03937f00000000000000000000000000000000000000000000000000000000000000008516330361029d57808891518101031261029957519280841680940361029957303b15610299579086916040519363479d955760e01b85528260048601521692838982015284604482015286808260648183305af1918261027e575b5050610275576101ac92610174610c0a565b60405163a9059cbb60e01b81526001600160a01b03909616600487015260248601929092529093928391908290889082906044820190565b03925af1801561026a57916101f5917fc800e8ca4bda8128731e0444109da53d19286048d068614656da8edcfc0f1d489361023d575b5060405191829187835287830190610b93565b0390a15b604051938385019182118583101761022957506040528252610225604051928284938452830190610b93565b0390f35b634e487b7160e01b60009081526041600452fd5b61025c90873d8911610263575b6102548183610b55565b810190610bf2565b50386101e2565b503d61024a565b6040513d86823e3d90fd5b505050506101f9565b61028b9192939450610b41565b610299579086918638610162565b8580fd5b60405163241314cd60e01b81523360048201528990fd5b8780fd5b8380fd5b600080fd5b80fd5b5060e03660031901126102c15760043563ffffffff811681036102bc576102e9610aff565b6102f1610b15565b916102fa610b2b565b9267ffffffffffffffff60c435116108635736602360c4350112156108635767ffffffffffffffff60c43560040135116108635736602460c4356004013560c43501011161086357608435156108515760405163476a536360e11b81526001600160a01b038281166004830152909490602090869060249082907f0000000000000000000000000000000000000000000000000000000000000000165afa948515610846578695610825575b5060405163eec9567960e01b81526001600160a01b038681166004830152909290602090849060249082907f0000000000000000000000000000000000000000000000000000000000000000165afa92831561063f5787936107f4575b506040516323ce9cbb60e11b81526020816004816001600160a01b0388165afa9081156107e95788916107ca575b50156106925750608435341061067257608435340334811161065e579186906001600160a01b0381163b1561060b57604051636db5a92360e11b815290829082906004908290608435906001600160a01b03165af180156106175761064a575b50505b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152608435602482015294602086806044810103818a6001600160a01b0386165af194851561063f5763ffffffff96602096610622575b506040519687956345560b5d60e11b875216600486015260018060a01b0316602485015260018060a01b0316604484015260018060a01b03166064830152608435608483015260a43560a483015260e060c483015260c4356004013560e48301528161010460c43560040135602460c4350182840137600460c43501358281018201889052601f01601f1916820182900301917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156106175782916105dd575b602082604051908152f35b90506020813d60201161060f575b816105f860209383610b55565b8101031261060b576020915051386105d2565b5080fd5b3d91506105eb565b6040513d84823e3d90fd5b61063890873d8911610263576102548183610b55565b5038610505565b6040513d89823e3d90fd5b61065390610b41565b610299578538610491565b634e487b7160e01b87526011600452602487fd5b604051635bc10dc760e01b81523460048201526084356024820152604490fd5b6040516323b872dd60e01b60208201523360248201523060448201526084356064820152606481528060a081011067ffffffffffffffff60a0830111176107b45760a081016040526106ed906001600160a01b038316610c3a565b60405163095ea7b360e01b81526001600160a01b03848116600483015260843560248301529091602091839160449183918c91165af1801561063f57610795575b50349186906001600160a01b0381163b1561060b5760405163b6b55f2560e01b815260843560048201529082908290602490829084906001600160a01b03165af1801561061757610781575b5050610494565b61078a90610b41565b61029957853861077a565b6107ad9060203d602011610263576102548183610b55565b503861072e565b634e487b7160e01b600052604160045260246000fd5b6107e3915060203d602011610263576102548183610b55565b38610431565b6040513d8a823e3d90fd5b61081791935060203d60201161081e575b61080f8183610b55565b810190610bd3565b9138610403565b503d610805565b61083f91955060203d60201161081e5761080f8183610b55565b93386103a6565b6040513d88823e3d90fd5b60405163820bf1e560e01b8152600490fd5b8480fd5b82346102c15760603660031901126102c157600435610884610aff565b61088c610b15565b303303610aea5760405163eec9567960e01b81526001600160a01b039283166004820181905294955085947f00000000000000000000000000000000000000000000000000000000000000008416916020918282602481875afa9182156107e95760249484918a94610acb575b5060405195868092634e0dc55760e01b82528560048301525afa9384156107e9578894610aac575b506040516323ce9cbb60e11b815290828716908483600481855afa928315610aa15785918a918c95610a7e575b5060405163095ea7b360e01b81526001600160a01b0390961660048701526024860191909152929391928290818c81604481015b03925af18015610a7357610a56575b50803b156102b45787906024604051809b8193632e1a7d4d60e01b83528b60048401525af1801561063f57610a42575b8697506000146109f9575050839283928392165af16109de610c0a565b50156109e75780f35b60405163250c731360e11b8152600490fd5b60405163a9059cbb60e01b918101919091526001600160a01b03929092166024830152604480830194909452928152610a3f935091610a39606484610b55565b16610c3a565b80f35b959096610a4e90610b41565b9486906109c1565b610a6c90843d8611610263576102548183610b55565b5089610991565b6040513d8b823e3d90fd5b610982949550610a9a90843d8611610263576102548183610b55565b949361094e565b6040513d8c823e3d90fd5b610ac4919450833d851161081e5761080f8183610b55565b9289610921565b610ae3919450823d841161081e5761080f8183610b55565b928b6108f9565b630173cb6760e51b8552336004860152602485fd5b602435906001600160a01b03821682036102bc57565b604435906001600160a01b03821682036102bc57565b606435906001600160a01b03821682036102bc57565b67ffffffffffffffff81116107b457604052565b90601f8019910116810190811067ffffffffffffffff8211176107b457604052565b67ffffffffffffffff81116107b457601f01601f191660200190565b919082519283825260005b848110610bbf575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610b9e565b908160209103126102bc57516001600160a01b03811681036102bc5790565b908160209103126102bc575180151581036102bc5790565b3d15610c35573d90610c1b82610b77565b91610c296040519384610b55565b82523d6000602084013e565b606090565b60408051908101916001600160a01b031667ffffffffffffffff8311828410176107b457610caa926040526000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af1610ca4610c0a565b91610d26565b80519081610cb757505050565b8280610cc7938301019101610bf2565b15610ccf5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b91929015610d885750815115610d3a575090565b3b15610d435790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610d9b5750805190602001fd5b60405162461bcd60e51b815260206004820152908190610dbf906024830190610b93565b0390fdfea26469706673582212202b1b9516411eb8de83068e58191f07b143e93f75a5cb7ff9fb5c87c7b34fcad864736f6c634300081400330000000000000000000000008898b472c54c31894e3b9bb83cea802a5d0e63c6000000000000000000000000bf29a2d67efb6766e44c163b19c6f4118b164702

Deployed Bytecode

0x608080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c908163479d955714610867575080638aac16ba146102c45763fd614f410361000f57346102c15760c03660031901126102c157602490813590610066610b15565b61006e610b2b565b5060843563ffffffff8116036102bc5760a43567ffffffffffffffff918282116102b857366023830112156102b8578160040135946100ac86610b77565b926100ba6040519485610b55565b86845260209687850191368a83830101116102b4578188928b8b93018537860101526001600160a01b03937f0000000000000000000000008898b472c54c31894e3b9bb83cea802a5d0e63c68516330361029d57808891518101031261029957519280841680940361029957303b15610299579086916040519363479d955760e01b85528260048601521692838982015284604482015286808260648183305af1918261027e575b5050610275576101ac92610174610c0a565b60405163a9059cbb60e01b81526001600160a01b03909616600487015260248601929092529093928391908290889082906044820190565b03925af1801561026a57916101f5917fc800e8ca4bda8128731e0444109da53d19286048d068614656da8edcfc0f1d489361023d575b5060405191829187835287830190610b93565b0390a15b604051938385019182118583101761022957506040528252610225604051928284938452830190610b93565b0390f35b634e487b7160e01b60009081526041600452fd5b61025c90873d8911610263575b6102548183610b55565b810190610bf2565b50386101e2565b503d61024a565b6040513d86823e3d90fd5b505050506101f9565b61028b9192939450610b41565b610299579086918638610162565b8580fd5b60405163241314cd60e01b81523360048201528990fd5b8780fd5b8380fd5b600080fd5b80fd5b5060e03660031901126102c15760043563ffffffff811681036102bc576102e9610aff565b6102f1610b15565b916102fa610b2b565b9267ffffffffffffffff60c435116108635736602360c4350112156108635767ffffffffffffffff60c43560040135116108635736602460c4356004013560c43501011161086357608435156108515760405163476a536360e11b81526001600160a01b038281166004830152909490602090869060249082907f000000000000000000000000bf29a2d67efb6766e44c163b19c6f4118b164702165afa948515610846578695610825575b5060405163eec9567960e01b81526001600160a01b038681166004830152909290602090849060249082907f000000000000000000000000bf29a2d67efb6766e44c163b19c6f4118b164702165afa92831561063f5787936107f4575b506040516323ce9cbb60e11b81526020816004816001600160a01b0388165afa9081156107e95788916107ca575b50156106925750608435341061067257608435340334811161065e579186906001600160a01b0381163b1561060b57604051636db5a92360e11b815290829082906004908290608435906001600160a01b03165af180156106175761064a575b50505b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000008898b472c54c31894e3b9bb83cea802a5d0e63c6166004820152608435602482015294602086806044810103818a6001600160a01b0386165af194851561063f5763ffffffff96602096610622575b506040519687956345560b5d60e11b875216600486015260018060a01b0316602485015260018060a01b0316604484015260018060a01b03166064830152608435608483015260a43560a483015260e060c483015260c4356004013560e48301528161010460c43560040135602460c4350182840137600460c43501358281018201889052601f01601f1916820182900301917f0000000000000000000000008898b472c54c31894e3b9bb83cea802a5d0e63c66001600160a01b03165af19081156106175782916105dd575b602082604051908152f35b90506020813d60201161060f575b816105f860209383610b55565b8101031261060b576020915051386105d2565b5080fd5b3d91506105eb565b6040513d84823e3d90fd5b61063890873d8911610263576102548183610b55565b5038610505565b6040513d89823e3d90fd5b61065390610b41565b610299578538610491565b634e487b7160e01b87526011600452602487fd5b604051635bc10dc760e01b81523460048201526084356024820152604490fd5b6040516323b872dd60e01b60208201523360248201523060448201526084356064820152606481528060a081011067ffffffffffffffff60a0830111176107b45760a081016040526106ed906001600160a01b038316610c3a565b60405163095ea7b360e01b81526001600160a01b03848116600483015260843560248301529091602091839160449183918c91165af1801561063f57610795575b50349186906001600160a01b0381163b1561060b5760405163b6b55f2560e01b815260843560048201529082908290602490829084906001600160a01b03165af1801561061757610781575b5050610494565b61078a90610b41565b61029957853861077a565b6107ad9060203d602011610263576102548183610b55565b503861072e565b634e487b7160e01b600052604160045260246000fd5b6107e3915060203d602011610263576102548183610b55565b38610431565b6040513d8a823e3d90fd5b61081791935060203d60201161081e575b61080f8183610b55565b810190610bd3565b9138610403565b503d610805565b61083f91955060203d60201161081e5761080f8183610b55565b93386103a6565b6040513d88823e3d90fd5b60405163820bf1e560e01b8152600490fd5b8480fd5b82346102c15760603660031901126102c157600435610884610aff565b61088c610b15565b303303610aea5760405163eec9567960e01b81526001600160a01b039283166004820181905294955085947f000000000000000000000000bf29a2d67efb6766e44c163b19c6f4118b1647028416916020918282602481875afa9182156107e95760249484918a94610acb575b5060405195868092634e0dc55760e01b82528560048301525afa9384156107e9578894610aac575b506040516323ce9cbb60e11b815290828716908483600481855afa928315610aa15785918a918c95610a7e575b5060405163095ea7b360e01b81526001600160a01b0390961660048701526024860191909152929391928290818c81604481015b03925af18015610a7357610a56575b50803b156102b45787906024604051809b8193632e1a7d4d60e01b83528b60048401525af1801561063f57610a42575b8697506000146109f9575050839283928392165af16109de610c0a565b50156109e75780f35b60405163250c731360e11b8152600490fd5b60405163a9059cbb60e01b918101919091526001600160a01b03929092166024830152604480830194909452928152610a3f935091610a39606484610b55565b16610c3a565b80f35b959096610a4e90610b41565b9486906109c1565b610a6c90843d8611610263576102548183610b55565b5089610991565b6040513d8b823e3d90fd5b610982949550610a9a90843d8611610263576102548183610b55565b949361094e565b6040513d8c823e3d90fd5b610ac4919450833d851161081e5761080f8183610b55565b9289610921565b610ae3919450823d841161081e5761080f8183610b55565b928b6108f9565b630173cb6760e51b8552336004860152602485fd5b602435906001600160a01b03821682036102bc57565b604435906001600160a01b03821682036102bc57565b606435906001600160a01b03821682036102bc57565b67ffffffffffffffff81116107b457604052565b90601f8019910116810190811067ffffffffffffffff8211176107b457604052565b67ffffffffffffffff81116107b457601f01601f191660200190565b919082519283825260005b848110610bbf575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610b9e565b908160209103126102bc57516001600160a01b03811681036102bc5790565b908160209103126102bc575180151581036102bc5790565b3d15610c35573d90610c1b82610b77565b91610c296040519384610b55565b82523d6000602084013e565b606090565b60408051908101916001600160a01b031667ffffffffffffffff8311828410176107b457610caa926040526000806020958685527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656487860152868151910182855af1610ca4610c0a565b91610d26565b80519081610cb757505050565b8280610cc7938301019101610bf2565b15610ccf5750565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b91929015610d885750815115610d3a575090565b3b15610d435790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610d9b5750805190602001fd5b60405162461bcd60e51b815260206004820152908190610dbf906024830190610b93565b0390fdfea26469706673582212202b1b9516411eb8de83068e58191f07b143e93f75a5cb7ff9fb5c87c7b34fcad864736f6c63430008140033

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

0000000000000000000000008898b472c54c31894e3b9bb83cea802a5d0e63c6000000000000000000000000bf29a2d67efb6766e44c163b19c6f4118b164702

-----Decoded View---------------
Arg [0] : _connext (address): 0x8898B472C54c31894e3B9bb83cEA802a5d0e63C6
Arg [1] : _registry (address): 0xBf29A2D67eFb6766E44c163B19C6F4118b164702

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008898b472c54c31894e3b9bb83cea802a5d0e63c6
Arg [1] : 000000000000000000000000bf29a2d67efb6766e44c163b19c6f4118b164702


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.