Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,667 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Xcall | 19798615 | 1 hr ago | IN | 0.00000305 ETH | 0.0020143 | ||||
Xcall | 19797854 | 4 hrs ago | IN | 0.00003252 ETH | 0.00291251 | ||||
Xcall | 19797653 | 5 hrs ago | IN | 0.00000304 ETH | 0.00292378 | ||||
Xcall | 19797607 | 5 hrs ago | IN | 0.00000304 ETH | 0.0023205 | ||||
Xcall | 19797545 | 5 hrs ago | IN | 0.00002031 ETH | 0.00255318 | ||||
Xcall | 19797083 | 6 hrs ago | IN | 0.00002029 ETH | 0.00266334 | ||||
Xcall | 19796979 | 7 hrs ago | IN | 0.00002032 ETH | 0.00237351 | ||||
Xcall | 19796725 | 8 hrs ago | IN | 0.00002033 ETH | 0.00287042 | ||||
Xcall | 19796667 | 8 hrs ago | IN | 0.00000304 ETH | 0.00250501 | ||||
Xcall | 19796078 | 10 hrs ago | IN | 0.00002032 ETH | 0.00188013 | ||||
Xcall | 19796021 | 10 hrs ago | IN | 0.00002032 ETH | 0.00215622 | ||||
Xcall | 19795963 | 10 hrs ago | IN | 0.00002032 ETH | 0.00218844 | ||||
Xcall | 19795862 | 11 hrs ago | IN | 0.00000304 ETH | 0.00247271 | ||||
Xcall | 19795812 | 11 hrs ago | IN | 0.00002032 ETH | 0.00203832 | ||||
Xcall | 19795720 | 11 hrs ago | IN | 0.00002032 ETH | 0.00252987 | ||||
Xcall | 19794740 | 14 hrs ago | IN | 0.0002146 ETH | 0.0018441 | ||||
Xcall | 19794698 | 14 hrs ago | IN | 0.00000492 ETH | 0.00181646 | ||||
Xcall | 19794564 | 15 hrs ago | IN | 0.00003744 ETH | 0.00198385 | ||||
Xcall | 19794561 | 15 hrs ago | IN | 0.00002032 ETH | 0.0017911 | ||||
Xcall | 19794559 | 15 hrs ago | IN | 0.00002032 ETH | 0.00189197 | ||||
Xcall | 19794557 | 15 hrs ago | IN | 0.00002032 ETH | 0.00212059 | ||||
Xcall | 19794551 | 15 hrs ago | IN | 0.00002032 ETH | 0.0020404 | ||||
Xcall | 19794547 | 15 hrs ago | IN | 0.00002032 ETH | 0.00178248 | ||||
Xcall | 19794543 | 15 hrs ago | IN | 0.00002033 ETH | 0.00184296 | ||||
Xcall | 19794092 | 16 hrs ago | IN | 0.00002031 ETH | 0.00196669 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
19798615 | 1 hr ago | 0.00000305 ETH | ||||
19797854 | 4 hrs ago | 0.00003252 ETH | ||||
19797653 | 5 hrs ago | 0.00000304 ETH | ||||
19797607 | 5 hrs ago | 0.00000304 ETH | ||||
19797545 | 5 hrs ago | 0.00002031 ETH | ||||
19797083 | 6 hrs ago | 0.00002029 ETH | ||||
19796979 | 7 hrs ago | 0.00002032 ETH | ||||
19796725 | 8 hrs ago | 0.00002033 ETH | ||||
19796667 | 8 hrs ago | 0.00000304 ETH | ||||
19796078 | 10 hrs ago | 0.00002032 ETH | ||||
19796021 | 10 hrs ago | 0.00002032 ETH | ||||
19795963 | 10 hrs ago | 0.00002032 ETH | ||||
19795862 | 11 hrs ago | 0.00000304 ETH | ||||
19795812 | 11 hrs ago | 0.00002032 ETH | ||||
19795720 | 11 hrs ago | 0.00002032 ETH | ||||
19794740 | 14 hrs ago | 0.0002146 ETH | ||||
19794698 | 14 hrs ago | 0.00000492 ETH | ||||
19794564 | 15 hrs ago | 0.00003744 ETH | ||||
19794561 | 15 hrs ago | 0.00002032 ETH | ||||
19794559 | 15 hrs ago | 0.00002032 ETH | ||||
19794557 | 15 hrs ago | 0.00002032 ETH | ||||
19794551 | 15 hrs ago | 0.00002032 ETH | ||||
19794547 | 15 hrs ago | 0.00002032 ETH | ||||
19794543 | 15 hrs ago | 0.00002033 ETH | ||||
19794092 | 16 hrs ago | 0.00002031 ETH |
Loading...
Loading
Contract Name:
LockboxAdapter
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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 {} }
// 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"); } } }
// 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); }
// 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; }
// 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; }
// 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); }
// 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); }
// 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); }
// 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); } } }
// 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; }
// 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; }
{ "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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.