Overview
MNT Balance
MNT Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Initialize | 22753046 | 879 days ago | IN | 0 MNT | 0.29358133 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-FileCopyrightText: 2022 Lido <[email protected]> // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.10; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {IL1ERC20Bridge} from "./interfaces/IL1ERC20Bridge.sol"; import {IL2ERC20Bridge} from "./interfaces/IL2ERC20Bridge.sol"; import {IERC20Bridged} from "../token/interfaces/IERC20Bridged.sol"; import {BridgingManager} from "../BridgingManager.sol"; import {BridgeableTokens} from "../BridgeableTokens.sol"; import {CrossDomainEnabled} from "./CrossDomainEnabled.sol"; /// @author psirex /// @notice The L2 token bridge works with the L1 token bridge to enable ERC20 token bridging /// between L1 and L2. It acts as a minter for new tokens when it hears about /// deposits into the L1 token bridge. It also acts as a burner of the tokens /// intended for withdrawal, informing the L1 bridge to release L1 funds. Additionally, adds /// the methods for bridging management: enabling and disabling withdrawals/deposits contract L2ERC20TokenBridge is IL2ERC20Bridge, BridgingManager, BridgeableTokens, CrossDomainEnabled { /// @inheritdoc IL2ERC20Bridge address public immutable l1TokenBridge; /// @param messenger_ L2 messenger address being used for cross-chain communications /// @param l1TokenBridge_ Address of the corresponding L1 bridge /// @param l1Token_ Address of the bridged token in the L1 chain /// @param l2Token_ Address of the token minted on the L2 chain when token bridged constructor( address messenger_, address l1TokenBridge_, address l1Token_, address l2Token_ ) CrossDomainEnabled(messenger_) BridgeableTokens(l1Token_, l2Token_) { l1TokenBridge = l1TokenBridge_; } /// @inheritdoc IL2ERC20Bridge function withdraw( address l2Token_, uint256 amount_, uint32 l1Gas_, bytes calldata data_ ) external whenWithdrawalsEnabled onlySupportedL2Token(l2Token_) { if (Address.isContract(msg.sender)) { revert ErrorSenderNotEOA(); } _initiateWithdrawal(msg.sender, msg.sender, amount_, l1Gas_, data_); } /// @inheritdoc IL2ERC20Bridge function withdrawTo( address l2Token_, address to_, uint256 amount_, uint32 l1Gas_, bytes calldata data_ ) external whenWithdrawalsEnabled onlySupportedL2Token(l2Token_) { _initiateWithdrawal(msg.sender, to_, amount_, l1Gas_, data_); } /// @inheritdoc IL2ERC20Bridge function finalizeDeposit( address l1Token_, address l2Token_, address from_, address to_, uint256 amount_, bytes calldata data_ ) external whenDepositsEnabled onlySupportedL1Token(l1Token_) onlySupportedL2Token(l2Token_) onlyFromCrossDomainAccount(l1TokenBridge) { IERC20Bridged(l2Token_).bridgeMint(to_, amount_); emit DepositFinalized(l1Token_, l2Token_, from_, to_, amount_, data_); } /// @notice Performs the logic for withdrawals by burning the token and informing /// the L1 token Gateway of the withdrawal /// @param from_ Account to pull the withdrawal from on L2 /// @param to_ Account to give the withdrawal to on L1 /// @param amount_ Amount of the token to withdraw /// @param l1Gas_ Unused, but included for potential forward compatibility considerations /// @param data_ Optional data to forward to L1. This data is provided /// solely as a convenience for external contracts. Aside from enforcing a maximum /// length, these contracts provide no guarantees about its content function _initiateWithdrawal( address from_, address to_, uint256 amount_, uint32 l1Gas_, bytes calldata data_ ) internal { IERC20Bridged(l2Token).bridgeBurn(from_, amount_); bytes memory message = abi.encodeWithSelector( IL1ERC20Bridge.finalizeERC20Withdrawal.selector, l1Token, l2Token, from_, to_, amount_, data_ ); sendCrossDomainMessage(l1TokenBridge, l1Gas_, message); emit WithdrawalInitiated(l1Token, l2Token, from_, to_, amount_, data_); } error ErrorSenderNotEOA(); }
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.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 functionCall(target, data, "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");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(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) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(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) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason 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 {
// 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
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-FileCopyrightText: 2022 Lido <[email protected]> // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.10; /// @notice The L1 Standard bridge locks bridged tokens on the L1 side, sends deposit messages /// on the L2 side, and finalizes token withdrawals from L2. interface IL1ERC20Bridge { event ERC20DepositInitiated( address indexed _l1Token, address indexed _l2Token, address indexed _from, address _to, uint256 _amount, bytes _data ); event ERC20WithdrawalFinalized( address indexed _l1Token, address indexed _l2Token, address indexed _from, address _to, uint256 _amount, bytes _data ); /// @notice get the address of the corresponding L2 bridge contract. /// @return Address of the corresponding L2 bridge contract. function l2TokenBridge() external returns (address); /// @notice deposit an amount of the ERC20 to the caller's balance on L2. /// @param l1Token_ Address of the L1 ERC20 we are depositing /// @param l2Token_ Address of the L1 respective L2 ERC20 /// @param amount_ Amount of the ERC20 to deposit /// @param l2Gas_ Gas limit required to complete the deposit on L2. /// @param data_ Optional data to forward to L2. This data is provided /// solely as a convenience for external contracts. Aside from enforcing a maximum /// length, these contracts provide no guarantees about its content. function depositERC20( address l1Token_, address l2Token_, uint256 amount_, uint32 l2Gas_, bytes calldata data_ ) external; /// @notice deposit an amount of ERC20 to a recipient's balance on L2. /// @param l1Token_ Address of the L1 ERC20 we are depositing /// @param l2Token_ Address of the L1 respective L2 ERC20 /// @param to_ L2 address to credit the withdrawal to. /// @param amount_ Amount of the ERC20 to deposit. /// @param l2Gas_ Gas limit required to complete the deposit on L2. /// @param data_ Optional data to forward to L2. This data is provided /// solely as a convenience for external contracts. Aside from enforcing a maximum /// length, these contracts provide no guarantees about its content. function depositERC20To( address l1Token_, address l2Token_, address to_, uint256 amount_, uint32 l2Gas_, bytes calldata data_ ) external; /// @notice Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the /// L1 ERC20 token. /// @dev This call will fail if the initialized withdrawal from L2 has not been finalized. /// @param l1Token_ Address of L1 token to finalizeWithdrawal for. /// @param l2Token_ Address of L2 token where withdrawal was initiated. /// @param from_ L2 address initiating the transfer. /// @param to_ L1 address to credit the withdrawal to. /// @param amount_ Amount of the ERC20 to deposit. /// @param data_ Data provided by the sender on L2. This data is provided /// solely as a convenience for external contracts. Aside from enforcing a maximum /// length, these contracts provide no guarantees about its content. function finalizeERC20Withdrawal( address l1Token_, address l2Token_, address from_, address to_, uint256 amount_, bytes calldata data_ ) external; }
// SPDX-FileCopyrightText: 2022 Lido <[email protected]> // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.10; /// @notice The L2 token bridge works with the L1 token bridge to enable ERC20 token bridging /// between L1 and L2. It acts as a minter for new tokens when it hears about /// deposits into the L1 token bridge. It also acts as a burner of the tokens /// intended for withdrawal, informing the L1 bridge to release L1 funds. interface IL2ERC20Bridge { event WithdrawalInitiated( address indexed _l1Token, address indexed _l2Token, address indexed _from, address _to, uint256 _amount, bytes _data ); event DepositFinalized( address indexed _l1Token, address indexed _l2Token, address indexed _from, address _to, uint256 _amount, bytes _data ); event DepositFailed( address indexed _l1Token, address indexed _l2Token, address indexed _from, address _to, uint256 _amount, bytes _data ); /// @notice Returns the address of the corresponding L1 bridge contract function l1TokenBridge() external returns (address); /// @notice Initiates a withdraw of some tokens to the caller's account on L1 /// @param l2Token_ Address of L2 token where withdrawal was initiated. /// @param amount_ Amount of the token to withdraw. /// @param l1Gas_ Unused, but included for potential forward compatibility considerations. /// @param data_ Optional data to forward to L1. This data is provided /// solely as a convenience for external contracts. Aside from enforcing a maximum /// length, these contracts provide no guarantees about its content. function withdraw( address l2Token_, uint256 amount_, uint32 l1Gas_, bytes calldata data_ ) external; /// @notice Initiates a withdraw of some token to a recipient's account on L1. /// @param l2Token_ Address of L2 token where withdrawal is initiated. /// @param to_ L1 adress to credit the withdrawal to. /// @param amount_ Amount of the token to withdraw. /// @param l1Gas_ Unused, but included for potential forward compatibility considerations. /// @param data_ Optional data to forward to L1. This data is provided /// solely as a convenience for external contracts. Aside from enforcing a maximum /// length, these contracts provide no guarantees about its content. function withdrawTo( address l2Token_, address to_, uint256 amount_, uint32 l1Gas_, bytes calldata data_ ) external; /// @notice Completes a deposit from L1 to L2, and credits funds to the recipient's balance of /// this L2 token. This call will fail if it did not originate from a corresponding deposit /// in L1StandardTokenBridge. /// @param l1Token_ Address for the l1 token this is called with /// @param l2Token_ Address for the l2 token this is called with /// @param from_ Account to pull the deposit from on L2. /// @param to_ Address to receive the withdrawal at /// @param amount_ Amount of the token to withdraw /// @param data_ Data provider by the sender on L1. This data is provided /// solely as a convenience for external contracts. Aside from enforcing a maximum /// length, these contracts provide no guarantees about its content. function finalizeDeposit( address l1Token_, address l2Token_, address from_, address to_, uint256 amount_, bytes calldata data_ ) external; }
// SPDX-FileCopyrightText: 2022 Lido <[email protected]> // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.10; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /// @author psirex /// @notice Extends the ERC20 functionality that allows the bridge to mint/burn tokens interface IERC20Bridged is IERC20 { /// @notice Returns bridge which can mint and burn tokens on L2 function bridge() external view returns (address); /// @notice Creates amount_ tokens and assigns them to account_, increasing the total supply /// @param account_ An address of the account to mint tokens /// @param amount_ An amount of tokens to mint function bridgeMint(address account_, uint256 amount_) external; /// @notice Destroys amount_ tokens from account_, reducing the total supply /// @param account_ An address of the account to burn tokens /// @param amount_ An amount of tokens to burn function bridgeBurn(address account_, uint256 amount_) external; }
// SPDX-FileCopyrightText: 2022 Lido <[email protected]> // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.10; import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; /// @author psirex /// @notice Contains administrative methods to retrieve and control the state of the bridging contract BridgingManager is AccessControl { /// @dev Stores the state of the bridging /// @param isInitialized Shows whether the contract is initialized or not /// @param isDepositsEnabled Stores the state of the deposits /// @param isWithdrawalsEnabled Stores the state of the withdrawals struct State { bool isInitialized; bool isDepositsEnabled; bool isWithdrawalsEnabled; } bytes32 public constant DEPOSITS_ENABLER_ROLE = keccak256("BridgingManager.DEPOSITS_ENABLER_ROLE"); bytes32 public constant DEPOSITS_DISABLER_ROLE = keccak256("BridgingManager.DEPOSITS_DISABLER_ROLE"); bytes32 public constant WITHDRAWALS_ENABLER_ROLE = keccak256("BridgingManager.WITHDRAWALS_ENABLER_ROLE"); bytes32 public constant WITHDRAWALS_DISABLER_ROLE = keccak256("BridgingManager.WITHDRAWALS_DISABLER_ROLE"); /// @dev The location of the slot with State bytes32 private constant STATE_SLOT = keccak256("BridgingManager.bridgingState"); /// @notice Initializes the contract to grant DEFAULT_ADMIN_ROLE to the admin_ address /// @dev This method might be called only once /// @param admin_ Address of the account to grant the DEFAULT_ADMIN_ROLE function initialize(address admin_) external { State storage s = _loadState(); if (s.isInitialized) { revert ErrorAlreadyInitialized(); } _setupRole(DEFAULT_ADMIN_ROLE, admin_); s.isInitialized = true; emit Initialized(admin_); } /// @notice Returns whether the contract is initialized or not function isInitialized() public view returns (bool) { return _loadState().isInitialized; } /// @notice Returns whether the deposits are enabled or not function isDepositsEnabled() public view returns (bool) { return _loadState().isDepositsEnabled; } /// @notice Returns whether the withdrawals are enabled or not function isWithdrawalsEnabled() public view returns (bool) { return _loadState().isWithdrawalsEnabled; } /// @notice Enables the deposits if they are disabled function enableDeposits() external onlyRole(DEPOSITS_ENABLER_ROLE) { if (isDepositsEnabled()) { revert ErrorDepositsEnabled(); } _loadState().isDepositsEnabled = true; emit DepositsEnabled(msg.sender); } /// @notice Disables the deposits if they aren't disabled yet function disableDeposits() external whenDepositsEnabled onlyRole(DEPOSITS_DISABLER_ROLE) { _loadState().isDepositsEnabled = false; emit DepositsDisabled(msg.sender); } /// @notice Enables the withdrawals if they are disabled function enableWithdrawals() external onlyRole(WITHDRAWALS_ENABLER_ROLE) { if (isWithdrawalsEnabled()) { revert ErrorWithdrawalsEnabled(); } _loadState().isWithdrawalsEnabled = true; emit WithdrawalsEnabled(msg.sender); } /// @notice Disables the withdrawals if they aren't disabled yet function disableWithdrawals() external whenWithdrawalsEnabled onlyRole(WITHDRAWALS_DISABLER_ROLE) { _loadState().isWithdrawalsEnabled = false; emit WithdrawalsDisabled(msg.sender); } /// @dev Returns the reference to the slot with State struct function _loadState() private pure returns (State storage r) { bytes32 slot = STATE_SLOT; assembly { r.slot := slot } } /// @dev Validates that deposits are enabled modifier whenDepositsEnabled() { if (!isDepositsEnabled()) { revert ErrorDepositsDisabled(); } _; } /// @dev Validates that withdrawals are enabled modifier whenWithdrawalsEnabled() { if (!isWithdrawalsEnabled()) { revert ErrorWithdrawalsDisabled(); } _; } event DepositsEnabled(address indexed enabler); event DepositsDisabled(address indexed disabler); event WithdrawalsEnabled(address indexed enabler); event WithdrawalsDisabled(address indexed disabler); event Initialized(address indexed admin); error ErrorDepositsEnabled(); error ErrorDepositsDisabled(); error ErrorWithdrawalsEnabled(); error ErrorWithdrawalsDisabled(); error ErrorAlreadyInitialized(); }
// SPDX-FileCopyrightText: 2022 Lido <[email protected]> // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.10; /// @author psirex /// @notice Contains the logic for validation of tokens used in the bridging process contract BridgeableTokens { /// @notice Address of the bridged token in the L1 chain address public immutable l1Token; /// @notice Address of the token minted on the L2 chain when token bridged address public immutable l2Token; /// @param l1Token_ Address of the bridged token in the L1 chain /// @param l2Token_ Address of the token minted on the L2 chain when token bridged constructor(address l1Token_, address l2Token_) { l1Token = l1Token_; l2Token = l2Token_; } /// @dev Validates that passed l1Token_ is supported by the bridge modifier onlySupportedL1Token(address l1Token_) { if (l1Token_ != l1Token) { revert ErrorUnsupportedL1Token(); } _; } /// @dev Validates that passed l2Token_ is supported by the bridge modifier onlySupportedL2Token(address l2Token_) { if (l2Token_ != l2Token) { revert ErrorUnsupportedL2Token(); } _; } /// @dev validates that account_ is not zero address modifier onlyNonZeroAccount(address account_) { if (account_ == address(0)) { revert ErrorAccountIsZeroAddress(); } _; } error ErrorUnsupportedL1Token(); error ErrorUnsupportedL2Token(); error ErrorAccountIsZeroAddress(); }
// SPDX-FileCopyrightText: 2022 Lido <[email protected]> // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.10; import {ICrossDomainMessenger} from "./interfaces/ICrossDomainMessenger.sol"; /// @dev Helper contract for contracts performing cross-domain communications contract CrossDomainEnabled { /// @notice Messenger contract used to send and receive messages from the other domain ICrossDomainMessenger public immutable messenger; /// @param messenger_ Address of the CrossDomainMessenger on the current layer constructor(address messenger_) { messenger = ICrossDomainMessenger(messenger_); } /// @dev Sends a message to an account on another domain /// @param crossDomainTarget_ Intended recipient on the destination domain /// @param message_ Data to send to the target (usually calldata to a function with /// `onlyFromCrossDomainAccount()`) /// @param gasLimit_ gasLimit for the receipt of the message on the target domain. function sendCrossDomainMessage( address crossDomainTarget_, uint32 gasLimit_, bytes memory message_ ) internal { messenger.sendMessage(crossDomainTarget_, message_, gasLimit_); } /// @dev Enforces that the modified function is only callable by a specific cross-domain account /// @param sourceDomainAccount_ The only account on the originating domain which is /// authenticated to call this function modifier onlyFromCrossDomainAccount(address sourceDomainAccount_) { if (msg.sender != address(messenger)) { revert ErrorUnauthorizedMessenger(); } if (messenger.xDomainMessageSender() != sourceDomainAccount_) { revert ErrorWrongCrossDomainSender(); } _; } error ErrorUnauthorizedMessenger(); error ErrorWrongCrossDomainSender(); }
// 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: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}// SPDX-FileCopyrightText: 2022 Lido <[email protected]> // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.10; interface ICrossDomainMessenger { function xDomainMessageSender() external view returns (address); /// Sends a cross domain message to the target messenger. /// @param _target Target contract address. /// @param _message Message to send to the target. /// @param _gasLimit Gas limit for the provided message. function sendMessage( address _target, bytes calldata _message, uint32 _gasLimit ) external; }
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"remappings": [
"@ensdomains/=node_modules/@ensdomains/",
"@eth-optimism/=node_modules/@eth-optimism/",
"@ethan-bedrock/=node_modules/@ethan-bedrock/",
"@openzeppelin/=node_modules/@openzeppelin/",
"eth-gas-reporter/=node_modules/eth-gas-reporter/",
"hardhat/=node_modules/hardhat/"
],
"optimizer": {
"enabled": true,
"runs": 100000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs"
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "london",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"messenger_","type":"address"},{"internalType":"address","name":"l1TokenBridge_","type":"address"},{"internalType":"address","name":"l1Token_","type":"address"},{"internalType":"address","name":"l2Token_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ErrorAccountIsZeroAddress","type":"error"},{"inputs":[],"name":"ErrorAlreadyInitialized","type":"error"},{"inputs":[],"name":"ErrorDepositsDisabled","type":"error"},{"inputs":[],"name":"ErrorDepositsEnabled","type":"error"},{"inputs":[],"name":"ErrorSenderNotEOA","type":"error"},{"inputs":[],"name":"ErrorUnauthorizedMessenger","type":"error"},{"inputs":[],"name":"ErrorUnsupportedL1Token","type":"error"},{"inputs":[],"name":"ErrorUnsupportedL2Token","type":"error"},{"inputs":[],"name":"ErrorWithdrawalsDisabled","type":"error"},{"inputs":[],"name":"ErrorWithdrawalsEnabled","type":"error"},{"inputs":[],"name":"ErrorWrongCrossDomainSender","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_l1Token","type":"address"},{"indexed":true,"internalType":"address","name":"_l2Token","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"}],"name":"DepositFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_l1Token","type":"address"},{"indexed":true,"internalType":"address","name":"_l2Token","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"}],"name":"DepositFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"disabler","type":"address"}],"name":"DepositsDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"enabler","type":"address"}],"name":"DepositsEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_l1Token","type":"address"},{"indexed":true,"internalType":"address","name":"_l2Token","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"}],"name":"WithdrawalInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"disabler","type":"address"}],"name":"WithdrawalsDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"enabler","type":"address"}],"name":"WithdrawalsEnabled","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSITS_DISABLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSITS_ENABLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWALS_DISABLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWALS_ENABLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"l1Token_","type":"address"},{"internalType":"address","name":"l2Token_","type":"address"},{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"finalizeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isDepositsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWithdrawalsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1Token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1TokenBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l2Token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messenger","outputs":[{"internalType":"contract ICrossDomainMessenger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"l2Token_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint32","name":"l1Gas_","type":"uint32"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"l2Token_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint32","name":"l1Gas_","type":"uint32"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101006040523480156200001257600080fd5b506040516200216638038062002166833981016040819052620000359162000075565b6001600160a01b03918216608052811660a05291821660c0521660e052620000d2565b80516001600160a01b03811681146200007057600080fd5b919050565b600080600080608085870312156200008c57600080fd5b620000978562000058565b9350620000a76020860162000058565b9250620000b76040860162000058565b9150620000c76060860162000058565b905092959194509250565b60805160a05160c05160e051611ff86200016e6000396000818161024c01528181610a08015261142d0152600081816102c201528181610a3f01528181610aaf01526116ec0152600081816102e90152818161060c0152818161098301528181610d03015281816112e60152818161136f015261146c015260008181610447015281816108fd0152818161134e01526114a30152611ff86000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80636f18bd22116100ee578063ad960ce111610097578063d547741f11610071578063d547741f1461047c578063e3b523e31461048f578063e8bac93b146104b6578063fadcc54a146104be57600080fd5b8063ad960ce11461043a578063c01e1bd614610442578063c4d66de81461046957600080fd5b8063a217fddf116100c8578063a217fddf14610417578063a3a795481461041f578063ac67e1af1461043257600080fd5b80636f18bd22146103855780638d7601c0146103ac57806391d14854146103d357600080fd5b8063392e53cd1161015b5780635777bf50116101355780635777bf501461030b5780635e4c57a41461033a5780635ed2c22014610342578063662a633a1461037257600080fd5b8063392e53cd146102935780633cb747bf146102bd57806356eff267146102e457600080fd5b806332b7006d1161018c57806332b7006d1461022157806336568abe1461023457806336c717c11461024757600080fd5b806301ffc9a7146101b3578063248a9ca3146101db5780632f2ff15d1461020c575b600080fd5b6101c66101c136600461199d565b6104e5565b60405190151581526020015b60405180910390f35b6101fe6101e93660046119df565b60009081526020819052604090206001015490565b6040519081526020016101d2565b61021f61021a366004611a1a565b61057e565b005b61021f61022f366004611aac565b6105a8565b61021f610242366004611a1a565b6106de565b61026e7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5460ff166101c6565b61026e7f000000000000000000000000000000000000000000000000000000000000000081565b61026e7f000000000000000000000000000000000000000000000000000000000000000081565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba54610100900460ff166101c6565b61021f610796565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5462010000900460ff166101c6565b61021f610380366004611b1d565b61089a565b6101fe7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b6101fe7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b6101c66103e1366004611a1a565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101fe600081565b61021f61042d366004611bb5565b610c9f565b61021f610d9d565b61021f610e9c565b61026e7f000000000000000000000000000000000000000000000000000000000000000081565b61021f610477366004611c38565b610f9c565b61021f61048a366004611a1a565b611072565b6101fe7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b61021f611097565b6101fe7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061057857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000828152602081905260409020600101546105998161119d565b6105a383836111aa565b505050565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5462010000900460ff16610609576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461068f576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333b156106c8576040517fdf6691fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d633338787878761129a565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b610792828261151e565b5050565b7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a6107c08161119d565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba54610100900460ff1615610821576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a90600090a250565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba54610100900460ff166108fa576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610980576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a06576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610a96576040517ff95a18f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3c9190611c55565b73ffffffffffffffffffffffffffffffffffffffff1614610b89576040517fe36e2eb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8c2a993e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018890528a1690638c2a993e90604401600060405180830381600087803b158015610bf957600080fd5b505af1158015610c0d573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898a8a8a8a604051610c8b9493929190611cbb565b60405180910390a450505050505050505050565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5462010000900460ff16610d00576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d86576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d9433878787878761129a565b50505050505050565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba54610100900460ff16610dfd576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d6610e278161119d565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb990600090a250565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5462010000900460ff16610efd576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c610f278161119d565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb90600090a250565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba805460ff1615610ff9576040517f66a02dea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110046000836115d5565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405173ffffffffffffffffffffffffffffffffffffffff8316907f908408e307fc569b417f6cbec5d5a06f44a0a505ac0479b47d421a4b2fd6a1e690600090a25050565b60008281526020819052604090206001015461108d8161119d565b6105a3838361151e565b7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d6110c18161119d565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5462010000900460ff1615611123576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320490600090a250565b6111a781336115df565b50565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166107925760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561123c3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6040517f74f4f54700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000016906374f4f54790604401600060405180830381600087803b15801561132a57600080fd5b505af115801561133e573d6000803e3d6000fd5b50505050600063a9f9e67560e01b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000089898988886040516024016113a99796959493929190611cfb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506114537f000000000000000000000000000000000000000000000000000000000000000085836116af565b8673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8989888860405161150d9493929190611cbb565b60405180910390a450505050505050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156107925760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61079282826111aa565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610792576116358173ffffffffffffffffffffffffffffffffffffffff166014611753565b611640836020611753565b604051602001611651929190611d88565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261077f91600401611e53565b6040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690633dbb202b9061172590869085908790600401611e66565b600060405180830381600087803b15801561173f57600080fd5b505af1158015610d94573d6000803e3d6000fd5b60606000611762836002611eda565b61176d906002611f17565b67ffffffffffffffff81111561178557611785611f2f565b6040519080825280601f01601f1916602001820160405280156117af576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117e6576117e6611f5e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061184957611849611f5e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611885846002611eda565b611890906001611f17565b90505b600181111561192d577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106118d1576118d1611f5e565b1a60f81b8282815181106118e7576118e7611f5e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361192681611f8d565b9050611893565b508315611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161077f565b9392505050565b6000602082840312156119af57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461199657600080fd5b6000602082840312156119f157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111a757600080fd5b60008060408385031215611a2d57600080fd5b823591506020830135611a3f816119f8565b809150509250929050565b803563ffffffff81168114611a5e57600080fd5b919050565b60008083601f840112611a7557600080fd5b50813567ffffffffffffffff811115611a8d57600080fd5b602083019150836020828501011115611aa557600080fd5b9250929050565b600080600080600060808688031215611ac457600080fd5b8535611acf816119f8565b945060208601359350611ae460408701611a4a565b9250606086013567ffffffffffffffff811115611b0057600080fd5b611b0c88828901611a63565b969995985093965092949392505050565b600080600080600080600060c0888a031215611b3857600080fd5b8735611b43816119f8565b96506020880135611b53816119f8565b95506040880135611b63816119f8565b94506060880135611b73816119f8565b93506080880135925060a088013567ffffffffffffffff811115611b9657600080fd5b611ba28a828b01611a63565b989b979a50959850939692959293505050565b60008060008060008060a08789031215611bce57600080fd5b8635611bd9816119f8565b95506020870135611be9816119f8565b945060408701359350611bfe60608801611a4a565b9250608087013567ffffffffffffffff811115611c1a57600080fd5b611c2689828a01611a63565b979a9699509497509295939492505050565b600060208284031215611c4a57600080fd5b8135611996816119f8565b600060208284031215611c6757600080fd5b8151611996816119f8565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000611cf1606083018486611c72565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152611d4b60c083018486611c72565b9998505050505050505050565b60005b83811015611d73578181015183820152602001611d5b565b83811115611d82576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611dc0816017850160208801611d58565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351611dfd816028840160208801611d58565b01602801949350505050565b60008151808452611e21816020860160208601611d58565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006119966020830184611e09565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000611e956060830185611e09565b905063ffffffff83166040830152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611f1257611f12611eab565b500290565b60008219821115611f2a57611f2a611eab565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081611f9c57611f9c611eab565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea26469706673582212202b5e455347cff672d129823f3740e17b4c5693696a835d3ba5d2b1454f39b38e64736f6c634300080a003300000000000000000000000042000000000000000000000000000000000000070000000000000000000000002d001d79e5af5f65a939781fe228b267a8ed468b0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000458ed78eb972a369799fb278c0243b25e5242a83
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c80636f18bd22116100ee578063ad960ce111610097578063d547741f11610071578063d547741f1461047c578063e3b523e31461048f578063e8bac93b146104b6578063fadcc54a146104be57600080fd5b8063ad960ce11461043a578063c01e1bd614610442578063c4d66de81461046957600080fd5b8063a217fddf116100c8578063a217fddf14610417578063a3a795481461041f578063ac67e1af1461043257600080fd5b80636f18bd22146103855780638d7601c0146103ac57806391d14854146103d357600080fd5b8063392e53cd1161015b5780635777bf50116101355780635777bf501461030b5780635e4c57a41461033a5780635ed2c22014610342578063662a633a1461037257600080fd5b8063392e53cd146102935780633cb747bf146102bd57806356eff267146102e457600080fd5b806332b7006d1161018c57806332b7006d1461022157806336568abe1461023457806336c717c11461024757600080fd5b806301ffc9a7146101b3578063248a9ca3146101db5780632f2ff15d1461020c575b600080fd5b6101c66101c136600461199d565b6104e5565b60405190151581526020015b60405180910390f35b6101fe6101e93660046119df565b60009081526020819052604090206001015490565b6040519081526020016101d2565b61021f61021a366004611a1a565b61057e565b005b61021f61022f366004611aac565b6105a8565b61021f610242366004611a1a565b6106de565b61026e7f0000000000000000000000002d001d79e5af5f65a939781fe228b267a8ed468b81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5460ff166101c6565b61026e7f000000000000000000000000420000000000000000000000000000000000000781565b61026e7f000000000000000000000000458ed78eb972a369799fb278c0243b25e5242a8381565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba54610100900460ff166101c6565b61021f610796565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5462010000900460ff166101c6565b61021f610380366004611b1d565b61089a565b6101fe7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b6101fe7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b6101c66103e1366004611a1a565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6101fe600081565b61021f61042d366004611bb5565b610c9f565b61021f610d9d565b61021f610e9c565b61026e7f0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca081565b61021f610477366004611c38565b610f9c565b61021f61048a366004611a1a565b611072565b6101fe7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b61021f611097565b6101fe7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061057857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000828152602081905260409020600101546105998161119d565b6105a383836111aa565b505050565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5462010000900460ff16610609576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b847f000000000000000000000000458ed78eb972a369799fb278c0243b25e5242a8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461068f576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333b156106c8576040517fdf6691fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106d633338787878761129a565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b610792828261151e565b5050565b7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a6107c08161119d565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba54610100900460ff1615610821576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a90600090a250565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba54610100900460ff166108fa576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610980576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f000000000000000000000000458ed78eb972a369799fb278c0243b25e5242a8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a06576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000002d001d79e5af5f65a939781fe228b267a8ed468b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000042000000000000000000000000000000000000071614610a96576040517ff95a18f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000420000000000000000000000000000000000000773ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3c9190611c55565b73ffffffffffffffffffffffffffffffffffffffff1614610b89576040517fe36e2eb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8c2a993e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018890528a1690638c2a993e90604401600060405180830381600087803b158015610bf957600080fd5b505af1158015610c0d573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898a8a8a8a604051610c8b9493929190611cbb565b60405180910390a450505050505050505050565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5462010000900460ff16610d00576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b857f000000000000000000000000458ed78eb972a369799fb278c0243b25e5242a8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d86576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d9433878787878761129a565b50505050505050565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba54610100900460ff16610dfd576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d6610e278161119d565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb990600090a250565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5462010000900460ff16610efd576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c610f278161119d565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb90600090a250565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba805460ff1615610ff9576040517f66a02dea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110046000836115d5565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405173ffffffffffffffffffffffffffffffffffffffff8316907f908408e307fc569b417f6cbec5d5a06f44a0a505ac0479b47d421a4b2fd6a1e690600090a25050565b60008281526020819052604090206001015461108d8161119d565b6105a3838361151e565b7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d6110c18161119d565b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba5462010000900460ff1615611123576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f013e929b381f2fbbac854bd18fb8231dc73c4a2eab0d4cbb4db9436b6ff9b2ba80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320490600090a250565b6111a781336115df565b50565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166107925760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561123c3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6040517f74f4f54700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018690527f000000000000000000000000458ed78eb972a369799fb278c0243b25e5242a8316906374f4f54790604401600060405180830381600087803b15801561132a57600080fd5b505af115801561133e573d6000803e3d6000fd5b50505050600063a9f9e67560e01b7f0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca07f000000000000000000000000458ed78eb972a369799fb278c0243b25e5242a8389898988886040516024016113a99796959493929190611cfb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506114537f0000000000000000000000002d001d79e5af5f65a939781fe228b267a8ed468b85836116af565b8673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000458ed78eb972a369799fb278c0243b25e5242a8373ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca073ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8989888860405161150d9493929190611cbb565b60405180910390a450505050505050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156107925760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61079282826111aa565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610792576116358173ffffffffffffffffffffffffffffffffffffffff166014611753565b611640836020611753565b604051602001611651929190611d88565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261077f91600401611e53565b6040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000042000000000000000000000000000000000000071690633dbb202b9061172590869085908790600401611e66565b600060405180830381600087803b15801561173f57600080fd5b505af1158015610d94573d6000803e3d6000fd5b60606000611762836002611eda565b61176d906002611f17565b67ffffffffffffffff81111561178557611785611f2f565b6040519080825280601f01601f1916602001820160405280156117af576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117e6576117e6611f5e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061184957611849611f5e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611885846002611eda565b611890906001611f17565b90505b600181111561192d577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106118d1576118d1611f5e565b1a60f81b8282815181106118e7576118e7611f5e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361192681611f8d565b9050611893565b508315611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161077f565b9392505050565b6000602082840312156119af57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461199657600080fd5b6000602082840312156119f157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111a757600080fd5b60008060408385031215611a2d57600080fd5b823591506020830135611a3f816119f8565b809150509250929050565b803563ffffffff81168114611a5e57600080fd5b919050565b60008083601f840112611a7557600080fd5b50813567ffffffffffffffff811115611a8d57600080fd5b602083019150836020828501011115611aa557600080fd5b9250929050565b600080600080600060808688031215611ac457600080fd5b8535611acf816119f8565b945060208601359350611ae460408701611a4a565b9250606086013567ffffffffffffffff811115611b0057600080fd5b611b0c88828901611a63565b969995985093965092949392505050565b600080600080600080600060c0888a031215611b3857600080fd5b8735611b43816119f8565b96506020880135611b53816119f8565b95506040880135611b63816119f8565b94506060880135611b73816119f8565b93506080880135925060a088013567ffffffffffffffff811115611b9657600080fd5b611ba28a828b01611a63565b989b979a50959850939692959293505050565b60008060008060008060a08789031215611bce57600080fd5b8635611bd9816119f8565b95506020870135611be9816119f8565b945060408701359350611bfe60608801611a4a565b9250608087013567ffffffffffffffff811115611c1a57600080fd5b611c2689828a01611a63565b979a9699509497509295939492505050565b600060208284031215611c4a57600080fd5b8135611996816119f8565b600060208284031215611c6757600080fd5b8151611996816119f8565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000611cf1606083018486611c72565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152611d4b60c083018486611c72565b9998505050505050505050565b60005b83811015611d73578181015183820152602001611d5b565b83811115611d82576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611dc0816017850160208801611d58565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351611dfd816028840160208801611d58565b01602801949350505050565b60008151808452611e21816020860160208601611d58565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006119966020830184611e09565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000611e956060830185611e09565b905063ffffffff83166040830152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611f1257611f12611eab565b500290565b60008219821115611f2a57611f2a611eab565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081611f9c57611f9c611eab565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea26469706673582212202b5e455347cff672d129823f3740e17b4c5693696a835d3ba5d2b1454f39b38e64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000042000000000000000000000000000000000000070000000000000000000000002d001d79e5af5f65a939781fe228b267a8ed468b0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000458ed78eb972a369799fb278c0243b25e5242a83
-----Decoded View---------------
Arg [0] : messenger_ (address): 0x4200000000000000000000000000000000000007
Arg [1] : l1TokenBridge_ (address): 0x2D001d79E5aF5F65a939781FE228B267a8Ed468B
Arg [2] : l1Token_ (address): 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0
Arg [3] : l2Token_ (address): 0x458ed78EB972a369799fb278c0243b25e5242A83
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000004200000000000000000000000000000000000007
Arg [1] : 0000000000000000000000002d001d79e5af5f65a939781fe228b267a8ed468b
Arg [2] : 0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0
Arg [3] : 000000000000000000000000458ed78eb972a369799fb278c0243b25e5242a83
Deployed Bytecode Sourcemap
1019:3365:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2606:202:8;;;;;;:::i;:::-;;:::i;:::-;;;516:14:16;;509:22;491:41;;479:2;464:18;2606:202:8;;;;;;;;4391:129;;;;;;:::i;:::-;4465:7;4491:12;;;;;;;;;;:22;;;;4391:129;;;;874:25:16;;;862:2;847:18;4391:129:8;728:177:16;4770:145:8;;;;;;:::i;:::-;;:::i;:::-;;1823:372:3;;;;;;:::i;:::-;;:::i;5787:214:8:-;;;;;;:::i;:::-;;:::i;1177:38:3:-;;;;;;;;2775:42:16;2763:55;;;2745:74;;2733:2;2718:18;1177:38:3;2599:226:16;1933:102:1;1299:42;2002:26;;;1933:102;;396:48:2;;;;;429:32:0;;;;;2105:110:1;1299:42;2178:30;;;;;;2105:110;;2468:251;;;:::i;2288:116::-;1299:42;2364:33;;;;;;2288:116;;2568:503:3;;;;;;:::i;:::-;;:::i;851:108:1:-;;908:51;851:108;;1083:114;;1143:54;1083:114;;2895:145:8;;;;;;:::i;:::-;2981:4;3004:12;;;;;;;;;;;:29;;;;;;;;;;;;;;;;2895:145;2027:49;;2072:4;2027:49;;2236:291:3;;;;;;:::i;:::-;;:::i;2791:215:1:-;;;:::i;3417:230::-;;;:::i;311:32:0:-;;;;;1567:293:1;;;;;;:::i;:::-;;:::i;5149:147:8:-;;;;;;:::i;:::-;;:::i;965:112:1:-;;1024:53;965:112;;3073:269;;;:::i;739:106::-;;795:50;739:106;;2606:202:8;2691:4;2714:47;;;2729:32;2714:47;;:87;;-1:-1:-1;952:25:14;937:40;;;;2765:36:8;2707:94;2606:202;-1:-1:-1;;2606:202:8:o;4770:145::-;4465:7;4491:12;;;;;;;;;;:22;;;2505:16;2516:4;2505:10;:16::i;:::-;4883:25:::1;4894:4;4900:7;4883:10;:25::i;:::-;4770:145:::0;;;:::o;1823:372:3:-;1299:42:1;2364:33;;;;;;4173:87;;4223:26;;;;;;;;;;;;;;4173:87;2004:8:3::1;1120:7:0;1108:19;;:8;:19;;;1104:82;;1150:25;;;;;;;;;;;;;;1104:82;2047:10:3::2;1465:19:11::0;:23;2024:87:3::2;;2081:19;;;;;;;;;;;;;;2024:87;2121:67;2141:10;2153;2165:7;2174:6;2182:5;;2121:19;:67::i;:::-;4269:1:1::1;1823:372:3::0;;;;;:::o;5787:214:8:-;5882:23;;;719:10:12;5882:23:8;5874:83;;;;;;;5419:2:16;5874:83:8;;;5401:21:16;5458:2;5438:18;;;5431:30;5497:34;5477:18;;;5470:62;5568:17;5548:18;;;5541:45;5603:19;;5874:83:8;;;;;;;;;5968:26;5980:4;5986:7;5968:11;:26::i;:::-;5787:214;;:::o;2468:251:1:-;795:50;2505:16:8;2516:4;2505:10;:16::i;:::-;1299:42:1;2178:30;;;;;;2545:79:::1;;;2591:22;;;;;;;;;;;;;;2545:79;1299:42:::0;2633:37;;;::::1;;;::::0;;2685:27:::1;::::0;2701:10:::1;::::0;2685:27:::1;::::0;2633:37;;2685:27:::1;2468:251:::0;:::o;2568:503:3:-;1299:42:1;2178:30;;;;;;3973:81;;4020:23;;;;;;;;;;;;;;3973:81;2824:8:3::1;886:7:0;874:19;;:8;:19;;;870:82;;916:25;;;;;;;;;;;;;;870:82;2863:8:3::2;1120:7:0;1108:19;;:8;:19;;;1104:82;;1150:25;;;;;;;;;;;;;;1104:82;2908:13:3::3;1535:10:2;:32;1557:9;1535:32;;1531:98;;1590:28;;;;;;;;;;;;;;1531:98;1678:20;1642:56;;:9;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;1638:123;;1721:29;;;;;;;;;;;;;;1638:123;2937:48:3::4;::::0;;;;:34:::4;6081:55:16::0;;;2937:48:3::4;::::0;::::4;6063:74:16::0;6153:18;;;6146:34;;;2937::3;::::4;::::0;::::4;::::0;6036:18:16;;2937:48:3::4;;;;;;;;;;;;;;;;;::::0;::::4;;;;;;;;;;;;::::0;::::4;;;;;;;;;3037:5;3000:64;;3027:8;3000:64;;3017:8;3000:64;;;3044:3;3049:7;3058:5;;3000:64;;;;;;;;;:::i;:::-;;;;;;;;1195:1:0::3;961::::2;4063::1::1;2568:503:3::0;;;;;;;:::o;2236:291::-;1299:42:1;2364:33;;;;;;4173:87;;4223:26;;;;;;;;;;;;;;4173:87;2440:8:3::1;1120:7:0;1108:19;;:8;:19;;;1104:82;;1150:25;;;;;;;;;;;;;;1104:82;2460:60:3::2;2480:10;2492:3;2497:7;2506:6;2514:5;;2460:19;:60::i;:::-;4269:1:1::1;2236:291:3::0;;;;;;:::o;2791:215:1:-;1299:42;2178:30;;;;;;3973:81;;4020:23;;;;;;;;;;;;;;3973:81;908:51:::1;2505:16:8;2516:4;2505:10;:16::i;:::-;1299:42:1::0;2918:38;;;::::2;::::0;;2971:28:::2;::::0;2988:10:::2;::::0;2971:28:::2;::::0;2951:5:::2;::::0;2971:28:::2;4063:1:::1;2791:215::o:0;3417:230::-;1299:42;2364:33;;;;;;4173:87;;4223:26;;;;;;;;;;;;;;4173:87;1143:54:::1;2505:16:8;2516:4;2505:10;:16::i;:::-;1299:42:1::0;3553:41;;;::::2;::::0;;3609:31:::2;::::0;3629:10:::2;::::0;3609:31:::2;::::0;3589:5:::2;::::0;3609:31:::2;4269:1:::1;3417:230::o:0;1567:293::-;1299:42;1666:15;;;;1662:78;;;1704:25;;;;;;;;;;;;;;1662:78;1749:38;2072:4:8;1780:6:1;1749:10;:38::i;:::-;1797:22;;;;1815:4;1797:22;;;1834:19;;;;;;;;1797:15;;1834:19;1612:248;1567:293;:::o;5149:147:8:-;4465:7;4491:12;;;;;;;;;;:22;;;2505:16;2516:4;2505:10;:16::i;:::-;5263:26:::1;5275:4;5281:7;5263:11;:26::i;3073:269:1:-:0;1024:53;2505:16:8;2516:4;2505:10;:16::i;:::-;1299:42:1;2364:33;;;;;;3156:85:::1;;;3205:25;;;;;;;;;;;;;;3156:85;1299:42:::0;3250:40;;;::::1;::::0;::::1;::::0;;3305:30:::1;::::0;3324:10:::1;::::0;3305:30:::1;::::0;3250:40;;3305:30:::1;3073:269:::0;:::o;3334:103:8:-;3400:30;3411:4;719:10:12;3400::8;:30::i;:::-;3334:103;:::o;7244:233::-;2981:4;3004:12;;;;;;;;;;;:29;;;;;;;;;;;;;7322:149;;7365:6;:12;;;;;;;;;;;:29;;;;;;;;;;:36;;;;7397:4;7365:36;;;7447:12;719:10:12;;640:96;7447:12:8;7420:40;;7438:7;7420:40;;7432:4;7420:40;;;;;;;;;;7244:233;;:::o;3727:623:3:-;3903:49;;;;;:33;6081:55:16;;;3903:49:3;;;6063:74:16;6153:18;;;6146:34;;;3917:7:3;3903:33;;;;6036:18:16;;3903:49:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3963:20;4022:47;;;4083:7;4104;4125:5;4144:3;4161:7;4182:5;;3986:211;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4208:54:3;4231:13;4246:6;3986:211;4208:22;:54::i;:::-;4316:5;4278:65;;4307:7;4278:65;;4298:7;4278:65;;;4323:3;4328:7;4337:5;;4278:65;;;;;;;;;:::i;:::-;;;;;;;;3893:457;3727:623;;;;;;:::o;7602:234:8:-;2981:4;3004:12;;;;;;;;;;;:29;;;;;;;;;;;;;7681:149;;;7755:5;7723:12;;;;;;;;;;;:29;;;;;;;;;;;:37;;;;;;7779:40;719:10:12;;7723:12:8;;7779:40;;7755:5;7779:40;7602:234;;:::o;6640:110::-;6718:25;6729:4;6735:7;6718:10;:25::i;3718:492::-;2981:4;3004:12;;;;;;;;;;;:29;;;;;;;;;;;;;3801:403;;3989:41;4017:7;3989:41;;4027:2;3989:19;:41::i;:::-;4101:38;4129:4;4136:2;4101:19;:38::i;:::-;3896:265;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;3844:349;;;;;;;;:::i;993:219:2:-;1143:62;;;;;:21;:9;:21;;;;:62;;1165:18;;1185:8;;1195:9;;1143:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1588:441:13;1663:13;1688:19;1720:10;1724:6;1720:1;:10;:::i;:::-;:14;;1733:1;1720:14;:::i;:::-;1710:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1710:25:13;;1688:47;;1745:15;:6;1752:1;1745:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;;1770;:6;1777:1;1770:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;-1:-1:-1;1800:9:13;1812:10;1816:6;1812:1;:10;:::i;:::-;:14;;1825:1;1812:14;:::i;:::-;1800:26;;1795:132;1832:1;1828;:5;1795:132;;;1866:12;1879:5;1887:3;1879:11;1866:25;;;;;;;:::i;:::-;;;;1854:6;1861:1;1854:9;;;;;;;;:::i;:::-;;;;:37;;;;;;;;;;-1:-1:-1;1915:1:13;1905:11;;;;;1835:3;;;:::i;:::-;;;1795:132;;;-1:-1:-1;1944:10:13;;1936:55;;;;;;;11032:2:16;1936:55:13;;;11014:21:16;;;11051:18;;;11044:30;11110:34;11090:18;;;11083:62;11162:18;;1936:55:13;10830:356:16;1936:55:13;2015:6;1588:441;-1:-1:-1;;;1588:441:13:o;14:332:16:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:66;223:5;219:78;212:5;209:89;199:117;;312:1;309;302:12;543:180;602:6;655:2;643:9;634:7;630:23;626:32;623:52;;;671:1;668;661:12;623:52;-1:-1:-1;694:23:16;;543:180;-1:-1:-1;543:180:16:o;910:154::-;996:42;989:5;985:54;978:5;975:65;965:93;;1054:1;1051;1044:12;1069:315;1137:6;1145;1198:2;1186:9;1177:7;1173:23;1169:32;1166:52;;;1214:1;1211;1204:12;1166:52;1250:9;1237:23;1227:33;;1310:2;1299:9;1295:18;1282:32;1323:31;1348:5;1323:31;:::i;:::-;1373:5;1363:15;;;1069:315;;;;;:::o;1389:163::-;1456:20;;1516:10;1505:22;;1495:33;;1485:61;;1542:1;1539;1532:12;1485:61;1389:163;;;:::o;1557:347::-;1608:8;1618:6;1672:3;1665:4;1657:6;1653:17;1649:27;1639:55;;1690:1;1687;1680:12;1639:55;-1:-1:-1;1713:20:16;;1756:18;1745:30;;1742:50;;;1788:1;1785;1778:12;1742:50;1825:4;1817:6;1813:17;1801:29;;1877:3;1870:4;1861:6;1853;1849:19;1845:30;1842:39;1839:59;;;1894:1;1891;1884:12;1839:59;1557:347;;;;;:::o;1909:685::-;2005:6;2013;2021;2029;2037;2090:3;2078:9;2069:7;2065:23;2061:33;2058:53;;;2107:1;2104;2097:12;2058:53;2146:9;2133:23;2165:31;2190:5;2165:31;:::i;:::-;2215:5;-1:-1:-1;2267:2:16;2252:18;;2239:32;;-1:-1:-1;2290:37:16;2323:2;2308:18;;2290:37;:::i;:::-;2280:47;;2378:2;2367:9;2363:18;2350:32;2405:18;2397:6;2394:30;2391:50;;;2437:1;2434;2427:12;2391:50;2476:58;2526:7;2517:6;2506:9;2502:22;2476:58;:::i;:::-;1909:685;;;;-1:-1:-1;1909:685:16;;-1:-1:-1;2553:8:16;;2450:84;1909:685;-1:-1:-1;;;1909:685:16:o;3090:1038::-;3205:6;3213;3221;3229;3237;3245;3253;3306:3;3294:9;3285:7;3281:23;3277:33;3274:53;;;3323:1;3320;3313:12;3274:53;3362:9;3349:23;3381:31;3406:5;3381:31;:::i;:::-;3431:5;-1:-1:-1;3488:2:16;3473:18;;3460:32;3501:33;3460:32;3501:33;:::i;:::-;3553:7;-1:-1:-1;3612:2:16;3597:18;;3584:32;3625:33;3584:32;3625:33;:::i;:::-;3677:7;-1:-1:-1;3736:2:16;3721:18;;3708:32;3749:33;3708:32;3749:33;:::i;:::-;3801:7;-1:-1:-1;3855:3:16;3840:19;;3827:33;;-1:-1:-1;3911:3:16;3896:19;;3883:33;3939:18;3928:30;;3925:50;;;3971:1;3968;3961:12;3925:50;4010:58;4060:7;4051:6;4040:9;4036:22;4010:58;:::i;:::-;3090:1038;;;;-1:-1:-1;3090:1038:16;;-1:-1:-1;3090:1038:16;;;;3984:84;;-1:-1:-1;;;3090:1038:16:o;4133:827::-;4238:6;4246;4254;4262;4270;4278;4331:3;4319:9;4310:7;4306:23;4302:33;4299:53;;;4348:1;4345;4338:12;4299:53;4387:9;4374:23;4406:31;4431:5;4406:31;:::i;:::-;4456:5;-1:-1:-1;4513:2:16;4498:18;;4485:32;4526:33;4485:32;4526:33;:::i;:::-;4578:7;-1:-1:-1;4632:2:16;4617:18;;4604:32;;-1:-1:-1;4655:37:16;4688:2;4673:18;;4655:37;:::i;:::-;4645:47;;4743:3;4732:9;4728:19;4715:33;4771:18;4763:6;4760:30;4757:50;;;4803:1;4800;4793:12;4757:50;4842:58;4892:7;4883:6;4872:9;4868:22;4842:58;:::i;:::-;4133:827;;;;-1:-1:-1;4133:827:16;;-1:-1:-1;4133:827:16;;4919:8;;4133:827;-1:-1:-1;;;4133:827:16:o;4965:247::-;5024:6;5077:2;5065:9;5056:7;5052:23;5048:32;5045:52;;;5093:1;5090;5083:12;5045:52;5132:9;5119:23;5151:31;5176:5;5151:31;:::i;5633:251::-;5703:6;5756:2;5744:9;5735:7;5731:23;5727:32;5724:52;;;5772:1;5769;5762:12;5724:52;5804:9;5798:16;5823:31;5848:5;5823:31;:::i;6191:325::-;6279:6;6274:3;6267:19;6331:6;6324:5;6317:4;6312:3;6308:14;6295:43;;6383:1;6376:4;6367:6;6362:3;6358:16;6354:27;6347:38;6249:3;6505:4;6435:66;6430:2;6422:6;6418:15;6414:88;6409:3;6405:98;6401:109;6394:116;;6191:325;;;;:::o;6521:435::-;6746:42;6738:6;6734:55;6723:9;6716:74;6826:6;6821:2;6810:9;6806:18;6799:34;6869:2;6864;6853:9;6849:18;6842:30;6697:4;6889:61;6946:2;6935:9;6931:18;6923:6;6915;6889:61;:::i;:::-;6881:69;6521:435;-1:-1:-1;;;;;;6521:435:16:o;6961:700::-;7221:4;7250:42;7331:2;7323:6;7319:15;7308:9;7301:34;7383:2;7375:6;7371:15;7366:2;7355:9;7351:18;7344:43;7435:2;7427:6;7423:15;7418:2;7407:9;7403:18;7396:43;7487:2;7479:6;7475:15;7470:2;7459:9;7455:18;7448:43;;7528:6;7522:3;7511:9;7507:19;7500:35;7572:3;7566;7555:9;7551:19;7544:32;7593:62;7650:3;7639:9;7635:19;7627:6;7619;7593:62;:::i;:::-;7585:70;6961:700;-1:-1:-1;;;;;;;;;6961:700:16:o;7666:258::-;7738:1;7748:113;7762:6;7759:1;7756:13;7748:113;;;7838:11;;;7832:18;7819:11;;;7812:39;7784:2;7777:10;7748:113;;;7879:6;7876:1;7873:13;7870:48;;;7914:1;7905:6;7900:3;7896:16;7889:27;7870:48;;7666:258;;;:::o;7929:786::-;8340:25;8335:3;8328:38;8310:3;8395:6;8389:13;8411:62;8466:6;8461:2;8456:3;8452:12;8445:4;8437:6;8433:17;8411:62;:::i;:::-;8537:19;8532:2;8492:16;;;8524:11;;;8517:40;8582:13;;8604:63;8582:13;8653:2;8645:11;;8638:4;8626:17;;8604:63;:::i;:::-;8687:17;8706:2;8683:26;;7929:786;-1:-1:-1;;;;7929:786:16:o;8720:317::-;8762:3;8800:5;8794:12;8827:6;8822:3;8815:19;8843:63;8899:6;8892:4;8887:3;8883:14;8876:4;8869:5;8865:16;8843:63;:::i;:::-;8951:2;8939:15;8956:66;8935:88;8926:98;;;;9026:4;8922:109;;8720:317;-1:-1:-1;;8720:317:16:o;9042:220::-;9191:2;9180:9;9173:21;9154:4;9211:45;9252:2;9241:9;9237:18;9229:6;9211:45;:::i;9267:424::-;9480:42;9472:6;9468:55;9457:9;9450:74;9560:2;9555;9544:9;9540:18;9533:30;9431:4;9580:45;9621:2;9610:9;9606:18;9598:6;9580:45;:::i;:::-;9572:53;;9673:10;9665:6;9661:23;9656:2;9645:9;9641:18;9634:51;9267:424;;;;;;:::o;9696:184::-;9748:77;9745:1;9738:88;9845:4;9842:1;9835:15;9869:4;9866:1;9859:15;9885:228;9925:7;10051:1;9983:66;9979:74;9976:1;9973:81;9968:1;9961:9;9954:17;9950:105;9947:131;;;10058:18;;:::i;:::-;-1:-1:-1;10098:9:16;;9885:228::o;10118:128::-;10158:3;10189:1;10185:6;10182:1;10179:13;10176:39;;;10195:18;;:::i;:::-;-1:-1:-1;10231:9:16;;10118:128::o;10251:184::-;10303:77;10300:1;10293:88;10400:4;10397:1;10390:15;10424:4;10421:1;10414:15;10440:184;10492:77;10489:1;10482:88;10589:4;10586:1;10579:15;10613:4;10610:1;10603:15;10629:196;10668:3;10696:5;10686:39;;10705:18;;:::i;:::-;-1:-1:-1;10752:66:16;10741:78;;10629:196::o
Swarm Source
ipfs://2b5e455347cff672d129823f3740e17b4c5693696a835d3ba5d2b1454f39b38e
Net Worth in USD
Net Worth in MNT
Multichain Portfolio | 32 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.